@code-yeongyu/senpi 2026.9.3 → 2026.9.4

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 (269) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/dist/core/agent-session.d.ts +2 -5
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +32 -29
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/dynamic-prompt/style.js +1 -1
  7. package/dist/core/dynamic-prompt/style.js.map +1 -1
  8. package/dist/core/dynamic-prompt/working-task.js +1 -1
  9. package/dist/core/dynamic-prompt/working-task.js.map +1 -1
  10. package/dist/core/extensions/builtin/bash-timeout/index.d.ts +1 -1
  11. package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/bash-timeout/index.js +7 -1
  13. package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
  14. package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts +11 -7
  15. package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
  16. package/dist/core/extensions/builtin/bash-timeout/timeout.js +4 -8
  17. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  18. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -1
  19. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js +15 -18
  20. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -1
  21. package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.d.ts +3 -0
  22. package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.d.ts.map +1 -0
  23. package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.js +80 -0
  24. package/dist/core/extensions/builtin/claude-sdk-oauth/content-blocks.js.map +1 -0
  25. package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts +18 -1
  26. package/dist/core/extensions/builtin/claude-sdk-oauth/errors.d.ts.map +1 -1
  27. package/dist/core/extensions/builtin/claude-sdk-oauth/errors.js +57 -1
  28. package/dist/core/extensions/builtin/claude-sdk-oauth/errors.js.map +1 -1
  29. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts +1 -0
  30. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.d.ts.map +1 -1
  31. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js +13 -0
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/guidance.js.map +1 -1
  33. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +6 -1
  35. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
  36. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.d.ts.map +1 -1
  37. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js +2 -23
  38. package/dist/core/extensions/builtin/claude-sdk-oauth/prompt-bridge.js.map +1 -1
  39. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts +2 -2
  40. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +30 -24
  42. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
  43. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +2 -0
  44. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +15 -1
  46. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
  47. package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts +1 -1
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts.map +1 -1
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js +1 -0
  50. package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js.map +1 -1
  51. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts +6 -1
  52. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +1 -0
  54. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
  55. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.d.ts.map +1 -1
  56. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js +19 -3
  57. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-pump.js.map +1 -1
  58. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
  59. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +31 -13
  60. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
  61. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts +1 -0
  62. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
  63. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +1 -0
  64. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -1
  65. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
  66. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +8 -14
  67. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
  68. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js +23 -6
  70. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js.map +1 -1
  71. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.d.ts.map +1 -1
  72. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js +4 -2
  73. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-guidance.js.map +1 -1
  74. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts +1 -1
  75. package/dist/core/extensions/builtin/claude-sdk-oauth/stream-protocol.d.ts.map +1 -1
  76. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
  77. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +13 -6
  78. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
  79. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts +11 -3
  80. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
  81. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js +12 -3
  82. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js.map +1 -1
  83. package/dist/core/extensions/builtin/eval-only-routing.d.ts +10 -0
  84. package/dist/core/extensions/builtin/eval-only-routing.d.ts.map +1 -0
  85. package/dist/core/extensions/builtin/eval-only-routing.js +16 -0
  86. package/dist/core/extensions/builtin/eval-only-routing.js.map +1 -0
  87. package/dist/core/extensions/builtin/gpt-account.d.ts +3 -0
  88. package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -0
  89. package/dist/core/extensions/builtin/gpt-account.js +115 -0
  90. package/dist/core/extensions/builtin/gpt-account.js.map +1 -0
  91. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  92. package/dist/core/extensions/builtin/index.js +2 -0
  93. package/dist/core/extensions/builtin/index.js.map +1 -1
  94. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
  95. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js +1 -3
  96. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
  97. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js +1 -11
  99. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
  100. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js +2 -2
  101. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
  102. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js +3 -3
  103. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js.map +1 -1
  104. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts.map +1 -1
  105. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +56 -43
  106. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
  107. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts +4 -15
  108. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js +12 -21
  110. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js.map +1 -1
  111. package/dist/core/extensions/builtin/prompt-preset/glm-5-2.d.ts +1 -1
  112. package/dist/core/extensions/builtin/prompt-preset/glm-5-2.d.ts.map +1 -1
  113. package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js +2 -11
  114. package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js.map +1 -1
  115. package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts +1 -1
  116. package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js +2 -11
  118. package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js.map +1 -1
  119. package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts +4 -0
  120. package/dist/core/extensions/builtin/prompt-preset/glm-5.d.ts.map +1 -0
  121. package/dist/core/extensions/builtin/prompt-preset/glm-5.js +16 -0
  122. package/dist/core/extensions/builtin/prompt-preset/glm-5.js.map +1 -0
  123. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +1 -5
  124. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  125. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +1 -6
  126. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  127. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +123 -0
  128. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -0
  129. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +202 -0
  130. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -0
  131. package/dist/core/extensions/builtin/prompt-preset/gpt-eval-routing.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/prompt-preset/gpt-eval-routing.js +1 -2
  133. package/dist/core/extensions/builtin/prompt-preset/gpt-eval-routing.js.map +1 -1
  134. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +60 -76
  136. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  137. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  138. package/dist/core/extensions/builtin/prompt-preset/presets.js +17 -0
  139. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  140. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  141. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  143. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  144. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  145. package/dist/core/extensions/builtin/terminal/extension.js +5 -2
  146. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  147. package/dist/core/extensions/builtin/terminal/prompt.d.ts +13 -2
  148. package/dist/core/extensions/builtin/terminal/prompt.d.ts.map +1 -1
  149. package/dist/core/extensions/builtin/terminal/prompt.js +18 -7
  150. package/dist/core/extensions/builtin/terminal/prompt.js.map +1 -1
  151. package/dist/core/extensions/builtin/tool-search/native-search.d.ts +1 -1
  152. package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/tool-search/native-search.js +1 -1
  154. package/dist/core/extensions/builtin/tool-search/native-search.js.map +1 -1
  155. package/dist/core/extensions/builtin/ttsr/detectors/collapse-paragraphs.d.ts +34 -0
  156. package/dist/core/extensions/builtin/ttsr/detectors/collapse-paragraphs.d.ts.map +1 -0
  157. package/dist/core/extensions/builtin/ttsr/detectors/collapse-paragraphs.js +121 -0
  158. package/dist/core/extensions/builtin/ttsr/detectors/collapse-paragraphs.js.map +1 -0
  159. package/dist/core/extensions/builtin/ttsr/detectors/collapse.d.ts +2 -0
  160. package/dist/core/extensions/builtin/ttsr/detectors/collapse.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/ttsr/detectors/collapse.js +6 -2
  162. package/dist/core/extensions/builtin/ttsr/detectors/collapse.js.map +1 -1
  163. package/dist/core/session-manager.d.ts.map +1 -1
  164. package/dist/core/session-manager.js +18 -1
  165. package/dist/core/session-manager.js.map +1 -1
  166. package/dist/core/settings-manager.d.ts +0 -4
  167. package/dist/core/settings-manager.d.ts.map +1 -1
  168. package/dist/core/settings-manager.js +0 -6
  169. package/dist/core/settings-manager.js.map +1 -1
  170. package/dist/modes/print-mode.d.ts.map +1 -1
  171. package/dist/modes/print-mode.js +9 -0
  172. package/dist/modes/print-mode.js.map +1 -1
  173. package/dist/modes/rpc/connection-handler.d.ts +2 -0
  174. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  175. package/dist/modes/rpc/connection-handler.js +71 -12
  176. package/dist/modes/rpc/connection-handler.js.map +1 -1
  177. package/dist/modes/rpc/custom-capability.d.ts +5 -0
  178. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  179. package/dist/modes/rpc/custom-capability.js +5 -0
  180. package/dist/modes/rpc/custom-capability.js.map +1 -1
  181. package/dist/modes/rpc/login-prompts.d.ts +24 -0
  182. package/dist/modes/rpc/login-prompts.d.ts.map +1 -0
  183. package/dist/modes/rpc/login-prompts.js +44 -0
  184. package/dist/modes/rpc/login-prompts.js.map +1 -0
  185. package/dist/modes/rpc/media-placeholders.d.ts +49 -0
  186. package/dist/modes/rpc/media-placeholders.d.ts.map +1 -0
  187. package/dist/modes/rpc/media-placeholders.js +151 -0
  188. package/dist/modes/rpc/media-placeholders.js.map +1 -0
  189. package/dist/modes/rpc/multi-session-host.js +3 -0
  190. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  191. package/dist/modes/rpc/rpc-client.d.ts +8 -0
  192. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  193. package/dist/modes/rpc/rpc-client.js +11 -0
  194. package/dist/modes/rpc/rpc-client.js.map +1 -1
  195. package/dist/modes/rpc/rpc-types.d.ts +23 -1
  196. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  197. package/dist/modes/rpc/rpc-types.js +1 -0
  198. package/dist/modes/rpc/rpc-types.js.map +1 -1
  199. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  200. package/dist/modes/rpc/session-command-router.js +2 -1
  201. package/dist/modes/rpc/session-command-router.js.map +1 -1
  202. package/dist/modes/rpc/session-event-fanout.d.ts +13 -2
  203. package/dist/modes/rpc/session-event-fanout.d.ts.map +1 -1
  204. package/dist/modes/rpc/session-event-fanout.js +36 -12
  205. package/dist/modes/rpc/session-event-fanout.js.map +1 -1
  206. package/dist/modes/rpc/session-event-writer.d.ts +3 -1
  207. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  208. package/dist/modes/rpc/session-event-writer.js +23 -13
  209. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  210. package/dist/modes/rpc/socket-event-fanout.d.ts +8 -1
  211. package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -1
  212. package/dist/modes/rpc/socket-event-fanout.js +32 -9
  213. package/dist/modes/rpc/socket-event-fanout.js.map +1 -1
  214. package/docs/rpc.md +104 -0
  215. package/docs/settings.md +5 -27
  216. package/docs/windows.md +1 -1
  217. package/node_modules/@anthropic-ai/claude-agent-sdk/bridge.d.ts +18 -1
  218. package/node_modules/@anthropic-ai/claude-agent-sdk/bridge.mjs +155 -106
  219. package/node_modules/@anthropic-ai/claude-agent-sdk/browser-sdk.js +144 -83
  220. package/node_modules/@anthropic-ai/claude-agent-sdk/manifest.json +21 -32
  221. package/node_modules/@anthropic-ai/claude-agent-sdk/manifest.zst.json +25 -36
  222. package/node_modules/@anthropic-ai/claude-agent-sdk/package.json +2 -2
  223. package/node_modules/@anthropic-ai/claude-agent-sdk/sdk-tools.d.ts +93 -31
  224. package/node_modules/@anthropic-ai/claude-agent-sdk/sdk.d.ts +473 -31
  225. package/node_modules/@anthropic-ai/claude-agent-sdk/sdk.mjs +140 -93
  226. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +38 -0
  227. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  228. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +17 -0
  229. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +6 -0
  230. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.d.ts +10 -0
  231. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.js +126 -0
  232. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +14 -6
  233. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +2 -0
  234. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +1 -0
  235. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  236. package/node_modules/@earendil-works/pi-ai/dist/api/context-room.d.ts +20 -0
  237. package/node_modules/@earendil-works/pi-ai/dist/api/context-room.d.ts.map +1 -0
  238. package/node_modules/@earendil-works/pi-ai/dist/api/context-room.js +40 -0
  239. package/node_modules/@earendil-works/pi-ai/dist/api/context-room.js.map +1 -0
  240. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts +1 -3
  241. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
  242. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +2 -16
  243. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
  244. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts +16 -3
  245. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.d.ts.map +1 -1
  246. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js +40 -6
  247. package/node_modules/@earendil-works/pi-ai/dist/auth/pool/slots.js.map +1 -1
  248. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.d.ts +8 -0
  249. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.d.ts.map +1 -1
  250. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.js.map +1 -1
  251. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  252. package/node_modules/@earendil-works/pi-ai/dist/models.js +3 -2
  253. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  254. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  255. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  256. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  257. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  258. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  259. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  260. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  261. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  262. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  263. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +2 -0
  264. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  265. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  266. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  267. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  268. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  269. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentSession - Core abstraction for agent lifecycle and session management.\n *\n * This class is shared between all run modes (interactive, print, rpc).\n * It encapsulates:\n * - Agent state access\n * - Event subscription with automatic session persistence\n * - Model and thinking level management\n * - Compaction (manual and auto)\n * - Bash execution\n * - Session switching and branching\n *\n * Modes use this class and add their own I/O layer on top.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { basename, dirname } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport type {\n\tAgent,\n\tAgentContinuationOptions,\n\tAgentEvent,\n\tAgentMessage,\n\tAgentState,\n\tAgentTool,\n\tAgentToolCall,\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tPreparedAgentToolCall,\n\tPrepareNextTurnContext,\n\tThinkingLevel,\n} from \"@earendil-works/pi-agent-core\";\nimport { ProviderRetryWatchdogAbortError, prepareAgentToolCall } from \"@earendil-works/pi-agent-core\";\nimport {\n\tcontentText,\n\tmeasureCursorHistorySerializedBytes,\n\tSERVER_FALLBACK_ABORTED_DIAGNOSTIC,\n\ttype ThinkingSelection,\n} from \"@earendil-works/pi-ai\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tAuthResult,\n\tContext,\n\tImageContent,\n\tMessage,\n\tModel,\n\tProviderHeaders,\n\tSimpleStreamOptions,\n\tTextContent,\n\tUsage,\n} from \"@earendil-works/pi-ai/compat\";\nimport {\n\tcleanupSessionResources,\n\tcursorOverflowCompactionSettings,\n\tisClassifierRefusal,\n\tisContextOverflow,\n\tisCursorPayloadResourceExhausted,\n\tisCursorQuotaResourceExhausted,\n\tisCursorZeroTokenResourceExhausted,\n\tisProviderStreamStallError,\n\tisProviderTimeoutError,\n\tisRecoverableLength,\n\tisRetryableAssistantError,\n\tmodelsAreEqual,\n\ttype RetryCallbacks,\n\tresetApiProviders,\n\tshouldRetryOverflowWithoutCompact,\n\tstreamSimple,\n} from \"@earendil-works/pi-ai/compat\";\nimport { extract429RetryAfterMs, parseRetryAfterMsMarker } from \"@earendil-works/pi-ai/utils/retry-hint\";\nimport { retryBackoffDelayMs } from \"@earendil-works/pi-ai/utils/retry-profile/backoff\";\nimport { getAgentDir } from \"../config.ts\";\nimport { getThemeByName, theme } from \"../modes/interactive/theme/theme.ts\";\nimport { stripFrontmatter } from \"../utils/frontmatter.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { sleep } from \"../utils/sleep.ts\";\nimport { normalizeToolResultImages } from \"../utils/tool-result-images.ts\";\nimport { AgentAbortProvenance, type AgentAbortSource } from \"./agent-abort-provenance.ts\";\nimport {\n\tAgentSettledDelivery,\n\ttype DeferredAgentSettledAction,\n\ttype DeferredTurnClaim,\n} from \"./agent-settled-delivery.ts\";\nimport { formatNoApiKeyFoundMessage, formatNoModelSelectedMessage } from \"./auth-guidance.ts\";\nimport { type BashResult, executeBashWithOperations } from \"./bash-executor.ts\";\nimport { envValue } from \"./brand.ts\";\nimport {\n\ttype CacheFriendlySummaryOptions,\n\ttype CompactionPreparation,\n\ttype CompactionResult,\n\tcalculateContextTokens,\n\tcollectEntriesForBranchSummary,\n\tcompact,\n\testimateContextTokens,\n\testimateTokens,\n\tgenerateBranchSummary,\n\tprepareCompaction,\n\tresolveThresholdContextTokens,\n\tshouldCompact,\n} from \"./compaction/index.ts\";\nimport { CompactionLifecycleCoordinator, type CompactionLifecycleState } from \"./compaction/lifecycle.ts\";\nimport { isWarmSummaryAnchorValid } from \"./compaction/warm-anchor.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport { type BuildDynamicSystemPromptOptions, buildDynamicSystemPrompt } from \"./dynamic-prompt/index.ts\";\nimport { areExperimentalFeaturesEnabled } from \"./experimental.ts\";\nimport { exportSessionToHtml, type ToolHtmlRenderer } from \"./export-html/index.ts\";\nimport { createToolHtmlRenderer } from \"./export-html/tool-renderer.ts\";\nimport {\n\tModelUsabilityBudgetError,\n\tprojectModelUsabilityBudget,\n} from \"./extensions/builtin/compaction/model-usability-budget.ts\";\nimport { resolveReserveTokens } from \"./extensions/builtin/compaction/policy.ts\";\nimport { WAKE_SOURCE_STATE_EVENT } from \"./extensions/builtin/monitor-state-event.ts\";\nimport { CODEX_RESPONSES_API, type ServiceTier } from \"./extensions/builtin/service-tier.ts\";\nimport { deriveExtensionRegistrationId } from \"./extensions/builtin/tool-search/engine/marker.ts\";\nimport { getToolSearchService } from \"./extensions/builtin/tool-search/service.ts\";\nimport {\n\ttype ContextUsage,\n\tExecuteToolError,\n\ttype ExecuteToolOptions,\n\ttype ExtensionCommandContextActions,\n\ttype ExtensionErrorListener,\n\ttype ExtensionMode,\n\tExtensionRunner,\n\ttype ExtensionToolHookLifecycleEvent,\n\ttype ExtensionUIContext,\n\ttype InputSource,\n\ttype MessageEndEvent,\n\ttype MessageStartEvent,\n\ttype MessageUpdateEvent,\n\ttype ReplacedSessionContext,\n\ttype SessionBeforeCompactResult,\n\ttype SessionBeforeTreeResult,\n\ttype SessionCompactFailedEvent,\n\ttype SessionStartEvent,\n\ttype ShutdownHandler,\n\ttype SystemPromptChangeEvent,\n\ttype ToolDefinition,\n\ttype ToolExecutionEndEvent,\n\ttype ToolExecutionStartEvent,\n\ttype ToolExecutionUpdateEvent,\n\ttype ToolInfo,\n\ttype TreePreparation,\n\ttype TurnEndEvent,\n\ttype TurnStartEvent,\n\twrapRegisteredTools,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport type {\n\tApplyCompactionOptions,\n\tApplyCompactionResult,\n\tCompactionReason,\n\tCompactionRejectionCause,\n\tLazyToolActivator,\n\tModelSelectSource,\n} from \"./extensions/types.ts\";\nimport { normalizeToolExposure, RUNTIME_EXTENSION_PATH } from \"./extensions/types.ts\";\nimport { shouldWarnHighReasoning } from \"./high-reasoning-warning.ts\";\nimport {\n\ttype BashExecutionMessage,\n\ttype CustomMessage,\n\tconvertToLlm,\n\tfilterContextExcludedMessages,\n} from \"./messages.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { type AvailableModelsSource, getModelNarrowingPatterns, resolveModelScope } from \"./model-resolver.ts\";\nimport type { ModelRuntime } from \"./model-runtime.ts\";\nimport { PROMPT_CACHE_SAFE_WAIT_ENV, resolvePromptCacheSafeWaitSeconds } from \"./prompt-cache-budget.ts\";\nimport { expandPromptTemplateWithMetadata, type PromptTemplate } from \"./prompt-templates.ts\";\nimport { createProviderTimeoutRetryPlan, runBoundedRetryContinuation } from \"./provider-timeout-retry.ts\";\nimport type { ResourceExtensionPaths, ResourceLoader } from \"./resource-loader.ts\";\nimport { isBillingErrorMessage } from \"./retry-fallback/billing.ts\";\nimport { formatSelector } from \"./retry-fallback/chains.ts\";\nimport { RetryFallbackController } from \"./retry-fallback/controller.ts\";\nimport { SelectorCooldowns } from \"./retry-fallback/cooldown.ts\";\nimport {\n\tclassifyRateLimitedWait,\n\tdegradeWithoutFallback,\n\ttype HintTier,\n\tnextInTurnDelayMs,\n\ttype ProbePhase,\n\tprobeBackSchedule,\n} from \"./retry-fallback/hint-policy.ts\";\nimport { createFallbackLogger } from \"./retry-fallback/log.ts\";\nimport { ProbeBackScheduler } from \"./retry-fallback/probe-scheduler.ts\";\nimport { validateFallbackChains } from \"./retry-fallback/validate.ts\";\nimport { isSessionBusySnapshot, type SessionActivitySnapshot, WakeSourceTracker } from \"./session-activity.ts\";\nimport { createSessionLogger, type SessionLogger } from \"./session-log.ts\";\nimport type { BranchSummaryEntry, CompactionEntry, SessionEntry, SessionManager } from \"./session-manager.ts\";\nimport {\n\tbuildSessionContext,\n\tCURRENT_SESSION_VERSION,\n\tgetLatestCompactionEntry,\n\ttype SessionHeader,\n} from \"./session-manager.ts\";\nimport { generateSessionTitle, sessionTitleRetryPolicy, shouldSkipSessionTitle } from \"./session-title-generator.ts\";\nimport { SessionWorkBarrier } from \"./session-work-barrier.ts\";\nimport type { SettingsManager, SettingsSourceSelection } from \"./settings-manager.ts\";\nimport type { SlashCommandInfo } from \"./slash-commands.ts\";\nimport { createSyntheticSourceInfo, type SourceInfo } from \"./source-info.ts\";\nimport { getSupportedThinkingLevels, supportsMax, supportsXhigh } from \"./thinking-levels.ts\";\nimport { resetTimings, time } from \"./timings.ts\";\nimport { type BashOperations, createLocalBashOperations } from \"./tools/bash.ts\";\nimport { composeFilesystemPolicies } from \"./tools/filesystem-policy.ts\";\nimport { createAllToolDefinitions, temporarilyDisabledToolNames } from \"./tools/index.ts\";\nimport { createToolDefinitionFromAgentTool } from \"./tools/tool-definition-wrapper.ts\";\nimport { addUsageToTotals, createUsageTotals } from \"./usage-totals.ts\";\n\n/** Built-in shell tools routed exclusively through eval when experimental.bashEvalOnly is enabled. */\nconst EVAL_ONLY_SHELL_TOOL_NAMES: readonly string[] = [\"bash\", \"powershell\"];\n/** Workflow tool routed exclusively through eval when experimental.workflowEvalOnly is enabled. */\nconst EVAL_ONLY_WORKFLOW_TOOL_NAMES: readonly string[] = [\"workflow\"];\n\n/** Sample eval-cell call for an eval-only tool, using the argument name that tool actually takes. */\nfunction evalHelperCall(name: string): string {\n\tif (EVAL_ONLY_SHELL_TOOL_NAMES.includes(name)) return `tool.${name}({ command: \"...\" })`;\n\tif (EVAL_ONLY_WORKFLOW_TOOL_NAMES.includes(name)) return `tool.${name}({ action: \"...\" })`;\n\treturn `tool.${name}({ ... })`;\n}\nconst TURN_RETRY_SUPPRESSION_PREFIX = \"senpi:no-turn-retry:\";\nconst DEFERRED_RETRY_QUEUE_OWNERS = new WeakSet<object>();\n\n// ============================================================================\n// Skill Invocation Formatting and Parsing\n// ============================================================================\n\nexport interface SkillInvocationPromptSkill {\n\tname: string;\n\tfilePath: string;\n\tbaseDir: string;\n\tbody: string;\n}\n\n/** Format the user-attributed payload for one or more explicit skill invocations. */\nexport function formatSkillInvocationPrompt(\n\tskills: readonly SkillInvocationPromptSkill[],\n\tuserRequest?: string,\n): string {\n\tconst skillBlocks = skills.map(\n\t\t(skill) =>\n\t\t\t`The user explicitly invoked the \"${skill.name}\" skill. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions.\\n\\n<skill-instruction name=\"${skill.name}\" location=\"${skill.filePath}\">\\nReferences are relative to ${skill.baseDir}.\\n\\n${skill.body}\\n</skill-instruction>`,\n\t);\n\tconst expandedSkills = skillBlocks.join(\"\\n\\n\");\n\treturn userRequest && /\\S/.test(userRequest)\n\t\t? `${expandedSkills}\\n\\n<user-request>\\n${userRequest}\\n</user-request>`\n\t\t: expandedSkills;\n}\n\n/** Parsed skill block from a user message */\nexport interface ParsedSkillBlock {\n\tname: string;\n\tlocation: string;\n\tcontent: string;\n\tuserMessage: string | undefined;\n}\n\n/**\n * Parse a skill block from message text.\n * Returns null if the text doesn't contain a skill block.\n */\nexport function parseSkillBlock(text: string): ParsedSkillBlock | null {\n\tconst instructionPattern =\n\t\t/^The user explicitly invoked the \"([^\"]+)\" skill\\. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions\\.\\n\\n<skill-instruction name=\"([^\"]+)\" location=\"([^\"]+)\">\\n([\\s\\S]*?)\\n<\\/skill-instruction>/;\n\tconst instructionMatch = text.match(instructionPattern);\n\tif (instructionMatch) {\n\t\tif (instructionMatch[1] !== instructionMatch[2]) return null;\n\t\tlet remainder = text.slice(instructionMatch[0].length);\n\t\twhile (remainder.startsWith(\"\\n\\nThe user explicitly invoked the \")) {\n\t\t\tconst chainedMatch = remainder.slice(2).match(instructionPattern);\n\t\t\tif (!chainedMatch || chainedMatch[1] !== chainedMatch[2]) return null;\n\t\t\tremainder = remainder.slice(chainedMatch[0].length + 2);\n\t\t}\n\t\tconst requestMatch = remainder.match(/^\\n\\n<user-request>\\n([\\s\\S]*?)\\n<\\/user-request>$/);\n\t\tif (remainder && !requestMatch) return null;\n\t\treturn {\n\t\t\tname: instructionMatch[1],\n\t\t\tlocation: instructionMatch[3],\n\t\t\tcontent: instructionMatch[4],\n\t\t\tuserMessage: requestMatch?.[1].trim() || undefined,\n\t\t};\n\t}\n\n\tconst legacyMatch = text.match(\n\t\t/^<skill name=\"([^\"]+)\" location=\"([^\"]+)\">\\n([\\s\\S]*?)\\n<\\/skill>(?:\\n\\n([\\s\\S]+))?$/,\n\t);\n\tif (!legacyMatch) return null;\n\treturn {\n\t\tname: legacyMatch[1],\n\t\tlocation: legacyMatch[2],\n\t\tcontent: legacyMatch[3],\n\t\tuserMessage: legacyMatch[4]?.trim() || undefined,\n\t};\n}\n\nexport type SkillInvocationSyntax = \"dollar\" | \"slash\";\n\nexport interface CommandInvocation {\n\tname: string;\n\tsource: \"extension\" | \"prompt\";\n\tsourceInfo: SourceInfo;\n\tsyntax: \"slash\";\n}\n\nexport interface SkillInvocationToken {\n\tname: string;\n\tsyntax: SkillInvocationSyntax;\n\tstart: number;\n\tend: number;\n\tposition: \"inline\" | \"leading\";\n}\n\nexport const MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT = 64;\n\nconst LEADING_SKILL_INVOCATION_PATTERN = /^(?:\\/skill:([a-zA-Z][a-zA-Z0-9:_-]*)|\\$([a-zA-Z][a-zA-Z0-9:_-]*))(?=\\s|$)/;\nconst INLINE_DOLLAR_SKILL_INVOCATION_PATTERN = /(^|\\s)\\$skill:([a-zA-Z][a-zA-Z0-9:_-]*)(?=\\s|$)/g;\n\n/**\n * Find explicit skill invocation tokens without treating ordinary inline dollar\n * prose (for example `$HOME`) as executable.\n *\n * Leading runs accept `/skill:name`, `$name`, and `$skill:name`. Outside the\n * leading run only the desktop's explicit `$skill:name` token is executable.\n */\nexport function parseSkillInvocationTokens(text: string): SkillInvocationToken[] {\n\tconst tokens: SkillInvocationToken[] = [];\n\tlet cursor = 0;\n\n\twhile (cursor < text.length) {\n\t\twhile (cursor < text.length && /\\s/.test(text[cursor]!)) cursor++;\n\t\tconst match = text.slice(cursor).match(LEADING_SKILL_INVOCATION_PATTERN);\n\t\tif (!match) break;\n\t\tconst syntax: SkillInvocationSyntax = match[1] ? \"slash\" : \"dollar\";\n\t\tconst dollarName = match[2];\n\t\tconst name = match[1] ?? (dollarName?.startsWith(\"skill:\") ? dollarName.slice(\"skill:\".length) : dollarName);\n\t\tif (!name) break;\n\t\ttokens.push({\n\t\t\tname,\n\t\t\tsyntax,\n\t\t\tstart: cursor,\n\t\t\tend: cursor + match[0].length,\n\t\t\tposition: \"leading\",\n\t\t});\n\t\tif (tokens.length >= MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT) return tokens;\n\t\tcursor += match[0].length;\n\t}\n\n\tINLINE_DOLLAR_SKILL_INVOCATION_PATTERN.lastIndex = cursor;\n\tfor (const match of text.matchAll(INLINE_DOLLAR_SKILL_INVOCATION_PATTERN)) {\n\t\tconst start = (match.index ?? 0) + match[1].length;\n\t\ttokens.push({\n\t\t\tname: match[2],\n\t\t\tsyntax: \"dollar\",\n\t\t\tstart,\n\t\t\tend: start + `$skill:${match[2]}`.length,\n\t\t\tposition: \"inline\",\n\t\t});\n\t\tif (tokens.length >= MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT) break;\n\t}\n\n\treturn tokens;\n}\n\nfunction stripLeadingInvocationSeparators(text: string): string {\n\tlet cursor = 0;\n\twhile (text[cursor] === \" \" || text[cursor] === \"\\t\") cursor++;\n\twhile (text[cursor] === \"\\n\" || (text[cursor] === \"\\r\" && text[cursor + 1] === \"\\n\")) {\n\t\tcursor += text[cursor] === \"\\r\" ? 2 : 1;\n\t\tconst lineStart = cursor;\n\t\twhile (text[cursor] === \" \" || text[cursor] === \"\\t\") cursor++;\n\t\tif (text[cursor] !== \"\\n\" && !(text[cursor] === \"\\r\" && text[cursor + 1] === \"\\n\")) {\n\t\t\treturn text.slice(lineStart);\n\t\t}\n\t}\n\treturn text.slice(cursor);\n}\n\nfunction removeSkillInvocationTokens(text: string, tokens: readonly SkillInvocationToken[]): string {\n\tlet cursor = 0;\n\tlet result = \"\";\n\tfor (const token of tokens) {\n\t\tresult += text.slice(cursor, token.start);\n\t\tcursor = token.end;\n\t\tif (\n\t\t\ttoken.position === \"inline\" &&\n\t\t\t(result.endsWith(\" \") || result.endsWith(\"\\t\")) &&\n\t\t\t(text[cursor] === \" \" || text[cursor] === \"\\t\")\n\t\t) {\n\t\t\tcursor++;\n\t\t}\n\t}\n\tresult += text.slice(cursor);\n\treturn tokens.some((token) => token.position === \"leading\") ? stripLeadingInvocationSeparators(result) : result;\n}\n\n/** Session-specific events that extend the core AgentEvent */\ntype AgentSessionAgentEndEvent = Extract<AgentEvent, { type: \"agent_end\" }> & {\n\twillRetry: boolean;\n};\n\nexport type AgentSessionEvent =\n\t| Exclude<AgentEvent, { type: \"agent_end\" }>\n\t| AgentSessionAgentEndEvent\n\t| { type: \"agent_settled\" }\n\t| { type: \"agent_idle\" }\n\t| { type: \"session_abort\" }\n\t| { type: \"continuation_error\"; errorMessage: string }\n\t| {\n\t\t\ttype: \"skill_invocation\";\n\t\t\tskills: readonly {\n\t\t\t\tname: string;\n\t\t\t\tpath: string;\n\t\t\t\tsyntax: SkillInvocationSyntax;\n\t\t\t}[];\n\t }\n\t| {\n\t\t\ttype: \"command_invocation\";\n\t\t\tcommand: CommandInvocation;\n\t }\n\t| {\n\t\t\ttype: \"queue_update\";\n\t\t\tsteering: readonly string[];\n\t\t\tfollowUp: readonly string[];\n\t\t\tordered: readonly { text: string; mode: \"steer\" | \"followUp\"; enqueueOrder: number }[];\n\t }\n\t| { type: \"compaction_start\"; reason: CompactionReason; requestId?: string }\n\t| {\n\t\t\ttype: \"compaction_progress\";\n\t\t\treason: CompactionReason;\n\t\t\tdelta?: string;\n\t\t\ttext?: string;\n\t }\n\t| { type: \"entry_appended\"; entry: SessionEntry }\n\t| { type: \"session_info_changed\"; name: string | undefined }\n\t| ExtensionToolHookLifecycleEvent\n\t| SystemPromptChangeEvent\n\t| { type: \"thinking_level_changed\"; level: ThinkingLevel }\n\t| {\n\t\t\ttype: \"high_reasoning_warning\";\n\t\t\tmodelId: string;\n\t\t\tprovider: string;\n\t\t\tthinkingLevel: ThinkingLevel;\n\t }\n\t| ({ type: \"settings_source_selected\" } & SettingsSourceSelection)\n\t/** Active model changed; `thinkingLevel` is the level in force AFTER the switch. */\n\t| {\n\t\t\ttype: \"model_changed\";\n\t\t\tmodel: Model<any>;\n\t\t\tthinkingLevel: ThinkingLevel;\n\t\t\tsource: ModelSelectSource;\n\t }\n\t/** Effective service tier or fast-mode state changed. */\n\t| { type: \"service_tier_changed\"; tier?: ServiceTier; fastMode: boolean }\n\t| {\n\t\t\ttype: \"session_settings_changed\";\n\t\t\tsteeringMode: \"all\" | \"one-at-a-time\";\n\t\t\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\t\t\tautoCompactionEnabled: boolean;\n\t }\n\t| {\n\t\t\ttype: \"compaction_end\";\n\t\t\treason: CompactionReason;\n\t\t\tresult: CompactionResult | undefined;\n\t\t\taborted: boolean;\n\t\t\twillRetry: boolean;\n\t\t\trequestId?: string;\n\t\t\taccepted?: boolean;\n\t\t\trejectionCause?: CompactionRejectionCause;\n\t\t\terrorMessage?: string;\n\t }\n\t| {\n\t\t\ttype: \"auto_retry_start\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdelayMs: number;\n\t\t\terrorMessage: string;\n\t }\n\t| {\n\t\t\ttype: \"auto_retry_end\";\n\t\t\tsuccess: boolean;\n\t\t\tattempt: number;\n\t\t\tfinalError?: string;\n\t }\n\t| {\n\t\t\ttype: \"retry_fallback_applied\";\n\t\t\tfrom: string;\n\t\t\tto: string;\n\t\t\tchainKey: string;\n\t\t\treason: \"transient\" | \"refusal\" | \"hard-error\" | \"billing\";\n\t }\n\t| { type: \"retry_fallback_succeeded\"; model: string; chainKey: string }\n\t| { type: \"retry_fallback_reverted\"; from: string; to: string }\n\t| { type: \"retry_fallback_exhausted\"; chainKey: string; lastError: string }\n\t| {\n\t\t\ttype: \"server_fallback_aborted\";\n\t\t\tfrom: string;\n\t\t\tto: string;\n\t\t\tchainConfigured: boolean;\n\t }\n\t// Auth login flow (task 13) is additive with event-only completion. The\n\t// login_start command responds immediately, then the OAuth URL and the\n\t// terminal result arrive here, because an interactive browser round-trip\n\t// cannot fit inside the request timeout.\n\t| { type: \"auth_login_url\"; provider: string; url: string }\n\t| {\n\t\t\ttype: \"auth_login_end\";\n\t\t\tprovider: string;\n\t\t\tsuccess: boolean;\n\t\t\terror?: string;\n\t }\n\t| {\n\t\t\ttype: \"summarization_retry_scheduled\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdelayMs: number;\n\t\t\terrorMessage: string;\n\t }\n\t| { type: \"summarization_retry_attempt_start\"; source: \"branchSummary\" }\n\t| {\n\t\t\ttype: \"summarization_retry_attempt_start\";\n\t\t\tsource: \"compaction\";\n\t\t\treason: CompactionReason;\n\t }\n\t| { type: \"summarization_retry_finished\" }\n\t| {\n\t\t\ttype: \"retry_probe_scheduled\";\n\t\t\tselector: string;\n\t\t\tatMs: number;\n\t\t\tprobeIndex: 1 | 2;\n\t }\n\t| {\n\t\t\ttype: \"retry_probe_result\";\n\t\t\tselector: string;\n\t\t\tok: boolean;\n\t\t\terrorMessage?: string;\n\t }\n\t| { type: \"bash_execution_update\"; id?: string; delta: string };\n\n/** Listener function for agent session events */\nexport type AgentSessionEventListener = (event: AgentSessionEvent) => void;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nfunction withoutDeletedHeaders(headers: ProviderHeaders | undefined): Record<string, string> | undefined {\n\treturn headers\n\t\t? Object.fromEntries(Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== null))\n\t\t: undefined;\n}\n\nexport interface AgentSessionConfig {\n\tagent: Agent;\n\tsessionManager: SessionManager;\n\tsettingsManager: SettingsManager;\n\tcwd: string;\n\t/** Directory containing runtime logs and global agent configuration. */\n\tagentDir?: string;\n\t/** Clock override for fallback selector cooldowns (tests only). */\n\tfallbackNow?: () => number;\n\t/** Random source for retry jitter (tests only). */\n\tretryRandom?: () => number;\n\t/** Global model narrowing for selectors and startup model choice (from --models / enabledModels) */\n\tscopedModels?: Array<{\n\t\tmodel: Model<any>;\n\t\tthinkingLevel?: ThinkingLevel;\n\t\tthinkingSelection?: ThinkingSelection;\n\t\tserviceTier?: ServiceTier;\n\t}>;\n\t/** Favorite models to cycle through with Ctrl+P */\n\tfavoriteModels?: Array<{\n\t\tmodel: Model<any>;\n\t\tthinkingLevel?: ThinkingLevel;\n\t\tthinkingSelection?: ThinkingSelection;\n\t\tserviceTier?: ServiceTier;\n\t}>;\n\t/** Resource loader for extensions, skills, prompts, themes, context files, and system prompt */\n\tresourceLoader: ResourceLoader;\n\t/** SDK custom tools registered outside extensions */\n\tcustomTools?: ToolDefinition[];\n\t/** Canonical model/auth runtime used by coding-agent internals. */\n\tmodelRuntime?: ModelRuntime;\n\t/** Legacy model facade retained for extensions and SDK consumers. */\n\tmodelRegistry?: ModelRegistry;\n\t/** Initial active built-in tool names. Default: [read, bash, edit, write] */\n\tinitialActiveToolNames?: string[];\n\t/** Configured built-in defaults; fork-native builtin extension tools outside this set are omitted. */\n\tdefaultToolNames?: string[];\n\t/** Tool names that remain executable only through the registered eval tool. */\n\tevalOnlyToolNames?: string[];\n\t/** Optional allowlist of tool names. When provided, only these tool names are exposed. */\n\tallowedToolNames?: string[];\n\t/** Optional denylist of tool names. When provided, these tool names are not exposed. */\n\texcludedToolNames?: string[];\n\t/**\n\t * Override base tools (useful for custom runtimes).\n\t *\n\t * These are synthesized into minimal ToolDefinitions internally so AgentSession can keep\n\t * a definition-first registry even when callers provide plain AgentTool instances.\n\t */\n\tbaseToolsOverride?: Record<string, AgentTool>;\n\t/** Mutable ref used by Agent to access the current ExtensionRunner */\n\textensionRunnerRef?: { current?: ExtensionRunner };\n\t/** Session start event metadata emitted when extensions bind to this runtime. */\n\tsessionStartEvent?: SessionStartEvent;\n\tautoTitleSessions?: boolean;\n}\n\ntype SessionModelEntry = {\n\tmodel: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tthinkingSelection?: ThinkingSelection;\n\tserviceTier?: ServiceTier;\n};\n\ninterface CompactionExecutionRequest {\n\tcontroller: AbortController;\n\towner: \"auto\" | \"compaction\";\n\treason: CompactionReason;\n\trequestId?: string;\n\tcustomInstructions?: string;\n\twillRetry: boolean;\n\tskipAbortedCheck?: boolean;\n\tlastAssistantMessage?: AgentMessage;\n\tprecomputed?: CompactionResult;\n\tallowSummaryOnly?: boolean;\n\tagentMessagesAtStart?: readonly AgentMessage[];\n}\n\ntype CompactionExecutionResult =\n\t| {\n\t\t\taccepted: true;\n\t\t\trequestId: string;\n\t\t\tresult: CompactionResult;\n\t\t\tcompactionEntry: CompactionEntry;\n\t\t\tfromExtension: boolean;\n\t }\n\t| {\n\t\t\taccepted: false;\n\t\t\trequestId: string;\n\t\t\trejectionCause: CompactionRejectionCause;\n\t };\n\ntype PendingCompactionAdmission = {\n\treadonly controller: AbortController;\n\treadonly finishSessionWork: () => void;\n\toutcome?: \"completed\" | \"failed\" | \"aborted\";\n};\n\nfunction isCompactionOwnedPreCompactDiagnostic(message: AgentMessage, requestId: string): boolean {\n\tif (message.role !== \"custom\" || message.customType !== \"senpi.hook\") return false;\n\tconst details = message.details;\n\tif (!details || typeof details !== \"object\") return false;\n\tconst diagnostic = details as {\n\t\tevent?: unknown;\n\t\tcompactionRequestId?: unknown;\n\t};\n\treturn diagnostic.event === \"PreCompact\" && diagnostic.compactionRequestId === requestId;\n}\n\n/**\n * Human-readable rejection message paired with a `CompactionRejectionCause`.\n *\n * Kept exhaustive over the union so the compiler flags any new cause that would\n * otherwise reintroduce silent failures at the `compaction_end` UI seam.\n */\nfunction describeCompactionRejection(cause: CompactionRejectionCause): string {\n\tswitch (cause) {\n\t\tcase \"would-overflow\":\n\t\t\treturn \"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.\";\n\t\tcase \"cancelled-by-extension\":\n\t\t\treturn \"Compaction rejected: cancelled by an extension.\";\n\t\tcase \"external-owner\":\n\t\t\treturn \"Compaction rejected: the active provider owns compaction for this session.\";\n\t\tcase \"circuit-breaker\":\n\t\t\treturn \"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.\";\n\t\tcase \"per-turn-cap\":\n\t\t\t// Historical cause identifier kept for extension-API stability; since the\n\t\t\t// per-turn soft cap was removed it fires only at the absolute session cap.\n\t\t\treturn \"Compaction rejected: absolute compaction cap reached for this session.\";\n\t\tcase \"stale-revision\":\n\t\t\treturn \"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context.\";\n\t}\n}\n\nclass CompactionRejectedError extends Error {\n\treadonly rejectionCause: CompactionRejectionCause;\n\n\tconstructor(rejectionCause: CompactionRejectionCause) {\n\t\tsuper(\n\t\t\trejectionCause === \"cancelled-by-extension\"\n\t\t\t\t? \"Compaction cancelled\"\n\t\t\t\t: describeCompactionRejection(rejectionCause),\n\t\t);\n\t\tthis.name = \"CompactionRejectedError\";\n\t\tthis.rejectionCause = rejectionCause;\n\t}\n}\n\nclass CompactionCancelledError extends Error {\n\tconstructor() {\n\t\tsuper(\"Compaction cancelled\");\n\t\tthis.name = \"CompactionCancelledError\";\n\t}\n}\n\n/**\n * An execution failure annotated with whether this operation still owns its\n * terminal transition. Callers must not publish a terminal event for an\n * operation that a newer compaction generation has superseded.\n */\nclass CompactionExecutionError extends Error {\n\treadonly ownsTerminalTransition: boolean;\n\treadonly aborted: boolean;\n\n\tconstructor(error: unknown, ownsTerminalTransition: boolean, aborted: boolean) {\n\t\tsuper(error instanceof Error ? error.message : String(error));\n\t\tthis.name = \"CompactionExecutionError\";\n\t\tthis.ownsTerminalTransition = ownsTerminalTransition;\n\t\tthis.aborted = aborted;\n\t}\n}\n\nfunction compactionExecutionOwnsTerminalTransition(error: unknown): boolean {\n\treturn !(error instanceof CompactionExecutionError) || error.ownsTerminalTransition;\n}\n\nfunction isCompactionExecutionAborted(error: unknown): boolean {\n\treturn (\n\t\t(error instanceof CompactionExecutionError && error.aborted) ||\n\t\terror instanceof CompactionCancelledError ||\n\t\t(error instanceof Error && error.name === \"AbortError\")\n\t);\n}\n\nclass RequiredCompactionError extends Error {\n\tconstructor() {\n\t\tsuper(\"Context remains above the compaction threshold because compaction did not complete\");\n\t\tthis.name = \"RequiredCompactionError\";\n\t}\n}\n\nclass MissingModelAccessError extends Error {\n\tconstructor() {\n\t\tsuper(\"AgentSession requires modelRuntime or modelRegistry\");\n\t\tthis.name = \"MissingModelAccessError\";\n\t}\n}\nexport interface ExtensionBindings {\n\tuiContext?: ExtensionUIContext;\n\tmode?: ExtensionMode;\n\tcommandContextActions?: ExtensionCommandContextActions;\n\tabortHandler?: () => void;\n\tshutdownHandler?: ShutdownHandler;\n\tonError?: ExtensionErrorListener;\n}\n\n/** Options for AgentSession.prompt() */\nexport type PromptDisposition = \"handled\" | \"queued\" | \"started\";\n\nexport type QueuedInput = {\n\treadonly text: string;\n\treadonly mode: \"steer\" | \"followUp\";\n\treadonly enqueueOrder: number;\n};\n\nexport type ClearedQueue = {\n\tsteering: string[];\n\tfollowUp: string[];\n\t/** Global enqueue order, independent of native delivery priority. */\n\treadonly ordered: readonly QueuedInput[];\n};\n\nexport interface PromptOptions {\n\t/** Whether to dispatch extension commands and expand skill commands and prompt templates (default: true) */\n\texpandPromptTemplates?: boolean;\n\t/** Image attachments */\n\timages?: ImageContent[];\n\t/** When streaming, how to queue the message: \"steer\" (interrupt) or \"followUp\" (wait). Required if streaming. */\n\tstreamingBehavior?: \"steer\" | \"followUp\";\n\t/** Session-only thinking level applied before starting this prompt. */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Source of input for extension input event handlers. Defaults to \"interactive\". */\n\tsource?: InputSource;\n\t/** Internal hook used by RPC mode to observe prompt preflight acceptance or rejection. */\n\tpreflightResult?: (success: boolean) => void;\n\t/** Internal hook used by the TUI to distinguish handled input from owned prompt work. */\n\tpromptDisposition?: (disposition: PromptDisposition) => void;\n\t/** Internal cancellation signal for a prompt that has not acquired session-work ownership yet. */\n\tsignal?: AbortSignal;\n\t/** Internal callback used by fire-and-forget extension input to retain session-work ownership after its barrier wait. */\n\tonSessionWorkReady?: () => void;\n\tsessionTitlePrompt?: string | false;\n}\n\n/** Result from cycleModel() */\nexport interface ModelCycleResult {\n\tmodel: Model<any>;\n\tthinkingLevel: ThinkingLevel;\n\t/** Whether cycling used the configured favorite model list */\n\tisScoped: boolean;\n\t/** Present when the model switch also changed the active system prompt. */\n\tsystemPromptChange?: SystemPromptChangeEvent;\n}\n\n/** Session statistics for /session command */\nexport interface SessionStats {\n\tsessionFile: string | undefined;\n\tsessionId: string;\n\tuserMessages: number;\n\tassistantMessages: number;\n\ttoolCalls: number;\n\ttoolResults: number;\n\ttotalMessages: number;\n\ttokens: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t};\n\tcost: number;\n\tcontextUsage?: ContextUsage;\n}\n\ninterface ToolDefinitionEntry {\n\tdefinition: ToolDefinition;\n\tsourceInfo: SourceInfo;\n}\n\nfunction estimateMessagesTokens(messages: AgentMessage[]): number {\n\tlet tokens = 0;\n\tfor (const message of messages) {\n\t\ttokens += estimateTokens(message);\n\t}\n\treturn tokens;\n}\n\nfunction isSameOverflowSource(\n\tmessage: AssistantMessage,\n\tmodel: Model<Api>,\n\tupstreamModelId: string | undefined,\n): boolean {\n\tif (message.provider !== model.provider) return false;\n\tif (message.model === model.id) return true;\n\treturn message.model === upstreamModelId;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Thinking levels including native max (Opus 4.6 legacy / Opus 4.7 native). */\nconst THINKING_LEVELS_WITH_MAX: ThinkingLevel[] = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\n\n/** Caps explicit skill expansion so one prompt cannot consume unbounded context. */\nexport const MAX_SKILL_EXPANSIONS_PER_PROMPT = 5;\n\n/** Cursor ingest rejects large verbatim tool payloads. The bound is UTF-8 bytes. */\nexport const CURSOR_TOOL_RESULT_MAX_CHARS = 2000;\nexport const CURSOR_TOOL_RESULT_MAX_BYTES = 50_000;\nconst CURSOR_TRUNCATION_MARKER = \"\\n...[truncated]\";\n\nexport function truncateToolResultBodies(\n\tmessages: AgentMessage[] | undefined,\n\tmaxChars = CURSOR_TOOL_RESULT_MAX_CHARS,\n\tmaxBytes = CURSOR_TOOL_RESULT_MAX_BYTES,\n\tconvert = (candidate: AgentMessage[]) => convertToLlm(candidate),\n): { messages: AgentMessage[] | undefined; changed: boolean } {\n\tif (!Array.isArray(messages) || messages.length === 0) return { messages, changed: false };\n\tconst segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\tconst markerChars = [...segmenter.segment(CURSOR_TRUNCATION_MARKER)].length;\n\tconst result = messages.slice();\n\tlet changed = false;\n\n\t// Apply the per-result character cap first, independent of the aggregate wire cap.\n\tfor (let messageIndex = result.length - 1; messageIndex >= 0; messageIndex--) {\n\t\tconst message = result[messageIndex];\n\t\tif (message.role !== \"toolResult\" || !Array.isArray(message.content)) continue;\n\t\tlet content = message.content;\n\t\tfor (let partIndex = content.length - 1; partIndex >= 0; partIndex--) {\n\t\t\tconst part = content[partIndex];\n\t\t\tif (part.type === \"image\" && typeof part.data === \"string\") continue;\n\t\t\tif (part.type !== \"text\" || typeof part.text !== \"string\") continue;\n\t\t\tconst graphemes = [...segmenter.segment(part.text)].map((item) => item.segment);\n\t\t\tif (graphemes.length <= maxChars) continue;\n\t\t\tconst kept = graphemes.slice(0, Math.max(0, maxChars - markerChars)).join(\"\");\n\t\t\tconst nextText = kept + CURSOR_TRUNCATION_MARKER;\n\t\t\tcontent = content === message.content ? content.slice() : content;\n\t\t\tcontent[partIndex] = { ...part, text: nextText };\n\t\t\tresult[messageIndex] = { ...message, content };\n\t\t\tchanged = true;\n\t\t}\n\t}\n\n\tconst measure = (candidate: AgentMessage[]): number => {\n\t\tconst converted = convert(candidate);\n\t\tconst activeUserMessageIndex = converted.at(-1)?.role === \"user\" ? converted.length - 1 : -1;\n\t\treturn measureCursorHistorySerializedBytes(converted, activeUserMessageIndex);\n\t};\n\tconst fits = (candidate = result) => measure(candidate) <= maxBytes;\n\tif (fits()) return { messages: changed ? result : messages, changed };\n\n\t// Empty the oldest result bodies. Search the monotonic prefix of candidates\n\t// rather than serializing once for every result (admission must stay bounded).\n\tconst emptyToolResult = (message: AgentMessage): AgentMessage => {\n\t\tif (message.role !== \"toolResult\" || !Array.isArray(message.content)) return message;\n\t\tconst emptiedContent = message.content.map((part) =>\n\t\t\tpart.type === \"text\" ? { ...part, text: \"\" } : part.type === \"image\" ? { ...part, data: \"\" } : part,\n\t\t);\n\t\tconst content = emptiedContent.filter((part, index) => {\n\t\t\tif (index === 0) return true;\n\t\t\tconst previous = emptiedContent[index - 1];\n\t\t\tconst empty = part.type === \"text\" ? part.text === \"\" : part.type === \"image\" && part.data === \"\";\n\t\t\tconst previousEmpty =\n\t\t\t\tprevious.type === \"text\" ? previous.text === \"\" : previous.type === \"image\" && previous.data === \"\";\n\t\t\treturn !empty || !previousEmpty;\n\t\t});\n\t\treturn { ...message, content };\n\t};\n\tconst toolResultIndexes = result.flatMap((message, index) =>\n\t\tmessage.role === \"toolResult\" && Array.isArray(message.content) ? [index] : [],\n\t);\n\tconst withEmptyPrefix = (count: number): AgentMessage[] => {\n\t\tconst candidate = result.slice();\n\t\tfor (let i = 0; i < count; i++)\n\t\t\tcandidate[toolResultIndexes[i]] = emptyToolResult(candidate[toolResultIndexes[i]]);\n\t\treturn candidate;\n\t};\n\tlet low = 0;\n\tlet high = toolResultIndexes.length;\n\twhile (low < high) {\n\t\tconst middle = Math.floor((low + high) / 2);\n\t\tif (fits(withEmptyPrefix(middle + 1))) high = middle;\n\t\telse low = middle + 1;\n\t}\n\tconst emptyCount = Math.min(low + 1, toolResultIndexes.length);\n\tif (emptyCount > 0) {\n\t\tresult.splice(0, result.length, ...withEmptyPrefix(emptyCount));\n\t\tchanged = true;\n\t}\n\tif (fits()) return { messages: changed ? result : messages, changed };\n\n\t// If metadata alone exceeds the cap, discard the oldest complete turns. This\n\t// search is also monotonic and avoids quadratic whole-history reserialization.\n\tconst turnRanges: Array<[number, number]> = [];\n\tconst isConvertedUser = (message: AgentMessage): boolean => convert([message])[0]?.role === \"user\";\n\tfor (let index = 0; index < result.length; index++) {\n\t\tif (!isConvertedUser(result[index])) continue;\n\t\tconst nextUser = result.findIndex((message, nextIndex) => nextIndex > index && isConvertedUser(message));\n\t\tturnRanges.push([index, nextUser < 0 ? result.length : nextUser]);\n\t}\n\tconst withoutTurns = (count: number): AgentMessage[] => {\n\t\tif (count === 0) return result;\n\t\tconst start = turnRanges[0]?.[0] ?? 0;\n\t\tconst end = turnRanges[count - 1]?.[1] ?? start;\n\t\treturn [...result.slice(0, start), ...result.slice(end)];\n\t};\n\tlow = 0;\n\thigh = turnRanges.length;\n\twhile (low < high) {\n\t\tconst middle = Math.floor((low + high) / 2);\n\t\tif (fits(withoutTurns(middle + 1))) high = middle;\n\t\telse low = middle + 1;\n\t}\n\tconst turnCount = Math.min(low + 1, turnRanges.length);\n\tif (turnCount > 0) {\n\t\tconst next = withoutTurns(turnCount);\n\t\tresult.splice(0, result.length, ...next);\n\t\tchanged = true;\n\t}\n\treturn { messages: changed ? result : messages, changed };\n}\n\n// ============================================================================\n// AgentSession Class\n// ============================================================================\n\nexport function providerRetryWatchdogAbortMessage(\n\tretryTimeoutMs: number | undefined,\n\tstreamStartTimeoutMs: number | undefined,\n): string {\n\treturn (\n\t\t`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms` +\n\t\t(streamStartTimeoutMs === undefined\n\t\t\t? \" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)\"\n\t\t\t: ` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)\n\t);\n}\n\nexport class AgentSession {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\n\tprivate _scopedModels: SessionModelEntry[];\n\tprivate _favoriteModels: SessionModelEntry[];\n\n\t// Event subscription state\n\tprivate _unsubscribeAgent?: () => void;\n\tprivate _unsubscribeSettingsSource?: () => void;\n\tprivate _eventListeners: AgentSessionEventListener[] = [];\n\tprivate _agentEventQueue: Promise<void> = Promise.resolve();\n\t/**\n\t * Exact message objects whose message_end persistence is still queued.\n\t * Agent core appends messages to agent.state.messages before emitting\n\t * message_end; until that event settles on _agentEventQueue, compaction must\n\t * treat these identities as pending persistence, never as stale or droppable.\n\t */\n\tprivate readonly _messageEndsAwaitingPersistence = new Set<AgentMessage>();\n\tprivate _isAgentRunActive = false;\n\tprivate _toolExecutionDepth = 0;\n\tprivate _promptStartPending = false;\n\tprivate _nextInputId = 0;\n\tprivate _idleWaitPromise: Promise<void> | undefined;\n\tprivate _resolveIdleWait: (() => void) | undefined;\n\tprivate _settlementEpoch = 0;\n\n\t/** Tracks pending steering messages for UI display. Removed when delivered. */\n\tprivate _steeringMessages: string[] = [];\n\t/** Tracks pending follow-up messages for UI display. Removed when delivered. */\n\tprivate _followUpMessages: string[] = [];\n\t/** Recovery-only order across both native queue modes and TUI compaction ownership. */\n\tprivate _queuedInputOrder: QueuedInput[] = [];\n\tprivate _nextQueuedInputOrder = 0;\n\tprivate _sessionLogger: SessionLogger;\n\tprivate _activeCompactionLogAttempt:\n\t\t| { id: string; reason: CompactionReason; tokensBefore: number | undefined }\n\t\t| undefined;\n\tprivate readonly _supersededCompactionLogAttemptIds = new Set<string>();\n\t/** Messages queued to be included with the next user prompt as context (\"asides\"). */\n\tprivate _pendingNextTurnMessages: CustomMessage[] = [];\n\tprivate _pendingCustomMessages: CustomMessage[] = [];\n\t// Queues held while the first post-compaction response is classified. Agent\n\t// core otherwise drains steering immediately before AgentSession can consume\n\t// the stale-usage exemption and schedule the continuation itself.\n\tprivate _postCompactionDeferredSteeringMessages: AgentMessage[] = [];\n\tprivate _postCompactionDeferredFollowUpMessages: AgentMessage[] = [];\n\n\t// Compaction state\n\tprivate _compactionAbortController: AbortController | undefined = undefined;\n\tprivate _autoCompactionAbortController: AbortController | undefined = undefined;\n\tprivate _pendingCompactionAdmission: PendingCompactionAdmission | undefined = undefined;\n\tprivate readonly _compactionLifecycle = new CompactionLifecycleCoordinator();\n\tprivate readonly _sessionWorkBarrier = new SessionWorkBarrier();\n\t/**\n\t * Extension-published activity that outlives a turn (background terminal\n\t * jobs, terminal monitors, loop-guard holds). Counts persist across extension\n\t * reloads on purpose: a stale \"busy\" only delays reclamation, while a lost\n\t * one would let the host evict a session still doing work.\n\t */\n\tprivate readonly _wakeSources = new WakeSourceTracker();\n\tprivate _unsubscribeWakeSources: (() => void) | undefined;\n\tprivate _overflowRecoveryAttempted = false;\n\tprivate _compactionSkippedTooSmall = false;\n\tprivate _requiredCompactionAdmissionError: RequiredCompactionError | undefined;\n\t// Preserve provenance across agent-core's conversion of our admission error\n\t// into an assistant error message. Matching provider text alone is not proof\n\t// that AgentSession initiated required-compaction recovery.\n\tprivate _requiredCompactionTurnError: RequiredCompactionError | undefined;\n\t// A retry continuation immediately follows an accepted compaction. Its first\n\t// response must not retrigger threshold compaction from stale provider usage.\n\tprivate _skipNextPostRetryCompactionCheck = false;\n\tprivate _blockedPostCompactionAssistant: { assistant: AssistantMessage; revision: number } | undefined;\n\tprivate _delegatedCompactionKey: { provider: string; id: string } | undefined;\n\tprivate _skipNextPostCompactionAssistantCheck = false;\n\tprivate _scheduledContinuationRecompacted = false;\n\tprivate readonly _assistantsPendingAtCompaction = new WeakSet<AssistantMessage>();\n\tprivate readonly _postCompactionUsageExemptAssistants = new WeakSet<AssistantMessage>();\n\tprivate _messageRevision = 0;\n\n\t// Branch summarization state\n\tprivate _branchSummaryAbortController: AbortController | undefined = undefined;\n\n\tprivate _sessionTitleAbortController: AbortController | undefined = undefined;\n\tprivate _sessionTitlePromise: Promise<void> | undefined = undefined;\n\tprivate readonly _autoTitleSessions: boolean;\n\n\t// Retry state\n\tprivate _retryAbortController: AbortController | undefined = undefined;\n\tprivate _retryAttempt = 0;\n\n\t/**\n\t * Resolve the effective retry profile for the current model's provider.\n\t * Falls back to the senpi-default profile when the provider declares none.\n\t */\n\tprivate _resolveRetryProfile() {\n\t\tconst providerId = this.model?.provider;\n\t\tconst declared = providerId !== undefined ? this._modelRuntime.getProvider(providerId)?.retryPolicy : undefined;\n\t\treturn this.settingsManager.resolveRetryProfile(\n\t\t\tproviderId !== undefined ? { id: providerId, retryPolicy: declared } : undefined,\n\t\t);\n\t}\n\tprivate _probePhase: ProbePhase = \"idle\";\n\tprivate _hintDeadlineMs: number | undefined = undefined;\n\tprivate _cumulativeHintedWaitMs = 0;\n\tprivate _retryPromise: Promise<void> | undefined = undefined;\n\tprivate _retryResolve: (() => void) | undefined = undefined;\n\tprivate _userAbortPromise: Promise<void> | undefined = undefined;\n\tprivate readonly _abortProvenance = new AgentAbortProvenance();\n\tprivate readonly _agentSettledDelivery = new AgentSettledDelivery();\n\tprivate _suppressQueuedContinuationAfterUserAbort = false;\n\tprivate _userAbortGeneration = 0;\n\t/** Set when clearQueue({ abortWillFollow: true }) drains queues immediately before abort(). */\n\tprivate _hadClearedQueuedMessages = false;\n\tprivate _extensionEventSignal: AbortSignal | undefined = undefined;\n\n\t// Bash execution state\n\tprivate readonly _bashAbortControllers = new Set<AbortController>();\n\tprivate _pendingBashMessages: BashExecutionMessage[] = [];\n\n\t// Extension system\n\tprivate _extensionRunner!: ExtensionRunner;\n\tprivate _turnIndex = 0;\n\n\tprivate _resourceLoader: ResourceLoader;\n\tprivate _customTools: ToolDefinition[];\n\tprivate _baseToolDefinitions: Map<string, ToolDefinition> = new Map();\n\tprivate _cwd: string;\n\tprivate _agentDir: string;\n\tprivate _extensionRunnerRef?: { current?: ExtensionRunner };\n\tprivate _initialActiveToolNames?: string[];\n\tprivate _defaultToolNames?: Set<string>;\n\tprivate _evalOnlyToolNames?: ReadonlySet<string>;\n\t/** Explicit config override; when supplied it wins over the settings-derived policy across reloads. */\n\tprivate readonly _evalOnlyToolNamesOverride?: ReadonlySet<string>;\n\t/** Policy tools withheld from the model, retained so disarming can restore direct access. */\n\tprivate readonly _withheldEvalOnlyToolNames = new Set<string>();\n\t/** Eval-only hint names this session published, so a disarm can withdraw exactly those. */\n\tprivate readonly _publishedEvalOnlyHintNames = new Set<string>();\n\t/** Active-tool selection as requested by callers, before eval-only filtering. */\n\tprivate _requestedActiveToolNames?: string[];\n\tprivate _allowedToolNames?: Set<string>;\n\tprivate _excludedToolNames?: Set<string>;\n\tprivate _baseToolsOverride?: Record<string, AgentTool>;\n\tprivate _sessionStartEvent: SessionStartEvent;\n\tprivate _extensionUIContext?: ExtensionUIContext;\n\tprivate _extensionMode: ExtensionMode = \"print\";\n\tprivate _extensionCommandContextActions?: ExtensionCommandContextActions;\n\tprivate _extensionAbortHandler?: () => void;\n\tprivate _extensionShutdownHandler?: ShutdownHandler;\n\tprivate _extensionErrorListener?: ExtensionErrorListener;\n\tprivate _extensionErrorUnsubscriber?: () => void;\n\tprivate _extensionBindingPromptReadiness: Set<Promise<void>> | undefined;\n\n\tprivate _modelRuntime: ModelRuntime;\n\tprivate _modelRegistry: ModelRegistry;\n\tprivate readonly _fallbackValidationWarnings: readonly string[];\n\tprivate readonly _retryFallback: RetryFallbackController;\n\tprivate readonly _selectorCooldowns: SelectorCooldowns;\n\tprivate readonly _probeBackScheduler: ProbeBackScheduler;\n\tprivate readonly _fallbackNow: () => number;\n\tprivate readonly _retryRandom: () => number;\n\n\t// Tool registry for extension getTools/setTools\n\tprivate _toolRegistry: Map<string, AgentTool> = new Map();\n\tprivate _lazyToolActivators: LazyToolActivator[] = [];\n\tprivate _toolDefinitions: Map<string, ToolDefinitionEntry> = new Map();\n\tprivate _toolPromptSnippets: Map<string, string> = new Map();\n\tprivate _toolPromptGuidelines: Map<string, string[]> = new Map();\n\n\t// Base system prompt (without extension appends) - used to apply fresh appends each turn\n\tprivate _baseSystemPrompt = \"\";\n\tprivate _currentServiceTier: ServiceTier | undefined = undefined;\n\tprivate _sessionFastMode = false;\n\tprivate readonly _shownHighReasoningWarningKeys = new Set<string>();\n\t// Widened with the upstream BuildSystemPromptOptions user-override fields so\n\t// extensions (prompt-preset) can see CLI/SDK custom prompts via\n\t// before_agent_start/model_select systemPromptOptions and ctx.getSystemPromptOptions().\n\tprivate _baseSystemPromptOptions!: BuildDynamicSystemPromptOptions & {\n\t\tcustomPrompt?: string;\n\t\tappendSystemPrompt?: string;\n\t};\n\tprivate _systemPromptOverride?: string;\n\n\tconstructor(config: AgentSessionConfig) {\n\t\tthis.agent = config.agent;\n\t\tthis.sessionManager = config.sessionManager;\n\t\tthis.settingsManager = config.settingsManager;\n\t\tthis._unsubscribeSettingsSource = this.settingsManager.subscribeToSourceSelection((source) => {\n\t\t\tthis._emit({ type: \"settings_source_selected\", ...source });\n\t\t});\n\t\tconst noModelFallback =\n\t\t\tconfig.resourceLoader.getExtensions().runtime.flagValues.get(\"no-model-fallback\") === true ||\n\t\t\tenvValue(\"NO_FALLBACK\") === \"1\";\n\t\tif (noModelFallback) {\n\t\t\tthis.settingsManager.applyOverrides({ retry: { modelFallback: false } });\n\t\t}\n\t\tthis._scopedModels = config.scopedModels ?? [];\n\t\tthis._favoriteModels = config.favoriteModels ?? [];\n\t\tthis._resourceLoader = config.resourceLoader;\n\t\tthis._customTools = config.customTools ?? [];\n\t\tthis._cwd = config.cwd;\n\t\tconst modelRuntime = config.modelRuntime ?? config.modelRegistry?.modelRuntime;\n\t\tif (!modelRuntime) {\n\t\t\tthrow new MissingModelAccessError();\n\t\t}\n\t\tthis._modelRuntime = modelRuntime;\n\t\tthis._modelRegistry = config.modelRegistry ?? new ModelRegistry(modelRuntime);\n\t\tthis._agentDir = config.agentDir ?? getAgentDir();\n\t\tconst fallbackLogger = createFallbackLogger(this._agentDir);\n\t\tthis._sessionLogger = createSessionLogger(this._agentDir);\n\t\tthis._fallbackValidationWarnings = validateFallbackChains(\n\t\t\tthis.settingsManager.getRawFallbackChains(),\n\t\t\tthis._modelRegistry,\n\t\t);\n\t\t// `source` names the scope that supplied the chains so a single log line\n\t\t// points at the file to open; \"default\" means no scope configured any.\n\t\tconst fallbackChainsSource = this.settingsManager.getFallbackChainsScope() ?? \"default\";\n\t\tfor (const warning of this._fallbackValidationWarnings) {\n\t\t\tfallbackLogger.warn(\"validation_warning\", {\n\t\t\t\twarning,\n\t\t\t\tsource: fallbackChainsSource,\n\t\t\t});\n\t\t}\n\t\tthis._selectorCooldowns = new SelectorCooldowns(config.fallbackNow ?? (() => Date.now()));\n\t\tthis._fallbackNow = config.fallbackNow ?? (() => Date.now());\n\t\tthis._retryRandom = config.retryRandom ?? Math.random;\n\t\tthis._retryFallback = new RetryFallbackController({\n\t\t\tgetSettings: () => this.settingsManager.getRetryFallbackSettings(),\n\t\t\tregistry: this._modelRegistry,\n\t\t\tcooldowns: this._selectorCooldowns,\n\t\t\tlogger: fallbackLogger,\n\t\t\tswitchModel: async (model, thinking, reason) => {\n\t\t\t\tawait this._switchActiveModel(model, {\n\t\t\t\t\tpersistDefault: false,\n\t\t\t\t\tappendSessionEntry: true,\n\t\t\t\t\tentryReason: reason,\n\t\t\t\t\temitModelSelect: true,\n\t\t\t\t\tmodelSelectSource: reason,\n\t\t\t\t\tinvalidateCompaction: true,\n\t\t\t\t\tephemeralThinkingLevel: thinking,\n\t\t\t\t});\n\t\t\t},\n\t\t\temit: (event) => this._emit(event),\n\t\t\tgetCurrentSelector: () => (this.model ? { model: this.model, thinkingLevel: this.thinkingLevel } : undefined),\n\t\t\tisAuthAvailable: (provider) => this._modelRuntime.hasConfiguredAuth(provider),\n\t\t});\n\t\tthis._probeBackScheduler = new ProbeBackScheduler({\n\t\t\tnow: this._fallbackNow,\n\t\t});\n\t\tthis._extensionRunnerRef = config.extensionRunnerRef;\n\t\tthis._initialActiveToolNames = config.initialActiveToolNames;\n\t\tthis._defaultToolNames = config.defaultToolNames ? new Set(config.defaultToolNames) : undefined;\n\t\tthis._evalOnlyToolNamesOverride = config.evalOnlyToolNames ? new Set(config.evalOnlyToolNames) : undefined;\n\t\tthis._evalOnlyToolNames = this._resolveEvalOnlyToolNames();\n\t\tthis._allowedToolNames = config.allowedToolNames ? new Set(config.allowedToolNames) : undefined;\n\t\tthis._excludedToolNames = config.excludedToolNames ? new Set(config.excludedToolNames) : undefined;\n\t\tthis._baseToolsOverride = config.baseToolsOverride;\n\t\tthis._sessionStartEvent = config.sessionStartEvent ?? {\n\t\t\ttype: \"session_start\",\n\t\t\treason: \"startup\",\n\t\t};\n\t\tthis._autoTitleSessions = config.autoTitleSessions ?? false;\n\n\t\tconst initialModel = this.agent.state.model;\n\t\tif (initialModel) {\n\t\t\tconst scopedMatch = this._scopedModels.find((sm) => modelsAreEqual(sm.model, initialModel));\n\t\t\tthis._currentServiceTier = this._resolveServiceTier(initialModel, scopedMatch?.serviceTier);\n\t\t}\n\n\t\tthis._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);\n\t\tthis._installAgentToolHooks();\n\t\tthis._installAgentNextTurnRefresh();\n\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this._initialActiveToolNames,\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\t}\n\n\tget modelRuntime(): ModelRuntime {\n\t\treturn this._modelRuntime;\n\t}\n\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this._modelRegistry;\n\t}\n\n\tprivate async _getRequiredRequestAuth(model: Model<any>): Promise<{\n\t\tmodel: Model<any>;\n\t\tapiKey?: string;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t\tenv?: Record<string, string>;\n\t}> {\n\t\tlet result: AuthResult | undefined;\n\t\ttry {\n\t\t\tresult = await this._modelRuntime.getAuth(model);\n\t\t} catch (error) {\n\t\t\tconst cause = error instanceof Error ? error.cause : undefined;\n\t\t\tif (cause instanceof Error && cause.message === \"authHeader requires a resolved API key\") {\n\t\t\t\tthrow new Error(formatNoApiKeyFoundMessage(model.provider));\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tif (result && (result.auth.apiKey || result.auth.headers)) {\n\t\t\tconst requestModel = result.auth.baseUrl ? { ...model, baseUrl: result.auth.baseUrl } : model;\n\t\t\treturn {\n\t\t\t\tmodel: requestModel,\n\t\t\t\tapiKey: result.auth.apiKey,\n\t\t\t\theaders: withoutDeletedHeaders(result.auth.headers),\n\t\t\t\textraBody: this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,\n\t\t\t\tenv: result.env,\n\t\t\t};\n\t\t}\n\n\t\tconst isOAuth = this._modelRuntime.isUsingOAuth(model.provider);\n\t\tif (isOAuth) {\n\t\t\tthrow new Error(\n\t\t\t\t`Authentication failed for \"${model.provider}\". ` +\n\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t`Run '/login ${model.provider}' to re-authenticate.`,\n\t\t\t);\n\t\t}\n\t\tthrow new Error(formatNoApiKeyFoundMessage(model.provider));\n\t}\n\n\t/**\n\t * Resolve optional auth for a summarization stream. Native/custom stream\n\t * functions may provide ambient credentials, unlike streamSimple.\n\t */\n\tprivate async _getSummarizationRequestAuth(model: Model<any>): Promise<{\n\t\tmodel: Model<any>;\n\t\tapiKey?: string;\n\t\theaders?: Record<string, string>;\n\t\tenv?: Record<string, string>;\n\t}> {\n\t\tif (this.agent.streamFunction === streamSimple) {\n\t\t\treturn this._getRequiredRequestAuth(model);\n\t\t}\n\n\t\ttry {\n\t\t\tconst storedResult = await this._modelRuntime.getAuth(model);\n\t\t\tconst activeApiKey = await this.agent.getApiKey?.(model.provider);\n\t\t\tconst result =\n\t\t\t\tactiveApiKey !== undefined && storedResult?.source !== \"OAuth\"\n\t\t\t\t\t? await this._modelRuntime.getAuth(model, { apiKey: activeApiKey })\n\t\t\t\t\t: storedResult;\n\t\t\tif (!result) return { model };\n\t\t\tconst requestModel = result.auth.baseUrl ? { ...model, baseUrl: result.auth.baseUrl } : model;\n\t\t\treturn {\n\t\t\t\tmodel: requestModel,\n\t\t\t\tapiKey: result.auth.apiKey,\n\t\t\t\theaders: withoutDeletedHeaders(result.auth.headers),\n\t\t\t\tenv: result.env,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn { model };\n\t\t}\n\t}\n\n\tprivate async _getCompactionRequestAuth(model: Model<any>): Promise<{\n\t\tmodel: Model<any>;\n\t\tapiKey?: string;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t\tenv?: Record<string, string>;\n\t}> {\n\t\tconst auth = await this._getSummarizationRequestAuth(model);\n\t\treturn {\n\t\t\t...auth,\n\t\t\textraBody: this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,\n\t\t};\n\t}\n\n\t/**\n\t * Install tool hooks once on the Agent instance.\n\t *\n\t * The callbacks read `this._extensionRunner` at execution time, so extension reload swaps in the\n\t * new runner without reinstalling hooks. Extension-specific tool wrappers are still used to adapt\n\t * registered tool execution to the extension context. Tool call and tool result interception now\n\t * happens here instead of in wrappers.\n\t */\n\t/**\n\t * Surface a provider-level server-fallback abort before retry handling runs so\n\t * the UI can explain the switch. Emitted synchronously here because retry work\n\t * for the following agent_end starts before queued message_end processing\n\t * drains. `chainConfigured` is required because the no-chain refusal path\n\t * emits no retry_fallback_exhausted, leaving the UI no other signal.\n\t */\n\tprivate _emitServerFallbackAborted(message: AssistantMessage): void {\n\t\tconst details = message.diagnostics?.find((entry) => entry.type === SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;\n\t\tif (details === undefined) return;\n\t\tthis._emit({\n\t\t\ttype: \"server_fallback_aborted\",\n\t\t\tfrom: typeof details.from === \"string\" ? details.from : message.model,\n\t\t\tto: typeof details.to === \"string\" ? details.to : message.model,\n\t\t\tchainConfigured: this._retryFallback.hasConfiguredChain(),\n\t\t});\n\t}\n\n\tprivate _installAgentToolHooks(): void {\n\t\tthis.agent.resolveUnknownToolCall = (toolName) => {\n\t\t\tlet service: ReturnType<typeof getToolSearchService>;\n\t\t\ttry {\n\t\t\t\tservice = getToolSearchService();\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst catalogTool = service.getCatalog().some((doc) => doc.name === toolName);\n\t\t\tif (!catalogTool || !this._activateLazyTool(toolName)) return undefined;\n\t\t\treturn this.agent.state.tools.find((tool) => tool.name === toolName);\n\t\t};\n\n\t\tthis.agent.beforeToolCall = async ({ toolCall, args }) => {\n\t\t\tthis._toolExecutionDepth++;\n\t\t\ttry {\n\t\t\t\tconst result = await this.preflightToolCall(toolCall, args);\n\t\t\t\tif (result?.block) {\n\t\t\t\t\tthis._toolExecutionDepth--;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tthis._toolExecutionDepth--;\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t};\n\n\t\tthis.agent.afterToolCall = async ({ toolCall, args, result, isError }) => {\n\t\t\ttry {\n\t\t\t\treturn await this._emitAfterToolCallHooks(toolCall, args, result, isError);\n\t\t\t} finally {\n\t\t\t\tthis._toolExecutionDepth--;\n\t\t\t}\n\t\t};\n\t}\n\n\tasync preflightToolCall(toolCall: AgentToolCall, args: unknown, options: { waitForEventQueue?: boolean } = {}) {\n\t\tif (options.waitForEventQueue !== false) {\n\t\t\tawait this._agentEventQueue;\n\t\t}\n\n\t\tconst runner = this._extensionRunner;\n\t\tif (!runner.hasHandlers(\"tool_call\")) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\ttry {\n\t\t\treturn await runner.emitToolCall({\n\t\t\t\ttype: \"tool_call\",\n\t\t\t\ttoolName: toolCall.name,\n\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\tinput: args as Record<string, unknown>,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tif (err instanceof Error) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new Error(`Extension failed, blocking execution: ${String(err)}`);\n\t\t}\n\t}\n\n\tprivate async _emitAfterToolCallHooks(\n\t\ttoolCall: AgentToolCall,\n\t\targs: unknown,\n\t\tresult: AgentToolResult<unknown>,\n\t\tisError: boolean,\n\t) {\n\t\tconst runner = this._extensionRunner;\n\t\tconst hookResult = runner.hasHandlers(\"tool_result\")\n\t\t\t? await runner.emitToolResult({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\tinput: args as Record<string, unknown>,\n\t\t\t\t\tcontent: result.content,\n\t\t\t\t\tdetails: result.details,\n\t\t\t\t\tisError,\n\t\t\t\t\tusage: result.usage,\n\t\t\t\t})\n\t\t\t: undefined;\n\t\tconst content = hookResult?.content ?? result.content ?? [];\n\t\tconst normalizedContent = await normalizeToolResultImages(content, {\n\t\t\tautoResizeImages: this.settingsManager.getImageAutoResize(),\n\t\t});\n\n\t\tif (!hookResult && normalizedContent === content) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tcontent: normalizedContent,\n\t\t\tdetails: hookResult?.details,\n\t\t\tisError: hookResult?.isError ?? isError,\n\t\t\tusage: hookResult?.usage,\n\t\t};\n\t}\n\n\tprivate _installAgentNextTurnRefresh(): void {\n\t\tconst previousPrepareNextTurnWithContext =\n\t\t\tthis.agent.prepareNextTurnWithContext ??\n\t\t\t(this.agent.prepareNextTurn\n\t\t\t\t? async (_turn: PrepareNextTurnContext, signal?: AbortSignal) => await this.agent.prepareNextTurn?.(signal)\n\t\t\t\t: undefined);\n\t\tconst previousTransformContext = this.agent.transformContext;\n\t\tthis.agent.transformContext = async (messages, signal) => {\n\t\t\tconst transformed = previousTransformContext ? await previousTransformContext(messages, signal) : messages;\n\t\t\tif (this.model?.provider === \"cursor\" || this.model?.provider === \"cursor-cli-oauth\") {\n\t\t\t\treturn (\n\t\t\t\t\t(\n\t\t\t\t\t\tawait truncateToolResultBodies(\n\t\t\t\t\t\t\ttransformed,\n\t\t\t\t\t\t\tCURSOR_TOOL_RESULT_MAX_CHARS,\n\t\t\t\t\t\t\tCURSOR_TOOL_RESULT_MAX_BYTES,\n\t\t\t\t\t\t\t(candidate) => this.agent.convertToLlm(candidate) as Message[],\n\t\t\t\t\t\t)\n\t\t\t\t\t).messages ?? transformed\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn transformed;\n\t\t};\n\n\t\tthis.agent.prepareNextTurnWithContext = async (turn, signal) => {\n\t\t\t// Enforce compaction only when this prepare precedes an actual provider\n\t\t\t// admission: a tool continuation or queued steer/follow-up messages. A\n\t\t\t// completed turn with no continuation keeps pre-PR timing, while the\n\t\t\t// prior prepare callback and context refresh below still run every turn.\n\t\t\tconst compactBeforeNextAdmission = async (): Promise<boolean> => {\n\t\t\t\tconst provider = this.model?.provider;\n\t\t\t\t// Cursor rebuilds the full conversation each hop. Compacting here\n\t\t\t\t// mutates rootPrompt mid-run and poisons conversationId (#984).\n\t\t\t\t// Still truncate verbatim toolResult bodies so the skip cannot send MB-scale payloads (#1043).\n\t\t\t\tif (provider === \"cursor\" || provider === \"cursor-cli-oauth\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (turn.toolResults.length === 0 && !this.agent.hasQueuedMessages()) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tawait this._agentEventQueue;\n\t\t\t\t// A queue can be cleared while waiting for persistence. Re-sample it\n\t\t\t\t// immediately before compaction so a completed turn never compacts\n\t\t\t\t// merely because it once had a possible continuation.\n\t\t\t\tif (turn.toolResults.length === 0 && !this.agent.hasQueuedMessages()) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\treturn await this._enforceCompactionBeforeProvider(turn.message, true, \"threshold\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (error instanceof RequiredCompactionError) {\n\t\t\t\t\t\tthis._requiredCompactionTurnError = error;\n\t\t\t\t\t\tif (this.agent.hasQueuedMessages()) {\n\t\t\t\t\t\t\tthis._requiredCompactionAdmissionError = error;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst compactedBeforeCallback = await compactBeforeNextAdmission();\n\t\t\tconst messages = compactedBeforeCallback ? this.agent.state.messages.slice() : turn.context.messages;\n\n\t\t\tconst postCompactionTurn = {\n\t\t\t\t...turn,\n\t\t\t\tcontext: { ...turn.context, messages },\n\t\t\t};\n\t\t\tlet previousSnapshot = await previousPrepareNextTurnWithContext?.(postCompactionTurn, signal);\n\t\t\tlet previousContext = previousSnapshot?.context ?? postCompactionTurn.context;\n\t\t\t// The previous callback may await while agent_end extensions enqueue\n\t\t\t// continuation work. Re-sample after it returns so that work cannot\n\t\t\t// slip through with the stale provider snapshot it observed on entry.\n\t\t\tlet compactedAfterCallback = false;\n\t\t\tif (!compactedBeforeCallback) {\n\t\t\t\tcompactedAfterCallback = await compactBeforeNextAdmission();\n\t\t\t}\n\t\t\tif (compactedAfterCallback) {\n\t\t\t\t// The callback's first result describes the stale pre-compaction\n\t\t\t\t// context. Reapply it once to the compacted context so any host\n\t\t\t\t// transformation reaches the provider request. Do not re-sample after\n\t\t\t\t// this invocation: one replay is the bounded admission path.\n\t\t\t\tconst postLateCompactionTurn = {\n\t\t\t\t\t...turn,\n\t\t\t\t\tcontext: {\n\t\t\t\t\t\t...turn.context,\n\t\t\t\t\t\tmessages: this.agent.state.messages.slice(),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst postLateCompactionSnapshot = await previousPrepareNextTurnWithContext?.(\n\t\t\t\t\tpostLateCompactionTurn,\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t\tpreviousSnapshot = {\n\t\t\t\t\t...previousSnapshot,\n\t\t\t\t\t...postLateCompactionSnapshot,\n\t\t\t\t\tcontext: postLateCompactionSnapshot?.context ?? postLateCompactionTurn.context,\n\t\t\t\t};\n\t\t\t\tpreviousContext = previousSnapshot.context ?? postLateCompactionTurn.context;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...previousSnapshot,\n\t\t\t\tcontext: {\n\t\t\t\t\t...previousContext,\n\t\t\t\t\tmessages: previousContext.messages,\n\t\t\t\t\tsystemPrompt: this._systemPromptOverride ?? this._baseSystemPrompt,\n\t\t\t\t\ttools: this.agent.state.tools.slice(),\n\t\t\t\t},\n\t\t\t\tmodel: this.agent.state.model,\n\t\t\t\tthinkingLevel: this.agent.state.thinkingLevel,\n\t\t\t\tthinkingSelection: this.agent.state.thinkingSelection ?? null,\n\t\t\t\tabortServerSideFallback:\n\t\t\t\t\tthis.settingsManager.getAbortServerSideFallback() && this._retryFallback.hasConfiguredChain(),\n\t\t\t};\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// Event Subscription\n\t// =========================================================================\n\n\t/** Emit an event to all listeners */\n\tprivate _emitEntryAppended(entryId: string): void {\n\t\tif (this._extensionMode !== \"rpc\") return;\n\t\tconst entry = this.sessionManager.getEntry(entryId);\n\t\tif (entry) this._emit({ type: \"entry_appended\", entry });\n\t}\n\n\t/** Append a transport-provided entry and publish it on the RPC event stream. */\n\tappendSessionEntry(entry: SessionEntry): void {\n\t\tthis.sessionManager.appendEntry(entry);\n\t\tthis.agent.state.messages = this.sessionManager.buildSessionContext().messages;\n\t\tthis._emitEntryAppended(entry.id);\n\t}\n\n\tprivate _emit(event: AgentSessionEvent): void {\n\t\tthis._logSessionEvent(event);\n\t\tfor (const l of this._eventListeners) {\n\t\t\tl(event);\n\t\t}\n\t}\n\n\tprivate async _emitSessionCompactFailed(event: Omit<SessionCompactFailedEvent, \"type\">): Promise<void> {\n\t\tif (this._extensionRunner.hasHandlers(\"session_compact_failed\")) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_compact_failed\",\n\t\t\t\t...event,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Mirror stuck-prone lifecycle transitions into logs/session.log (content-free). */\n\tprivate _logSessionEvent(event: AgentSessionEvent): void {\n\t\tif (event.type === \"compaction_start\") {\n\t\t\tconst previousAttempt = this._activeCompactionLogAttempt;\n\t\t\tif (previousAttempt) {\n\t\t\t\tconst tokensAfter = this._estimateCompactionLogTokens(\"persisted\");\n\t\t\t\tthis._sessionLogger.info(\"compaction_decision\", {\n\t\t\t\t\tattemptId: previousAttempt.id,\n\t\t\t\t\treason: previousAttempt.reason,\n\t\t\t\t\tmode: previousAttempt.reason === \"manual\" ? \"manual\" : \"auto\",\n\t\t\t\t\taction: \"compact\",\n\t\t\t\t\tdisposition: \"superseded\",\n\t\t\t\t\taccepted: false,\n\t\t\t\t\tskipped: true,\n\t\t\t\t\taborted: true,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\ttokensBefore: previousAttempt.tokensBefore,\n\t\t\t\t\ttokensAfter,\n\t\t\t\t});\n\t\t\t\tthis._supersededCompactionLogAttemptIds.add(previousAttempt.id);\n\t\t\t}\n\t\t\tconst attempt = {\n\t\t\t\tid: event.requestId ?? randomUUID(),\n\t\t\t\treason: event.reason,\n\t\t\t\ttokensBefore: this._estimateCompactionLogTokens(\"persisted\"),\n\t\t\t};\n\t\t\tthis._activeCompactionLogAttempt = attempt;\n\t\t\tthis._sessionLogger.info(\"compaction_start\", {\n\t\t\t\tattemptId: attempt.id,\n\t\t\t\treason: event.reason,\n\t\t\t\tmode: event.reason === \"manual\" ? \"manual\" : \"auto\",\n\t\t\t\taction: \"compact\",\n\t\t\t\ttokensBefore: attempt.tokensBefore,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (event.type === \"compaction_end\") {\n\t\t\tif (event.requestId && this._supersededCompactionLogAttemptIds.delete(event.requestId)) return;\n\t\t\tconst activeAttempt = this._activeCompactionLogAttempt;\n\t\t\tconst attempt =\n\t\t\t\tevent.requestId !== undefined && activeAttempt?.id === event.requestId ? activeAttempt : undefined;\n\t\t\tconst accepted = event.accepted ?? event.result !== undefined;\n\t\t\tconst rejected = event.rejectionCause !== undefined;\n\t\t\tconst skipped = !accepted && (attempt === undefined || (!rejected && !event.aborted && !event.errorMessage));\n\t\t\tconst disposition = accepted\n\t\t\t\t? \"committed\"\n\t\t\t\t: attempt === undefined\n\t\t\t\t\t? \"skipped\"\n\t\t\t\t\t: rejected\n\t\t\t\t\t\t? \"rejected\"\n\t\t\t\t\t\t: event.aborted\n\t\t\t\t\t\t\t? \"aborted\"\n\t\t\t\t\t\t\t: event.errorMessage\n\t\t\t\t\t\t\t\t? \"failed\"\n\t\t\t\t\t\t\t\t: \"skipped\";\n\t\t\tconst tokensAfter = this._estimateCompactionLogTokens(accepted ? \"active\" : \"persisted\");\n\t\t\tthis._sessionLogger.info(\"compaction_decision\", {\n\t\t\t\tattemptId: attempt?.id ?? event.requestId,\n\t\t\t\treason: event.reason,\n\t\t\t\tmode: event.reason === \"manual\" ? \"manual\" : \"auto\",\n\t\t\t\taction: accepted || attempt ? \"compact\" : \"none\",\n\t\t\t\tdisposition,\n\t\t\t\taccepted,\n\t\t\t\tskipped,\n\t\t\t\taborted: event.aborted,\n\t\t\t\twillRetry: event.willRetry,\n\t\t\t\trejectionCause: event.rejectionCause,\n\t\t\t\terror: event.errorMessage,\n\t\t\t\ttokensBefore: attempt?.tokensBefore ?? tokensAfter,\n\t\t\t\ttokensAfter,\n\t\t\t});\n\t\t\tif (attempt) this._activeCompactionLogAttempt = undefined;\n\t\t\treturn;\n\t\t}\n\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\tconst message = event.message as AssistantMessage;\n\t\t\tif (message.stopReason !== \"error\") return;\n\t\t\tconst kind = isProviderStreamStallError(message)\n\t\t\t\t? \"stall\"\n\t\t\t\t: isProviderTimeoutError(message)\n\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t: \"error\";\n\t\t\tthis._sessionLogger.warn(\"provider_error\", {\n\t\t\t\tkind,\n\t\t\t\terror: message.errorMessage,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _estimateCompactionLogTokens(source: \"active\" | \"persisted\"): number | undefined {\n\t\ttry {\n\t\t\tconst messages =\n\t\t\t\tsource === \"active\" ? this.agent.state.messages : this.sessionManager.buildSessionContext().messages;\n\t\t\treturn estimateMessagesTokens(filterContextExcludedMessages(messages));\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _emitQueueUpdate(): void {\n\t\tthis._emit({\n\t\t\ttype: \"queue_update\",\n\t\t\tsteering: [...this._steeringMessages],\n\t\t\tfollowUp: [...this._followUpMessages],\n\t\t\tordered: [...this._queuedInputOrder].sort((a, b) => a.enqueueOrder - b.enqueueOrder),\n\t\t});\n\t}\n\n\tprivate _incrementMessageRevision(): void {\n\t\tthis._messageRevision++;\n\t\tthis._blockedPostCompactionAssistant = undefined;\n\t}\n\n\tgetMessageRevision(): number {\n\t\treturn this._messageRevision;\n\t}\n\n\t/** Resolved agent state directory for this session. */\n\tget agentDir(): string {\n\t\treturn this._agentDir;\n\t}\n\n\t/**\n\t * Working directory this session resolves settings against — the same value extensions\n\t * receive as `ctx.cwd`, so a host surface (RPC) reads project settings identically.\n\t */\n\tget cwd(): string {\n\t\treturn this._cwd;\n\t}\n\n\tprivate async _waitForSettledSessionWork(): Promise<void> {\n\t\tawait this._sessionWorkBarrier.waitForSettled(() => this._agentEventQueue);\n\t}\n\n\tasync waitForSettledSessionWork(): Promise<void> {\n\t\tawait this._waitForSettledSessionWork();\n\t\tconst titlePromise = this._sessionTitlePromise;\n\t\tif (titlePromise !== undefined) {\n\t\t\tawait titlePromise;\n\t\t}\n\t\tawait this._waitForSettledSessionWork();\n\t}\n\n\tprivate _modelSelectionChangesContext(previousModel: Model<any> | undefined, nextModel: Model<any>): boolean {\n\t\tif (!modelsAreEqual(previousModel, nextModel)) return true;\n\t\tif (previousModel?.contextWindow !== nextModel.contextWindow) return true;\n\t\treturn previousModel?.api !== nextModel.api;\n\t}\n\n\tprivate _invalidateCompactionForModelSelection(): void {\n\t\tthis.abortCompaction();\n\t\tthis.abortBranchSummary();\n\t\tthis._delegatedCompactionKey = undefined;\n\t\tthis._incrementMessageRevision();\n\t}\n\n\tprivate _getIdleWaitPromise(): Promise<void> {\n\t\tif (!this._idleWaitPromise) {\n\t\t\tthis._idleWaitPromise = new Promise((resolve) => {\n\t\t\t\tthis._resolveIdleWait = resolve;\n\t\t\t});\n\t\t}\n\t\treturn this._idleWaitPromise;\n\t}\n\n\tprivate _resolveIdleWaitIfIdle(): void {\n\t\tif (this._isAgentRunActive || !this._resolveIdleWait) {\n\t\t\treturn;\n\t\t}\n\t\tconst resolve = this._resolveIdleWait;\n\t\tthis._idleWaitPromise = undefined;\n\t\tthis._resolveIdleWait = undefined;\n\t\tresolve();\n\t}\n\n\tprivate async _emitAgentSettled(): Promise<void> {\n\t\tif (this.agent.state.isStreaming) {\n\t\t\tawait this.agent.waitForIdle();\n\t\t}\n\t\tif (!this._isAgentRunActive) {\n\t\t\tthis._abortProvenance.closeAgentEndBoundary();\n\t\t\tthis._resolveIdleWaitIfIdle();\n\t\t\treturn;\n\t\t}\n\t\tthis._isAgentRunActive = false;\n\t\tlet deferredActions: DeferredAgentSettledAction[] = [];\n\t\tlet deferredTurnClaims: DeferredTurnClaim[] = [];\n\t\tthis._agentSettledDelivery.begin(this._userAbortGeneration);\n\t\tconst settlementEpoch = ++this._settlementEpoch;\n\t\ttry {\n\t\t\tawait this._extensionRunner.emit({ type: \"agent_settled\" });\n\t\t\tthis._emit({ type: \"agent_settled\" });\n\t\t\tif (this._abortProvenance.takeLateUserJoin()) await this._emitSessionAbort();\n\t\t\t({ actions: deferredActions, turnClaims: deferredTurnClaims } = this._agentSettledDelivery.finish(\n\t\t\t\tthis._userAbortGeneration,\n\t\t\t));\n\t\t} finally {\n\t\t\tthis._agentSettledDelivery.cancel();\n\t\t\tthis._abortProvenance.closeAgentEndBoundary();\n\t\t\tthis._resolveIdleWaitIfIdle();\n\t\t}\n\t\tfor (const action of deferredActions) action();\n\t\tqueueMicrotask(() => {\n\t\t\tvoid this._emitAgentIdleAfterDeferredTurns(settlementEpoch, deferredTurnClaims);\n\t\t});\n\t}\n\n\tprivate async _emitAgentIdleAfterDeferredTurns(\n\t\tsettlementEpoch: number,\n\t\tdeferredTurnClaims: DeferredTurnClaim[],\n\t): Promise<void> {\n\t\tconst dispositions = await Promise.all(deferredTurnClaims.map((claim) => claim.disposition));\n\t\tif (dispositions.includes(\"started\")) return;\n\t\tif (dispositions.includes(\"delegated\") || this._sessionWorkBarrier.hasActiveWork) {\n\t\t\tawait this._waitForSettledSessionWork();\n\t\t}\n\t\tif (settlementEpoch !== this._settlementEpoch) return;\n\t\tif (this._isAgentRunActive || this._sessionWorkBarrier.hasActiveWork) return;\n\t\tthis._emit({ type: \"agent_idle\" });\n\t}\n\n\tprivate async _promptAgent(\n\t\tmessages: AgentMessage | AgentMessage[],\n\t\tdeferredTurnClaim?: DeferredTurnClaim,\n\t): Promise<void> {\n\t\tdeferredTurnClaim?.resolve(\"started\");\n\t\tthis._isAgentRunActive = true;\n\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\tthis.agent.abortServerSideFallback =\n\t\t\tthis.settingsManager.getAbortServerSideFallback() && this._retryFallback.hasConfiguredChain();\n\t\ttry {\n\t\t\tawait this.agent.prompt(messages);\n\t\t\t// AgentSession's subscriber intentionally queues event work instead of\n\t\t\t// blocking Agent core. Wait for this run's queued recovery decision\n\t\t\t// before reporting prompt completion to the caller.\n\t\t\tawait this._agentEventQueue;\n\t\t\tconst requiredCompactionError = this._requiredCompactionAdmissionError;\n\t\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\t\tif (requiredCompactionError) {\n\t\t\t\tthis._sessionLogger.warn(\"prompt_rejected\", {\n\t\t\t\t\tstage: \"admission\",\n\t\t\t\t\terror: \"RequiredCompactionError\",\n\t\t\t\t});\n\t\t\t\tthrow requiredCompactionError;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror instanceof Error &&\n\t\t\t\terror.message ===\n\t\t\t\t\t\"Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.\"\n\t\t\t) {\n\t\t\t\tconst queuedMessages = Array.isArray(messages) ? messages : [messages];\n\t\t\t\tfor (const message of queuedMessages) this.agent.steer(message);\n\t\t\t\tconst userMessage = queuedMessages.find((message) => message.role === \"user\");\n\t\t\t\tif (userMessage?.role === \"user\") {\n\t\t\t\t\tconst text = this._extractUserMessageText(userMessage.content);\n\t\t\t\t\tthis._steeringMessages.push(text);\n\t\t\t\t\tthis._recordQueuedInput(text, \"steer\");\n\t\t\t\t\tthis._emitQueueUpdate();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this._emitAgentSettled();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/** Extract text content used to track fork-owned queued user messages. */\n\tprivate _extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\t\tif (typeof content === \"string\") return content;\n\t\treturn content\n\t\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\"\");\n\t}\n\n\t// Track last assistant message for auto-compaction check\n\tprivate _lastAssistantMessage: AssistantMessage | undefined = undefined;\n\n\t/** Internal handler for agent events - shared by subscribe and reconnect */\n\tprivate _handleAgentEvent = (event: AgentEvent, signal: AbortSignal): void => {\n\t\t// Agent core drains native steer/follow-up queues immediately after its\n\t\t// final agent_end. This subscriber intentionally processes its own event\n\t\t// queue asynchronously, so a later recovery rejection cannot abort that\n\t\t// drain in time. agent_end itself is still an awaited synchronous boundary\n\t\t// before that drain: transfer every required overflow or threshold\n\t\t// compaction to AgentSession, retaining queues until recovery is accepted.\n\t\tif (event.type === \"agent_end\") {\n\t\t\tconst lastAssistant = this._findLastAssistantInMessages(event.messages);\n\t\t\tconst requiredAutoCompaction = lastAssistant\n\t\t\t\t? this._getRequiredAutoCompactionReason(lastAssistant)\n\t\t\t\t: undefined;\n\t\t\tif (requiredAutoCompaction) {\n\t\t\t\tthis.agent.suppressQueuedMessageDrain();\n\t\t\t}\n\t\t}\n\n\t\t// Create retry promise synchronously before queueing async processing.\n\t\t// Agent.emit() calls this handler synchronously, and prompt() calls waitForRetry()\n\t\t// as soon as agent.prompt() resolves. If _retryPromise is created only inside\n\t\t// _processAgentEvent, slow earlier queued events can delay agent_end processing\n\t\t// and waitForRetry() can miss the in-flight retry.\n\t\tthis._createRetryPromiseForAgentEnd(event);\n\n\t\t// The message object is already in agent.state.messages when message_end\n\t\t// fires; track its exact identity until this event's queued processing\n\t\t// settles so compaction can distinguish pending persistence from stale state.\n\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\tthis._emitServerFallbackAborted(event.message);\n\t\t}\n\n\t\tconst pendingMessage = event.type === \"message_end\" ? event.message : undefined;\n\t\tif (pendingMessage !== undefined) {\n\t\t\tthis._messageEndsAwaitingPersistence.add(pendingMessage);\n\t\t}\n\n\t\tconst processing = this._agentEventQueue.then(\n\t\t\t() => this._processAgentEvent(event, signal),\n\t\t\t() => this._processAgentEvent(event, signal),\n\t\t);\n\t\tthis._agentEventQueue =\n\t\t\tpendingMessage !== undefined\n\t\t\t\t? processing.finally(() => {\n\t\t\t\t\t\tthis._messageEndsAwaitingPersistence.delete(pendingMessage);\n\t\t\t\t\t})\n\t\t\t\t: processing;\n\n\t\t// Keep queue alive if an event handler fails\n\t\tthis._agentEventQueue.catch(() => {});\n\t};\n\n\tprivate _createRetryPromiseForAgentEnd(event: AgentEvent): void {\n\t\tif (event.type !== \"agent_end\" || this._retryPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastAssistant = this._findLastAssistantInMessages(event.messages);\n\t\tif (\n\t\t\t!lastAssistant ||\n\t\t\t(!this._isRetryableError(lastAssistant) &&\n\t\t\t\t!this._isHardErrorFallbackEligible(lastAssistant) &&\n\t\t\t\t!isCursorZeroTokenResourceExhausted(lastAssistant) &&\n\t\t\t\t!isCursorQuotaResourceExhausted(lastAssistant, this.model?.contextWindow ?? 0))\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._retryPromise = new Promise((resolve) => {\n\t\t\tthis._retryResolve = resolve;\n\t\t});\n\t\t// Agent core normally drains queued input immediately after agent_end.\n\t\t// Retry owns that continuation until its final provider-admission check has\n\t\t// either started it or reported a terminal rejection.\n\t\tthis.agent.suppressQueuedMessageDrain();\n\t}\n\n\tprivate _findLastAssistantInMessages(messages: AgentMessage[]): AssistantMessage | undefined {\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst message = messages[i];\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\treturn message as AssistantMessage;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Synchronously mirror the auto-compaction decision that _checkCompaction()\n\t * will make after agent_end. Agent core drains queues before that async work\n\t * runs, so only this preflight can transfer required admissions safely.\n\t */\n\tprivate _getRequiredAutoCompactionReason(message: AssistantMessage): \"overflow\" | \"threshold\" | undefined {\n\t\tconst reason = this._getAutoCompactionReason(message);\n\t\t// Retry and post-compaction exemptions only cover stale usage estimates.\n\t\t// A provider-confirmed overflow must always retain queue ownership and run\n\t\t// fail-closed recovery.\n\t\tif (\n\t\t\treason === \"overflow\" &&\n\t\t\tmessage.stopReason === \"stop\" &&\n\t\t\tthis._hasPendingPostCompactionUsageExemption(message)\n\t\t) {\n\t\t\t// A successful post-compaction response can carry stale provider usage.\n\t\t\t// Retain its queues while the asynchronous check consumes the exemption.\n\t\t\treturn \"threshold\";\n\t\t}\n\t\tif (reason === \"overflow\") return reason;\n\t\t// Keep queued continuations under AgentSession ownership while the\n\t\t// asynchronous check consumes this post-compaction usage exemption.\n\t\tif (this._hasPendingPostCompactionUsageExemption(message)) return \"threshold\";\n\t\tif (\n\t\t\treason === \"threshold\" &&\n\t\t\t(this._skipNextPostRetryCompactionCheck || this._postCompactionUsageExemptAssistants.has(message))\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn reason;\n\t}\n\n\t/**\n\t * Threshold checks measure the larger of the provider-reported context and\n\t * the plain local-transcript estimate. Providers whose usage tracks a\n\t * server-side summarized conversation (native Cursor checkpoints) can report\n\t * a context far smaller than the transcript this client replays every turn,\n\t * and that small figure must not hide a transcript already past the window.\n\t */\n\tprivate _resolveThresholdContextTokens(directContextTokens: number): number {\n\t\tconst messages = filterContextExcludedMessages(this.agent.state.messages);\n\t\treturn resolveThresholdContextTokens(directContextTokens, estimateMessagesTokens(messages));\n\t}\n\n\tprivate _getAutoCompactionReason(message: AssistantMessage): \"overflow\" | \"threshold\" | undefined {\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled || message.stopReason === \"aborted\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst model = this.model;\n\t\tif (!model || this._isAssistantFromBeforeLatestCompaction(message)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sameModel = isSameOverflowSource(\n\t\t\tmessage,\n\t\t\tmodel,\n\t\t\tthis._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId,\n\t\t);\n\t\tconst contextUsage = this.getContextUsage();\n\t\tconst currentContextNeedsCompaction =\n\t\t\tcontextUsage !== undefined &&\n\t\t\tcontextUsage.tokens !== null &&\n\t\t\tshouldCompact(contextUsage.tokens, contextUsage.contextWindow, settings);\n\t\tif (isContextOverflow(message, model.contextWindow) && (sameModel || currentContextNeedsCompaction)) {\n\t\t\treturn \"overflow\";\n\t\t}\n\t\tif (this._isCursorPayloadOverflow(message)) {\n\t\t\treturn \"overflow\";\n\t\t}\n\n\t\tlet contextTokens: number;\n\t\tconst directContextTokens = message.usage ? calculateContextTokens(message.usage) : 0;\n\t\tif (message.stopReason !== \"error\" && directContextTokens !== 0) {\n\t\t\tcontextTokens = this._resolveThresholdContextTokens(directContextTokens);\n\t\t} else {\n\t\t\tconst messages = filterContextExcludedMessages(this.agent.state.messages);\n\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\tif (estimate.lastUsageIndex === null) {\n\t\t\t\tif (!this._isRequiredCompactionError(message)) return undefined;\n\t\t\t} else {\n\t\t\t\tconst compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\t\t\tconst usageMessage = messages[estimate.lastUsageIndex];\n\t\t\t\tif (\n\t\t\t\t\tcompactionEntry &&\n\t\t\t\t\tusageMessage?.role === \"assistant\" &&\n\t\t\t\t\tthis._isAssistantFromBeforeLatestCompaction(usageMessage)\n\t\t\t\t) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontextTokens = estimate.tokens;\n\t\t}\n\n\t\treturn shouldCompact(contextTokens, model.contextWindow, settings) ? \"threshold\" : undefined;\n\t}\n\n\tprivate _hasPendingPostCompactionUsageExemption(message: AssistantMessage): boolean {\n\t\treturn (\n\t\t\tthis._skipNextPostCompactionAssistantCheck &&\n\t\t\t!this._assistantsPendingAtCompaction.has(message) &&\n\t\t\t!this._overflowRecoveryAttempted\n\t\t);\n\t}\n\n\tprivate _isPostCompactionUsageExempt(message: AssistantMessage): boolean {\n\t\treturn (\n\t\t\tthis._postCompactionUsageExemptAssistants.has(message) || this._hasPendingPostCompactionUsageExemption(message)\n\t\t);\n\t}\n\n\tprivate _consumePostCompactionUsageExemption(message: AssistantMessage): boolean {\n\t\tif (this._postCompactionUsageExemptAssistants.has(message)) return true;\n\t\tif (!this._isPostCompactionUsageExempt(message)) return false;\n\t\tthis._skipNextPostCompactionAssistantCheck = false;\n\t\tthis._postCompactionUsageExemptAssistants.add(message);\n\t\treturn true;\n\t}\n\n\tprivate _agentEndAllowsQueuedContinuation(messages: AgentMessage[]): boolean {\n\t\tlet lastAssistantIndex = -1;\n\t\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\t\tif (messages[index]?.role === \"assistant\") {\n\t\t\t\tlastAssistantIndex = index;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (lastAssistantIndex === -1) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst lastAssistant = messages[lastAssistantIndex];\n\t\tif (lastAssistant?.role !== \"assistant\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (lastAssistant.stopReason === \"aborted\" || lastAssistant.stopReason === \"error\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (this._getRequiredAutoCompactionReason(lastAssistant)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let index = lastAssistantIndex + 1; index < messages.length; index++) {\n\t\t\tconst message = messages[index];\n\t\t\tif (\n\t\t\t\tmessage?.role === \"toolResult\" &&\n\t\t\t\tmessage.isError &&\n\t\t\t\tmessage.content.some((content) => content.type === \"text\" && /\\babort(?:ed)?\\b/i.test(content.text))\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate _willRetryAfterAgentEnd(messages: AgentMessage[]): boolean {\n\t\tconst lastAssistant = this._lastAssistantMessage ?? this._findLastAssistantInMessages(messages);\n\t\tif (!lastAssistant) {\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tthis._isRequiredCompactionError(lastAssistant) &&\n\t\t\tthis._getRequiredAutoCompactionReason(lastAssistant) !== undefined\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\treturn false;\n\t\t}\n\t\t// The same-model budget comes from the resolved profile so a provider-declared\n\t\t// budget (e.g. kimi-code's 9) is honoured; identical to settings.maxRetries for\n\t\t// providers without a profile.\n\t\tconst turnMaxRetries = this._resolveRetryProfile().turn.maxRetries;\n\n\t\tconst retryableError = this._isRetryableError(lastAssistant);\n\t\tif (isCursorZeroTokenResourceExhausted(lastAssistant)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (isCursorQuotaResourceExhausted(lastAssistant, this.model?.contextWindow ?? 0)) {\n\t\t\treturn this._retryFallback.canTryFallback();\n\t\t}\n\t\tif (!retryableError && this._isHardErrorFallbackEligible(lastAssistant)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (!retryableError) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (isClassifierRefusal(lastAssistant)) {\n\t\t\treturn this._retryAttempt + 1 <= turnMaxRetries && this._retryFallback.canTryFallback();\n\t\t}\n\n\t\tif (this._retryAttempt + 1 > turnMaxRetries) {\n\t\t\treturn this._retryFallback.canTryFallback();\n\t\t}\n\n\t\tconst errorMessage = lastAssistant.errorMessage || \"Unknown error\";\n\t\tconst providerDelayMs = this._getProviderRetryDelayMs(errorMessage);\n\t\tif (providerDelayMs === undefined) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (providerDelayMs <= this.settingsManager.getProviderRetrySettings().maxRetryDelayMs) {\n\t\t\treturn true;\n\t\t}\n\t\treturn this._retryFallback.canTryFallback();\n\t}\n\n\tprivate _isRequiredCompactionError(message: AssistantMessage): boolean {\n\t\treturn (\n\t\t\tthis._requiredCompactionTurnError !== undefined &&\n\t\t\tmessage.stopReason === \"error\" &&\n\t\t\tmessage.errorMessage === this._requiredCompactionTurnError.message\n\t\t);\n\t}\n\n\tprivate async _processAgentEvent(event: AgentEvent, signal: AbortSignal): Promise<void> {\n\t\tif (event.type === \"agent_start\") {\n\t\t\tthis._requiredCompactionTurnError = undefined;\n\t\t}\n\t\t// When a user message starts, check if it's from either queue and remove it BEFORE emitting\n\t\t// This ensures the UI sees the updated queue state\n\t\tif (event.type === \"message_start\" && event.message.role === \"user\") {\n\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\tthis._retryFallback.resetTurn();\n\t\t\tconst messageText = contentText(event.message.content, \"\");\n\t\t\tif (messageText) {\n\t\t\t\t// Check steering queue first\n\t\t\t\tconst steeringIndex = this._steeringMessages.indexOf(messageText);\n\t\t\t\tif (steeringIndex !== -1) {\n\t\t\t\t\tthis._steeringMessages.splice(steeringIndex, 1);\n\t\t\t\t\tthis._removeQueuedInput(messageText, \"steer\");\n\t\t\t\t\tthis._emitQueueUpdate();\n\t\t\t\t} else {\n\t\t\t\t\t// Check follow-up queue\n\t\t\t\t\tconst followUpIndex = this._followUpMessages.indexOf(messageText);\n\t\t\t\t\tif (followUpIndex !== -1) {\n\t\t\t\t\t\tthis._followUpMessages.splice(followUpIndex, 1);\n\t\t\t\t\t\tthis._removeQueuedInput(messageText, \"followUp\");\n\t\t\t\t\t\tthis._emitQueueUpdate();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst agentEndWillRetry = event.type === \"agent_end\" && this._willRetryAfterAgentEnd(event.messages);\n\n\t\t// Emit to extensions first. Agent event persistence is intentionally\n\t\t// asynchronous, so retain the source run signal while dispatching.\n\t\tthis._extensionEventSignal = signal;\n\t\ttry {\n\t\t\tawait this._emitExtensionEvent(event, agentEndWillRetry);\n\t\t} finally {\n\t\t\tthis._extensionEventSignal = undefined;\n\t\t}\n\t\tif (event.type === \"agent_end\" && this._abortProvenance.takeLateUserJoin()) await this._emitSessionAbort();\n\n\t\t// Notify all listeners\n\t\tthis._emit(event.type === \"agent_end\" ? { ...event, willRetry: agentEndWillRetry } : event);\n\t\tif (event.type === \"agent_end\") {\n\t\t\tif (this._abortProvenance.takeLateUserJoin()) await this._emitSessionAbort();\n\t\t}\n\n\t\t// Handle session persistence\n\t\tif (event.type === \"message_end\") {\n\t\t\t// Check if this is a custom message from extensions\n\t\t\tif (event.message.role === \"custom\") {\n\t\t\t\t// Persist as CustomMessageEntry\n\t\t\t\tthis.sessionManager.appendCustomMessageEntry(\n\t\t\t\t\tevent.message.customType,\n\t\t\t\t\tevent.message.content,\n\t\t\t\t\tevent.message.display,\n\t\t\t\t\tevent.message.details,\n\t\t\t\t);\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t} else if (\n\t\t\t\tevent.message.role === \"user\" ||\n\t\t\t\tevent.message.role === \"assistant\" ||\n\t\t\t\tevent.message.role === \"toolResult\"\n\t\t\t) {\n\t\t\t\t// Regular LLM message - persist as SessionMessageEntry\n\t\t\t\tthis._emitEntryAppended(this.sessionManager.appendMessage(event.message));\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t}\n\t\t\t// Other message types (bashExecution, compactionSummary, branchSummary) are persisted elsewhere\n\n\t\t\t// Track assistant message for auto-compaction (checked on agent_end)\n\t\t\tif (event.message.role === \"assistant\") {\n\t\t\t\tthis._lastAssistantMessage = event.message;\n\n\t\t\t\tconst assistantMsg = event.message as AssistantMessage;\n\t\t\t\tconst succeeded =\n\t\t\t\t\t!assistantMsg.errorMessage &&\n\t\t\t\t\tassistantMsg.stopReason !== \"error\" &&\n\t\t\t\t\tassistantMsg.stopReason !== \"aborted\" &&\n\t\t\t\t\t!isClassifierRefusal(assistantMsg);\n\t\t\t\tif (succeeded && assistantMsg.stopReason !== \"length\") {\n\t\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t\t}\n\n\t\t\t\t// Reset retry state only after a genuinely successful response. Provider\n\t\t\t\t// transport timeouts can arrive as `aborted` and must keep consuming the\n\t\t\t\t// same bounded retry budget instead of reporting a false success.\n\t\t\t\tif (succeeded && this._retryAttempt > 0) {\n\t\t\t\t\tconst fallback = this._retryFallback.activeState;\n\t\t\t\t\tif (fallback) {\n\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\ttype: \"retry_fallback_succeeded\",\n\t\t\t\t\t\t\tmodel: this.model ? `${this.model.provider}/${this.model.id}` : \"\",\n\t\t\t\t\t\t\tchainKey: fallback.chainKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t});\n\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check auto-retry and auto-compaction after agent completes.\n\t\tlet launchedContinuation = false;\n\t\tlet retryContinuationBlocked = false;\n\t\tlet retryExhaustionAllowsQueuedContinuation = false;\n\t\tlet allowsPostCompactionUsageExemptContinuation = false;\n\t\tconst userAbortSuppressedQueuedContinuation =\n\t\t\tevent.type === \"agent_end\" && this._suppressQueuedContinuationAfterUserAbort;\n\t\tif (userAbortSuppressedQueuedContinuation) {\n\t\t\tthis._suppressQueuedContinuationAfterUserAbort = false;\n\t\t}\n\t\tconst allowsQueuedContinuation =\n\t\t\tevent.type === \"agent_end\" && !userAbortSuppressedQueuedContinuation\n\t\t\t\t? this._agentEndAllowsQueuedContinuation(event.messages)\n\t\t\t\t: false;\n\t\tif (event.type === \"agent_end\" && this._lastAssistantMessage) {\n\t\t\tconst msg = this._lastAssistantMessage;\n\t\t\tthis._lastAssistantMessage = undefined;\n\t\t\tthis._skipNextPostRetryCompactionCheck = false;\n\t\t\tconst requiredAutoCompaction = this._getRequiredAutoCompactionReason(msg);\n\t\t\tconst retryAfterRequiredCompaction =\n\t\t\t\trequiredAutoCompaction !== undefined && this._isRequiredCompactionError(msg);\n\n\t\t\t// Retry transient failures normally and eligible hard errors only through a fallback.\n\t\t\tconst retryableError = this._isRetryableError(msg);\n\t\t\tconst hardErrorFallbackEligible = this._isHardErrorFallbackEligible(msg);\n\t\t\tconst cursorZeroTokenRe = isCursorZeroTokenResourceExhausted(msg);\n\t\t\tconst cursorQuotaRe = isCursorQuotaResourceExhausted(msg, this.model?.contextWindow ?? 0);\n\t\t\tconst retryCanAdmitProvider =\n\t\t\t\t!userAbortSuppressedQueuedContinuation &&\n\t\t\t\tthis.settingsManager.getRetrySettings().enabled &&\n\t\t\t\t(retryableError || hardErrorFallbackEligible || cursorZeroTokenRe || cursorQuotaRe);\n\t\t\tlet compactedBeforeRetry = false;\n\t\t\tif (\n\t\t\t\tretryCanAdmitProvider &&\n\t\t\t\trequiredAutoCompaction &&\n\t\t\t\t!(requiredAutoCompaction === \"threshold\" && this._hasPendingPostCompactionUsageExemption(msg))\n\t\t\t) {\n\t\t\t\tthis._retireFailedRetryAssistant(msg);\n\t\t\t\tcompactedBeforeRetry = await this._runPrePromptCompaction(msg, true, requiredAutoCompaction, true);\n\t\t\t\tretryContinuationBlocked =\n\t\t\t\t\t!compactedBeforeRetry && !this._isCompactionDelegated() && !cursorQuotaRe && !hardErrorFallbackEligible;\n\t\t\t}\n\n\t\t\tlet retryOutcome: \"continued\" | \"blocked\" | \"not-handled\" | \"cancelled\" = \"not-handled\";\n\t\t\tconst retryOwnedDeferredQueue = DEFERRED_RETRY_QUEUE_OWNERS.has(this);\n\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.delete(this);\n\t\t\tif (!retryContinuationBlocked && !userAbortSuppressedQueuedContinuation) {\n\t\t\t\tif (cursorZeroTokenRe) {\n\t\t\t\t\tretryOutcome = await this._handleRetryableError(msg, { sameModelRemint: true });\n\t\t\t\t} else if (cursorQuotaRe) {\n\t\t\t\t\t// Mid-turn Cursor errors may retain unpaired tool calls. Remove the\n\t\t\t\t\t// failed assistant before provider fallback so replay stays valid.\n\t\t\t\t\tthis._retireFailedRetryAssistant(msg);\n\t\t\t\t\tretryOutcome = await this._handleRetryableError(msg, { hardErrorFallback: true });\n\t\t\t\t} else if (retryableError) {\n\t\t\t\t\tretryOutcome = await this._handleRetryableError(msg);\n\t\t\t\t} else if (hardErrorFallbackEligible) {\n\t\t\t\t\tretryOutcome = await this._handleRetryableError(msg, {\n\t\t\t\t\t\thardErrorFallback: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (retryOutcome === \"continued\") {\n\t\t\t\tthis._abortProvenance.closeAgentEndBoundary();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Provider-timeout retries deliberately skip their first queue poll so\n\t\t\t// steering cannot be consumed by another doomed retry request. Once the\n\t\t\t// managed retry owner exhausts its budget, hand that retained queue back\n\t\t\t// to the normal scheduled-continuation path instead of parking it until\n\t\t\t// an unrelated later prompt arrives.\n\t\t\tretryExhaustionAllowsQueuedContinuation =\n\t\t\t\t!userAbortSuppressedQueuedContinuation &&\n\t\t\t\tretryOwnedDeferredQueue &&\n\t\t\t\tretryOutcome === \"not-handled\" &&\n\t\t\t\t(msg.stopReason === \"error\" || msg.stopReason === \"aborted\");\n\n\t\t\tif (retryOutcome === \"not-handled\" && cursorQuotaRe && msg.errorMessage) {\n\t\t\t\tmsg.errorMessage = `${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`;\n\t\t\t}\n\t\t\tif (retryOutcome === \"not-handled\" && this._retryAttempt > 0 && msg.errorMessage) {\n\t\t\t\tconst attempt = this._retryAttempt;\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tattempt,\n\t\t\t\t\tfinalError: msg.errorMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis._resolveRetry();\n\t\t\tretryContinuationBlocked ||= retryOutcome === \"blocked\";\n\t\t\tif (!retryContinuationBlocked && !userAbortSuppressedQueuedContinuation) {\n\t\t\t\tif (compactedBeforeRetry && this.agent.hasQueuedMessages()) {\n\t\t\t\t\t// Accepted recovery supersedes the stored admission rejection: the\n\t\t\t\t\t// queued continuation is about to run, so the originating prompt must\n\t\t\t\t\t// not observe the stale RequiredCompactionError.\n\t\t\t\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\t\tlaunchedContinuation = true;\n\t\t\t\t} else {\n\t\t\t\t\tlaunchedContinuation = await this._checkCompaction(msg, true, undefined, retryAfterRequiredCompaction);\n\t\t\t\t\tif (launchedContinuation && this.agent.hasQueuedMessages()) {\n\t\t\t\t\t\t// Same supersession on the post-check path: an accepted recovery\n\t\t\t\t\t\t// compaction owns the continuation now.\n\t\t\t\t\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tallowsPostCompactionUsageExemptContinuation = this._postCompactionUsageExemptAssistants.has(msg);\n\t\t\t\t\tif (allowsPostCompactionUsageExemptContinuation) {\n\t\t\t\t\t\tthis._flushPostCompactionDeferredMessages();\n\t\t\t\t\t}\n\t\t\t\t\t// _runAutoCompaction() returns false both when recovery was rejected and\n\t\t\t\t\t// when an accepted compaction had no queue to continue. Re-sample after\n\t\t\t\t\t// it settles so only the still-required (rejected) case fails admission.\n\t\t\t\t\tif (\n\t\t\t\t\t\trequiredAutoCompaction &&\n\t\t\t\t\t\t!launchedContinuation &&\n\t\t\t\t\t\tthis.agent.hasQueuedMessages() &&\n\t\t\t\t\t\tthis._getRequiredAutoCompactionReason(msg) !== undefined\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis._requiredCompactionAdmissionError = new RequiredCompactionError();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (event.type === \"agent_end\") {\n\t\t\tthis._flushPendingBashMessages();\n\t\t\tif (\n\t\t\t\t!launchedContinuation &&\n\t\t\t\t!retryContinuationBlocked &&\n\t\t\t\t(allowsQueuedContinuation ||\n\t\t\t\t\tallowsPostCompactionUsageExemptContinuation ||\n\t\t\t\t\tretryExhaustionAllowsQueuedContinuation) &&\n\t\t\t\tthis.agent.hasQueuedMessages()\n\t\t\t) {\n\t\t\t\t// A scheduled continuation owns the queue now; the stored admission\n\t\t\t\t// rejection from a superseded required compaction must not surface.\n\t\t\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\tlaunchedContinuation = true;\n\t\t\t}\n\t\t\tif (!launchedContinuation) {\n\t\t\t\tawait this._emitAgentSettled();\n\t\t\t} else {\n\t\t\t\tthis._abortProvenance.closeAgentEndBoundary();\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Resolve the pending retry promise */\n\tprivate _resolveRetry(): void {\n\t\tif (this._retryResolve) {\n\t\t\tthis._retryResolve();\n\t\t\tthis._retryResolve = undefined;\n\t\t\tthis._retryPromise = undefined;\n\t\t}\n\t}\n\n\tprivate _resetHintTierState(): void {\n\t\tthis._probePhase = \"idle\";\n\t\tthis._hintDeadlineMs = undefined;\n\t\tthis._cumulativeHintedWaitMs = 0;\n\t}\n\n\tprivate async _emitSessionAbort(): Promise<void> {\n\t\tawait this._extensionRunner.emit({ type: \"session_abort\" });\n\t\tthis._emit({ type: \"session_abort\" });\n\t}\n\n\t/**\n\t * Arm the probe-back scheduler for a tier-2 demoted selector. The scheduler\n\t * will fire at most two probes (half-hint, then deadline) and clear the\n\t * selector cooldown on success so maybeRestorePrimary reverts at the next\n\t * turn boundary.\n\t */\n\tprivate _armProbeBackForDemotedSelector(selector: string, hintMs: number): void {\n\t\tif (!selector) return;\n\n\t\t// Guard: skip when the demoted selector is the ACTIVE model.\n\t\tconst currentModel = this.model;\n\t\tif (currentModel && formatSelector(currentModel) === selector) return;\n\n\t\t// Guard: skip when auth is unavailable at arm time.\n\t\tconst parts = selector.split(\"/\");\n\t\tif (parts.length < 2) return;\n\t\tconst provider = parts[0];\n\t\tif (!this._modelRuntime.hasConfiguredAuth(provider)) return;\n\n\t\tconst now = this._fallbackNow();\n\t\tconst schedule = probeBackSchedule(hintMs, now);\n\t\tconst modelId = parts.slice(1).join(\"/\");\n\t\tconst demotedModel = this._modelRuntime.getModel(provider, modelId);\n\t\tif (!demotedModel) return;\n\n\t\tthis._probeBackScheduler.arm({\n\t\t\tselector,\n\t\t\tfirstAtMs: schedule.firstAtMs,\n\t\t\tdeadlineMs: schedule.deadlineMs,\n\t\t\tauthAvailable: () => this._modelRuntime.hasConfiguredAuth(provider),\n\t\t\trunProbe: async (signal: AbortSignal): Promise<boolean> => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await this._modelRuntime.completeSimple(\n\t\t\t\t\t\tdemotedModel,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsystemPrompt: \"Reply with OK.\",\n\t\t\t\t\t\t\tmessages: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"OK\" }],\n\t\t\t\t\t\t\t\t\ttimestamp: now,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ maxTokens: 1, signal },\n\t\t\t\t\t);\n\t\t\t\t\treturn result.stopReason !== \"error\" && result.stopReason !== \"aborted\";\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCleared: (sel: string) => {\n\t\t\t\tthis._selectorCooldowns.clear(sel);\n\t\t\t},\n\t\t\temit: (event) => {\n\t\t\t\tif (event.type === \"retry_probe_scheduled\") {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"retry_probe_scheduled\",\n\t\t\t\t\t\tselector: event.selector,\n\t\t\t\t\t\tatMs: event.atMs,\n\t\t\t\t\t\tprobeIndex: event.probeIndex,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"retry_probe_result\",\n\t\t\t\t\t\tselector: event.selector,\n\t\t\t\t\t\tok: event.ok,\n\t\t\t\t\t\terrorMessage: event.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\t/** Find the last assistant message in agent state (including aborted ones) */\n\tprivate _findLastAssistantMessage(): AssistantMessage | undefined {\n\t\tconst messages = this.agent.state.messages;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst msg = messages[i];\n\t\t\tif (msg.role === \"assistant\") {\n\t\t\t\treturn msg as AssistantMessage;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Retry failures stay in append-only history but must not be retained in the\n\t * active context branch. Otherwise split-turn compaction keeps the failed\n\t * assistant response verbatim and cannot make progress before a retry.\n\t */\n\tprivate _retireFailedRetryAssistant(message: AssistantMessage): void {\n\t\tconst position = this.sessionManager.getMessageEntryPosition(message);\n\t\tif (!position || this.sessionManager.getLeafId() !== position.entryId) return;\n\t\tconst entry = this.sessionManager.getEntry(position.entryId);\n\t\tif (entry?.type !== \"message\") return;\n\n\t\tif (entry.parentId === null) {\n\t\t\tthis.sessionManager.resetLeaf();\n\t\t} else {\n\t\t\tthis.sessionManager.branch(entry.parentId);\n\t\t}\n\t\tconst messageIndex = this.agent.state.messages.lastIndexOf(message);\n\t\tif (messageIndex !== -1) {\n\t\t\tthis.agent.state.messages = this.agent.state.messages.slice(0, messageIndex);\n\t\t}\n\t\tthis._incrementMessageRevision();\n\t}\n\n\tprivate _isAssistantFromBeforeLatestCompaction(assistantMessage: AssistantMessage): boolean {\n\t\tconst compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\tif (compactionEntry === null) return false;\n\n\t\t// An agent message_end can still be awaiting persistence while compaction\n\t\t// commits. It is necessarily a post-boundary message, even when a provider\n\t\t// supplied an older payload timestamp.\n\t\tif (this._messageEndsAwaitingPersistence.has(assistantMessage)) return false;\n\n\t\tconst messagePosition = this.sessionManager.getMessageEntryPosition(assistantMessage);\n\t\tconst compactionOrder = this.sessionManager.getEntryOrder(compactionEntry.id);\n\t\tif (messagePosition !== undefined && compactionOrder !== undefined) {\n\t\t\treturn messagePosition.order <= compactionOrder;\n\t\t}\n\n\t\t// Reloaded/reconstructed messages have no runtime identity. Retain the\n\t\t// historical timestamp heuristic only for that compatibility path.\n\t\treturn assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();\n\t}\n\n\tprivate _replaceMessageInPlace(target: AgentMessage, replacement: AgentMessage): void {\n\t\t// Agent-core stores the finalized message object in its state before emitting message_end.\n\t\t// SessionManager persistence happens later in _processAgentEvent() with event.message.\n\t\t// Mutating this object in place keeps agent state, later turn/agent events, listeners,\n\t\t// and the eventual SessionManager.appendMessage(event.message) persistence in sync.\n\t\tif (target === replacement) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const key of Object.keys(target)) {\n\t\t\tReflect.deleteProperty(target, key);\n\t\t}\n\t\tObject.assign(target, replacement);\n\t}\n\n\t/** Emit extension events based on agent events */\n\tprivate async _emitExtensionEvent(event: AgentEvent, agentEndWillRetry = false): Promise<void> {\n\t\tif (event.type === \"agent_start\") {\n\t\t\tthis._turnIndex = 0;\n\t\t\tawait this._extensionRunner.emit({ type: \"agent_start\" });\n\t\t} else if (event.type === \"agent_end\") {\n\t\t\tconst extensionEvent = this._abortProvenance.beginAgentEnd(\n\t\t\t\tevent.messages,\n\t\t\t\tagentEndWillRetry,\n\t\t\t\tthis._findLastAssistantInMessages(event.messages)?.stopReason === \"aborted\",\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\t} finally {\n\t\t\t\tthis._abortProvenance.endAgentEnd(extensionEvent);\n\t\t\t}\n\t\t} else if (event.type === \"turn_start\") {\n\t\t\tconst extensionEvent: TurnStartEvent = {\n\t\t\t\ttype: \"turn_start\",\n\t\t\t\tturnIndex: this._turnIndex,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"turn_end\") {\n\t\t\tconst extensionEvent: TurnEndEvent = {\n\t\t\t\ttype: \"turn_end\",\n\t\t\t\tturnIndex: this._turnIndex,\n\t\t\t\tmessage: event.message,\n\t\t\t\ttoolResults: event.toolResults,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\tthis._turnIndex++;\n\t\t\tthis._flushPendingCustomMessages();\n\t\t} else if (event.type === \"message_start\") {\n\t\t\tconst extensionEvent: MessageStartEvent = {\n\t\t\t\ttype: \"message_start\",\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"message_update\") {\n\t\t\tconst extensionEvent: MessageUpdateEvent = {\n\t\t\t\ttype: \"message_update\",\n\t\t\t\tmessage: event.message,\n\t\t\t\tassistantMessageEvent: event.assistantMessageEvent,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"message_end\") {\n\t\t\tconst extensionEvent: MessageEndEvent = {\n\t\t\t\ttype: \"message_end\",\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\t\tconst replacement = await this._extensionRunner.emitMessageEnd(extensionEvent);\n\t\t\tif (replacement) {\n\t\t\t\t// Untyped extension handlers can return messages with null/missing content;\n\t\t\t\t// normalize so it never enters agent state or session history.\n\t\t\t\tconst normalized =\n\t\t\t\t\t(replacement.role === \"user\" ||\n\t\t\t\t\t\treplacement.role === \"assistant\" ||\n\t\t\t\t\t\treplacement.role === \"toolResult\" ||\n\t\t\t\t\t\treplacement.role === \"custom\") &&\n\t\t\t\t\treplacement.content == null\n\t\t\t\t\t\t? ({ ...replacement, content: [] } as AgentMessage)\n\t\t\t\t\t\t: replacement;\n\t\t\t\tthis._replaceMessageInPlace(event.message, normalized);\n\t\t\t}\n\t\t} else if (event.type === \"tool_execution_start\") {\n\t\t\tconst extensionEvent: ToolExecutionStartEvent = {\n\t\t\t\ttype: \"tool_execution_start\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"tool_execution_update\") {\n\t\t\tconst extensionEvent: ToolExecutionUpdateEvent = {\n\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t\tpartialResult: event.partialResult,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"tool_execution_end\") {\n\t\t\tconst extensionEvent: ToolExecutionEndEvent = {\n\t\t\t\ttype: \"tool_execution_end\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\tresult: event.result,\n\t\t\t\tisError: event.isError,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t * Session persistence is handled internally (saves messages on message_end).\n\t * Multiple listeners can be added. Returns unsubscribe function for this listener.\n\t */\n\tsubscribe(listener: AgentSessionEventListener): () => void {\n\t\tthis._eventListeners.push(listener);\n\t\tfor (const source of this.settingsManager.getSelectedSettingsSources()) {\n\t\t\tlistener({ type: \"settings_source_selected\", ...source });\n\t\t}\n\n\t\t// Return unsubscribe function for this specific listener\n\t\treturn () => {\n\t\t\tconst index = this._eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis._eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Temporarily disconnect from agent events.\n\t * User listeners are preserved and will receive events again after resubscribe().\n\t * Used internally during operations that need to pause event processing.\n\t */\n\tprivate _disconnectFromAgent(): void {\n\t\tif (this._unsubscribeAgent) {\n\t\t\tthis._unsubscribeAgent();\n\t\t\tthis._unsubscribeAgent = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Reconnect to agent events after _disconnectFromAgent().\n\t * Preserves all existing listeners.\n\t */\n\tprivate _reconnectToAgent(): void {\n\t\tif (this._unsubscribeAgent) return; // Already connected\n\t\tthis._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);\n\t}\n\n\t/**\n\t * Remove all listeners and disconnect from agent.\n\t * Call this when completely done with the session.\n\t */\n\tdispose(): void {\n\t\ttry {\n\t\t\tthis._probeBackScheduler.cancel(\"dispose\");\n\t\t\tthis.abortRetry();\n\t\t\tthis.abortCompaction();\n\t\t\tthis.abortBranchSummary();\n\t\t\tthis.abortSessionTitleGeneration();\n\t\t\tthis.abortBash();\n\t\t\tthis.agent.abort();\n\t\t} catch {\n\t\t\t// Dispose must succeed even if an abort hook throws.\n\t\t}\n\n\t\tthis._extensionRunner.invalidate(\n\t\t\t\"This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().\",\n\t\t);\n\t\tthis._disconnectFromAgent();\n\t\tthis._unsubscribeSettingsSource?.();\n\t\tthis._unsubscribeSettingsSource = undefined;\n\t\tthis._unsubscribeWakeSources?.();\n\t\tthis._unsubscribeWakeSources = undefined;\n\t\tthis._eventListeners = [];\n\t\tcleanupSessionResources(this.sessionId);\n\t}\n\n\t/** Live in-session activity signals; see `session-activity.ts` for the contract. */\n\tget activitySnapshot(): SessionActivitySnapshot {\n\t\treturn {\n\t\t\tisStreaming: this._isAgentRunActive,\n\t\t\tisBashRunning: this.isBashRunning,\n\t\t\tisCompacting: this.isCompacting,\n\t\t\thasSessionWork: this._sessionWorkBarrier.hasActiveWork,\n\t\t\thasActiveWakeSource: this._wakeSources.hasActive,\n\t\t};\n\t}\n\n\t/**\n\t * Whether this session owns work that must outlive a teardown decision: an\n\t * agent run, bash, compaction, barrier-held session work, or an\n\t * extension-published wake source. Occupancy sweeps (the shared RPC host's\n\t * idle eviction) MUST consult this rather than individual flags, so a new\n\t * activity source is picked up by every call site at once.\n\t */\n\tget isSessionBusy(): boolean {\n\t\treturn isSessionBusySnapshot(this.activitySnapshot);\n\t}\n\n\t// =========================================================================\n\t// Read-only State Access\n\t// =========================================================================\n\n\t/** Full agent state */\n\tget state(): AgentState {\n\t\treturn this.agent.state;\n\t}\n\n\t/** Current model (may be undefined if not yet selected) */\n\tget model(): Model<any> | undefined {\n\t\treturn this.agent.state.model;\n\t}\n\n\t/** Current thinking level */\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this.agent.state.thinkingLevel;\n\t}\n\n\t/** Explicit selector provenance, absent for SDK-defaulted effective levels. */\n\tget thinkingSelection(): ThinkingSelection | undefined {\n\t\treturn this.agent.state.thinkingSelection;\n\t}\n\n\tget serviceTier(): ServiceTier | undefined {\n\t\treturn this._currentServiceTier;\n\t}\n\n\t/**\n\t * True when the active model is served at the priority (\"fast\") tier: either the model\n\t * itself is configured for it (an `openai` `-fast` catalog variant, a scoped\n\t * `provider/id:priority`) or an extension turned fast mode on for this session.\n\t *\n\t * Display-only: it never feeds request composition, so an extension toggling fast mode\n\t * for one provider cannot leak `service_tier` into another provider's payload.\n\t * `serviceTier` stays the single request-side source.\n\t */\n\tisFastModeActive(): boolean {\n\t\treturn this._sessionFastMode || this._currentServiceTier === \"priority\";\n\t}\n\n\t/**\n\t * The tier a request would carry right now: `serviceTier`, promoted to `\"priority\"` while\n\t * session fast mode is on (which is exactly what the service-tier extension puts on the\n\t * wire). Reported to clients so `serviceTier` and `fastMode` can never disagree.\n\t */\n\tget effectiveServiceTier(): ServiceTier | undefined {\n\t\treturn this.isFastModeActive() ? \"priority\" : this._currentServiceTier;\n\t}\n\n\t/**\n\t * Session-scoped fast-mode indicator; never persisted, reset on session start.\n\t *\n\t * Turning fast OFF also clears the cached priority tier: `/fast off` writes a remembered\n\t * `\"auto\"` that must override an inherited catalog-priority tier immediately (display and\n\t * request side), not only on the next session. Only codex-response models are touched, and\n\t * never when an explicit scoped/favorite `:priority` pin is in force — those are pinned by\n\t * the user's model selection, not by `/fast`.\n\t */\n\tsetSessionFastMode(enabled: boolean): void {\n\t\tconst previousFastMode = this.isFastModeActive();\n\t\tconst previousTier = this._currentServiceTier;\n\t\tthis._sessionFastMode = enabled;\n\t\tif (!enabled && this._currentServiceTier === \"priority\" && this.model?.api === CODEX_RESPONSES_API) {\n\t\t\t// Only an INHERITED (catalog) priority is cleared. A priority the catalog does not\n\t\t\t// explain came from an explicit scoped/favorite `:priority` pin, which `/fast` must not undo.\n\t\t\tif (this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier === \"priority\") {\n\t\t\t\tthis._currentServiceTier = undefined;\n\t\t\t}\n\t\t}\n\t\tthis._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);\n\t}\n\n\t/**\n\t * Emit `service_tier_changed` when the effective tier or the fast-mode indicator actually\n\t * moved. Both are observable state for RPC clients (`get_state.serviceTier` / `.fastMode`),\n\t * and they can move independently: a session fast-mode toggle need not change the resolved\n\t * tier, and a model switch can change the tier with fast mode untouched.\n\t */\n\tprivate _emitServiceTierChangeIfNeeded(previousTier: ServiceTier | undefined, previousFastMode: boolean): void {\n\t\tconst fastMode = this.isFastModeActive();\n\t\tif (previousTier === this._currentServiceTier && previousFastMode === fastMode) return;\n\t\tthis._emit({\n\t\t\ttype: \"service_tier_changed\",\n\t\t\ttier: this.effectiveServiceTier,\n\t\t\tfastMode,\n\t\t});\n\t}\n\n\t/**\n\t * Explicit scoped/favorite tiers win; otherwise fall back to the model's\n\t * configured serviceTier from models.json/extension compatibility config. The per-model\n\t * `/fast` memory is honored by the service-tier extension (`liveMemoryTier` + the session\n\t * flag in `before_provider_request`), not cached here: caching it would survive a same-session\n\t * `/fast off` (no model switch to re-resolve) and leak an inherited priority onto the wire.\n\t */\n\tprivate _resolveServiceTier(\n\t\tmodel: Model<any> | undefined,\n\t\texplicit: ServiceTier | undefined,\n\t): ServiceTier | undefined {\n\t\tif (explicit) return explicit;\n\t\tif (!model) return undefined;\n\t\treturn this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier;\n\t}\n\n\t/** Whether the session is currently processing an agent run or post-run continuation. */\n\tget isStreaming(): boolean {\n\t\treturn this._isAgentRunActive;\n\t}\n\n\t/** Whether the session has no active agent run, retry, auto-compaction, or queued continuation. */\n\tget isIdle(): boolean {\n\t\treturn !this._isAgentRunActive;\n\t}\n\n\t/** Current effective system prompt (includes any per-turn extension modifications) */\n\tget systemPrompt(): string {\n\t\treturn this.agent.state.systemPrompt;\n\t}\n\n\t/** Current retry attempt (0 if not retrying) */\n\tget retryAttempt(): number {\n\t\treturn this._retryAttempt;\n\t}\n\n\t/** Abort owner for the current turn boundary, used by internal renderers. */\n\tget currentAbortSource(): AgentAbortSource | undefined {\n\t\treturn this._abortProvenance.currentSource;\n\t}\n\n\t/**\n\t * Get the names of currently active tools.\n\t * Returns the names of tools currently set on the agent.\n\t */\n\tgetActiveToolNames(): string[] {\n\t\treturn this.agent.state.tools.map((t) => t.name);\n\t}\n\n\t/**\n\t * Get all configured tools with normalized exposure metadata and source metadata.\n\t */\n\tgetAllTools(): ToolInfo[] {\n\t\treturn Array.from(this._toolDefinitions.values()).map(({ definition, sourceInfo }) => ({\n\t\t\tname: definition.name,\n\t\t\tlabel: definition.label,\n\t\t\tdescription: definition.description,\n\t\t\tparameters: definition.parameters,\n\t\t\tpromptGuidelines: definition.promptGuidelines,\n\t\t\tsourceInfo,\n\t\t\t...normalizeToolExposure(definition),\n\t\t}));\n\t}\n\n\tgetToolDefinition(name: string): ToolDefinition | undefined {\n\t\treturn this._toolDefinitions.get(name)?.definition;\n\t}\n\n\tasync executeTool<TDetails = unknown>(\n\t\ttoolName: string,\n\t\tparams: unknown,\n\t\toptions?: ExecuteToolOptions<TDetails>,\n\t): Promise<AgentToolResult<TDetails>> {\n\t\tlet activeTools = this.getActiveToolNames();\n\t\tlet tool = this.agent.state.tools.find((candidate) => candidate.name === toolName);\n\t\tif (!tool && this._isEvalOnlyPolicyArmed() && this._evalOnlyToolNames?.has(toolName)) {\n\t\t\ttool = this._toolRegistry.get(toolName);\n\t\t}\n\t\tif (\n\t\t\t!tool &&\n\t\t\toptions?.activateInactiveTool === true &&\n\t\t\tthis._toolDefinitions.has(toolName) &&\n\t\t\tthis._activateLazyTool(toolName)\n\t\t) {\n\t\t\tactiveTools = this.getActiveToolNames();\n\t\t\ttool = this.agent.state.tools.find((candidate) => candidate.name === toolName);\n\t\t}\n\t\tif (!tool) {\n\t\t\tconst knownToolNames = new Set(this._toolDefinitions.keys());\n\t\t\tconst code = knownToolNames.has(toolName) ? \"inactive_tool\" : \"unknown_tool\";\n\t\t\tconst activeList = activeTools.length > 0 ? activeTools.join(\", \") : \"(none)\";\n\t\t\tthrow new ExecuteToolError(\n\t\t\t\tcode,\n\t\t\t\ttoolName,\n\t\t\t\tcode === \"inactive_tool\"\n\t\t\t\t\t? `Tool ${toolName} is registered but inactive. Active tools: ${activeList}`\n\t\t\t\t\t: `Unknown tool ${toolName}. Active tools: ${activeList}`,\n\t\t\t\tactiveTools,\n\t\t\t);\n\t\t}\n\n\t\tconst toolCall: AgentToolCall = {\n\t\t\ttype: \"toolCall\",\n\t\t\tid: `codemode-${randomUUID()}`,\n\t\t\tname: toolName,\n\t\t\targuments: params as Record<string, unknown>,\n\t\t};\n\n\t\tlet prepared: PreparedAgentToolCall;\n\t\ttry {\n\t\t\tprepared = prepareAgentToolCall(tool, toolCall);\n\t\t} catch (err) {\n\t\t\tthrow new ExecuteToolError(\n\t\t\t\t\"invalid_params\",\n\t\t\t\ttoolName,\n\t\t\t\terr instanceof Error ? err.message : String(err),\n\t\t\t\tactiveTools,\n\t\t\t);\n\t\t}\n\n\t\tconst beforeResult = await this.preflightToolCall(prepared.toolCall, prepared.args, {\n\t\t\twaitForEventQueue: this._toolExecutionDepth === 0,\n\t\t});\n\t\tif (beforeResult?.block) {\n\t\t\tthrow new ExecuteToolError(\n\t\t\t\t\"blocked\",\n\t\t\t\ttoolName,\n\t\t\t\tbeforeResult.reason || \"Tool execution was blocked\",\n\t\t\t\tactiveTools,\n\t\t\t);\n\t\t}\n\n\t\tlet result: AgentToolResult<unknown>;\n\t\tlet isError = false;\n\t\ttry {\n\t\t\tresult = await prepared.tool.execute(\n\t\t\t\tprepared.toolCall.id,\n\t\t\t\tprepared.args as never,\n\t\t\t\toptions?.signal,\n\t\t\t\toptions?.onUpdate as AgentToolUpdateCallback<unknown> | undefined,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tresult = {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { isError: true },\n\t\t\t};\n\t\t\tisError = true;\n\t\t}\n\t\tconst hookResult = await this._emitAfterToolCallHooks(prepared.toolCall, prepared.args, result, isError);\n\n\t\tif (!hookResult) {\n\t\t\treturn result as AgentToolResult<TDetails>;\n\t\t}\n\n\t\treturn {\n\t\t\tcontent: hookResult.content ?? result.content,\n\t\t\tdetails: (hookResult.details ?? result.details) as TDetails,\n\t\t\tterminate: result.terminate,\n\t\t};\n\t}\n\n\t/**\n\t * Lazily activate a registered inactive tool.\n\t *\n\t * Resolution order is deliberate: resolve the winning definition and enforce its\n\t * `allowLazyActivation` hard stop, then invoke activators in registration order.\n\t * The caller re-resolves the tool from the active registry before execution.\n\t */\n\tprivate _activateLazyTool(toolName: string): boolean {\n\t\tconst definition = this._toolDefinitions.get(toolName)?.definition;\n\t\tif (!definition || !normalizeToolExposure(definition).allowLazyActivation) return false;\n\t\treturn this._lazyToolActivators.some((activate) => activate(toolName));\n\t}\n\n\tprivate _isEvalOnlyPolicyArmed(): boolean {\n\t\treturn this._evalOnlyToolNames !== undefined && this._toolRegistry.has(\"eval\");\n\t}\n\n\t/**\n\t * Resolve the eval-only policy from settings so a reload picks up a flag change.\n\t * An explicitly configured set stays authoritative for SDK embedders and tests.\n\t */\n\tprivate _resolveEvalOnlyToolNames(): ReadonlySet<string> | undefined {\n\t\tif (this._evalOnlyToolNamesOverride !== undefined) return this._evalOnlyToolNamesOverride;\n\t\tconst names = [\n\t\t\t...(this.settingsManager.getExperimentalBashEvalOnly() ? EVAL_ONLY_SHELL_TOOL_NAMES : []),\n\t\t\t...(this.settingsManager.getExperimentalWorkflowEvalOnly() ? EVAL_ONLY_WORKFLOW_TOOL_NAMES : []),\n\t\t];\n\t\treturn names.length > 0 ? new Set(names) : undefined;\n\t}\n\n\t/**\n\t * Publish per-tool eval-only redirect hints so a direct call names its own eval helper.\n\t *\n\t * Hints published here are tracked so a disarm - or a shrinking armed set, e.g. bash+workflow\n\t * down to workflow only - withdraws the stale ones. Only tracked names are ever deleted, so\n\t * hints owned by other publishers survive.\n\t */\n\tprivate _publishEvalOnlyToolHints(): void {\n\t\tconst armed = this._isEvalOnlyPolicyArmed() ? (this._evalOnlyToolNames ?? new Set<string>()) : undefined;\n\t\tfor (const name of this._publishedEvalOnlyHintNames) {\n\t\t\tif (armed?.has(name)) continue;\n\t\t\tdelete this.agent.removedToolHints[name];\n\t\t}\n\t\tthis._publishedEvalOnlyHintNames.clear();\n\t\tif (!armed) return;\n\t\tfor (const name of armed) {\n\t\t\tthis.agent.removedToolHints[name] =\n\t\t\t\t`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`;\n\t\t\tthis._publishedEvalOnlyHintNames.add(name);\n\t\t}\n\t}\n\n\t/**\n\t * Set active tools by name.\n\t * Only tools in the registry can be enabled. Unknown tool names are ignored.\n\t * Also rebuilds the system prompt to reflect the new tool set.\n\t * Changes take effect on the next agent turn.\n\t */\n\t/**\n\t * Resolve an executable tool from the full registry (builtin + extension\n\t * tools), independent of the active set. The Cursor exec bridge uses this:\n\t * Cursor drives its native tools (read/bash/grep/ls/write) over the exec\n\t * channel regardless of which tools the request advertised.\n\t */\n\tgetRegisteredTool(name: string): AgentTool | undefined {\n\t\treturn this._toolRegistry.get(name);\n\t}\n\n\t/** Cursor exec already ran the tool; still emit tool_result so plan-touch trackers see .omo/plans writes. */\n\tasync emitExecBridgeToolResult(\n\t\ttoolName: string,\n\t\ttoolCallId: string,\n\t\targs: unknown,\n\t\tresult: AgentToolResult<unknown>,\n\t\tisError: boolean,\n\t): Promise<void> {\n\t\tawait this._emitAfterToolCallHooks(\n\t\t\t{\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tid: toolCallId,\n\t\t\t\tname: toolName,\n\t\t\t\targuments:\n\t\t\t\t\targs && typeof args === \"object\" && !Array.isArray(args) ? (args as Record<string, unknown>) : {},\n\t\t\t},\n\t\t\targs,\n\t\t\tresult,\n\t\t\tisError,\n\t\t);\n\t}\n\n\tsetActiveToolsByName(toolNames: string[]): void {\n\t\tconst tools: AgentTool[] = [];\n\t\tconst validToolNames: string[] = [];\n\t\tconst policyArmed = this._isEvalOnlyPolicyArmed();\n\t\tthis._publishEvalOnlyToolHints();\n\t\tconst policyNames = this._evalOnlyToolNames;\n\t\tlet filteredToolNames = toolNames;\n\t\tif (policyArmed && policyNames) {\n\t\t\tfor (const name of toolNames) {\n\t\t\t\tif (policyNames.has(name)) this._withheldEvalOnlyToolNames.add(name);\n\t\t\t}\n\t\t\tfilteredToolNames = toolNames.filter((name) => !policyNames.has(name));\n\t\t} else {\n\t\t\tthis._withheldEvalOnlyToolNames.clear();\n\t\t}\n\t\t// Remember the unfiltered request so a later disarm can restore withheld shell tools.\n\t\tthis._requestedActiveToolNames = [...new Set([...toolNames, ...this._withheldEvalOnlyToolNames])];\n\t\tfor (const name of filteredToolNames) {\n\t\t\tconst tool = this._toolRegistry.get(name);\n\t\t\tif (tool) {\n\t\t\t\ttools.push(tool);\n\t\t\t\tvalidToolNames.push(name);\n\t\t\t}\n\t\t}\n\t\tconst activeToolNamesChanged =\n\t\t\tvalidToolNames.length !== this.agent.state.tools.length ||\n\t\t\tvalidToolNames.some((name, index) => name !== this.agent.state.tools[index]?.name);\n\t\tthis.agent.state.tools = tools;\n\n\t\t// Rebuild base system prompt with new tool set\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);\n\t\tthis.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;\n\t\tif (activeToolNamesChanged) {\n\t\t\t// A tool change emitted while extensions are still binding belongs to the\n\t\t\t// binding itself, not to a mid-session change. The session was already\n\t\t\t// committed to the client, so cancelling or invalidating work it started\n\t\t\t// against that session would be spurious.\n\t\t\tif (this._extensionBindingPromptReadiness === undefined) {\n\t\t\t\tthis.abortCompaction();\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Whether compaction or branch summarization is currently running */\n\tget isCompacting(): boolean {\n\t\treturn (\n\t\t\tthis._compactionLifecycle.state.status === \"running\" ||\n\t\t\tthis._autoCompactionAbortController !== undefined ||\n\t\t\tthis._compactionAbortController !== undefined ||\n\t\t\tthis._branchSummaryAbortController !== undefined\n\t\t);\n\t}\n\n\tget compactionState(): Readonly<CompactionLifecycleState> {\n\t\treturn this._compactionLifecycle.state;\n\t}\n\n\t/** All messages including custom types like BashExecutionMessage */\n\tget messages(): AgentMessage[] {\n\t\treturn this.agent.state.messages;\n\t}\n\n\t/** Current steering mode */\n\tget steeringMode(): \"all\" | \"one-at-a-time\" {\n\t\treturn this.agent.steeringMode;\n\t}\n\n\t/** Current follow-up mode */\n\tget followUpMode(): \"all\" | \"one-at-a-time\" {\n\t\treturn this.agent.followUpMode;\n\t}\n\n\t/** Current session file path, or undefined if sessions are disabled */\n\tget sessionFile(): string | undefined {\n\t\treturn this.sessionManager.getSessionFile();\n\t}\n\n\t/** Current session ID */\n\tget sessionId(): string {\n\t\treturn this.sessionManager.getSessionId();\n\t}\n\n\t/** Subscribe to the internal event bus shared by this session's extensions. */\n\tonExtensionEvent(channel: string, handler: (data: unknown) => void): () => void {\n\t\treturn this._resourceLoader.onExtensionEvent?.(channel, handler) ?? (() => {});\n\t}\n\n\t/** Publish on the internal event bus shared by this session's extensions. */\n\temitExtensionEvent(channel: string, data: unknown): void {\n\t\tthis._resourceLoader.emitExtensionEvent?.(channel, data);\n\t}\n\n\t/** Current session display name, if set */\n\tget sessionName(): string | undefined {\n\t\treturn this.sessionManager.getSessionName();\n\t}\n\n\t/** Globally narrowed models (from --models / enabledModels) */\n\tget scopedModels(): ReadonlyArray<SessionModelEntry> {\n\t\treturn this._scopedModels;\n\t}\n\n\t/** Update global model narrowing */\n\tsetScopedModels(scopedModels: SessionModelEntry[]): void {\n\t\tthis._scopedModels = scopedModels;\n\t}\n\n\t/** Favorite models for Ctrl+P cycling */\n\tget favoriteModels(): ReadonlyArray<SessionModelEntry> {\n\t\treturn this._getCurrentFavoriteModels();\n\t}\n\n\t/** Update favorite models for Ctrl+P cycling */\n\tsetFavoriteModels(favoriteModels: SessionModelEntry[]): void {\n\t\tthis._favoriteModels = favoriteModels;\n\t}\n\n\tprivate _getCurrentFavoriteModels(): SessionModelEntry[] {\n\t\tconst availableById = new Map(\n\t\t\tthis._modelRuntime.getAvailableSnapshot().map((model) => [`${model.provider}/${model.id}`, model]),\n\t\t);\n\t\tconst narrowedModelIds =\n\t\t\tthis._scopedModels.length > 0\n\t\t\t\t? new Set(this._scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`))\n\t\t\t\t: undefined;\n\t\tconst seenModelIds = new Set<string>();\n\t\tconst favoriteModels: SessionModelEntry[] = [];\n\n\t\tfor (const favorite of this._favoriteModels) {\n\t\t\tconst modelId = `${favorite.model.provider}/${favorite.model.id}`;\n\t\t\tif (seenModelIds.has(modelId)) continue;\n\n\t\t\tconst model = availableById.get(modelId);\n\t\t\tif (!model) continue;\n\t\t\tif (narrowedModelIds && !narrowedModelIds.has(modelId)) continue;\n\n\t\t\tseenModelIds.add(modelId);\n\t\t\tfavoriteModels.push({\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel: favorite.thinkingLevel,\n\t\t\t\tthinkingSelection: favorite.thinkingSelection,\n\t\t\t\tserviceTier: favorite.serviceTier,\n\t\t\t});\n\t\t}\n\n\t\treturn favoriteModels;\n\t}\n\n\t/** File-based prompt templates */\n\tget promptTemplates(): ReadonlyArray<PromptTemplate> {\n\t\treturn this._resourceLoader.getPrompts().prompts;\n\t}\n\n\tprivate _normalizePromptSnippet(text: string | undefined): string | undefined {\n\t\tif (!text) return undefined;\n\t\tconst oneLine = text\n\t\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\t\treturn oneLine.length > 0 ? oneLine : undefined;\n\t}\n\n\tprivate _normalizePromptGuidelines(guidelines: string[] | undefined): string[] {\n\t\tif (!guidelines || guidelines.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst unique = new Set<string>();\n\t\tfor (const guideline of guidelines) {\n\t\t\tconst normalized = guideline.trim();\n\t\t\tif (normalized.length > 0) {\n\t\t\t\tunique.add(normalized);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(unique);\n\t}\n\n\tprivate _rebuildSystemPrompt(toolNames: string[]): string {\n\t\tconst validToolNames = toolNames.filter((name) => this._toolRegistry.has(name));\n\t\tconst toolSnippets: Record<string, string> = {};\n\t\tconst promptGuidelines: string[] = [];\n\t\tfor (const name of validToolNames) {\n\t\t\tconst snippet = this._toolPromptSnippets.get(name);\n\t\t\tif (snippet) {\n\t\t\t\ttoolSnippets[name] = snippet;\n\t\t\t}\n\n\t\t\tconst toolGuidelines = this._toolPromptGuidelines.get(name);\n\t\t\tif (toolGuidelines) {\n\t\t\t\tpromptGuidelines.push(...toolGuidelines);\n\t\t\t}\n\t\t}\n\n\t\tconst loadedSkills = this._resourceLoader.getSkills().skills;\n\t\tconst loadedContextFiles = this._resourceLoader.getAgentsFiles().agentsFiles;\n\t\tconst loaderSystemPrompt = this._resourceLoader.getSystemPrompt();\n\t\tconst loaderAppendSystemPrompt = this._resourceLoader.getAppendSystemPrompt();\n\n\t\tthis._baseSystemPromptOptions = {\n\t\t\tcwd: this._cwd,\n\t\t\tskills: loadedSkills,\n\t\t\tcontextFiles: loadedContextFiles,\n\t\t\tselectedTools: validToolNames,\n\t\t\ttoolSnippets,\n\t\t\tpromptGuidelines,\n\t\t\tcustomPrompt: loaderSystemPrompt,\n\t\t\tappendSystemPrompt: loaderAppendSystemPrompt.length > 0 ? loaderAppendSystemPrompt.join(\"\\n\\n\") : undefined,\n\t\t};\n\t\tconst basePrompt = loaderSystemPrompt ?? buildDynamicSystemPrompt(this._baseSystemPromptOptions);\n\t\tconst prompt =\n\t\t\tloaderAppendSystemPrompt.length > 0 ? `${basePrompt}\\n\\n${loaderAppendSystemPrompt.join(\"\\n\\n\")}` : basePrompt;\n\t\tif (!this._isEvalOnlyPolicyArmed()) return prompt;\n\t\tconst armed = this._evalOnlyToolNames ?? new Set<string>();\n\t\tconst sentences: string[] = [];\n\t\tconst shellHelpers = EVAL_ONLY_SHELL_TOOL_NAMES.filter((name) => armed.has(name)).map(evalHelperCall);\n\t\tif (shellHelpers.length > 0) {\n\t\t\tsentences.push(\n\t\t\t\t`Shell commands run ONLY inside eval cells via ${shellHelpers.join(\" or \")}; hooks and permissions still apply.`,\n\t\t\t);\n\t\t}\n\t\tif (armed.has(\"workflow\")) {\n\t\t\tsentences.push(\n\t\t\t\t`The workflow tool runs ONLY inside eval cells via ${evalHelperCall(\"workflow\")}; hooks and permissions still apply.`,\n\t\t\t);\n\t\t}\n\t\t// SDK embedders can arm names outside the built-in groups; they still need eval guidance.\n\t\tconst otherHelpers = [...armed]\n\t\t\t.filter((name) => !EVAL_ONLY_SHELL_TOOL_NAMES.includes(name) && name !== \"workflow\")\n\t\t\t.map(evalHelperCall);\n\t\tif (otherHelpers.length > 0) {\n\t\t\tsentences.push(\n\t\t\t\t`These tools run ONLY inside eval cells via ${otherHelpers.join(\" or \")}; hooks and permissions still apply.`,\n\t\t\t);\n\t\t}\n\t\treturn sentences.length > 0 ? `${prompt}\\n\\n${sentences.join(\"\\n\\n\")}` : prompt;\n\t}\n\n\t/**\n\t * Send a prompt to the agent.\n\t * - Handles extension commands (registered via pi.registerCommand) immediately, even during streaming\n\t * - Expands file-based prompt templates by default\n\t * - During streaming, queues via steer() or followUp() based on streamingBehavior option\n\t * - Validates model and API key before sending (when not streaming)\n\t * @throws Error if streaming and no streamingBehavior specified\n\t * @throws Error if no model selected or no API key available (when not streaming)\n\t */\n\tasync prompt(text: string, options?: PromptOptions): Promise<void> {\n\t\tconst throwIfCancelled = (): void => {\n\t\t\tif (!options?.signal?.aborted) return;\n\t\t\tconst error = new Error(\"Prompt cancelled before acceptance\");\n\t\t\terror.name = \"AbortError\";\n\t\t\tthrow error;\n\t\t};\n\t\tthrowIfCancelled();\n\t\tconst userAbortPromise = this._userAbortPromise;\n\t\tif (userAbortPromise) {\n\t\t\tawait userAbortPromise;\n\t\t\tthrowIfCancelled();\n\t\t}\n\n\t\t// Extension commands are UI actions, not prompts: dispatch them before the\n\t\t// settled-session-work gate below. That gate makes a bare prompt() wait for\n\t\t// _sessionWorkBarrier, which a scheduled continuation (goal chain, queued\n\t\t// follow-up) holds for an entire run, so a command typed mid-turn used to run\n\t\t// only after the turn ended. The registry lookup stays synchronous so ordinary\n\t\t// text beginning with \"/\" gains no await before the prompt-start bookkeeping.\n\t\ttry {\n\t\t\tif ((options?.expandPromptTemplates ?? true) && text.startsWith(\"/\")) {\n\t\t\t\tconst spaceIndex = text.indexOf(\" \");\n\t\t\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\t\t\tif (this._extensionRunner.getCommand(commandName)) {\n\t\t\t\t\tconst handled = await this._tryExecuteExtensionCommand(text);\n\t\t\t\t\tthrowIfCancelled();\n\t\t\t\t\tif (handled) {\n\t\t\t\t\t\toptions?.promptDisposition?.(\"handled\");\n\t\t\t\t\t\toptions?.preflightResult?.(true);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\toptions?.preflightResult?.(false);\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (options?.source !== \"extension\" && this._compactionAbortController !== undefined) {\n\t\t\toptions?.preflightResult?.(false);\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.\",\n\t\t\t);\n\t\t}\n\n\t\tconst ownsPromptStart =\n\t\t\t!this.isStreaming && !this._promptStartPending && options?.streamingBehavior === undefined;\n\t\tif (ownsPromptStart) this._promptStartPending = true;\n\t\t// Extension bindings deliberately fire-and-forget sendUserMessage(), so an\n\t\t// extension callback cannot deadlock on this wait. The resulting provider\n\t\t// turn must still serialize behind compaction and other session work just\n\t\t// like an interactive prompt does.\n\t\tconst shouldWaitForSessionWork = true;\n\t\tconst pendingCompactionAdmissionAtExtensionAdmission =\n\t\t\toptions?.source === \"extension\" ? this._pendingCompactionAdmission : undefined;\n\t\tconst compactionGenerationAtExtensionAdmission =\n\t\t\toptions?.source === \"extension\" &&\n\t\t\tthis._sessionWorkBarrier.hasActiveWork &&\n\t\t\tthis._compactionLifecycle.state.status !== \"idle\"\n\t\t\t\t? this._compactionLifecycle.state.generation\n\t\t\t\t: undefined;\n\t\t// A steer/followUp submission during an active run can be queued immediately.\n\t\t// Waiting on the session-work barrier here would trap the message inside this\n\t\t// call for the rest of the run whenever a queued continuation (e.g. an active\n\t\t// goal chain) holds the barrier, making typed input invisible until the run\n\t\t// ends or the user aborts.\n\t\tconst canQueueWhileStreaming =\n\t\t\t(this.isStreaming || this._promptStartPending) &&\n\t\t\t!this.isCompacting &&\n\t\t\toptions?.streamingBehavior !== undefined;\n\t\t// Auto-compaction claims only _autoCompactionAbortController, which the\n\t\t// admission guard above deliberately ignores so background compaction never\n\t\t// rejects typed input. Without a queue route that message matched no branch\n\t\t// below and fell through neither queued nor started (field bug: input typed\n\t\t// while the TUI showed \"Compacting context...\" was accepted and dropped).\n\t\t// Manual compaction keeps its fail-closed admission path untouched.\n\t\tconst canQueueDuringAutoCompaction =\n\t\t\tthis._autoCompactionAbortController !== undefined &&\n\t\t\tthis._compactionAbortController === undefined &&\n\t\t\t!this.isStreaming &&\n\t\t\t!this._promptStartPending &&\n\t\t\toptions?.streamingBehavior !== undefined;\n\t\tif (\n\t\t\tshouldWaitForSessionWork &&\n\t\t\t!canQueueWhileStreaming &&\n\t\t\t!canQueueDuringAutoCompaction &&\n\t\t\t(!this.isStreaming || this.isCompacting || this._sessionWorkBarrier.hasActiveWork)\n\t\t) {\n\t\t\tawait this._waitForSettledSessionWork();\n\t\t\tthrowIfCancelled();\n\t\t\toptions?.onSessionWorkReady?.();\n\t\t}\n\n\t\t// Turn boundary: restore the primary model if the fallback cooldown expired.\n\t\tif (!this.isStreaming) {\n\t\t\ttry {\n\t\t\t\tawait this._maybeRestoreFallbackPrimary();\n\t\t\t} catch (error) {\n\t\t\t\tif (ownsPromptStart) this._promptStartPending = false;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst expandPromptTemplates = options?.expandPromptTemplates ?? true;\n\t\tconst preflightResult = options?.preflightResult;\n\t\tconst promptDisposition = options?.promptDisposition;\n\t\tlet messages: AgentMessage[] | undefined;\n\t\tlet titlePrompt: string | undefined;\n\t\tlet consumedNextTurnMessages: CustomMessage[] | undefined;\n\t\tlet inputId: string | undefined;\n\t\tlet pendingCommandInvocation: CommandInvocation | undefined;\n\t\tconst emitPendingCommandInvocation = (): void => {\n\t\t\tif (!pendingCommandInvocation) return;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"command_invocation\",\n\t\t\t\tcommand: pendingCommandInvocation,\n\t\t\t});\n\t\t\tpendingCommandInvocation = undefined;\n\t\t};\n\t\tconst emitInputDisposition = async (\n\t\t\tdisposition: \"handled\" | \"queued\" | \"started\" | \"rejected\",\n\t\t): Promise<void> => {\n\t\t\tif (inputId === undefined) return;\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"input_disposition\",\n\t\t\t\tinputId,\n\t\t\t\tdisposition,\n\t\t\t});\n\t\t};\n\n\t\ttry {\n\t\t\t// Emit input event for extension interception (before skill/template expansion)\n\t\t\tlet currentText = text;\n\t\t\tlet currentImages = options?.images;\n\t\t\tif (this._extensionRunner.hasHandlers(\"input\")) {\n\t\t\t\tinputId = `${this.sessionManager.getSessionId()}:${++this._nextInputId}`;\n\t\t\t\tconst inputResult = await this._extensionRunner.emitInput(\n\t\t\t\t\tcurrentText,\n\t\t\t\t\tcurrentImages,\n\t\t\t\t\toptions?.source ?? \"interactive\",\n\t\t\t\t\tthis.isStreaming ? options?.streamingBehavior : undefined,\n\t\t\t\t\tinputId,\n\t\t\t\t);\n\t\t\t\tthrowIfCancelled();\n\t\t\t\tif (inputResult.action === \"handled\") {\n\t\t\t\t\tawait emitInputDisposition(\"handled\");\n\t\t\t\t\tpromptDisposition?.(\"handled\");\n\t\t\t\t\tpreflightResult?.(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (inputResult.action === \"transform\") {\n\t\t\t\t\tcurrentText = inputResult.text;\n\t\t\t\t\tcurrentImages = inputResult.images ?? currentImages;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Expand skill commands (/skill:name args) and prompt templates (/template args)\n\t\t\tlet expandedText = currentText;\n\t\t\tif (expandPromptTemplates) {\n\t\t\t\texpandedText = this._expandSkillCommand(expandedText);\n\t\t\t\tconst templateExpansion = expandPromptTemplateWithMetadata(expandedText, [...this.promptTemplates]);\n\t\t\t\texpandedText = templateExpansion.text;\n\t\t\t\tif (templateExpansion.template) {\n\t\t\t\t\tpendingCommandInvocation = {\n\t\t\t\t\t\tname: templateExpansion.template.name,\n\t\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\t\tsourceInfo: templateExpansion.template.sourceInfo,\n\t\t\t\t\t\tsyntax: \"slash\",\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\ttitlePrompt = options?.sessionTitlePrompt === false ? undefined : (options?.sessionTitlePrompt ?? text);\n\n\t\t\t// If streaming, queue via steer() or followUp() based on option\n\t\t\tif (this.isStreaming) {\n\t\t\t\tif (!options?.streamingBehavior) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (options.thinkingLevel !== undefined) {\n\t\t\t\t\tthrow new Error(\"Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.\");\n\t\t\t\t}\n\t\t\t\tif (options.streamingBehavior === \"followUp\") {\n\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t}\n\t\t\t\temitPendingCommandInvocation();\n\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\tpreflightResult?.(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Input accepted while a run was active remains queued even if that run\n\t\t\t// ends while extension input handling or template expansion is pending.\n\t\t\t// Starting a fresh prompt here would let it overtake the held continuation.\n\t\t\tif (canQueueWhileStreaming && !this.isStreaming) {\n\t\t\t\tif (options?.thinkingLevel !== undefined) {\n\t\t\t\t\tthrow new Error(\"Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.\");\n\t\t\t\t}\n\t\t\t\tif (options?.streamingBehavior === \"followUp\") {\n\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t}\n\t\t\t\temitPendingCommandInvocation();\n\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\tpreflightResult?.(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Auto-compaction owns the session without claiming the admission controller,\n\t\t\t// so a queueable submission reaches here with no branch above matching and\n\t\t\t// would fall through neither queued nor started. Queue it instead of starting\n\t\t\t// a turn against a context that is still being compacted.\n\t\t\tif (canQueueDuringAutoCompaction && !this.isStreaming) {\n\t\t\t\tif (options?.thinkingLevel !== undefined) {\n\t\t\t\t\tthrow new Error(\"Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.\");\n\t\t\t\t}\n\t\t\t\tif (options?.streamingBehavior === \"followUp\") {\n\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t}\n\t\t\t\temitPendingCommandInvocation();\n\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\tpreflightResult?.(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// The queue-while-streaming bypass above skipped the settled-work wait. If\n\t\t\t// the run ended while input was being expanded, serialize with remaining\n\t\t\t// session work before sending a fresh prompt, and re-queue if a scheduled\n\t\t\t// continuation started a new run in the meantime.\n\t\t\tif (\n\t\t\t\tcanQueueWhileStreaming &&\n\t\t\t\tshouldWaitForSessionWork &&\n\t\t\t\t(this.isCompacting || this._sessionWorkBarrier.hasActiveWork)\n\t\t\t) {\n\t\t\t\tawait this._waitForSettledSessionWork();\n\t\t\t\tthrowIfCancelled();\n\t\t\t\tif (this.isStreaming) {\n\t\t\t\t\tif (options?.thinkingLevel !== undefined) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (options?.streamingBehavior === \"followUp\") {\n\t\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t\t}\n\t\t\t\t\temitPendingCommandInvocation();\n\t\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\t\tpreflightResult?.(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// A background extension prompt that arrived during a manual compaction\n\t\t\t// must never overtake a rejected or aborted compaction. Keep its normal\n\t\t\t// queue ownership instead of attempting another provider admission.\n\t\t\tif (\n\t\t\t\t(pendingCompactionAdmissionAtExtensionAdmission !== undefined &&\n\t\t\t\t\tpendingCompactionAdmissionAtExtensionAdmission.outcome !== \"completed\") ||\n\t\t\t\t(compactionGenerationAtExtensionAdmission !== undefined &&\n\t\t\t\t\tthis._compactionLifecycle.state.generation === compactionGenerationAtExtensionAdmission &&\n\t\t\t\t\t(this._compactionLifecycle.state.status === \"failed\" ||\n\t\t\t\t\t\tthis._compactionLifecycle.state.status === \"aborted\"))\n\t\t\t) {\n\t\t\t\tif (options?.streamingBehavior === \"followUp\") {\n\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t}\n\t\t\t\temitPendingCommandInvocation();\n\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\tpreflightResult?.(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Flush any pending bash messages before the new prompt\n\t\t\tthis._flushPendingBashMessages();\n\n\t\t\t// Validate model\n\t\t\tif (!this.model) {\n\t\t\t\tthrow new Error(formatNoModelSelectedMessage());\n\t\t\t}\n\n\t\t\tconst hasConfiguredAuth =\n\t\t\t\tthis._modelRuntime.hasConfiguredAuth(this.model.provider) ||\n\t\t\t\t(await this._modelRuntime.checkAuth(this.model.provider)) !== undefined;\n\t\t\tif (!hasConfiguredAuth) {\n\t\t\t\tconst isOAuth = this._modelRuntime.isUsingOAuth(this.model.provider);\n\t\t\t\tif (isOAuth) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Authentication failed for \"${this.model.provider}\". ` +\n\t\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t\t`Run '/login ${this.model.provider}' to re-authenticate.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(formatNoApiKeyFoundMessage(this.model.provider));\n\t\t\t}\n\n\t\t\t// The user's new prompt is sent below, so do not call agent.continue() here.\n\t\t\tawait this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(), false, \"pre_prompt\");\n\n\t\t\t// Build messages array (custom message if any, then user message)\n\t\t\tmessages = [];\n\n\t\t\t// Add user message\n\t\t\tconst userContent: (TextContent | ImageContent)[] = [{ type: \"text\", text: expandedText }];\n\t\t\tif (currentImages) {\n\t\t\t\tuserContent.push(...currentImages);\n\t\t\t}\n\t\t\tmessages.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userContent,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\t// Consume next-turn messages transactionally: a final admission rejection\n\t\t\t// restores them in their original order rather than dropping or duplicating\n\t\t\t// one-shot extension state.\n\t\t\tconsumedNextTurnMessages = this._pendingNextTurnMessages;\n\t\t\tthis._pendingNextTurnMessages = [];\n\t\t\tfor (const msg of consumedNextTurnMessages) {\n\t\t\t\tmessages.push(msg);\n\t\t\t}\n\n\t\t\t// Emit before_agent_start extension event\n\t\t\tconst result = await this._extensionRunner.emitBeforeAgentStart(\n\t\t\t\texpandedText,\n\t\t\t\tcurrentImages,\n\t\t\t\tthis._baseSystemPrompt,\n\t\t\t\tthis._baseSystemPromptOptions,\n\t\t\t);\n\t\t\t// Add all custom messages from extensions\n\t\t\tif (result?.messages) {\n\t\t\t\tfor (const msg of result.messages) {\n\t\t\t\t\tmessages.push({\n\t\t\t\t\t\trole: \"custom\",\n\t\t\t\t\t\tcustomType: msg.customType,\n\t\t\t\t\t\t// Untyped extensions can pass null/missing content; normalize at ingestion.\n\t\t\t\t\t\tcontent: msg.content ?? [],\n\t\t\t\t\t\tdisplay: msg.display,\n\t\t\t\t\t\tdetails: msg.details,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Apply extension-modified system prompt, or reset to base\n\t\t\tif (result?.systemPrompt !== undefined) {\n\t\t\t\tthis._systemPromptOverride = result.systemPrompt;\n\t\t\t\tthis.agent.state.systemPrompt = result.systemPrompt;\n\t\t\t} else {\n\t\t\t\t// Ensure we're using the base prompt (in case previous turn had modifications)\n\t\t\t\tthis._systemPromptOverride = undefined;\n\t\t\t\tthis.agent.state.systemPrompt = this._baseSystemPrompt;\n\t\t\t}\n\n\t\t\t// The preflight above only sees persisted session context. These prompt,\n\t\t\t// next-turn, and before_agent_start additions are also provider-visible,\n\t\t\t// so make one final admission decision against the complete request.\n\t\t\tawait this._enforceFinalProviderAdmission(messages);\n\t\t\tthrowIfCancelled();\n\t\t\tawait emitInputDisposition(\"started\");\n\t\t} catch (error) {\n\t\t\tawait emitInputDisposition(\"rejected\");\n\t\t\tif (consumedNextTurnMessages && consumedNextTurnMessages.length > 0) {\n\t\t\t\tthis._pendingNextTurnMessages = [...consumedNextTurnMessages, ...this._pendingNextTurnMessages];\n\t\t\t}\n\t\t\tpreflightResult?.(false);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (ownsPromptStart) this._promptStartPending = false;\n\t\t}\n\n\t\tif (!messages) {\n\t\t\treturn;\n\t\t}\n\n\t\tpromptDisposition?.(\"started\");\n\t\temitPendingCommandInvocation();\n\t\tpreflightResult?.(true);\n\t\tif (options?.thinkingLevel !== undefined) {\n\t\t\tthis.setSessionThinkingLevel(options.thinkingLevel);\n\t\t}\n\t\tawait this._promptAgent(messages);\n\t\tawait this.waitForRetry();\n\t\tawait this.waitForIdle();\n\t\tif (options?.onSessionWorkReady) {\n\t\t\t// This prompt owns a session-work token acquired after waiting for a\n\t\t\t// prior operation, so waiting for the global barrier here would await\n\t\t\t// itself. _promptAgent() already drained its event queue; any newly\n\t\t\t// scheduled continuation retains its own barrier ownership.\n\t\t\tawait this.agent.waitForIdle();\n\t\t} else if (shouldWaitForSessionWork) {\n\t\t\tawait this._waitForSettledSessionWork();\n\t\t} else {\n\t\t\tawait this.agent.waitForIdle();\n\t\t}\n\t\tif (titlePrompt !== undefined) {\n\t\t\tthis._startSessionTitleGeneration(titlePrompt);\n\t\t}\n\t}\n\n\t/**\n\t * Try to execute an extension command. Returns true if command was found and executed.\n\t */\n\tprivate async _tryExecuteExtensionCommand(text: string): Promise<boolean> {\n\t\t// Parse command name and args\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1);\n\n\t\tconst command = this._extensionRunner.getCommand(commandName);\n\t\tif (!command) return false;\n\t\tthis._emit({\n\t\t\ttype: \"command_invocation\",\n\t\t\tcommand: {\n\t\t\t\tname: commandName,\n\t\t\t\tsource: \"extension\",\n\t\t\t\tsourceInfo: command.sourceInfo,\n\t\t\t\tsyntax: \"slash\",\n\t\t\t},\n\t\t});\n\n\t\t// Get command context from extension runner (includes session control methods)\n\t\tconst ctx = this._extensionRunner.createCommandContext();\n\n\t\ttry {\n\t\t\tawait command.handler(args, ctx);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\t// Emit error via extension runner\n\t\t\tthis._extensionRunner.emitError({\n\t\t\t\textensionPath: `command:${commandName}`,\n\t\t\t\tevent: \"command\",\n\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t/**\n\t * Expand explicit skill invocations to their full content.\n\t * Leading runs accept slash and dollar syntax; inline expansion is limited to\n\t * the desktop's explicit `$skill:name` token so ordinary dollar prose stays literal.\n\t */\n\tprivate _expandSkillCommand(text: string): string {\n\t\tconst invocationTokens = parseSkillInvocationTokens(text);\n\t\tif (invocationTokens.length === 0) return text;\n\n\t\tconst skills = this.resourceLoader.getSkills().skills;\n\t\tconst expandedSkillNames = new Set<string>();\n\t\tconst skillBlocks: SkillInvocationPromptSkill[] = [];\n\t\tconst invocationMetadata: Array<{\n\t\t\tname: string;\n\t\t\tpath: string;\n\t\t\tsyntax: SkillInvocationSyntax;\n\t\t}> = [];\n\t\tconst removedTokens: SkillInvocationToken[] = [];\n\n\t\tfor (const token of invocationTokens) {\n\t\t\tconst skill = skills.find((candidate) => candidate.name === token.name);\n\t\t\tif (!skill) {\n\t\t\t\tif (token.position === \"leading\") break;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (skillBlocks.length >= MAX_SKILL_EXPANSIONS_PER_PROMPT) {\n\t\t\t\tthis._extensionRunner.emitError({\n\t\t\t\t\textensionPath: \"skill:expansion\",\n\t\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\t\terror: `Expanded at most ${MAX_SKILL_EXPANSIONS_PER_PROMPT} skills; remaining skill commands were left as literal text.`,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tremovedTokens.push(token);\n\t\t\tif (expandedSkillNames.has(skill.name)) {\n\t\t\t\tthis._extensionRunner.emitError({\n\t\t\t\t\textensionPath: skill.filePath,\n\t\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\t\terror: `Skipped duplicate skill invocation: ${skill.name}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst content = readFileSync(skill.filePath, \"utf-8\");\n\t\t\t\tconst body = stripFrontmatter(content).trim();\n\t\t\t\tskillBlocks.push({\n\t\t\t\t\tname: skill.name,\n\t\t\t\t\tfilePath: skill.filePath,\n\t\t\t\t\tbaseDir: skill.baseDir,\n\t\t\t\t\tbody,\n\t\t\t\t});\n\t\t\t\texpandedSkillNames.add(skill.name);\n\t\t\t\tinvocationMetadata.push({\n\t\t\t\t\tname: skill.name,\n\t\t\t\t\tpath: skill.filePath,\n\t\t\t\t\tsyntax: token.syntax,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tthis._extensionRunner.emitError({\n\t\t\t\t\textensionPath: skill.filePath,\n\t\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t});\n\t\t\t\treturn text; // Return the original prompt when any skill file cannot be read.\n\t\t\t}\n\t\t}\n\n\t\tif (skillBlocks.length === 0) return text;\n\t\tconst userRequest = removeSkillInvocationTokens(text, removedTokens);\n\t\tthis._emit({ type: \"skill_invocation\", skills: invocationMetadata });\n\t\treturn formatSkillInvocationPrompt(skillBlocks, userRequest);\n\t}\n\n\t/**\n\t * Queue a steering message while the agent is running.\n\t * Delivered after the current assistant turn finishes executing its tool calls,\n\t * before the next LLM call.\n\t * Expands skill commands and prompt templates. Errors on extension commands.\n\t * @param images Optional image attachments to include with the message\n\t * @throws Error if text is an extension command\n\t */\n\tasync steer(text: string, images?: ImageContent[], recovery?: { enqueueOrder?: number }): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\tconst templateExpansion = expandPromptTemplateWithMetadata(expandedText, [...this.promptTemplates]);\n\t\texpandedText = templateExpansion.text;\n\n\t\tawait this._queueSteer(expandedText, images, recovery?.enqueueOrder);\n\t\tif (templateExpansion.template) {\n\t\t\tthis._emit({\n\t\t\t\ttype: \"command_invocation\",\n\t\t\t\tcommand: {\n\t\t\t\t\tname: templateExpansion.template.name,\n\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\tsourceInfo: templateExpansion.template.sourceInfo,\n\t\t\t\t\tsyntax: \"slash\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t * Delivered only when agent has no more tool calls or steering messages.\n\t * Expands skill commands and prompt templates. Errors on extension commands.\n\t * @param images Optional image attachments to include with the message\n\t * @throws Error if text is an extension command\n\t */\n\tasync followUp(text: string, images?: ImageContent[], recovery?: { enqueueOrder?: number }): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\tconst templateExpansion = expandPromptTemplateWithMetadata(expandedText, [...this.promptTemplates]);\n\t\texpandedText = templateExpansion.text;\n\n\t\tawait this._queueFollowUp(expandedText, images, recovery?.enqueueOrder);\n\t\tif (templateExpansion.template) {\n\t\t\tthis._emit({\n\t\t\t\ttype: \"command_invocation\",\n\t\t\t\tcommand: {\n\t\t\t\t\tname: templateExpansion.template.name,\n\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\tsourceInfo: templateExpansion.template.sourceInfo,\n\t\t\t\t\tsyntax: \"slash\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _startSessionTitleGeneration(firstPrompt: string): void {\n\t\tif (!this._autoTitleSessions || this.sessionManager.getSessionName() || shouldSkipSessionTitle(firstPrompt)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._sessionTitleAbortController !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst model = this.model;\n\t\tif (!model) {\n\t\t\treturn;\n\t\t}\n\t\tconst abortController = new AbortController();\n\t\tthis._sessionTitleAbortController = abortController;\n\t\tthis._sessionTitlePromise = this._generateSessionTitle(firstPrompt, model, abortController);\n\t}\n\n\tprivate async _generateSessionTitle(\n\t\tfirstPrompt: string,\n\t\tmodel: Model<Api>,\n\t\tabortController: AbortController,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst auth = await this._getSummarizationRequestAuth(model);\n\t\t\tconst title = await generateSessionTitle({\n\t\t\t\tfirstPrompt,\n\t\t\t\tmodel,\n\t\t\t\tauth,\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tbaseOptions: this._buildSessionTitleBaseOptions(),\n\t\t\t\tretry: sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),\n\t\t\t\tsignal: abortController.signal,\n\t\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\t});\n\t\t\tif (abortController.signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (title && !this.sessionManager.getSessionName()) {\n\t\t\t\tthis.setSessionName(title);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (abortController.signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthis._extensionRunner.emitError({\n\t\t\t\textensionPath: RUNTIME_EXTENSION_PATH,\n\t\t\t\tevent: \"session_title_generation\",\n\t\t\t\terror: message,\n\t\t\t});\n\t\t} finally {\n\t\t\tif (this._sessionTitleAbortController === abortController) {\n\t\t\t\tthis._sessionTitleAbortController = undefined;\n\t\t\t}\n\t\t\tif (this._sessionTitlePromise !== undefined) {\n\t\t\t\tthis._sessionTitlePromise = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate abortSessionTitleGeneration(): void {\n\t\tthis._sessionTitleAbortController?.abort();\n\t\tthis._sessionTitleAbortController = undefined;\n\t}\n\n\tprivate _buildSessionTitleBaseOptions(): SimpleStreamOptions {\n\t\treturn {\n\t\t\tonPayload: this.agent.onPayload,\n\t\t\tonResponse: this.agent.onResponse,\n\t\t\ttransport: this.agent.transport,\n\t\t\tthinkingBudgets: this.agent.thinkingBudgets,\n\t\t\ttimeoutMs: this.agent.timeoutMs,\n\t\t\tmaxRetryDelayMs: this.agent.maxRetryDelayMs,\n\t\t};\n\t}\n\n\t/**\n\t * Internal: Queue a steering message (already expanded, no extension command check).\n\t */\n\tprivate async _queueSteer(text: string, images?: ImageContent[], enqueueOrder?: number): Promise<void> {\n\t\tthis._steeringMessages.push(text);\n\t\tthis._recordQueuedInput(text, \"steer\", enqueueOrder);\n\t\tthis._sessionLogger.debug(\"queue_enqueue\", {\n\t\t\tmode: \"steer\",\n\t\t\tcount: this._steeringMessages.length,\n\t\t});\n\t\tthis._emitQueueUpdate();\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\tconst message: AgentMessage = {\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tif (this._promptStartPending && this._skipNextPostCompactionAssistantCheck) {\n\t\t\tthis._postCompactionDeferredSteeringMessages.push(message);\n\t\t\treturn;\n\t\t}\n\t\tthis.agent.steer(message);\n\t}\n\n\t/**\n\t * Internal: Queue a follow-up message (already expanded, no extension command check).\n\t */\n\tprivate async _queueFollowUp(text: string, images?: ImageContent[], enqueueOrder?: number): Promise<void> {\n\t\tthis._followUpMessages.push(text);\n\t\tthis._recordQueuedInput(text, \"followUp\", enqueueOrder);\n\t\tthis._sessionLogger.debug(\"queue_enqueue\", {\n\t\t\tmode: \"followUp\",\n\t\t\tcount: this._followUpMessages.length,\n\t\t});\n\t\tthis._emitQueueUpdate();\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\tconst message: AgentMessage = {\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tif (this._promptStartPending && this._skipNextPostCompactionAssistantCheck) {\n\t\t\tthis._postCompactionDeferredFollowUpMessages.push(message);\n\t\t\treturn;\n\t\t}\n\t\tthis.agent.followUp(message);\n\t}\n\n\tprivate _flushPostCompactionDeferredMessages(): void {\n\t\tfor (const message of this._postCompactionDeferredSteeringMessages) {\n\t\t\tthis.agent.steer(message);\n\t\t}\n\t\tthis._postCompactionDeferredSteeringMessages = [];\n\t\tfor (const message of this._postCompactionDeferredFollowUpMessages) {\n\t\t\tthis.agent.followUp(message);\n\t\t}\n\t\tthis._postCompactionDeferredFollowUpMessages = [];\n\t}\n\n\t/**\n\t * Throw an error if the text is an extension command.\n\t */\n\tprivate _throwIfExtensionCommand(text: string): void {\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\tconst command = this._extensionRunner.getCommand(commandName);\n\n\t\tif (command) {\n\t\t\tthrow new Error(\n\t\t\t\t`Extension command \"/${commandName}\" cannot be queued. Use prompt() or execute the command when not streaming.`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Send a custom message to the session. Creates a CustomMessageEntry.\n\t *\n\t * Handles three cases:\n\t * - Streaming: queues message, processed when loop pulls from queue\n\t * - Not streaming + triggerTurn: appends to state/session, starts new turn\n\t * - Not streaming + no trigger: appends to state/session, no turn\n\t *\n\t * @param message Custom message with customType, content, display, details\n\t * @param options.triggerTurn If true and not streaming, triggers a new LLM turn\n\t * @param options.deliverAs Delivery mode: \"steer\", \"followUp\", or \"nextTurn\"\n\t */\n\tasync sendCustomMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: {\n\t\t\ttriggerTurn?: boolean;\n\t\t\tdeliverAs?: \"steer\" | \"followUp\" | \"nextTurn\";\n\t\t},\n\t\tdeferredTurnClaim?: DeferredTurnClaim,\n\t): Promise<void> {\n\t\tconst userAbortGeneration = this._userAbortGeneration;\n\t\tconst appMessage = {\n\t\t\trole: \"custom\" as const,\n\t\t\tcustomType: message.customType,\n\t\t\t// Untyped extensions can pass null/missing content; normalize at ingestion.\n\t\t\tcontent: message.content ?? [],\n\t\t\tdisplay: message.display,\n\t\t\tdetails: message.details,\n\t\t\ttimestamp: Date.now(),\n\t\t} satisfies CustomMessage<T>;\n\t\tconst waitForExistingSessionWork =\n\t\t\toptions?.triggerTurn === true &&\n\t\t\toptions.deliverAs !== \"nextTurn\" &&\n\t\t\t!this.isStreaming &&\n\t\t\tthis._sessionWorkBarrier.hasActiveWork &&\n\t\t\t// The session-start binding itself holds the barrier while it emits\n\t\t\t// session_start; a triggerTurn message queued from that emission (e.g. a\n\t\t\t// goal continuation) must not wait on the very work that is delivering it.\n\t\t\tthis._extensionBindingPromptReadiness === undefined;\n\t\tconst pendingCompactionAdmission = this._pendingCompactionAdmission;\n\t\tconst activeCompactionGeneration =\n\t\t\tthis._compactionLifecycle.state.status === \"running\" ? this._compactionLifecycle.state.generation : undefined;\n\t\tlet finishSessionWork: (() => void) | undefined;\n\t\ttry {\n\t\t\tif (waitForExistingSessionWork) {\n\t\t\t\tawait this._waitForSettledSessionWork();\n\t\t\t\tif (userAbortGeneration !== this._userAbortGeneration) return;\n\t\t\t\tfinishSessionWork = this._sessionWorkBarrier.begin();\n\t\t\t}\n\n\t\t\tif (options?.deliverAs === \"nextTurn\") {\n\t\t\t\tthis._pendingNextTurnMessages.push(appMessage);\n\t\t\t} else if (this.isStreaming && options?.triggerTurn !== false) {\n\t\t\t\tdeferredTurnClaim?.resolve(\"delegated\");\n\t\t\t\tif (options?.deliverAs === \"followUp\") {\n\t\t\t\t\tthis.agent.followUp(appMessage);\n\t\t\t\t} else {\n\t\t\t\t\tthis.agent.steer(appMessage);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\toptions?.triggerTurn === true &&\n\t\t\t\t((pendingCompactionAdmission !== undefined && pendingCompactionAdmission.outcome !== \"completed\") ||\n\t\t\t\t\t(activeCompactionGeneration !== undefined &&\n\t\t\t\t\t\tthis._compactionLifecycle.state.generation === activeCompactionGeneration &&\n\t\t\t\t\t\tthis._compactionLifecycle.state.status !== \"completed\"))\n\t\t\t) {\n\t\t\t\tdeferredTurnClaim?.resolve(\"delegated\");\n\t\t\t\tif (options?.deliverAs === \"followUp\") {\n\t\t\t\t\tthis.agent.followUp(appMessage);\n\t\t\t\t} else {\n\t\t\t\t\tthis.agent.steer(appMessage);\n\t\t\t\t}\n\t\t\t} else if (options?.triggerTurn) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(), false, \"pre_prompt\");\n\t\t\t\t\tawait this._enforceFinalProviderAdmission([appMessage]);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Mirror sendUserMessage's retention contract: an admission\n\t\t\t\t\t// rejection must retain the message for later delivery instead\n\t\t\t\t\t// of silently dropping it (the fire-and-forget extension action\n\t\t\t\t\t// swallows this rejection).\n\t\t\t\t\tif (options.deliverAs === \"followUp\") {\n\t\t\t\t\t\tthis.agent.followUp(appMessage);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.agent.steer(appMessage);\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tawait this._promptAgent(appMessage, deferredTurnClaim);\n\t\t\t} else if (this.isStreaming) {\n\t\t\t\tthis._pendingCustomMessages.push(appMessage);\n\t\t\t} else {\n\t\t\t\tthis._appendCustomMessage(appMessage);\n\t\t\t}\n\t\t} finally {\n\t\t\tdeferredTurnClaim?.resolve(\"finished-without-start\");\n\t\t\tfinishSessionWork?.();\n\t\t}\n\t}\n\n\tprivate _appendCustomMessage(appMessage: CustomMessage): void {\n\t\tthis.agent.state.messages.push(appMessage);\n\t\tthis._emitEntryAppended(\n\t\t\tthis.sessionManager.appendCustomMessageEntry(\n\t\t\t\tappMessage.customType,\n\t\t\t\tappMessage.content,\n\t\t\t\tappMessage.display,\n\t\t\t\tappMessage.details,\n\t\t\t),\n\t\t);\n\t\tthis._incrementMessageRevision();\n\t\tthis._emit({ type: \"message_start\", message: appMessage });\n\t\tthis._emit({ type: \"message_end\", message: appMessage });\n\t}\n\n\tprivate _flushPendingCustomMessages(): void {\n\t\tconst pending = this._pendingCustomMessages;\n\t\tthis._pendingCustomMessages = [];\n\t\tfor (const message of pending) this._appendCustomMessage(message);\n\t}\n\n\t/**\n\t * Send a user message to the agent. Always triggers a turn.\n\t * When the agent is streaming, use deliverAs to specify how to queue the message.\n\t * If the prompt path rejects before the message reaches a queue or a turn\n\t * (e.g. a required compaction that cannot complete), the message is retained\n\t * in the steering/followUp queue for later delivery and the error still propagates.\n\t *\n\t * @param content User message content (string or content array)\n\t * @param options.deliverAs Delivery mode when streaming: \"steer\" or \"followUp\"\n\t * @param options.expandPromptTemplates Whether to dispatch extension commands and expand skill commands and prompt templates. Default: false.\n\t */\n\tasync sendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: {\n\t\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\t\texpandPromptTemplates?: boolean;\n\t\t},\n\t\tdeferredTurnClaim?: DeferredTurnClaim,\n\t): Promise<void> {\n\t\tconst bindingPromptReadiness = this._extensionBindingPromptReadiness;\n\t\tlet resolveBindingPromptReadiness: (() => void) | undefined;\n\t\tif (bindingPromptReadiness) {\n\t\t\tconst readiness = new Promise<void>((resolve) => {\n\t\t\t\tresolveBindingPromptReadiness = resolve;\n\t\t\t});\n\t\t\tbindingPromptReadiness.add(readiness);\n\t\t}\n\t\t// Normalize content to text string + optional images. A throw here (null or a\n\t\t// content array whose iterator/part getter throws) happens before the guarded\n\t\t// try below, so resolve the deferred-turn claim first to keep agent_idle reachable.\n\t\tlet text: string;\n\t\tlet images: ImageContent[] | undefined;\n\n\t\ttry {\n\t\t\tif (typeof content === \"string\") {\n\t\t\t\ttext = content;\n\t\t\t} else {\n\t\t\t\tconst textParts: string[] = [];\n\t\t\t\timages = [];\n\t\t\t\tfor (const part of content) {\n\t\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\t\ttextParts.push(part.text);\n\t\t\t\t\t} else {\n\t\t\t\t\t\timages.push(part);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttext = textParts.join(\"\\n\");\n\t\t\t\tif (images.length === 0) images = undefined;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tdeferredTurnClaim?.resolve(\"finished-without-start\");\n\t\t\tresolveBindingPromptReadiness?.();\n\t\t\tthrow error;\n\t\t}\n\n\t\t// An extension binding invokes this method fire-and-forget. When it\n\t\t// arrives during session work, retain a barrier token after the prior work\n\t\t// settles so callers observing session idle cannot race its provider turn.\n\t\tconst waitForExistingSessionWork = this._sessionWorkBarrier.hasActiveWork;\n\t\tlet finishSessionWork: (() => void) | undefined;\n\t\tlet disposition: PromptDisposition | undefined;\n\t\ttry {\n\t\t\tawait this.prompt(text, {\n\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates ?? false,\n\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\timages,\n\t\t\t\tsource: \"extension\",\n\t\t\t\tpromptDisposition: (nextDisposition) => {\n\t\t\t\t\tdisposition = nextDisposition;\n\t\t\t\t\tif (nextDisposition === \"started\") deferredTurnClaim?.resolve(\"started\");\n\t\t\t\t\telse if (nextDisposition === \"queued\") deferredTurnClaim?.resolve(\"delegated\");\n\t\t\t\t\tresolveBindingPromptReadiness?.();\n\t\t\t\t},\n\t\t\t\tonSessionWorkReady: waitForExistingSessionWork\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\tfinishSessionWork ??= this._sessionWorkBarrier.begin();\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\tsessionTitlePrompt: false,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\t// Extension bindings invoke this method fire-and-forget, so a rejection\n\t\t\t// before prompt() accepted the message must not silently drop it.\n\t\t\tif (disposition === undefined) {\n\t\t\t\tif (options?.deliverAs === \"steer\") {\n\t\t\t\t\tawait this._queueSteer(text, images);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueFollowUp(text, images);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\t// A path that neither started nor delegated a turn (handled, rejected,\n\t\t\t// admission failure, cancellation) resolves as finished-without-start.\n\t\t\tdeferredTurnClaim?.resolve(\"finished-without-start\");\n\t\t\tresolveBindingPromptReadiness?.();\n\t\t\tfinishSessionWork?.();\n\t\t}\n\t}\n\n\t/** Reserve a global order for input temporarily owned outside the native queues. */\n\treserveQueuedInputOrder(): number {\n\t\tthis._nextQueuedInputOrder += 1;\n\t\treturn this._nextQueuedInputOrder;\n\t}\n\n\tprivate _recordQueuedInput(text: string, mode: QueuedInput[\"mode\"], enqueueOrder?: number): void {\n\t\tconst order = enqueueOrder ?? this.reserveQueuedInputOrder();\n\t\tthis._nextQueuedInputOrder = Math.max(this._nextQueuedInputOrder, order);\n\t\tthis._queuedInputOrder.push({ text, mode, enqueueOrder: order });\n\t}\n\n\tprivate _removeQueuedInput(text: string, mode: QueuedInput[\"mode\"]): void {\n\t\tconst index = this._queuedInputOrder.findIndex((message) => message.mode === mode && message.text === text);\n\t\tif (index !== -1) this._queuedInputOrder.splice(index, 1);\n\t}\n\n\t/**\n\t * Clear all queued messages and return them. The non-enumerable `ordered`\n\t * view preserves legacy object equality and native queue semantics.\n\t * @param options.abortWillFollow Mark a non-empty drain so an immediately following abort can emit session_abort.\n\t */\n\tclearQueue(options: { abortWillFollow: boolean } = { abortWillFollow: false }): ClearedQueue {\n\t\tconst steering = [...this._steeringMessages];\n\t\tconst followUp = [...this._followUpMessages];\n\t\tconst ordered = [...this._queuedInputOrder].sort((a, b) => a.enqueueOrder - b.enqueueOrder);\n\t\tif (options.abortWillFollow && (steering.length > 0 || followUp.length > 0)) {\n\t\t\tthis._hadClearedQueuedMessages = true;\n\t\t}\n\t\t// Clear every queue synchronously. Deferred post-compaction messages are\n\t\t// already represented in visible bookkeeping, so they must not be returned\n\t\t// a second time or later resurrected into Agent's native queues.\n\t\tthis._steeringMessages = [];\n\t\tthis._followUpMessages = [];\n\t\tthis._queuedInputOrder = [];\n\t\tthis._postCompactionDeferredSteeringMessages = [];\n\t\tthis._postCompactionDeferredFollowUpMessages = [];\n\t\tthis.agent.clearAllQueues();\n\t\tthis._emitQueueUpdate();\n\t\tconst cleared = { steering, followUp } as ClearedQueue;\n\t\tObject.defineProperty(cleared, \"ordered\", {\n\t\t\tvalue: ordered,\n\t\t\tenumerable: false,\n\t\t});\n\t\treturn cleared;\n\t}\n\n\t/** Number of pending messages (includes both steering and follow-up) */\n\tget pendingMessageCount(): number {\n\t\treturn this._steeringMessages.length + this._followUpMessages.length;\n\t}\n\n\t/** Get pending steering messages (read-only) */\n\tgetSteeringMessages(): readonly string[] {\n\t\treturn this._steeringMessages;\n\t}\n\n\t/** Get pending follow-up messages (read-only) */\n\tgetFollowUpMessages(): readonly string[] {\n\t\treturn this._followUpMessages;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this._resourceLoader;\n\t}\n\n\t/**\n\t * Abort current operation and wait for agent to become idle.\n\t */\n\tasync abort(): Promise<void> {\n\t\t// Streaming aborts are carried by agent_end provenance; only gaps need session_abort.\n\t\tconst wasMidRun = this.isStreaming && this._retryAbortController === undefined;\n\t\tconst hadRetryBackoff = this._retryAbortController !== undefined;\n\t\tconst hadCompactionOrPending = !this.isStreaming && (this.isCompacting || this.pendingMessageCount > 0);\n\t\tconst hadClearedQueues = this._hadClearedQueuedMessages;\n\t\tconst joinedAgentEndBoundary = this._abortProvenance.hasOpenAgentEndBoundary;\n\t\tthis._hadClearedQueuedMessages = false;\n\t\tconst shouldEmitAbort =\n\t\t\t!joinedAgentEndBoundary && !wasMidRun && (hadRetryBackoff || hadCompactionOrPending || hadClearedQueues);\n\t\tthis.abortCompaction();\n\t\tawait this._abortActiveAgentAndRetry(\"user\");\n\t\tif (!shouldEmitAbort) return;\n\t\ttry {\n\t\t\tawait this._emitSessionAbort();\n\t\t} catch {\n\t\t\t// Extension runner may be torn down during RPC close — best-effort.\n\t\t}\n\t}\n\n\tasync waitForIdle(): Promise<void> {\n\t\tif (this.isIdle) {\n\t\t\treturn;\n\t\t}\n\t\tawait this._getIdleWaitPromise();\n\t}\n\n\t// =========================================================================\n\t// Model Management\n\t// =========================================================================\n\n\tprivate async _emitModelSelect(\n\t\tnextModel: Model<any>,\n\t\tpreviousModel: Model<any> | undefined,\n\t\tsource: ModelSelectSource,\n\t): Promise<SystemPromptChangeEvent | undefined> {\n\t\tthis.syncPromptCacheSafeWaitEnv();\n\t\tif (!this._modelSelectionChangesContext(previousModel, nextModel)) return undefined;\n\t\tconst result = await this._extensionRunner.emitModelSelect({\n\t\t\ttype: \"model_select\",\n\t\t\tmodel: nextModel,\n\t\t\tpreviousModel,\n\t\t\tsource,\n\t\t\tsystemPrompt: this.agent.state.systemPrompt,\n\t\t\tsystemPromptOptions: this._baseSystemPromptOptions,\n\t\t});\n\t\tif (result?.systemPrompt === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst previousSystemPrompt = this.agent.state.systemPrompt;\n\t\tconst systemPrompt = result.systemPrompt ?? this._baseSystemPrompt;\n\t\tif (previousSystemPrompt === systemPrompt) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthis.agent.state.systemPrompt = systemPrompt;\n\t\tconst event: SystemPromptChangeEvent = {\n\t\t\ttype: \"system_prompt_change\",\n\t\t\tsystemPrompt,\n\t\t\tpreviousSystemPrompt,\n\t\t\tmodel: nextModel,\n\t\t\tpreviousModel,\n\t\t\tsource: \"model_select\",\n\t\t};\n\t\tif (result.systemPromptName) {\n\t\t\tevent.systemPromptName = result.systemPromptName;\n\t\t}\n\t\tawait this._extensionRunner.emit(event);\n\t\tthis._emit(event);\n\t\treturn event;\n\t}\n\n\t/**\n\t * Set model directly.\n\t * Validates that auth is configured, saves to session and settings.\n\t * @throws Error if no auth is configured for the model\n\t */\n\tasync setModel(model: Model<any>): Promise<SystemPromptChangeEvent | undefined> {\n\t\treturn this._setModel(model, true);\n\t}\n\n\tassertModelUsable(model: Model<Api> | undefined = this.model, liveContextTokens = 0): void {\n\t\tif (!model || model.contextWindow <= 0) return;\n\t\tconst projection = projectModelUsabilityBudget({\n\t\t\tmodel,\n\t\t\tsystemPrompt: this.agent.state.systemPrompt,\n\t\t\ttools: this.agent.state.tools,\n\t\t\tliveContextTokens,\n\t\t\tcompaction: this.settingsManager.getCompactionSettings(),\n\t\t});\n\t\tif (!projection.usable) throw new ModelUsabilityBudgetError(projection);\n\t}\n\n\tprivate _getDownswitchLiveContextTokens(model: Model<Api>): number {\n\t\tconst currentModel = this.model;\n\t\tif (!currentModel) return 0;\n\t\tconst compaction = this.settingsManager.getCompactionSettings();\n\t\tconst currentBudget = projectModelUsabilityBudget({\n\t\t\tmodel: currentModel,\n\t\t\tsystemPrompt: this.agent.state.systemPrompt,\n\t\t\ttools: this.agent.state.tools,\n\t\t\tcompaction,\n\t\t});\n\t\tconst targetBudget = projectModelUsabilityBudget({\n\t\t\tmodel,\n\t\t\tsystemPrompt: this.agent.state.systemPrompt,\n\t\t\ttools: this.agent.state.tools,\n\t\t\tcompaction,\n\t\t});\n\t\tconst currentUsableContext = currentBudget.contextWindow - currentBudget.requiredTokens;\n\t\tconst targetUsableContext = targetBudget.contextWindow - targetBudget.requiredTokens;\n\t\tif (targetUsableContext >= currentUsableContext) return 0;\n\t\tconst fixedPrefixTokens = currentBudget.systemPromptTokens + currentBudget.activeToolSchemaTokens;\n\t\treturn Math.max(0, (this.getContextUsage()?.tokens ?? 0) - fixedPrefixTokens);\n\t}\n\n\t/**\n\t * Set the model for this session without changing the global model defaults.\n\t * The selection is still persisted in this session's history.\n\t */\n\tasync setSessionModel(model: Model<Api>): Promise<SystemPromptChangeEvent | undefined> {\n\t\treturn this._setModel(model, false);\n\t}\n\n\tprivate async _setModel(\n\t\tmodel: Model<Api>,\n\t\tupdateGlobalDefaults: boolean,\n\t): Promise<SystemPromptChangeEvent | undefined> {\n\t\tthis.assertModelUsable(model, this._getDownswitchLiveContextTokens(model));\n\t\tif (!(await this._modelRuntime.checkAuth(model.provider))) {\n\t\t\tthrow new Error(`No API key for ${model.provider}/${model.id}`);\n\t\t}\n\n\t\t// A manual model change abandons any active fallback window; if a fallback\n\t\t// retry sleep is still pending, cancel it so no surprise continuation fires.\n\t\tconst hadActiveFallback = this._retryFallback.activeState !== undefined;\n\t\tthis._probeBackScheduler.cancel(\"manual-model-change\");\n\t\tthis._retryFallback.clearForManualModelChange(model);\n\t\tif (hadActiveFallback && this._retryAbortController) {\n\t\t\tthis.abortRetry();\n\t\t}\n\n\t\treturn await this._switchActiveModel(model, {\n\t\t\tpersistDefault: updateGlobalDefaults,\n\t\t\tappendSessionEntry: true,\n\t\t\temitModelSelect: true,\n\t\t\tmodelSelectSource: \"set\",\n\t\t\tinvalidateCompaction: true,\n\t\t});\n\t}\n\n\tprivate async _maybeRestoreFallbackPrimary(): Promise<void> {\n\t\ttry {\n\t\t\tawait this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy);\n\t\t} catch (error) {\n\t\t\tthis._retryFallback.clear();\n\t\t\tconsole.error(\"fallback revert failed; cleared fallback state\", error);\n\t\t}\n\t}\n\n\t/**\n\t * A senpi-owned compaction just rewrote the conversation context: release any\n\t * refusal-caused fallback pin (the \"same context refuses again\" assumption no\n\t * longer holds) and, while no run is active, eagerly re-attempt the original\n\t * model through the existing revert gate. Billing-caused pins never release.\n\t */\n\tprivate async _onCompactionContextChanged(): Promise<void> {\n\t\tconst released = this._retryFallback.notifyCompactionApplied();\n\t\tif (released && !this.isStreaming) await this._maybeRestoreFallbackPrimary();\n\t}\n\n\tprivate async _switchActiveModel(\n\t\tmodel: Model<Api>,\n\t\topts: {\n\t\t\tpersistDefault: boolean;\n\t\t\tappendSessionEntry: boolean;\n\t\t\tentryReason?: \"fallback\" | \"fallback-revert\";\n\t\t\temitModelSelect: boolean;\n\t\t\tmodelSelectSource: ModelSelectSource;\n\t\t\tinvalidateCompaction: boolean;\n\t\t\tephemeralThinkingLevel?: ThinkingLevel;\n\t\t},\n\t): Promise<SystemPromptChangeEvent | undefined> {\n\t\tconst previousModel = this.model;\n\t\tif (\n\t\t\topts.invalidateCompaction &&\n\t\t\t(this._modelSelectionChangesContext(previousModel, model) ||\n\t\t\t\tpreviousModel?.provider !== model.provider ||\n\t\t\t\tpreviousModel?.id !== model.id)\n\t\t) {\n\t\t\tthis._invalidateCompactionForModelSelection();\n\t\t}\n\t\tconst thinking = this._getThinkingForModelSwitch(model, opts.ephemeralThinkingLevel);\n\t\tconst liveContextTokens = this._getDownswitchLiveContextTokens(model);\n\t\tthis.agent.state.model = model;\n\t\tthis.agent.abortServerSideFallback =\n\t\t\tthis.settingsManager.getAbortServerSideFallback() && this._retryFallback.hasConfiguredChain();\n\t\tif (opts.appendSessionEntry) {\n\t\t\tthis.sessionManager.appendModelChange(\n\t\t\t\tmodel.provider,\n\t\t\t\tmodel.id,\n\t\t\t\topts.entryReason,\n\t\t\t\tpreviousModel?.provider,\n\t\t\t\tpreviousModel?.id,\n\t\t\t);\n\t\t}\n\t\tif (opts.persistDefault) {\n\t\t\tthis.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\t}\n\n\t\tconst scopedMatch = this._scopedModels.find((sm) => modelsAreEqual(sm.model, model));\n\t\tconst previousTier = this._currentServiceTier;\n\t\tconst previousFastMode = this.isFastModeActive();\n\t\tthis._currentServiceTier = this._resolveServiceTier(model, scopedMatch?.serviceTier);\n\n\t\tif (opts.ephemeralThinkingLevel !== undefined) {\n\t\t\tthis._applyEphemeralThinkingLevel(thinking.level);\n\t\t} else {\n\t\t\tthis._setThinkingLevel(thinking.level, false, thinking.selection);\n\t\t}\n\n\t\tthis._emitHighReasoningWarningIfNeeded();\n\t\t// Post-switch: the level reported here is the one actually in force (clamped, or restored\n\t\t// from this model's memory), not the level requested for the previous model.\n\t\tthis._emit({\n\t\t\ttype: \"model_changed\",\n\t\t\tmodel,\n\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\tsource: opts.modelSelectSource,\n\t\t});\n\t\tthis._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);\n\n\t\tif (!opts.emitModelSelect) return undefined;\n\t\tconst previousSystemPrompt = this.agent.state.systemPrompt;\n\t\ttry {\n\t\t\tconst systemPromptChange = await this._emitModelSelect(model, previousModel, opts.modelSelectSource);\n\t\t\tthis.assertModelUsable(model, liveContextTokens);\n\t\t\treturn systemPromptChange;\n\t\t} catch (error) {\n\t\t\tif (previousModel) this.agent.state.model = previousModel;\n\t\t\telse delete (this.agent.state as { model?: Model<Api> }).model;\n\t\t\tthis.agent.state.systemPrompt = previousSystemPrompt;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate _applyEphemeralThinkingLevel(level: ThinkingLevel): void {\n\t\tconst previousLevel = this.agent.state.thinkingLevel;\n\t\tthis.agent.state.thinkingLevel = level;\n\t\tthis.agent.state.thinkingSelection = undefined;\n\t\tif (previousLevel !== level) {\n\t\t\tthis._emit({ type: \"thinking_level_changed\", level });\n\t\t}\n\t}\n\n\t/**\n\t * Cycle to next/previous model.\n\t * Uses favorite models, constrained by any global model narrowing.\n\t * @param direction - \"forward\" (default) or \"backward\"\n\t * @returns The new model info, or undefined if only one model available\n\t */\n\tasync cycleModel(direction: \"forward\" | \"backward\" = \"forward\"): Promise<ModelCycleResult | undefined> {\n\t\tconst favoriteModels = this._getCurrentFavoriteModels();\n\t\tif (favoriteModels.length > 0) {\n\t\t\treturn this._cycleFavoriteModel(direction, favoriteModels);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async _cycleFavoriteModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\tfavoriteModels: SessionModelEntry[],\n\t): Promise<ModelCycleResult | undefined> {\n\t\tif (favoriteModels.length <= 1) return undefined;\n\n\t\tconst currentModel = this.model;\n\t\tconst currentIndex = favoriteModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\t\tlet nextIndex: number;\n\t\tif (currentIndex === -1) {\n\t\t\tnextIndex = direction === \"forward\" ? 0 : favoriteModels.length - 1;\n\t\t} else {\n\t\t\tconst len = favoriteModels.length;\n\t\t\tnextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\t\t}\n\t\tconst next = favoriteModels[nextIndex];\n\t\tconst liveContextTokens = this._getDownswitchLiveContextTokens(next.model);\n\t\tthis.assertModelUsable(next.model, liveContextTokens);\n\t\tconst invalidatesCompaction =\n\t\t\tthis._modelSelectionChangesContext(currentModel, next.model) ||\n\t\t\tcurrentModel?.provider !== next.model.provider ||\n\t\t\tcurrentModel?.id !== next.model.id;\n\t\tif (invalidatesCompaction) {\n\t\t\tthis._invalidateCompactionForModelSelection();\n\t\t}\n\t\tthis._probeBackScheduler.cancel(\"manual-model-change\");\n\t\tthis._retryFallback.clearForManualModelChange(next.model);\n\t\tconst thinking = this._getThinkingForModelSwitch(next.model, next.thinkingLevel, next.thinkingSelection);\n\n\t\tthis.agent.state.model = next.model;\n\t\tthis.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\t\tthis.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\t\tconst previousTier = this._currentServiceTier;\n\t\tconst previousFastMode = this.isFastModeActive();\n\t\tthis._currentServiceTier = this._resolveServiceTier(next.model, next.serviceTier);\n\n\t\t// Apply thinking level and provenance from the favorite projection or remembered preference.\n\t\tthis._setThinkingLevel(thinking.level, false, thinking.selection);\n\n\t\t// Post-switch, same contract as _switchActiveModel: the level in force AFTER the cycle.\n\t\tthis._emit({\n\t\t\ttype: \"model_changed\",\n\t\t\tmodel: next.model,\n\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\tsource: \"cycle\",\n\t\t});\n\t\tthis._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);\n\n\t\tconst previousSystemPrompt = this.agent.state.systemPrompt;\n\t\ttry {\n\t\t\tconst systemPromptChange = await this._emitModelSelect(next.model, currentModel, \"cycle\");\n\t\t\tthis.assertModelUsable(next.model, liveContextTokens);\n\n\t\t\tconst cycleResult: ModelCycleResult = {\n\t\t\t\tmodel: next.model,\n\t\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\t\tisScoped: true,\n\t\t\t};\n\t\t\tif (systemPromptChange) {\n\t\t\t\tcycleResult.systemPromptChange = systemPromptChange;\n\t\t\t}\n\t\t\treturn cycleResult;\n\t\t} catch (error) {\n\t\t\tif (currentModel) this.agent.state.model = currentModel;\n\t\t\telse delete (this.agent.state as { model?: Model<Api> }).model;\n\t\t\tthis.agent.state.systemPrompt = previousSystemPrompt;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// Thinking Level Management\n\t// =========================================================================\n\n\t/**\n\t * Set thinking level.\n\t * Clamps to model capabilities based on available thinking levels.\n\t * Persistent calls refresh per-model memory; session entries and events are emitted only on change.\n\t */\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tthis._setThinkingLevel(level, true, { level, source: \"explicit\" });\n\t}\n\n\t/**\n\t * Set the thinking level for this session without changing the global default.\n\t * The effective level is still persisted in this session's history.\n\t */\n\tsetSessionThinkingLevel(level: ThinkingLevel): void {\n\t\tthis._setThinkingLevel(level, false, { level, source: \"explicit\" });\n\t}\n\n\tprivate _setThinkingLevel(\n\t\tlevel: ThinkingLevel,\n\t\tupdateGlobalDefault: boolean,\n\t\tselection: ThinkingSelection | undefined,\n\t): void {\n\t\tconst availableLevels = this.getAvailableThinkingLevels();\n\t\tconst effectiveLevel = availableLevels.includes(level) ? level : this._clampThinkingLevel(level, availableLevels);\n\n\t\t// Only persist if actually changing\n\t\tconst previousLevel = this.agent.state.thinkingLevel;\n\t\tconst previousSelection = this.agent.state.thinkingSelection;\n\t\tconst effectiveSelection = selection ? { ...selection, level: effectiveLevel } : undefined;\n\t\tconst selectionChanged =\n\t\t\tpreviousSelection?.level !== effectiveSelection?.level ||\n\t\t\tpreviousSelection?.source !== effectiveSelection?.source ||\n\t\t\tpreviousSelection?.legacyVariantId !== effectiveSelection?.legacyVariantId;\n\t\tconst isChanging = effectiveLevel !== previousLevel;\n\t\tif (isChanging || selectionChanged) {\n\t\t\tthis._retryFallback.noteManualThinkingLevel();\n\t\t}\n\n\t\tthis.agent.state.thinkingLevel = effectiveLevel;\n\t\tthis.agent.state.thinkingSelection = effectiveSelection;\n\n\t\tif (updateGlobalDefault) {\n\t\t\tconst model = this.model;\n\t\t\tif (model) {\n\t\t\t\tthis.settingsManager.setModelThinkingLevel(model.provider, model.id, effectiveLevel);\n\t\t\t}\n\t\t}\n\n\t\tif (isChanging || selectionChanged) {\n\t\t\tthis.sessionManager.appendThinkingLevelChange(effectiveLevel, effectiveSelection);\n\t\t\tif (updateGlobalDefault && (this.supportsThinking() || effectiveLevel !== \"off\")) {\n\t\t\t\tthis.settingsManager.setDefaultThinkingLevel(effectiveLevel);\n\t\t\t}\n\t\t\tthis._emit({ type: \"thinking_level_changed\", level: effectiveLevel });\n\t\t\tvoid this._extensionRunner.emit({\n\t\t\t\ttype: \"thinking_level_select\",\n\t\t\t\tlevel: effectiveLevel,\n\t\t\t\tpreviousLevel,\n\t\t\t});\n\t\t\tthis._emitHighReasoningWarningIfNeeded();\n\t\t}\n\t}\n\n\tprivate _emitHighReasoningWarningIfNeeded(): void {\n\t\tconst model = this.model;\n\t\tconst level = this.thinkingLevel;\n\t\tif (!model || !shouldWarnHighReasoning(model, level)) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (this._shownHighReasoningWarningKeys.has(key)) return;\n\t\tthis._shownHighReasoningWarningKeys.add(key);\n\t\tthis._emit({\n\t\t\ttype: \"high_reasoning_warning\",\n\t\t\tmodelId: model.id,\n\t\t\tprovider: model.provider,\n\t\t\tthinkingLevel: level,\n\t\t});\n\t}\n\n\t/**\n\t * Cycle to next thinking level.\n\t * @returns New level, or undefined if model doesn't support thinking\n\t */\n\tcycleThinkingLevel(): ThinkingLevel | undefined {\n\t\tif (!this.supportsThinking()) return undefined;\n\n\t\tconst levels = this.getAvailableThinkingLevels();\n\t\tconst currentIndex = levels.indexOf(this.thinkingLevel);\n\t\tconst nextIndex = (currentIndex + 1) % levels.length;\n\t\tconst nextLevel = levels[nextIndex];\n\n\t\tthis.setThinkingLevel(nextLevel);\n\t\treturn nextLevel;\n\t}\n\n\t/**\n\t * Get available thinking levels for current model.\n\t * The provider will clamp to what the specific model supports internally.\n\t */\n\tgetAvailableThinkingLevels(): ThinkingLevel[] {\n\t\tconst model = this.model;\n\t\treturn model ? (getSupportedThinkingLevels(model) as ThinkingLevel[]) : [\"off\"];\n\t}\n\n\t/**\n\t * Check if current model supports xhigh thinking level.\n\t */\n\tsupportsXhighThinking(): boolean {\n\t\treturn this.model ? supportsXhigh(this.model) : false;\n\t}\n\n\t/**\n\t * Check if current model exposes the native \"max\" adaptive thinking tier\n\t * (currently Anthropic Opus 4.6 legacy and Opus 4.7 native).\n\t */\n\tsupportsMaxThinking(): boolean {\n\t\treturn this.model ? supportsMax(this.model) : false;\n\t}\n\n\t/**\n\t * Check if current model supports thinking/reasoning.\n\t */\n\tsupportsThinking(): boolean {\n\t\treturn !!this.model?.reasoning;\n\t}\n\n\tprivate _getThinkingForModelSwitch(\n\t\tmodel: Model<Api>,\n\t\texplicitLevel?: ThinkingLevel,\n\t\texplicitSelection?: ThinkingSelection,\n\t): { level: ThinkingLevel; selection?: ThinkingSelection } {\n\t\tlet requestedLevel = explicitLevel;\n\t\tlet selection = explicitSelection;\n\t\tif (requestedLevel !== undefined && !selection) selection = { level: requestedLevel, source: \"explicit\" };\n\t\tif (requestedLevel === undefined) {\n\t\t\tconst remembered = this.settingsManager.getModelThinkingLevel(model.provider, model.id);\n\t\t\tif (remembered !== undefined) {\n\t\t\t\trequestedLevel = remembered;\n\t\t\t\tselection = { level: remembered, source: \"explicit\" };\n\t\t\t}\n\t\t}\n\t\tif (requestedLevel === undefined) {\n\t\t\tconst configuredDefault = this.settingsManager.getDefaultThinkingLevel();\n\t\t\tif (configuredDefault !== undefined) {\n\t\t\t\trequestedLevel = configuredDefault;\n\t\t\t\tselection = { level: configuredDefault, source: \"explicit\" };\n\t\t\t}\n\t\t}\n\t\trequestedLevel ??= DEFAULT_THINKING_LEVEL;\n\t\tconst level = this._clampThinkingLevel(requestedLevel, getSupportedThinkingLevels(model) as ThinkingLevel[]);\n\t\treturn {\n\t\t\tlevel,\n\t\t\tselection: selection ? { ...selection, level } : undefined,\n\t\t};\n\t}\n\n\tprivate _clampThinkingLevel(level: ThinkingLevel, availableLevels: ThinkingLevel[]): ThinkingLevel {\n\t\tconst available = new Set(availableLevels);\n\t\tconst requestedIndex = THINKING_LEVELS_WITH_MAX.indexOf(level);\n\t\tif (requestedIndex === -1) return availableLevels[0] ?? \"off\";\n\n\t\tfor (let index = requestedIndex; index < THINKING_LEVELS_WITH_MAX.length; index++) {\n\t\t\tconst candidate = THINKING_LEVELS_WITH_MAX[index];\n\t\t\tif (candidate && available.has(candidate)) return candidate;\n\t\t}\n\t\tfor (let index = requestedIndex - 1; index >= 0; index--) {\n\t\t\tconst candidate = THINKING_LEVELS_WITH_MAX[index];\n\t\t\tif (candidate && available.has(candidate)) return candidate;\n\t\t}\n\t\treturn availableLevels[0] ?? \"off\";\n\t}\n\n\t// =========================================================================\n\t// Queue Mode Management\n\t// =========================================================================\n\n\tprivate syncQueueModesFromSettings(): void {\n\t\tthis.agent.steeringMode = this.settingsManager.getSteeringMode();\n\t\tthis.agent.followUpMode = this.settingsManager.getFollowUpMode();\n\t}\n\n\t/**\n\t * Set steering message mode.\n\t * Saves to settings.\n\t */\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.agent.steeringMode = mode;\n\t\tthis.settingsManager.setSteeringMode(mode);\n\t\tthis._emitSessionSettingsChanged();\n\t}\n\n\t/**\n\t * Set follow-up message mode.\n\t * Saves to settings.\n\t */\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.agent.followUpMode = mode;\n\t\tthis.settingsManager.setFollowUpMode(mode);\n\t\tthis._emitSessionSettingsChanged();\n\t}\n\n\t// =========================================================================\n\t// Compaction\n\t// =========================================================================\n\n\tprivate _claimCompactionController(controller: AbortController, owner: \"auto\" | \"compaction\"): void {\n\t\tconst supersedesCurrentOperation =\n\t\t\t(this._compactionAbortController !== undefined && this._compactionAbortController !== controller) ||\n\t\t\t(this._autoCompactionAbortController !== undefined && this._autoCompactionAbortController !== controller);\n\t\tif (supersedesCurrentOperation) {\n\t\t\t// Supersession has no public terminal event: the stale operation no\n\t\t\t// longer owns the route. Finishing its lifecycle state here prevents a\n\t\t\t// missing late feedback end from keeping isCompacting true.\n\t\t\tthis._compactionLifecycle.abort(this._messageRevision);\n\t\t}\n\t\tif (this._compactionAbortController && this._compactionAbortController !== controller) {\n\t\t\tthis._compactionAbortController.abort();\n\t\t\tthis._compactionAbortController = undefined;\n\t\t}\n\t\tif (this._autoCompactionAbortController && this._autoCompactionAbortController !== controller) {\n\t\t\tthis._autoCompactionAbortController.abort();\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t}\n\t\tif (owner === \"auto\") {\n\t\t\tthis._autoCompactionAbortController = controller;\n\t\t} else {\n\t\t\tthis._compactionAbortController = controller;\n\t\t}\n\t}\n\n\tprivate _ownsCompactionController(controller: AbortController, owner: \"auto\" | \"compaction\"): boolean {\n\t\treturn (\n\t\t\t!controller.signal.aborted &&\n\t\t\t(owner === \"auto\"\n\t\t\t\t? this._autoCompactionAbortController === controller\n\t\t\t\t: this._compactionAbortController === controller)\n\t\t);\n\t}\n\n\tprivate _releaseCompactionController(signal: AbortSignal): void {\n\t\tif (this._compactionAbortController?.signal === signal) {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t}\n\t\tif (this._autoCompactionAbortController?.signal === signal) {\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t}\n\t}\n\n\tprivate _claimPendingCompactionAdmission(): PendingCompactionAdmission {\n\t\tconst priorAdmission = this._pendingCompactionAdmission;\n\t\tif (priorAdmission) {\n\t\t\tpriorAdmission.controller.abort();\n\t\t\tpriorAdmission.outcome = \"aborted\";\n\t\t\tpriorAdmission.finishSessionWork();\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tconst admission: PendingCompactionAdmission = {\n\t\t\tcontroller,\n\t\t\tfinishSessionWork: this._sessionWorkBarrier.begin(),\n\t\t};\n\t\tthis._pendingCompactionAdmission = admission;\n\t\tthis._claimCompactionController(controller, \"compaction\");\n\t\treturn admission;\n\t}\n\n\tprivate _releasePendingCompactionAdmission(\n\t\tadmission: PendingCompactionAdmission,\n\t\toutcome: \"completed\" | \"failed\" | \"aborted\",\n\t): void {\n\t\tadmission.outcome = outcome;\n\t\tif (this._pendingCompactionAdmission !== admission) return;\n\t\tthis._pendingCompactionAdmission = undefined;\n\t\tadmission.finishSessionWork();\n\t}\n\n\tprivate _recordUserAbort(): void {\n\t\tthis._suppressQueuedContinuationAfterUserAbort = true;\n\t\tthis._userAbortGeneration += 1;\n\t}\n\n\tprivate async _abortActiveAgentAndRetry(source: \"user\" | \"system\"): Promise<void> {\n\t\tthis.abortRetry();\n\t\tthis.abortBranchSummary();\n\t\tif (this._userAbortPromise === undefined) {\n\t\t\tconst boundaryJoin = this._abortProvenance.joinOpenBoundary(source);\n\t\t\tif (boundaryJoin !== undefined) {\n\t\t\t\tif (boundaryJoin.userOwned) this._recordUserAbort();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (this._userAbortPromise) {\n\t\t\tconst joined = this._abortProvenance.join(source, this.isStreaming);\n\t\t\tif (joined.userOwned) this._recordUserAbort();\n\t\t\tif (joined.abortCurrentAgent) this.agent.abort();\n\t\t\tawait this._userAbortPromise;\n\t\t\treturn;\n\t\t}\n\t\tif (this.isStreaming && this._abortProvenance.begin(source)) this._recordUserAbort();\n\n\t\tconst abortPromise = (async () => {\n\t\t\tthis.agent.abort();\n\t\t\tawait this.waitForIdle();\n\t\t})();\n\t\tthis._userAbortPromise = abortPromise;\n\t\ttry {\n\t\t\tawait abortPromise;\n\t\t} finally {\n\t\t\tif (this._userAbortPromise === abortPromise) {\n\t\t\t\tthis._userAbortPromise = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Generate the built-in summary while preserving fork routing identity and transforms. */\n\tprivate async _runDefaultCompaction(\n\t\tpreparation: CompactionPreparation,\n\t\trequestModel: Model<any>,\n\t\tapiKey: string | undefined,\n\t\theaders: Record<string, string> | undefined,\n\t\textraBody: Record<string, unknown> | undefined,\n\t\tcustomInstructions: string | undefined,\n\t\tsignal: AbortSignal,\n\t\tenv: Record<string, string> | undefined,\n\t\treason: CompactionReason,\n\t): Promise<CompactionResult> {\n\t\tlet cacheFriendly: CacheFriendlySummaryOptions | undefined;\n\n\t\tif (areExperimentalFeaturesEnabled()) {\n\t\t\tconst systemPrompt = this.agent.state.systemPrompt;\n\t\t\tconst tools = this.agent.state.tools.slice();\n\t\t\tconst buildSourceContext = (messages: AgentMessage[]) =>\n\t\t\t\tthis.agent.buildProviderContext({ systemPrompt, messages: messages.slice(), tools: tools.slice() }, signal);\n\t\t\tconst fullContext = await buildSourceContext(this.agent.state.messages);\n\t\t\tconst isExactPrefix = (candidate: Context): boolean =>\n\t\t\t\tcandidate.messages.length > 0 &&\n\t\t\t\tcandidate.messages.length <= fullContext.messages.length &&\n\t\t\t\tisDeepStrictEqual(candidate.messages, fullContext.messages.slice(0, candidate.messages.length));\n\n\t\t\tlet sourceContext: Context | undefined;\n\t\t\tif (preparation.messagesToSummarize.length > 0 && preparation.sourceMessages) {\n\t\t\t\tconst candidate = await buildSourceContext(preparation.sourceMessages);\n\t\t\t\tif (isExactPrefix(candidate)) sourceContext = candidate;\n\t\t\t}\n\n\t\t\tlet turnPrefixSourceContext: Context | undefined;\n\t\t\tif (\n\t\t\t\tpreparation.isSplitTurn &&\n\t\t\t\tpreparation.turnPrefixMessages.length > 0 &&\n\t\t\t\tpreparation.turnPrefixSourceMessages\n\t\t\t) {\n\t\t\t\tconst candidate = await buildSourceContext(preparation.turnPrefixSourceMessages);\n\t\t\t\tconst providerTurnPrefix = await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());\n\t\t\t\tif (\n\t\t\t\t\tisExactPrefix(candidate) &&\n\t\t\t\t\tproviderTurnPrefix.length > 0 &&\n\t\t\t\t\tproviderTurnPrefix.length <= candidate.messages.length &&\n\t\t\t\t\tisDeepStrictEqual(candidate.messages.slice(-providerTurnPrefix.length), providerTurnPrefix)\n\t\t\t\t) {\n\t\t\t\t\tturnPrefixSourceContext = candidate;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sourceContext || turnPrefixSourceContext) {\n\t\t\t\tcacheFriendly = {\n\t\t\t\t\tsourceContext,\n\t\t\t\t\tturnPrefixSourceContext,\n\t\t\t\t\trequestOptions: {\n\t\t\t\t\t\tsessionId: this.agent.sessionId,\n\t\t\t\t\t\tonPayload: this.agent.onPayload,\n\t\t\t\t\t\tonResponse: this.agent.onResponse,\n\t\t\t\t\t\ttransport: this.agent.transport,\n\t\t\t\t\t\tthinkingBudgets: this.agent.thinkingBudgets,\n\t\t\t\t\t\tmaxRetryDelayMs: this.agent.maxRetryDelayMs,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn compact(\n\t\t\tpreparation,\n\t\t\trequestModel,\n\t\t\tapiKey,\n\t\t\theaders,\n\t\t\tcustomInstructions,\n\t\t\tsignal,\n\t\t\textraBody,\n\t\t\tthis.thinkingLevel,\n\t\t\tthis.agent.streamFunction,\n\t\t\tenv,\n\t\t\tthis.agent.transformContext,\n\t\t\tthis.settingsManager.getRetrySettings(),\n\t\t\tthis._summarizationRetryCallbacks({ source: \"compaction\", reason }),\n\t\t\tthis.sessionManager.getSessionId(),\n\t\t\tcacheFriendly,\n\t\t);\n\t}\n\n\t/**\n\t * Manually compact the session context.\n\t *\n\t * This is the manual entry point used by `/compact`, RPC, and extensions. It is\n\t * separate from automatic threshold/overflow compaction, which enters through\n\t * `_checkCompaction()` and `_runAutoCompaction()`. After preparation and the\n\t * `session_before_compact` hook, both paths call the lower-level `compact()`\n\t * function imported from `./compaction/index.ts`, unless the hook cancels or\n\t * supplies a custom result.\n\t *\n\t * Aborts the current agent operation first. Manual compaction never retries or\n\t * continues the interrupted agent turn.\n\t *\n\t * @param customInstructions Optional instructions for the compaction summary\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst model = this.model;\n\t\tif (!model) throw new Error(formatNoModelSelectedMessage());\n\t\tconst pathEntries = this.sessionManager.getBranch();\n\t\tconst settings = cursorOverflowCompactionSettings(\n\t\t\tthis.settingsManager.getCompactionSettings(),\n\t\t\tmodel.provider,\n\t\t\t\"manual\",\n\t\t);\n\t\tif (!prepareCompaction(pathEntries, settings)) {\n\t\t\tconst requestId = randomUUID();\n\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\tconst error = new Error(\n\t\t\t\tlastEntry?.type === \"compaction\" ? \"Already compacted\" : \"Nothing to compact (session too small)\",\n\t\t\t);\n\t\t\tconst errorMessage = `Compaction failed: ${error.message}`;\n\t\t\tthis._emit({ type: \"compaction_start\", reason: \"manual\", requestId });\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: \"manual\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage,\n\t\t\t});\n\t\t\tawait this._emitSessionCompactFailed({\n\t\t\t\treason: \"manual\",\n\t\t\t\terrorMessage,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tfromExtension: false,\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst admission = this._claimPendingCompactionAdmission();\n\t\tconst controller = admission.controller;\n\t\tconst requestId = randomUUID();\n\t\tlet outcome: \"completed\" | \"failed\" | \"aborted\" = \"failed\";\n\t\tlet disconnected = false;\n\n\t\ttry {\n\t\t\t// Keep the session subscriber attached until the aborted run emits\n\t\t\t// agent_end. That event clears the active-run and retry state that\n\t\t\t// waitForIdle() depends on.\n\t\t\tawait this._abortActiveAgentAndRetry(\"system\");\n\t\t\tthis._disconnectFromAgent();\n\t\t\tdisconnected = true;\n\t\t\tthis._emit({ type: \"compaction_start\", reason: \"manual\", requestId });\n\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\tcontroller,\n\t\t\t\towner: \"compaction\",\n\t\t\t\treason: \"manual\",\n\t\t\t\trequestId,\n\t\t\t\tcustomInstructions,\n\t\t\t\twillRetry: false,\n\t\t\t});\n\t\t\tif (!execution.accepted) {\n\t\t\t\tthrow new CompactionRejectedError(execution.rejectionCause);\n\t\t\t}\n\t\t\toutcome = \"completed\";\n\t\t\treturn execution.result;\n\t\t} catch (error) {\n\t\t\toutcome = isCompactionExecutionAborted(error) ? \"aborted\" : \"failed\";\n\t\t\tif (error instanceof CompactionRejectedError) {\n\t\t\t\tthrow new Error(error.message);\n\t\t\t}\n\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\tconst errorMessage = aborted ? undefined : `Compaction failed: ${message}`;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: \"manual\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage,\n\t\t\t});\n\t\t\tawait this._emitSessionCompactFailed({\n\t\t\t\treason: \"manual\",\n\t\t\t\terrorMessage,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\tfromExtension: false,\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (this._compactionAbortController === controller && this._compactionLifecycle.state.status !== \"running\") {\n\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t}\n\t\t\tthis._releasePendingCompactionAdmission(admission, outcome);\n\t\t\tif (disconnected && !this.isCompacting) this._reconnectToAgent();\n\t\t\tif (outcome === \"completed\") this._resumeQueuedMessagesAfterCompaction();\n\t\t}\n\t}\n\n\tasync applyCompaction(\n\t\tprecomputed: CompactionResult,\n\t\toptions: ApplyCompactionOptions,\n\t): Promise<ApplyCompactionResult> {\n\t\tif (options.signal !== undefined && options.signal !== this._compactionAbortController?.signal) {\n\t\t\treturn { applied: false, reason: \"stale\" };\n\t\t}\n\t\tif (options.expectedRevision !== undefined && options.expectedRevision !== this._messageRevision) {\n\t\t\treturn { applied: false, reason: \"stale\" };\n\t\t}\n\t\tif (\n\t\t\toptions.expectedWarmAnchor !== undefined &&\n\t\t\t!isWarmSummaryAnchorValid(options.expectedWarmAnchor, this.sessionManager.getBranch())\n\t\t) {\n\t\t\treturn { applied: false, reason: \"stale\" };\n\t\t}\n\n\t\tconst ownsController = this._compactionAbortController === undefined;\n\t\tconst lifecycleState = this._compactionLifecycle.state;\n\t\tconst requestId =\n\t\t\t!ownsController && lifecycleState.status === \"running\" && lifecycleState.stage === \"feedback\"\n\t\t\t\t? lifecycleState.operationId\n\t\t\t\t: randomUUID();\n\t\tif (ownsController) {\n\t\t\tthis._claimCompactionController(new AbortController(), \"compaction\");\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_start\",\n\t\t\t\treason: options.reason,\n\t\t\t\trequestId,\n\t\t\t});\n\t\t}\n\t\tconst controller = this._compactionAbortController;\n\t\tif (!controller) return { applied: false, reason: \"rejected\" };\n\t\tthis._claimCompactionController(controller, \"compaction\");\n\n\t\ttry {\n\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\tcontroller,\n\t\t\t\towner: \"compaction\",\n\t\t\t\treason: options.reason,\n\t\t\t\trequestId,\n\t\t\t\twillRetry: false,\n\t\t\t\tprecomputed,\n\t\t\t});\n\t\t\tif (!execution.accepted) {\n\t\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t\t}\n\t\t\tthis._resumeQueuedMessagesAfterCompaction();\n\t\t\treturn { applied: true, reason: \"ok\" };\n\t\t} catch (error) {\n\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: options.reason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage: aborted ? undefined : `Compaction failed: ${message}`,\n\t\t\t});\n\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t} finally {\n\t\t\tif (this._compactionAbortController === controller && this._compactionLifecycle.state.status !== \"running\") {\n\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _beginExtensionCompactionFeedback(reason: CompactionReason): AbortSignal {\n\t\tconst controller = new AbortController();\n\t\tthis._claimCompactionController(controller, \"compaction\");\n\t\tconst model = this.model;\n\t\tconst requestId = randomUUID();\n\t\tthis._compactionLifecycle.begin(\n\t\t\t{\n\t\t\t\toperationId: requestId,\n\t\t\t\tstage: \"feedback\",\n\t\t\t\treason,\n\t\t\t\tmodel: model ? { provider: model.provider, id: model.id } : undefined,\n\t\t\t\tstartedRevision: this._messageRevision,\n\t\t\t},\n\t\t\tcontroller,\n\t\t);\n\t\tthis._emit({ type: \"compaction_start\", reason, requestId });\n\t\treturn controller.signal;\n\t}\n\n\tprivate _updateExtensionCompactionFeedback(options: {\n\t\treason: CompactionReason;\n\t\tsignal?: AbortSignal;\n\t\tdelta?: string;\n\t\ttext?: string;\n\t}): void {\n\t\tif (!options.signal || !this._compactionLifecycle.hasCurrentSignal(options.signal)) return;\n\t\tthis._emit({\n\t\t\ttype: \"compaction_progress\",\n\t\t\treason: options.reason,\n\t\t\t...(options.delta !== undefined ? { delta: options.delta } : {}),\n\t\t\t...(options.text !== undefined ? { text: options.text } : {}),\n\t\t});\n\t}\n\n\tprivate _endExtensionCompactionFeedback(options: {\n\t\treason: CompactionReason;\n\t\tsignal?: AbortSignal;\n\t\taborted?: boolean;\n\t\terrorMessage?: string;\n\t}): void {\n\t\tif (!options.signal) return;\n\t\tif (!this._compactionLifecycle.hasCurrentSignal(options.signal)) {\n\t\t\tthis._releaseCompactionController(options.signal);\n\t\t\treturn;\n\t\t}\n\t\tconst operation = this._compactionLifecycle.state;\n\t\tif (operation.status !== \"running\" || operation.stage !== \"feedback\") return;\n\t\tconst aborted = options.aborted ?? options.signal.aborted;\n\t\tthis._compactionLifecycle.finish({\n\t\t\toperationId: operation.operationId,\n\t\t\tstatus: aborted ? \"aborted\" : \"failed\",\n\t\t\tendedRevision: this._messageRevision,\n\t\t\t...(aborted\n\t\t\t\t? { errorMessage: \"Compaction cancelled\" }\n\t\t\t\t: { errorMessage: options.errorMessage ?? \"Compaction did not apply\" }),\n\t\t});\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: options.reason,\n\t\t\tresult: undefined,\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\trequestId: operation.operationId,\n\t\t\terrorMessage: aborted ? undefined : (options.errorMessage ?? \"Compaction did not apply\"),\n\t\t});\n\t\tthis._releaseCompactionController(options.signal);\n\t}\n\n\tprivate async _executeCompaction(request: CompactionExecutionRequest): Promise<CompactionExecutionResult> {\n\t\tconst model = this.model;\n\t\tif (!model) throw new Error(formatNoModelSelectedMessage());\n\t\tconst controller = request.controller;\n\t\t// Async auth and provider preparation may yield to a newer route. A stale\n\t\t// controller must never promote itself into a lifecycle generation.\n\t\tif (!this._ownsCompactionController(controller, request.owner)) {\n\t\t\tthrow new CompactionExecutionError(new CompactionCancelledError(), false, true);\n\t\t}\n\t\tconst requestId = request.requestId ?? randomUUID();\n\t\tconst operationId = this._compactionLifecycle.begin(\n\t\t\t{\n\t\t\t\toperationId: requestId,\n\t\t\t\tstage: \"execution\",\n\t\t\t\treason: request.reason,\n\t\t\t\tmodel: { provider: model.provider, id: model.id },\n\t\t\t\tstartedRevision: this._messageRevision,\n\t\t\t},\n\t\t\tcontroller,\n\t\t);\n\t\tconst finishCompactionWork = this._sessionWorkBarrier.begin();\n\t\tconst agentMessagesAtStart = request.agentMessagesAtStart ?? this.agent.state.messages.slice();\n\t\tconst compactionOwnedDiagnosticMessages = new Set<AgentMessage>();\n\t\tconst signal = controller.signal;\n\t\ttry {\n\t\t\tif (signal.aborted) {\n\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t}\n\t\t\tconst pathEntries = this.sessionManager.getBranch();\n\t\t\tconst settings = cursorOverflowCompactionSettings(\n\t\t\t\tthis.settingsManager.getCompactionSettings(),\n\t\t\t\tthis.model?.provider,\n\t\t\t\trequest.reason,\n\t\t\t);\n\n\t\t\tlet compactionResult = request.precomputed;\n\t\t\tlet fromExtension = request.precomputed !== undefined;\n\n\t\t\tif (!compactionResult) {\n\t\t\t\tconst preparation = prepareCompaction(\n\t\t\t\t\tpathEntries,\n\t\t\t\t\tsettings,\n\t\t\t\t\trequest.reason === \"overflow\",\n\t\t\t\t\trequest.allowSummaryOnly,\n\t\t\t\t);\n\n\t\t\t\tif (!preparation) {\n\t\t\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\t\t\tif (lastEntry?.type === \"compaction\") {\n\t\t\t\t\t\tthrow new Error(\"Already compacted\");\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\"Nothing to compact (session too small)\");\n\t\t\t\t}\n\n\t\t\t\tif (this._extensionRunner.hasHandlers(\"session_before_compact\")) {\n\t\t\t\t\tconst messagesBeforeExtension = new Set(this.agent.state.messages);\n\t\t\t\t\tconst extensionResult = (await this._extensionRunner.emit({\n\t\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\t\treason: request.reason,\n\t\t\t\t\t\twillRetry: request.willRetry,\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\tpreparation,\n\t\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\t\tcustomInstructions: request.customInstructions,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\t\t\t\t\tfor (const message of this.agent.state.messages) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!messagesBeforeExtension.has(message) &&\n\t\t\t\t\t\t\tisCompactionOwnedPreCompactDiagnostic(message, requestId)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcompactionOwnedDiagnosticMessages.add(message);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this._compactionLifecycle.isCurrent(operationId, controller)) {\n\t\t\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\t\treturn await this._rejectCompaction(\n\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\textensionResult.rejectionCause ?? \"cancelled-by-extension\",\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\textensionResult.reason,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\t\tcompactionResult = extensionResult.compaction;\n\t\t\t\t\t\tfromExtension = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!compactionResult) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\textraBody,\n\t\t\t\t\t\tenv,\n\t\t\t\t\t} = await this._getCompactionRequestAuth(model);\n\t\t\t\t\tcompactionResult = await this._runDefaultCompaction(\n\t\t\t\t\t\tpreparation,\n\t\t\t\t\t\trequestModel,\n\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\textraBody,\n\t\t\t\t\t\trequest.customInstructions,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tenv,\n\t\t\t\t\t\trequest.reason,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (signal.aborted) {\n\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t}\n\t\t\tif (!this._compactionLifecycle.isCurrent(operationId, controller)) {\n\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t}\n\n\t\t\tconst lifecycleState = this._compactionLifecycle.state;\n\t\t\tconst currentMessagesAtCheck = this.agent.state.messages;\n\t\t\tconst startPrefixIntact = agentMessagesAtStart.every(\n\t\t\t\t(message, index) => currentMessagesAtCheck[index] === message,\n\t\t\t);\n\t\t\t// Appends after the start snapshot are fresh only while they are exact\n\t\t\t// message_end identities still awaiting persistence. Any revision change,\n\t\t\t// other append, replacement, or reorder still makes this compaction stale.\n\t\t\tconst onlyPendingPersistenceAppends =\n\t\t\t\tstartPrefixIntact &&\n\t\t\t\tcurrentMessagesAtCheck\n\t\t\t\t\t.slice(agentMessagesAtStart.length)\n\t\t\t\t\t.every(\n\t\t\t\t\t\t(message) =>\n\t\t\t\t\t\t\tthis._messageEndsAwaitingPersistence.has(message) ||\n\t\t\t\t\t\t\tcompactionOwnedDiagnosticMessages.has(message),\n\t\t\t\t\t);\n\t\t\tconst sourceChanged =\n\t\t\t\tlifecycleState.status !== \"running\" ||\n\t\t\t\tlifecycleState.operationId !== operationId ||\n\t\t\t\tlifecycleState.startedRevision + compactionOwnedDiagnosticMessages.size !== this._messageRevision ||\n\t\t\t\t!onlyPendingPersistenceAppends;\n\t\t\tif (sourceChanged) {\n\t\t\t\treturn await this._rejectCompaction(request, requestId, operationId, \"stale-revision\", false);\n\t\t\t}\n\n\t\t\tif (await this._wouldCompactionOverflow(pathEntries, compactionResult, fromExtension, model)) {\n\t\t\t\treturn await this._rejectCompaction(request, requestId, operationId, \"would-overflow\", false);\n\t\t\t}\n\n\t\t\tconst compactionEntryId = this.sessionManager.appendCompaction(\n\t\t\t\tcompactionResult.summary,\n\t\t\t\tcompactionResult.firstKeptEntryId,\n\t\t\t\tcompactionResult.tokensBefore,\n\t\t\t\tcompactionResult.details,\n\t\t\t\tfromExtension,\n\t\t\t\tcompactionResult.usage,\n\t\t\t);\n\t\t\tconst savedEntry = this.sessionManager.getEntry(compactionEntryId);\n\t\t\tif (savedEntry?.type !== \"compaction\") {\n\t\t\t\tthrow new Error(\"Compaction entry was not saved\");\n\t\t\t}\n\n\t\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\t\tconst currentAgentMessages = this.agent.state.messages;\n\t\t\tconst hasUnchangedPrefix = agentMessagesAtStart.every(\n\t\t\t\t(message, index) => currentAgentMessages[index] === message,\n\t\t\t);\n\t\t\tconst messagesAppendedDuringCompaction = hasUnchangedPrefix\n\t\t\t\t? currentAgentMessages.slice(agentMessagesAtStart.length)\n\t\t\t\t: [];\n\t\t\t// Preserve an identity-deduped, agent-ordered union of the append-during-\n\t\t\t// compaction suffix and exact messages still awaiting persistence. Their\n\t\t\t// queued message_end owns exactly-once persistence, so they are kept in\n\t\t\t// agent state only and never persisted here.\n\t\t\tconst preservedIdentities = new Set<AgentMessage>(messagesAppendedDuringCompaction);\n\t\t\tfor (const message of currentAgentMessages) {\n\t\t\t\tif (this._messageEndsAwaitingPersistence.has(message)) {\n\t\t\t\t\tpreservedIdentities.add(message);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst preservedPendingMessages = currentAgentMessages.filter((message) => preservedIdentities.delete(message));\n\t\t\tthis._skipNextPostCompactionAssistantCheck = true;\n\t\t\tfor (const message of preservedPendingMessages) {\n\t\t\t\tif (message.role === \"assistant\") {\n\t\t\t\t\tthis._assistantsPendingAtCompaction.add(message);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.agent.state.messages = [...sessionContext.messages, ...preservedPendingMessages];\n\t\t\tcompactionResult.estimatedTokensAfter = estimateMessagesTokens(sessionContext.messages);\n\t\t\tthis._incrementMessageRevision();\n\t\t\tif (\n\t\t\t\t!this._compactionLifecycle.finish({\n\t\t\t\t\toperationId,\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\tendedRevision: this._messageRevision,\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t}\n\t\t\tthis._delegatedCompactionKey = undefined;\n\t\t\tif (request.owner === \"compaction\" && this._compactionAbortController === request.controller) {\n\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t}\n\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: request.reason,\n\t\t\t\tresult: compactionResult,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: request.willRetry,\n\t\t\t\trequestId,\n\t\t\t\taccepted: true,\n\t\t\t});\n\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_compact\",\n\t\t\t\treason: request.reason,\n\t\t\t\trequestId,\n\t\t\t\taccepted: true,\n\t\t\t\tcompactionEntry: savedEntry,\n\t\t\t\tfromExtension,\n\t\t\t\twillRetry: request.willRetry,\n\t\t\t});\n\n\t\t\t// Shared success seam: every senpi-owned compaction apply (manual /compact,\n\t\t\t// extension applyCompaction, pre-prompt and auto compaction) funnels through\n\t\t\t// here after the compaction entry is appended and the success event emitted.\n\t\t\tawait this._onCompactionContextChanged();\n\n\t\t\treturn {\n\t\t\t\taccepted: true,\n\t\t\t\trequestId,\n\t\t\t\tresult: compactionResult,\n\t\t\t\tcompactionEntry: savedEntry,\n\t\t\t\tfromExtension,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (error instanceof CompactionExecutionError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst lifecycleState = this._compactionLifecycle.state;\n\t\t\tconst ownsTerminalTransition = lifecycleState.status !== \"idle\" && lifecycleState.operationId === operationId;\n\t\t\tconst aborted = signal.aborted || isCompactionExecutionAborted(error);\n\t\t\tif (ownsTerminalTransition && lifecycleState.status === \"running\") {\n\t\t\t\tthis._compactionLifecycle.finish({\n\t\t\t\t\toperationId,\n\t\t\t\t\tstatus: aborted ? \"aborted\" : \"failed\",\n\t\t\t\t\tendedRevision: this._messageRevision,\n\t\t\t\t\terrorMessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow new CompactionExecutionError(error, ownsTerminalTransition, aborted);\n\t\t} finally {\n\t\t\tfinishCompactionWork();\n\t\t}\n\t}\n\n\tprivate async _wouldCompactionOverflow(\n\t\tpathEntries: SessionEntry[],\n\t\tcompactionResult: CompactionResult,\n\t\tfromExtension: boolean,\n\t\tmodel: Model<Api>,\n\t): Promise<boolean> {\n\t\tconst currentLeaf = pathEntries[pathEntries.length - 1];\n\t\tif (!currentLeaf) return false;\n\n\t\tconst simulatedCompactionEntry: CompactionEntry = {\n\t\t\ttype: \"compaction\",\n\t\t\tid: `simulated-${randomUUID()}`,\n\t\t\tparentId: currentLeaf.id,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsummary: compactionResult.summary,\n\t\t\tfirstKeptEntryId: compactionResult.firstKeptEntryId,\n\t\t\ttokensBefore: compactionResult.tokensBefore,\n\t\t\tdetails: compactionResult.details,\n\t\t\tfromHook: fromExtension,\n\t\t};\n\n\t\tlet simulatedMessages = buildSessionContext(\n\t\t\t[...pathEntries, simulatedCompactionEntry],\n\t\t\tsimulatedCompactionEntry.id,\n\t\t).messages;\n\t\t// Size the same retained context that will be admitted to Cursor. Persisted JSONL\n\t\t// remains verbatim, but the in-memory request representation is bounded first.\n\t\tif (model.provider === \"cursor\" || model.provider === \"cursor-cli-oauth\") {\n\t\t\tsimulatedMessages = truncateToolResultBodies(simulatedMessages).messages ?? simulatedMessages;\n\t\t}\n\t\tconst contextTokens = estimateMessagesTokens(filterContextExcludedMessages(simulatedMessages));\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tconst reserveTokens =\n\t\t\tsettings.reserveScalingEnabled === false\n\t\t\t\t? settings.reserveTokens\n\t\t\t\t: resolveReserveTokens(model.contextWindow, settings.reserveTokens);\n\t\treturn contextTokens > model.contextWindow - reserveTokens;\n\t}\n\n\t/**\n\t * Replaces agent state with the canonical session context while keeping exact\n\t * message objects whose message_end persistence is still queued. Identities\n\t * already present in the session context are kept from the context only, so\n\t * nothing is duplicated; the queued message_end still owns exactly-once\n\t * persistence for the rest.\n\t */\n\tprivate _restoreAgentMessagesFromSession(): void {\n\t\tconst sessionMessages = this.sessionManager.buildSessionContext().messages;\n\t\tconst seen = new Set<AgentMessage>(sessionMessages);\n\t\tconst pendingMessages: AgentMessage[] = [];\n\t\tfor (const message of this.agent.state.messages) {\n\t\t\tif (seen.has(message) || !this._messageEndsAwaitingPersistence.has(message)) continue;\n\t\t\tseen.add(message);\n\t\t\tpendingMessages.push(message);\n\t\t}\n\t\tthis.agent.state.messages = [...sessionMessages, ...pendingMessages];\n\t}\n\n\tprivate async _rejectCompaction(\n\t\trequest: CompactionExecutionRequest,\n\t\trequestId: string,\n\t\toperationId: string,\n\t\trejectionCause: CompactionRejectionCause,\n\t\taborted: boolean,\n\t\textensionReason?: string,\n\t): Promise<CompactionExecutionResult> {\n\t\t// Per plan Section 1: rejection must never be silent. The compaction_end event\n\t\t// carries a non-empty human-readable errorMessage (unless the user aborted, where\n\t\t// the aborted branch already renders \"Compaction cancelled\"). session_compact is\n\t\t// also emitted with accepted:false so the compaction extension's circuit-breaker\n\t\t// bookkeeping stops being dead code; other builtin session_compact handlers guard\n\t\t// on event.accepted.\n\t\tif (rejectionCause === \"external-owner\" && this.model) {\n\t\t\tthis._delegatedCompactionKey = { provider: this.model.provider, id: this.model.id };\n\t\t}\n\t\tconst trimmedExtensionReason = extensionReason?.trim();\n\t\tconst detailedMessage = trimmedExtensionReason\n\t\t\t? `Compaction rejected: ${trimmedExtensionReason}`\n\t\t\t: describeCompactionRejection(rejectionCause);\n\t\tconst errorMessage = aborted && !trimmedExtensionReason ? undefined : detailedMessage;\n\t\tif (\n\t\t\t!this._compactionLifecycle.finish({\n\t\t\t\toperationId,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tendedRevision: this._messageRevision,\n\t\t\t\trejectionCause,\n\t\t\t\t...(trimmedExtensionReason !== undefined ? { errorMessage: trimmedExtensionReason } : {}),\n\t\t\t})\n\t\t) {\n\t\t\tthrow new CompactionCancelledError();\n\t\t}\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: request.reason,\n\t\t\tresult: undefined,\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\trequestId,\n\t\t\taccepted: false,\n\t\t\trejectionCause,\n\t\t\terrorMessage,\n\t\t});\n\t\tawait this._extensionRunner.emit({\n\t\t\ttype: \"session_compact\",\n\t\t\treason: request.reason,\n\t\t\trequestId,\n\t\t\taccepted: false,\n\t\t\trejectionCause,\n\t\t\tfromExtension: false,\n\t\t\twillRetry: false,\n\t\t});\n\t\treturn { accepted: false, requestId, rejectionCause };\n\t}\n\n\t/**\n\t * Cancel in-progress compaction (manual or auto).\n\t */\n\tabortCompaction(): void {\n\t\tconst lifecycleState = this._compactionLifecycle.state;\n\t\tconst activeFeedbackRequestId =\n\t\t\tlifecycleState.status === \"running\" && lifecycleState.stage === \"feedback\"\n\t\t\t\t? lifecycleState.operationId\n\t\t\t\t: undefined;\n\t\tconst feedbackOperation = this._compactionLifecycle.abort(this._messageRevision);\n\t\tthis._compactionAbortController?.abort();\n\t\tthis._autoCompactionAbortController?.abort();\n\t\tif (feedbackOperation?.stage === \"feedback\") {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: feedbackOperation.reason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: true,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId: activeFeedbackRequestId,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Cancel in-progress branch summarization.\n\t */\n\tabortBranchSummary(): void {\n\t\tthis._branchSummaryAbortController?.abort();\n\t}\n\n\t/**\n\t * Dispatch automatic compaction after `agent_end` or before prompt submission.\n\t * Manual compaction does not call this method; it enters through `compact()`.\n\t *\n\t * Two cases:\n\t * 1. Overflow: LLM returned context overflow error, remove error message from agent state, compact, auto-retry\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry (user continues manually)\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t * @returns Whether the post-run loop should call `agent.continue()` for overflow recovery or queued messages\n\t */\n\tprivate async _enforceCompactionBeforeProvider(\n\t\tassistantMessage: AssistantMessage | undefined,\n\t\tskipAbortedCheck: boolean,\n\t\tinlineReason: \"pre_prompt\" | \"threshold\",\n\t\tretryAfterCompaction = false,\n\t): Promise<boolean> {\n\t\tconst blockedAdmission = this._blockedPostCompactionAssistant;\n\t\tif (\n\t\t\tblockedAdmission !== undefined &&\n\t\t\tblockedAdmission.assistant === assistantMessage &&\n\t\t\tblockedAdmission.revision === this._messageRevision\n\t\t) {\n\t\t\tthrow new RequiredCompactionError();\n\t\t}\n\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tconst model = this.model;\n\t\tconst contextTokens = estimateContextTokens(\n\t\t\tfilterContextExcludedMessages(this.sessionManager.buildSessionContext().messages),\n\t\t).tokens;\n\t\tconst compacted = assistantMessage\n\t\t\t? await this._checkCompaction(assistantMessage, skipAbortedCheck, inlineReason, retryAfterCompaction)\n\t\t\t: false;\n\t\tif (compacted || (assistantMessage && this._postCompactionUsageExemptAssistants.has(assistantMessage))) {\n\t\t\treturn compacted;\n\t\t}\n\n\t\tif (!settings.enabled || !model || !shouldCompact(contextTokens, model.contextWindow, settings)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst latestCompaction = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\tconst assistantBeforeLatestCompaction =\n\t\t\tassistantMessage !== undefined && this._isAssistantFromBeforeLatestCompaction(assistantMessage);\n\t\tconst hasPostCompactionCustomState =\n\t\t\tlatestCompaction !== null &&\n\t\t\tthis.agent.state.messages.some(\n\t\t\t\t(message) =>\n\t\t\t\t\tmessage.role === \"custom\" && message.timestamp >= new Date(latestCompaction.timestamp).getTime(),\n\t\t\t);\n\t\tif (assistantBeforeLatestCompaction && !hasPostCompactionCustomState) {\n\t\t\treturn false;\n\t\t}\n\t\tif (assistantBeforeLatestCompaction && assistantMessage) {\n\t\t\tconst compacted = await this._runPrePromptCompaction(assistantMessage, skipAbortedCheck, inlineReason);\n\t\t\tif (compacted) return true;\n\t\t}\n\t\tif (this._isCompactionOnCooldown() || this._isCompactionDelegated() || this._hasSupersedingCompactionClaim()) {\n\t\t\treturn false;\n\t\t}\n\t\tthrow new RequiredCompactionError();\n\t}\n\n\t/**\n\t * The normal pre-prompt check only estimates persisted session context. This\n\t * final gate also includes turn-local messages which the provider will see:\n\t * the current prompt, next-turn custom messages, and before_agent_start\n\t * additions. Compaction rewrites only session context, so callers retain and\n\t * reapply their already-assembled one-shot additions after it succeeds.\n\t */\n\tprivate async _enforceFinalProviderAdmission(messages: readonly AgentMessage[]): Promise<void> {\n\t\t// User-only prompts are deliberately admitted without this gate: prompt\n\t\t// admission must never brick on a rejected or cooled-down compaction\n\t\t// (issues #531/#886), so oversized user prompts rely on threshold\n\t\t// compaction — which also samples the local transcript estimate — and on\n\t\t// provider-overflow recovery. This gate closes the separate gap opened by\n\t\t// turn-local custom additions, which the pre-prompt check cannot observe.\n\t\tif (!messages.some((message) => message.role === \"custom\")) return;\n\n\t\tconst model = this.model;\n\t\tif (!model) return;\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tconst reserveTokens =\n\t\t\tsettings.reserveScalingEnabled === false\n\t\t\t\t? settings.reserveTokens\n\t\t\t\t: resolveReserveTokens(model.contextWindow, settings.reserveTokens);\n\t\tconst isOversized = (): boolean => {\n\t\t\tconst providerMessages = filterContextExcludedMessages([...this.agent.state.messages, ...messages]);\n\t\t\tconst estimate = estimateContextTokens(providerMessages);\n\t\t\tconst usageMessage = estimate.lastUsageIndex === null ? undefined : providerMessages[estimate.lastUsageIndex];\n\t\t\t// Kept assistant usage can describe the pre-compaction request. Once a\n\t\t\t// compaction boundary exists, fall back to byte-derived message estimates\n\t\t\t// until a provider response refreshes that usage.\n\t\t\tconst contextTokens =\n\t\t\t\tusageMessage?.role === \"assistant\" && this._isAssistantFromBeforeLatestCompaction(usageMessage)\n\t\t\t\t\t? estimateMessagesTokens(providerMessages)\n\t\t\t\t\t: estimate.tokens;\n\t\t\treturn contextTokens > model.contextWindow - reserveTokens;\n\t\t};\n\n\t\tif (!settings.enabled || !isOversized()) return;\n\n\t\tconst lastAssistantMessage = this._findLastAssistantMessage();\n\t\tif (!lastAssistantMessage) {\n\t\t\tthrow new RequiredCompactionError();\n\t\t}\n\n\t\tconst compacted = await this._runPrePromptCompaction(lastAssistantMessage, false, \"pre_prompt\");\n\t\tif (!compacted && this._isCompactionDelegated()) return;\n\t\tif (!compacted && this._hasSupersedingCompactionClaim()) return;\n\t\tif (!compacted && !isOversized() && this._isCompactionOnCooldown()) return;\n\t\tif (!compacted || isOversized()) {\n\t\t\tthrow new RequiredCompactionError();\n\t\t}\n\t}\n\n\tprivate async _checkCompaction(\n\t\tassistantMessage: AssistantMessage,\n\t\tskipAbortedCheck = true,\n\t\tinlineReason?: \"pre_prompt\" | \"threshold\",\n\t\tretryAfterCompaction = false,\n\t): Promise<boolean> {\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) return false;\n\n\t\t// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return false;\n\n\t\tconst contextWindow = this.model?.contextWindow ?? 0;\n\n\t\t// Skip overflow check if the message came from a different model.\n\t\t// This handles the case where user switched from a smaller-context model (e.g. opus)\n\t\t// to a larger-context model (e.g. codex) - the overflow error from the old model\n\t\t// shouldn't trigger compaction for the new model.\n\t\tconst sameModel =\n\t\t\tthis.model &&\n\t\t\tisSameOverflowSource(\n\t\t\t\tassistantMessage,\n\t\t\t\tthis.model,\n\t\t\t\tthis._modelRuntime.getCompatibilityRequestConfig(this.model).upstreamModelId,\n\t\t\t);\n\n\t\t// Skip compaction checks if this assistant message is older than the latest\n\t\t// compaction boundary. This prevents a stale pre-compaction usage/error\n\t\t// from retriggering compaction on the first prompt after compaction.\n\t\tconst compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\tif (this._isAssistantFromBeforeLatestCompaction(assistantMessage)) {\n\t\t\treturn false;\n\t\t}\n\t\t// Case 1: Overflow - LLM returned context overflow error.\n\t\t// If the saved assistant provider differs from the currently selected provider alias,\n\t\t// still recover as overflow when the current context is also at the compaction limit.\n\t\tconst contextUsage = this.getContextUsage();\n\t\tconst currentContextNeedsCompaction =\n\t\t\tcontextUsage !== undefined &&\n\t\t\tcontextUsage.tokens !== null &&\n\t\t\tshouldCompact(contextUsage.tokens, contextUsage.contextWindow, settings);\n\t\tconst recoverableLength = sameModel && isRecoverableLength(assistantMessage, this.model?.maxTokens ?? 0);\n\t\tconst isOverflow =\n\t\t\t(isContextOverflow(assistantMessage, contextWindow) && (sameModel || currentContextNeedsCompaction)) ||\n\t\t\trecoverableLength ||\n\t\t\tthis._isCursorPayloadOverflow(assistantMessage);\n\t\tif (\n\t\t\tisOverflow &&\n\t\t\tassistantMessage.stopReason === \"stop\" &&\n\t\t\tthis._consumePostCompactionUsageExemption(assistantMessage)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tif (isOverflow) {\n\t\t\tthis._flushPostCompactionDeferredMessages();\n\t\t\tconst willRetry = retryAfterCompaction || assistantMessage.stopReason !== \"stop\";\n\n\t\t\t// Case 2: the response completed successfully. Compact, but do not retry because\n\t\t\t// agent.continue() cannot continue from a completed assistant response.\n\t\t\tif (!willRetry) {\n\t\t\t\tconst compacted = await this._runAutoCompaction(\"overflow\", false);\n\t\t\t\tif (\n\t\t\t\t\t!compacted &&\n\t\t\t\t\tthis._compactionLifecycle.state.status === \"failed\" &&\n\t\t\t\t\tthis._compactionLifecycle.state.rejectionCause !== \"external-owner\" &&\n\t\t\t\t\tgetLatestCompactionEntry(this.sessionManager.getBranch()) !== null\n\t\t\t\t) {\n\t\t\t\t\tthis._blockedPostCompactionAssistant = {\n\t\t\t\t\t\tassistant: assistantMessage,\n\t\t\t\t\t\trevision: this._messageRevision,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn compacted;\n\t\t\t}\n\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tconst errorMessage =\n\t\t\t\t\t\"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\";\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason: \"overflow\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\t\t\t\tif (inlineReason === \"pre_prompt\") {\n\t\t\t\t\tthrow new Error(errorMessage);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Case 1: remove the failed or truncated message from agent state, compact, and\n\t\t\t// retry once. The message remains in session history but is excluded from retry context.\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\t// Remove the error message from agent state (it IS saved to session for history,\n\t\t\t// but we don't want it in context for the retry)\n\t\t\tconst messages = this.agent.state.messages;\n\t\t\tlet removedOverflowAssistant = false;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis.agent.state.messages = messages.slice(0, -1);\n\t\t\t\tremovedOverflowAssistant = true;\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t}\n\t\t\tconst compacted = inlineReason\n\t\t\t\t? await this._runPrePromptCompaction(assistantMessage, skipAbortedCheck, \"overflow\", willRetry)\n\t\t\t\t: await this._runAutoCompaction(\"overflow\", willRetry);\n\t\t\tif (!compacted && removedOverflowAssistant) {\n\t\t\t\tthis._restoreAgentMessagesFromSession();\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t}\n\t\t\tif (!compacted && inlineReason && !this._isCompactionDelegated() && !this._hasSupersedingCompactionClaim()) {\n\t\t\t\tif (this._compactionSkippedTooSmall) {\n\t\t\t\t\tthis._compactionSkippedTooSmall = false;\n\t\t\t\t\tconst provider = this.model?.provider;\n\t\t\t\t\tif (provider === \"cursor\" || provider === \"cursor-cli-oauth\") {\n\t\t\t\t\t\tthis._truncateAgentMessagesToLastUserTurn();\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tthrow new RequiredCompactionError();\n\t\t\t}\n\t\t\treturn compacted;\n\t\t}\n\n\t\t// The first ordinary response can carry provider usage calculated before\n\t\t// compaction. Consume that exemption only after proving this is not an\n\t\t// overflow, then retain the decision for later admission re-sampling.\n\t\tif (this._consumePostCompactionUsageExemption(assistantMessage)) return false;\n\n\t\t// Case 2: Threshold - context is getting large\n\t\t// For error messages or all-zero usage messages, estimate from the last valid response.\n\t\t// This ensures sessions that hit persistent API errors (e.g. 529) or malformed zero-usage\n\t\t// responses can still compact and do not reset context accounting.\n\t\tlet contextTokens: number;\n\t\tif (inlineReason) {\n\t\t\tconst messages = filterContextExcludedMessages(this.sessionManager.buildSessionContext().messages);\n\t\t\tcontextTokens = estimateContextTokens(messages).tokens;\n\t\t} else {\n\t\t\tconst directContextTokens = assistantMessage.usage ? calculateContextTokens(assistantMessage.usage) : 0;\n\t\t\tif (assistantMessage.stopReason !== \"error\" && directContextTokens !== 0) {\n\t\t\t\tcontextTokens = this._resolveThresholdContextTokens(directContextTokens);\n\t\t\t} else {\n\t\t\t\tconst messages = filterContextExcludedMessages(this.agent.state.messages);\n\t\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\t\tif (estimate.lastUsageIndex !== null) {\n\t\t\t\t\t// Verify the usage source is post-compaction. Kept pre-compaction messages\n\t\t\t\t\t// have stale usage reflecting the old (larger) context and would falsely\n\t\t\t\t\t// trigger compaction right after one just finished.\n\t\t\t\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\t\t\t\tif (\n\t\t\t\t\t\tcompactionEntry &&\n\t\t\t\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t\t\t\tthis._isAssistantFromBeforeLatestCompaction(usageMsg)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontextTokens = estimate.tokens;\n\t\t\t}\n\t\t}\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\tif (inlineReason) {\n\t\t\t\treturn await this._runPrePromptCompaction(\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\tskipAbortedCheck,\n\t\t\t\t\tinlineReason,\n\t\t\t\t\tretryAfterCompaction,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst compacted = await this._runAutoCompaction(\"threshold\", retryAfterCompaction);\n\t\t\t\tif (\n\t\t\t\t\t!compacted &&\n\t\t\t\t\tthis._compactionLifecycle.state.status === \"failed\" &&\n\t\t\t\t\tthis._compactionLifecycle.state.rejectionCause !== \"external-owner\" &&\n\t\t\t\t\tgetLatestCompactionEntry(this.sessionManager.getBranch()) !== null\n\t\t\t\t) {\n\t\t\t\t\tthis._blockedPostCompactionAssistant = {\n\t\t\t\t\t\tassistant: assistantMessage,\n\t\t\t\t\t\trevision: this._messageRevision,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn compacted;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate _isCompactionOnCooldown(): boolean {\n\t\tconst state = this._compactionLifecycle.state;\n\t\treturn state.status === \"failed\" && state.rejectionCause === \"circuit-breaker\";\n\t}\n\n\t/**\n\t * Compaction claims are last-writer-wins: a newer admission aborts the\n\t * incumbent controller (_claimCompactionController). When the failed attempt\n\t * lost that race, a live claimant now owns the route and re-gates admission\n\t * itself, so the loser must not surface RequiredCompactionError (issue #886).\n\t * A user abort leaves no live claimant behind and keeps throwing.\n\t */\n\tprivate _hasSupersedingCompactionClaim(): boolean {\n\t\tconst claimant = this._compactionAbortController ?? this._autoCompactionAbortController;\n\t\treturn claimant !== undefined && !claimant.signal.aborted;\n\t}\n\n\tprivate _isCompactionDelegated(): boolean {\n\t\tconst model = this.model;\n\t\treturn (\n\t\t\tthis._delegatedCompactionKey !== undefined &&\n\t\t\tmodel !== undefined &&\n\t\t\tthis._delegatedCompactionKey.provider === model.provider &&\n\t\t\tthis._delegatedCompactionKey.id === model.id\n\t\t);\n\t}\n\n\tprivate async _runPrePromptCompaction(\n\t\tlastAssistantMessage: AssistantMessage | undefined,\n\t\tskipAbortedCheck: boolean,\n\t\treason: \"pre_prompt\" | \"overflow\" | \"threshold\" = \"pre_prompt\",\n\t\twillRetry = false,\n\t\tallowSummaryOnly = false,\n\t): Promise<boolean> {\n\t\tif (this._isCompactionDelegated()) return false;\n\t\tconst controller = new AbortController();\n\t\tconst requestId = randomUUID();\n\t\tthis._claimCompactionController(controller, \"compaction\");\n\t\tthis._emit({ type: \"compaction_start\", reason, requestId });\n\n\t\ttry {\n\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\tcontroller,\n\t\t\t\towner: \"compaction\",\n\t\t\t\treason,\n\t\t\t\trequestId,\n\t\t\t\twillRetry,\n\t\t\t\tlastAssistantMessage,\n\t\t\t\tskipAbortedCheck,\n\t\t\t\tallowSummaryOnly,\n\t\t\t});\n\t\t\tif (\n\t\t\t\t!execution.accepted &&\n\t\t\t\tlastAssistantMessage &&\n\t\t\t\tisContextOverflow(lastAssistantMessage, this.model?.contextWindow ?? 0)\n\t\t\t) {\n\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t}\n\t\t\treturn execution.accepted;\n\t\t} catch (error) {\n\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (lastAssistantMessage && isContextOverflow(lastAssistantMessage, this.model?.contextWindow ?? 0)) {\n\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t}\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n\t\t\tthis._compactionSkippedTooSmall = shouldRetryOverflowWithoutCompact(false, errorMessage);\n\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage: aborted ? undefined : `Pre-prompt compaction failed: ${errorMessage}`,\n\t\t\t});\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tif (this._compactionAbortController === controller && this._compactionLifecycle.state.status !== \"running\") {\n\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _revalidateScheduledContinuationAdmission(): Promise<void> {\n\t\tconst model = this.model;\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tif (!model || !settings.enabled) return;\n\n\t\tconst canonicalMessages = filterContextExcludedMessages(this.sessionManager.buildSessionContext().messages);\n\t\tconst estimate = estimateContextTokens(canonicalMessages);\n\t\tconst usageMessage = estimate.lastUsageIndex === null ? undefined : canonicalMessages[estimate.lastUsageIndex];\n\t\tconst contextTokens =\n\t\t\tusageMessage?.role === \"assistant\" && this._isAssistantFromBeforeLatestCompaction(usageMessage)\n\t\t\t\t? estimateMessagesTokens(canonicalMessages)\n\t\t\t\t: estimate.tokens;\n\t\tif (!shouldCompact(contextTokens, model.contextWindow, settings)) return;\n\n\t\tconst compacted = await this._runPrePromptCompaction(this._findLastAssistantMessage(), true, \"pre_prompt\");\n\t\tif (!compacted) {\n\t\t\tif (this._isCompactionOnCooldown() || this._isCompactionDelegated() || this._hasSupersedingCompactionClaim()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow new RequiredCompactionError();\n\t\t}\n\t\tthis._scheduledContinuationRecompacted = true;\n\t}\n\n\tprivate async _continueAgentAfterCurrentRun(\n\t\toptions: AgentContinuationOptions = {},\n\t\tretryTimeoutMs?: number,\n\t): Promise<\"continued\" | \"taken-over\"> {\n\t\tawait this.agent.waitForIdle();\n\t\ttry {\n\t\t\tif (this.agent.state.isStreaming) return \"taken-over\";\n\n\t\t\t// Pre-admission restore point. A senpi-owned compaction that succeeds\n\t\t\t// while a run is still active releases its refusal pin through\n\t\t\t// _onCompactionContextChanged() but cannot restore there: model-select\n\t\t\t// work must stay ordered behind the session-work barrier while the run\n\t\t\t// owns it. Every post-compaction continuation admission - auto/overflow\n\t\t\t// compaction recovery, _resumeQueuedMessagesAfterCompaction(), the\n\t\t\t// agent_end queued continuation and the retry continuation - is scheduled\n\t\t\t// through _scheduleContinuationAfterCurrentEvent() and funnels here, so\n\t\t\t// this is the single choke point every such request passes before\n\t\t\t// reaching the provider. Restoring here (a no-op when nothing is pending)\n\t\t\t// keeps the guarantee that the very next request after a compaction runs\n\t\t\t// on the primary, and precedes the admission revalidation below so that\n\t\t\t// check samples the restored model's context window - the same ordering\n\t\t\t// the retry-continuation restore uses.\n\t\t\tawait this._maybeRestoreFallbackPrimary();\n\n\t\t\tawait this._revalidateScheduledContinuationAdmission();\n\t\t\tif (this.agent.state.isStreaming) return \"taken-over\";\n\n\t\t\tawait runBoundedRetryContinuation({\n\t\t\t\tcontinueRun: async () => {\n\t\t\t\t\tif (this._scheduledContinuationRecompacted) {\n\t\t\t\t\t\tconst tail = this.agent.state.messages.at(-1);\n\t\t\t\t\t\tif (tail?.role === \"assistant\" && (tail.stopReason === \"error\" || tail.stopReason === \"aborted\")) {\n\t\t\t\t\t\t\tthis._retireFailedRetryAssistant(tail);\n\t\t\t\t\t\t\tif (this.agent.state.messages.at(-1) === tail) {\n\t\t\t\t\t\t\t\tthis.agent.state.messages = this.agent.state.messages.slice(0, -1);\n\t\t\t\t\t\t\t\tthis._incrementMessageRevision();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.agent.continueWithQueuedMessages(options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this.agent.continue(options);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tgetActiveSignal: () => this.agent.signal,\n\t\t\t\tabortActive: () =>\n\t\t\t\t\tthis.agent.abort(\n\t\t\t\t\t\tnew ProviderRetryWatchdogAbortError(\n\t\t\t\t\t\t\tproviderRetryWatchdogAbortMessage(retryTimeoutMs, this.agent.streamStartTimeoutMs),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\ttimeoutMs: retryTimeoutMs,\n\t\t\t});\n\t\t\treturn \"continued\";\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\tthis.agent.state.isStreaming &&\n\t\t\t\terror instanceof Error &&\n\t\t\t\terror.message.startsWith(\"Agent is already processing\")\n\t\t\t) {\n\t\t\t\treturn \"taken-over\";\n\t\t\t}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis._scheduledContinuationRecompacted = false;\n\t\t}\n\t}\n\n\t/**\n\t * Mirror _runAutoCompaction's post-success recovery for non-auto compaction\n\t * owners (manual, extension action, extension apply): a custom triggerTurn\n\t * message sent while the compaction was running is parked in the agent-level\n\t * queues without starting a turn, so a settled compaction must deliver it or\n\t * hidden continuations (e.g. goal) wedge until manual user input.\n\t */\n\tprivate _resumeQueuedMessagesAfterCompaction(): void {\n\t\tif (this.pendingMessageCount > 0 || this.agent.hasQueuedMessages()) {\n\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t}\n\t}\n\n\tprivate _scheduleContinuationAfterCurrentEvent(\n\t\toptions: AgentContinuationOptions = {},\n\t\tretryContinuation = false,\n\t\tretryTimeoutMs?: number,\n\t): void {\n\t\t// Tool hooks wait for queued message persistence, so continue() cannot run inside this event promise.\n\t\tconst currentEventQueue = this._agentEventQueue;\n\t\tconst finishContinuationWork = this._sessionWorkBarrier.begin();\n\t\tconst continueAfterEvent = async (): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tconst outcome = await this._continueAgentAfterCurrentRun(options, retryTimeoutMs);\n\t\t\t\tif (retryContinuation && outcome === \"taken-over\") {\n\t\t\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.delete(this);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (retryContinuation) {\n\t\t\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.delete(this);\n\t\t\t\t}\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"continuation_error\",\n\t\t\t\t\terrorMessage: `Failed to continue queued messages: ${message}`,\n\t\t\t\t});\n\t\t\t\tif (!this.agent.state.isStreaming) {\n\t\t\t\t\tawait this._emitAgentSettled();\n\t\t\t\t}\n\t\t\t\tif (retryContinuation) this._resolveRetry();\n\t\t\t}\n\t\t};\n\n\t\tvoid currentEventQueue\n\t\t\t.then(continueAfterEvent, continueAfterEvent)\n\t\t\t.finally(finishContinuationWork)\n\t\t\t.catch(() => undefined);\n\t}\n\n\t/**\n\t * Execute threshold or overflow compaction. Manual compaction uses\n\t * `AgentSession.compact()` instead. Both paths call the lower-level `compact()`\n\t * function imported from `./compaction/index.ts` after preparation and extension\n\t * interception.\n\t *\n\t * @param reason Automatic trigger selected by `_checkCompaction()`\n\t * @param willRetry Whether to continue the interrupted turn after overflow compaction\n\t * @returns Whether the post-run loop should call `agent.continue()`\n\t */\n\tprivate async _runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<boolean> {\n\t\tif (this._isCompactionDelegated()) return false;\n\t\tconst finishCompactionWork = this._sessionWorkBarrier.begin();\n\t\tconst agentMessagesAtStart = this.agent.state.messages.slice();\n\t\tconst autoCompactionController = new AbortController();\n\t\tconst requestId = randomUUID();\n\t\tthis._claimCompactionController(autoCompactionController, \"auto\");\n\t\tconst endBeforeExecution = (): false => {\n\t\t\tthis._emit({ type: \"compaction_start\", reason, requestId });\n\t\t\tif (reason === \"overflow\" && this._autoCompactionAbortController === autoCompactionController) {\n\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t}\n\t\t\t// A synchronous compaction_start listener can supersede this controller with a new\n\t\t\t// operation, which then owns its own start/end lifecycle; publishing another terminal\n\t\t\t// event here would be stale. A listener can instead abort this very controller, and\n\t\t\t// that still needs a terminal event: consumers open UI state on compaction_start and\n\t\t\t// close it only on compaction_end.\n\t\t\tif (this._autoCompactionAbortController !== autoCompactionController) return false;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: autoCompactionController.signal.aborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t});\n\t\t\treturn false;\n\t\t};\n\n\t\ttry {\n\t\t\tif (!this.model) {\n\t\t\t\treturn endBeforeExecution();\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Resolve once before admission so a pending auth refresh remains a\n\t\t\t\t// cancellable boundary. _executeCompaction resolves the policy-specific\n\t\t\t\t// auth after extension compaction hooks have had a chance to provide a\n\t\t\t\t// summary without credentials.\n\t\t\t\tawait this._modelRuntime.getAuth(this.model);\n\t\t\t} catch {\n\t\t\t\tif (!this._ownsCompactionController(autoCompactionController, \"auto\")) return false;\n\t\t\t\treturn endBeforeExecution();\n\t\t\t}\n\t\t\tif (!this._ownsCompactionController(autoCompactionController, \"auto\")) return false;\n\n\t\t\tconst preparation = prepareCompaction(\n\t\t\t\tthis.sessionManager.getBranch(),\n\t\t\t\tcursorOverflowCompactionSettings(\n\t\t\t\t\tthis.settingsManager.getCompactionSettings(),\n\t\t\t\t\tthis.model?.provider,\n\t\t\t\t\treason,\n\t\t\t\t),\n\t\t\t\treason === \"overflow\",\n\t\t\t);\n\t\t\tif (!preparation) {\n\t\t\t\treturn endBeforeExecution();\n\t\t\t}\n\t\t\tif (!this._ownsCompactionController(autoCompactionController, \"auto\")) return false;\n\t\t\tthis._emit({ type: \"compaction_start\", reason, requestId });\n\n\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\tcontroller: autoCompactionController,\n\t\t\t\towner: \"auto\",\n\t\t\t\treason,\n\t\t\t\trequestId,\n\t\t\t\twillRetry,\n\t\t\t\tagentMessagesAtStart,\n\t\t\t});\n\t\t\tif (!execution.accepted) {\n\t\t\t\tif (reason === \"overflow\") this._overflowRecoveryAttempted = false;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this._autoCompactionAbortController === autoCompactionController) {\n\t\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t\t}\n\n\t\t\tif (willRetry) {\n\t\t\t\tconst messages = this.agent.state.messages;\n\t\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\t\tif (\n\t\t\t\t\tlastMsg?.role === \"assistant\" &&\n\t\t\t\t\t((lastMsg as AssistantMessage).stopReason === \"error\" ||\n\t\t\t\t\t\t(lastMsg as AssistantMessage).stopReason === \"length\")\n\t\t\t\t) {\n\t\t\t\t\tthis.agent.state.messages = messages.slice(0, -1);\n\t\t\t\t\tthis._incrementMessageRevision();\n\t\t\t\t}\n\n\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\treturn true;\n\t\t\t} else if (this.pendingMessageCount > 0) {\n\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\treturn true;\n\t\t\t} else if (this.agent.hasQueuedMessages()) {\n\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t} catch (error) {\n\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (reason === \"overflow\") this._overflowRecoveryAttempted = false;\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\tconst formattedErrorMessage = aborted\n\t\t\t\t? undefined\n\t\t\t\t: reason === \"overflow\"\n\t\t\t\t\t? `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage: formattedErrorMessage,\n\t\t\t});\n\t\t\tawait this._emitSessionCompactFailed({\n\t\t\t\treason,\n\t\t\t\terrorMessage: formattedErrorMessage,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\tfromExtension: false,\n\t\t\t});\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tif (this._autoCompactionAbortController === autoCompactionController) {\n\t\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t\t}\n\t\t\tfinishCompactionWork();\n\t\t}\n\t}\n\n\t/**\n\t * Toggle auto-compaction setting.\n\t */\n\tsetAutoCompactionEnabled(enabled: boolean): void {\n\t\tthis.settingsManager.setCompactionEnabled(enabled);\n\t\tthis._emitSessionSettingsChanged();\n\t}\n\n\tprivate _emitSessionSettingsChanged(): void {\n\t\tthis._emit({\n\t\t\ttype: \"session_settings_changed\",\n\t\t\tsteeringMode: this.steeringMode,\n\t\t\tfollowUpMode: this.followUpMode,\n\t\t\tautoCompactionEnabled: this.autoCompactionEnabled,\n\t\t});\n\t}\n\n\t/** Whether auto-compaction is enabled */\n\tget autoCompactionEnabled(): boolean {\n\t\treturn this.settingsManager.getCompactionEnabled();\n\t}\n\n\tasync bindExtensions(bindings: ExtensionBindings): Promise<void> {\n\t\tconst finishBindingWork = this._sessionWorkBarrier.begin();\n\t\tconst bindingPromptReadiness = new Set<Promise<void>>();\n\t\tthis._extensionBindingPromptReadiness = bindingPromptReadiness;\n\t\ttry {\n\t\t\tif (bindings.uiContext !== undefined) {\n\t\t\t\tthis._extensionUIContext = bindings.uiContext;\n\t\t\t}\n\t\t\tif (bindings.mode !== undefined) {\n\t\t\t\tthis._extensionMode = bindings.mode;\n\t\t\t}\n\t\t\tif (bindings.commandContextActions !== undefined) {\n\t\t\t\tthis._extensionCommandContextActions = bindings.commandContextActions;\n\t\t\t}\n\t\t\tif (bindings.abortHandler !== undefined) {\n\t\t\t\tthis._extensionAbortHandler = bindings.abortHandler;\n\t\t\t}\n\t\t\tif (bindings.shutdownHandler !== undefined) {\n\t\t\t\tthis._extensionShutdownHandler = bindings.shutdownHandler;\n\t\t\t}\n\t\t\tif (bindings.onError !== undefined) {\n\t\t\t\tthis._extensionErrorListener = bindings.onError;\n\t\t\t}\n\n\t\t\tthis._applyExtensionBindings(this._extensionRunner);\n\t\t\tthis.syncPromptCacheSafeWaitEnv();\n\t\t\tawait this._extensionRunner.emit(this._sessionStartEvent);\n\t\t\tthis._enforceConfiguredDefaultTools();\n\t\t\tawait this.extendResourcesFromExtensions(this._sessionStartEvent.reason === \"reload\" ? \"reload\" : \"startup\");\n\t\t} finally {\n\t\t\tif (this._extensionBindingPromptReadiness === bindingPromptReadiness) {\n\t\t\t\tthis._extensionBindingPromptReadiness = undefined;\n\t\t\t}\n\t\t\tfinishBindingWork();\n\t\t}\n\t\tawait Promise.all(bindingPromptReadiness);\n\t}\n\n\tprivate async extendResourcesFromExtensions(reason: \"startup\" | \"reload\"): Promise<void> {\n\t\tif (!this._extensionRunner.hasHandlers(\"resources_discover\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { skillPaths, promptPaths, themePaths, hookPaths } = await this._extensionRunner.emitResourcesDiscover(\n\t\t\tthis._cwd,\n\t\t\treason,\n\t\t);\n\n\t\tif (skillPaths.length === 0 && promptPaths.length === 0 && themePaths.length === 0 && hookPaths.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst extensionPaths: ResourceExtensionPaths = {\n\t\t\tskillPaths: this.buildExtensionResourcePaths(skillPaths),\n\t\t\tpromptPaths: this.buildExtensionResourcePaths(promptPaths),\n\t\t\tthemePaths: this.buildExtensionResourcePaths(themePaths),\n\t\t\thookPaths: this.buildExtensionResourcePaths(hookPaths),\n\t\t};\n\n\t\tthis._resourceLoader.extendResources(extensionPaths);\n\t\tif (skillPaths.length > 0 || promptPaths.length > 0 || themePaths.length > 0) {\n\t\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());\n\t\t\tthis.agent.state.systemPrompt = this._baseSystemPrompt;\n\t\t}\n\t}\n\n\tprivate buildExtensionResourcePaths(entries: Array<{ path: string; extensionPath: string }>): Array<{\n\t\tpath: string;\n\t\tmetadata: {\n\t\t\tsource: string;\n\t\t\tscope: \"temporary\";\n\t\t\torigin: \"top-level\";\n\t\t\tbaseDir?: string;\n\t\t};\n\t}> {\n\t\treturn entries.map((entry) => {\n\t\t\tconst source = this.getExtensionSourceLabel(entry.extensionPath);\n\t\t\tconst baseDir = entry.extensionPath.startsWith(\"<\") ? undefined : dirname(entry.extensionPath);\n\t\t\treturn {\n\t\t\t\tpath: entry.path,\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource,\n\t\t\t\t\tscope: \"temporary\",\n\t\t\t\t\torigin: \"top-level\",\n\t\t\t\t\tbaseDir,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate getExtensionSourceLabel(extensionPath: string): string {\n\t\tif (extensionPath.startsWith(\"<\")) {\n\t\t\treturn `extension:${extensionPath.replace(/[<>]/g, \"\")}`;\n\t\t}\n\t\tconst base = basename(extensionPath);\n\t\tconst name = base.replace(/\\.(ts|js)$/, \"\");\n\t\treturn `extension:${name}`;\n\t}\n\n\tprivate _applyExtensionBindings(runner: ExtensionRunner): void {\n\t\trunner.setUIContext(this._extensionUIContext, this._extensionMode);\n\t\trunner.setToolHookLifecycleObserver((event) => {\n\t\t\tthis._emit(event);\n\t\t});\n\t\trunner.bindCommandContext(this._extensionCommandContextActions);\n\n\t\tthis._extensionErrorUnsubscriber?.();\n\t\tthis._extensionErrorUnsubscriber = this._extensionErrorListener\n\t\t\t? runner.onError(this._extensionErrorListener)\n\t\t\t: undefined;\n\t}\n\n\tprivate _refreshCurrentModelFromRegistry(): void {\n\t\tthis._delegatedCompactionKey = undefined;\n\t\tconst currentModel = this.model;\n\t\tif (!currentModel) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst refreshedModel = this._modelRuntime.getModel(currentModel.provider, currentModel.id);\n\t\tif (!refreshedModel || refreshedModel === currentModel) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.agent.state.model = refreshedModel;\n\t}\n\n\tprivate _bindExtensionCore(runner: ExtensionRunner): void {\n\t\t// Activity extensions publish about work outliving a turn (background\n\t\t// terminal jobs, monitors, holds) feeds the session-busy contract. Re-bound\n\t\t// per runner; counts survive the swap so a reload cannot make live work\n\t\t// look idle to an occupancy sweep.\n\t\tthis._unsubscribeWakeSources?.();\n\t\tthis._unsubscribeWakeSources = runner.onBusEvent(WAKE_SOURCE_STATE_EVENT, (data) =>\n\t\t\tthis._wakeSources.observe(data),\n\t\t);\n\t\tconst getCommands = (): SlashCommandInfo[] => {\n\t\t\tconst extensionCommands: SlashCommandInfo[] = runner.getRegisteredCommands().map((command) => ({\n\t\t\t\tname: command.invocationName,\n\t\t\t\tdescription: command.description,\n\t\t\t\tsource: \"extension\",\n\t\t\t\tsourceInfo: command.sourceInfo,\n\t\t\t}));\n\n\t\t\tconst templates: SlashCommandInfo[] = this.promptTemplates.map((template) => ({\n\t\t\t\tname: template.name,\n\t\t\t\tdescription: template.description,\n\t\t\t\tsource: \"prompt\",\n\t\t\t\tsourceInfo: template.sourceInfo,\n\t\t\t}));\n\n\t\t\tconst skills: SlashCommandInfo[] = this._resourceLoader.getSkills().skills.map((skill) => ({\n\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\tdescription: skill.description,\n\t\t\t\tsource: \"skill\",\n\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t}));\n\n\t\t\treturn [...extensionCommands, ...templates, ...skills];\n\t\t};\n\n\t\trunner.bindCore(\n\t\t\t{\n\t\t\t\tsendMessage: (message, options) => {\n\t\t\t\t\tconst reportError = (err: unknown) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: RUNTIME_EXTENSION_PATH,\n\t\t\t\t\t\t\tevent: \"send_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t\tif (options?.triggerTurn === true) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis._agentSettledDelivery.deferTriggerTurn((claim) => {\n\t\t\t\t\t\t\t\tthis.sendCustomMessage(message, options, claim).catch(reportError);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst send = () => this.sendCustomMessage(message, options).catch(reportError);\n\t\t\t\t\tif (this._agentSettledDelivery.defer(send)) return;\n\t\t\t\t\tsend();\n\t\t\t\t},\n\t\t\t\tsendUserMessage: (content, options) => {\n\t\t\t\t\tconst reportError = (err: unknown) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: RUNTIME_EXTENSION_PATH,\n\t\t\t\t\t\t\tevent: \"send_user_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t\t// sendUserMessage always triggers a turn; register a settlement-deferred\n\t\t\t\t\t// turn claim so agent_idle is not emitted before its deferred agent_start.\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis._agentSettledDelivery.deferTriggerTurn((claim) => {\n\t\t\t\t\t\t\tthis.sendUserMessage(content, options, claim).catch(reportError);\n\t\t\t\t\t\t})\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.sendUserMessage(content, options).catch(reportError);\n\t\t\t\t},\n\t\t\t\tappendEntry: (customType, data) => {\n\t\t\t\t\tconst entryId = this.sessionManager.appendCustomEntry(customType, data);\n\t\t\t\t\tconst entry = this.sessionManager.getEntry(entryId);\n\t\t\t\t\tif (entry) {\n\t\t\t\t\t\tthis._emit({ type: \"entry_appended\", entry });\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetSessionName: (name) => {\n\t\t\t\t\tthis.setSessionName(name);\n\t\t\t\t},\n\t\t\t\tgetSessionName: () => {\n\t\t\t\t\treturn this.sessionManager.getSessionName();\n\t\t\t\t},\n\t\t\t\tsetLabel: (entryId, label) => {\n\t\t\t\t\tthis.sessionManager.appendLabelChange(entryId, label);\n\t\t\t\t},\n\t\t\t\texecuteTool: (toolName, params, options) => this.executeTool(toolName, params, options),\n\t\t\t\tgetActiveTools: () => this.getActiveToolNames(),\n\t\t\t\tgetAllTools: () => this.getAllTools(),\n\t\t\t\tsetActiveTools: (toolNames) => this.setActiveToolsByName(toolNames),\n\t\t\t\trefreshTools: () => this._refreshToolRegistry(),\n\t\t\t\tregisterRemovedToolHint: (name, hint) => {\n\t\t\t\t\tthis.agent.removedToolHints[name] = hint;\n\t\t\t\t},\n\t\t\t\tregisterLazyToolActivator: (activator) => {\n\t\t\t\t\tthis._lazyToolActivators.push(activator);\n\t\t\t\t},\n\t\t\t\tgetCommands,\n\t\t\t\tsetModel: async (model) => {\n\t\t\t\t\tif (!this._modelRuntime.hasConfiguredAuth(model.provider)) return false;\n\t\t\t\t\tawait this.setModel(model);\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgetThinkingLevel: () => this.thinkingLevel,\n\t\t\t\tsetThinkingLevel: (level) => this.setThinkingLevel(level),\n\t\t\t\tsetSessionModel: async (model) => {\n\t\t\t\t\tif (!this._modelRuntime.hasConfiguredAuth(model.provider)) return false;\n\t\t\t\t\tawait this.setSessionModel(model);\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tsetSessionThinkingLevel: (level) => this.setSessionThinkingLevel(level),\n\t\t\t\tsetSessionFastMode: (enabled) => this.setSessionFastMode(enabled),\n\t\t\t},\n\t\t\t{\n\t\t\t\tgetModel: () => this.model,\n\t\t\t\tgetServiceTier: () => this.serviceTier,\n\t\t\t\tgetScopedModels: () => this._scopedModels,\n\t\t\t\tisIdle: () => this.isIdle,\n\t\t\t\tgetAgentDir: () => this._agentDir,\n\t\t\t\tisProjectTrusted: () => this.settingsManager.isProjectTrusted(),\n\t\t\t\tgetSignal: () => this._extensionEventSignal ?? this.agent.signal,\n\t\t\t\tabort: (source = \"user\") => {\n\t\t\t\t\tif (source === \"system\") return void this._abortActiveAgentAndRetry(\"system\");\n\t\t\t\t\tif (this._extensionAbortHandler) return this._extensionAbortHandler();\n\t\t\t\t\tvoid this.abort();\n\t\t\t\t},\n\t\t\t\thasPendingMessages: () => this.pendingMessageCount > 0,\n\t\t\t\tisCompacting: () => this.isCompacting,\n\t\t\t\tcheckReloadVeto: () => this.checkReloadVeto(),\n\t\t\t\tshutdown: () => {\n\t\t\t\t\tthis._extensionShutdownHandler?.();\n\t\t\t\t},\n\t\t\t\tgetContextUsage: () => this.getContextUsage(),\n\t\t\t\tgetCompactionSettings: () => this.settingsManager.getCompactionSettings(),\n\t\t\t\tgetPromptCacheSafeWaitSeconds: () => this.resolvePromptCacheSafeWaitSeconds(),\n\t\t\t\tgetPromptCacheGoalBackstopMaxSeconds: () => this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),\n\t\t\t\tgetPromptCacheKeepAliveSettings: () => this.settingsManager.getPromptCacheKeepAliveSettings(),\n\t\t\t\tgetLookAtSettings: () => {\n\t\t\t\t\tconst global = this.settingsManager.getGlobalSettings().lookAt;\n\t\t\t\t\tconst project = this.settingsManager.getProjectSettings().lookAt;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tenabled: project?.enabled ?? global?.enabled ?? true,\n\t\t\t\t\t\tmodels: project?.models ?? global?.models,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tgetImageSettings: () => ({\n\t\t\t\t\tautoResize: this.settingsManager.getImageAutoResize(),\n\t\t\t\t\tblockImages: this.settingsManager.getBlockImages(),\n\t\t\t\t}),\n\t\t\t\tsessionSettings: {\n\t\t\t\t\tgetRetryFallbackSettings: () => this.settingsManager.getRetryFallbackSettings(),\n\t\t\t\t\tsetFallbackChain: async (key, entries) => {\n\t\t\t\t\t\tthis.settingsManager.setFallbackChain(key, [...entries]);\n\t\t\t\t\t\tawait this.settingsManager.flush();\n\t\t\t\t\t},\n\t\t\t\t\tremoveFallbackChain: async (key) => {\n\t\t\t\t\t\tthis.settingsManager.removeFallbackChain(key);\n\t\t\t\t\t\tawait this.settingsManager.flush();\n\t\t\t\t\t},\n\t\t\t\t\tsetModelFallbackEnabled: async (enabled) => {\n\t\t\t\t\t\tthis.settingsManager.setModelFallbackEnabled(enabled);\n\t\t\t\t\t\tawait this.settingsManager.flush();\n\t\t\t\t\t},\n\t\t\t\t\tsetFallbackRevertPolicy: async (policy) => {\n\t\t\t\t\t\tthis.settingsManager.setFallbackRevertPolicy(policy);\n\t\t\t\t\t\tawait this.settingsManager.flush();\n\t\t\t\t\t},\n\t\t\t\t\treload: () => this.settingsManager.reload(),\n\t\t\t\t\tgetFallbackStatus: () => {\n\t\t\t\t\t\tconst active = this._retryFallback.activeState;\n\t\t\t\t\t\tif (!active) return undefined;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\t\tcurrentModel: this.model ? `${this.model.provider}/${this.model.id}` : undefined,\n\t\t\t\t\t\t\toriginalSelector: active.originalSelector,\n\t\t\t\t\t\t\tpinned: active.pinned,\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcompact: (options) => {\n\t\t\t\t\tconst admission = this._claimPendingCompactionAdmission();\n\t\t\t\t\tconst controller = admission.controller;\n\t\t\t\t\tconst requestId = randomUUID();\n\t\t\t\t\tvoid (async () => {\n\t\t\t\t\t\tlet outcome: \"completed\" | \"failed\" | \"aborted\" = \"failed\";\n\t\t\t\t\t\tlet compactionCompleted = false;\n\t\t\t\t\t\tlet disconnected = false;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this._abortActiveAgentAndRetry(\"system\");\n\t\t\t\t\t\t\tthis._disconnectFromAgent();\n\t\t\t\t\t\t\tdisconnected = true;\n\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\ttype: \"compaction_start\",\n\t\t\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\towner: \"compaction\",\n\t\t\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (execution.accepted) {\n\t\t\t\t\t\t\t\toutcome = \"completed\";\n\t\t\t\t\t\t\t\tcompactionCompleted = true;\n\t\t\t\t\t\t\t\toptions?.onComplete?.(execution.result);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutcome = \"failed\";\n\t\t\t\t\t\t\t\toptions?.onError?.(new CompactionRejectedError(execution.rejectionCause));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\toutcome = isCompactionExecutionAborted(error) ? \"aborted\" : \"failed\";\n\t\t\t\t\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\t\t\taborted,\n\t\t\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\t\terrorMessage: aborted ? undefined : `Compaction failed: ${message}`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\toptions?.onError?.(err);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tthis._compactionAbortController === controller &&\n\t\t\t\t\t\t\t\tthis._compactionLifecycle.state.status !== \"running\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._releasePendingCompactionAdmission(admission, outcome);\n\t\t\t\t\t\t\tif (disconnected && !this.isCompacting) this._reconnectToAgent();\n\t\t\t\t\t\t\t// A throwing onComplete consumer overwrites outcome in the catch\n\t\t\t\t\t\t\t// block, so recovery keys off whether compaction itself succeeded.\n\t\t\t\t\t\t\tif (compactionCompleted) this._resumeQueuedMessagesAfterCompaction();\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t\tbeginCompaction: (options) => this._beginExtensionCompactionFeedback(options.reason),\n\t\t\t\tupdateCompaction: (options) => this._updateExtensionCompactionFeedback(options),\n\t\t\t\tendCompaction: (options) => this._endExtensionCompactionFeedback(options),\n\t\t\t\tgetMessageRevision: () => this.getMessageRevision(),\n\t\t\t\tapplyCompaction: (precomputed, options) => this.applyCompaction(precomputed, options),\n\t\t\t\tgetSystemPrompt: () => this.systemPrompt,\n\t\t\t\tgetLoadedHookSources: () =>\n\t\t\t\t\tthis._resourceLoader.getLoadedHookSources?.() ?? {\n\t\t\t\t\t\tagentDir: this._cwd,\n\t\t\t\t\t\tcwd: this._cwd,\n\t\t\t\t\t\tglobalHookSourcePaths: [],\n\t\t\t\t\t\tglobalHooksPath: `${this._cwd}/hooks.json`,\n\t\t\t\t\t\tpreSessionHookSourcePaths: [],\n\t\t\t\t\t\tprojectHookSourcePaths: [],\n\t\t\t\t\t\tprojectHooksPath: `${this._cwd}/.senpi/hooks.json`,\n\t\t\t\t\t\truntimeHookSourcePaths: [],\n\t\t\t\t\t},\n\t\t\t\tgetSystemPromptOptions: () => this._baseSystemPromptOptions,\n\t\t\t},\n\t\t\t{\n\t\t\t\tregisterProvider: (name, config) => {\n\t\t\t\t\tthis._modelRuntime.registerProvider(name, config);\n\t\t\t\t\tthis._refreshCurrentModelFromRegistry();\n\t\t\t\t},\n\t\t\t\tregisterNativeProvider: (provider) => {\n\t\t\t\t\tthis._modelRuntime.registerNativeProvider(provider);\n\t\t\t\t\tthis._refreshCurrentModelFromRegistry();\n\t\t\t\t},\n\t\t\t\tunregisterProvider: (name) => {\n\t\t\t\t\tthis._modelRuntime.unregisterProvider(name);\n\t\t\t\t\tthis._refreshCurrentModelFromRegistry();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t}\n\n\t/** Fallback-chain configuration warnings calculated when this session started. */\n\tget fallbackValidationWarnings(): readonly string[] {\n\t\treturn this._fallbackValidationWarnings;\n\t}\n\n\tprivate _isBuiltinExtensionPath(path: string): boolean {\n\t\treturn path.startsWith(\"<builtin:\") || /[\\\\/]senpi-codemode[\\\\/]/u.test(path);\n\t}\n\n\tprivate _enforceConfiguredDefaultTools(): void {\n\t\tconst defaultToolNames = this._defaultToolNames;\n\t\tif (defaultToolNames === undefined) return;\n\t\tthis.setActiveToolsByName(\n\t\t\tthis.getActiveToolNames().filter((name) => {\n\t\t\t\tif (defaultToolNames.has(name)) return true;\n\t\t\t\tconst entry = this._toolDefinitions.get(name);\n\t\t\t\treturn (\n\t\t\t\t\tentry !== undefined &&\n\t\t\t\t\t!this._isBuiltinExtensionPath(entry.sourceInfo.path) &&\n\t\t\t\t\tentry.sourceInfo.source !== \"builtin\"\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate _refreshToolRegistry(options?: {\n\t\tactiveToolNames?: string[];\n\t\tincludeAllExtensionTools?: boolean;\n\t\tpreviousActiveToolRegistrationIds?: ReadonlyMap<string, string>;\n\t}): void {\n\t\tconst previousRegistryNames = new Set(this._toolRegistry.keys());\n\t\tconst previousActiveToolNames = this.getActiveToolNames();\n\t\tconst allowedToolNames = this._allowedToolNames;\n\t\tconst excludedToolNames = this._excludedToolNames;\n\t\tconst isAllowedTool = (name: string): boolean =>\n\t\t\t(!allowedToolNames || allowedToolNames.has(name)) && !excludedToolNames?.has(name);\n\n\t\tconst registeredTools = this._extensionRunner.getAllRegisteredTools();\n\t\tconst defaultToolNames = this._defaultToolNames;\n\t\tconst isConfiguredBuiltinTool = (tool: (typeof registeredTools)[number]): boolean =>\n\t\t\t(tool.sourceInfo.source !== \"builtin\" && !this._isBuiltinExtensionPath(tool.sourceInfo.path)) ||\n\t\t\tdefaultToolNames === undefined ||\n\t\t\tdefaultToolNames.has(tool.definition.name);\n\t\tconst allCustomTools = [\n\t\t\t...registeredTools.filter(isConfiguredBuiltinTool),\n\t\t\t...this._customTools.map((definition) => ({\n\t\t\t\tdefinition,\n\t\t\t\tsourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, {\n\t\t\t\t\tsource: \"sdk\",\n\t\t\t\t}),\n\t\t\t})),\n\t\t].filter((tool) => isAllowedTool(tool.definition.name));\n\t\t// Withheld tools stay in _baseToolDefinitions (and therefore in _toolRegistry, which\n\t\t// getRegisteredTool serves to the Cursor exec bridge) but are dropped from the model-facing\n\t\t// definitions so they never reach the prompt. See temporarilyDisabledToolNames.\n\t\tconst definitionRegistry = new Map<string, ToolDefinitionEntry>(\n\t\t\tArray.from(this._baseToolDefinitions.entries())\n\t\t\t\t.filter(([name]) => isAllowedTool(name) && !temporarilyDisabledToolNames.has(name))\n\t\t\t\t.map(([name, definition]) => [\n\t\t\t\t\tname,\n\t\t\t\t\t{\n\t\t\t\t\t\tdefinition,\n\t\t\t\t\t\tsourceInfo: createSyntheticSourceInfo(`<builtin:${name}>`, {\n\t\t\t\t\t\t\tsource: \"builtin\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t);\n\t\tfor (const tool of allCustomTools) {\n\t\t\tdefinitionRegistry.set(tool.definition.name, {\n\t\t\t\tdefinition: tool.definition,\n\t\t\t\tsourceInfo: tool.sourceInfo,\n\t\t\t});\n\t\t}\n\t\tthis._toolDefinitions = definitionRegistry;\n\t\tthis._toolPromptSnippets = new Map(\n\t\t\tArray.from(definitionRegistry.values())\n\t\t\t\t.map(({ definition }) => {\n\t\t\t\t\tconst snippet = this._normalizePromptSnippet(definition.promptSnippet);\n\t\t\t\t\treturn snippet ? ([definition.name, snippet] as const) : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((entry): entry is readonly [string, string] => entry !== undefined),\n\t\t);\n\t\tthis._toolPromptGuidelines = new Map(\n\t\t\tArray.from(definitionRegistry.values())\n\t\t\t\t.map(({ definition }) => {\n\t\t\t\t\tconst guidelines = this._normalizePromptGuidelines(definition.promptGuidelines);\n\t\t\t\t\treturn guidelines.length > 0 ? ([definition.name, guidelines] as const) : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((entry): entry is readonly [string, string[]] => entry !== undefined),\n\t\t);\n\t\tconst runner = this._extensionRunner;\n\t\tconst wrappedExtensionTools = wrapRegisteredTools(allCustomTools, runner);\n\t\tconst wrappedBuiltInTools = wrapRegisteredTools(\n\t\t\tArray.from(this._baseToolDefinitions.values())\n\t\t\t\t.filter((definition) => isAllowedTool(definition.name))\n\t\t\t\t.map((definition) => ({\n\t\t\t\t\tdefinition,\n\t\t\t\t\tsourceInfo: createSyntheticSourceInfo(`<builtin:${definition.name}>`, { source: \"builtin\" }),\n\t\t\t\t})),\n\t\t\trunner,\n\t\t);\n\n\t\tconst toolRegistry = new Map(wrappedBuiltInTools.map((tool) => [tool.name, tool]));\n\t\tfor (const tool of wrappedExtensionTools as AgentTool[]) {\n\t\t\ttoolRegistry.set(tool.name, tool);\n\t\t}\n\t\tthis._toolRegistry = toolRegistry;\n\t\tthis._publishEvalOnlyToolHints();\n\t\tconst isDirectlyExposed = (name: string): boolean => {\n\t\t\tconst entry = this._toolDefinitions.get(name);\n\t\t\treturn entry !== undefined && normalizeToolExposure(entry.definition).exposure === \"direct\";\n\t\t};\n\n\t\t// A withheld tool is dropped from the DEFAULT selection only. An explicit activeToolNames\n\t\t// request names the tool deliberately, and callers that do so (tests, SDK embedders,\n\t\t// filesystem-policy wiring) still expect it to activate.\n\t\tconst hasExplicitActiveToolNames = options?.activeToolNames !== undefined;\n\t\tconst nextActiveToolNames = (\n\t\t\toptions?.activeToolNames\n\t\t\t\t? [...options.activeToolNames]\n\t\t\t\t: [...(this._requestedActiveToolNames ?? previousActiveToolNames)]\n\t\t).filter((name) => {\n\t\t\tif (!isAllowedTool(name)) return false;\n\t\t\tif (!hasExplicitActiveToolNames && temporarilyDisabledToolNames.has(name)) return false;\n\t\t\tconst previousRegistrationIds = options?.previousActiveToolRegistrationIds;\n\t\t\tif (!previousRegistrationIds) return true;\n\t\t\tconst current = this._toolDefinitions.get(name);\n\t\t\treturn (\n\t\t\t\tcurrent !== undefined &&\n\t\t\t\tpreviousRegistrationIds.get(name) === deriveExtensionRegistrationId(current.sourceInfo, name)\n\t\t\t);\n\t\t});\n\n\t\tif (allowedToolNames) {\n\t\t\tfor (const toolName of this._toolRegistry.keys()) {\n\t\t\t\tif (allowedToolNames.has(toolName)) {\n\t\t\t\t\tnextActiveToolNames.push(toolName);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (options?.includeAllExtensionTools) {\n\t\t\tfor (const tool of wrappedExtensionTools) {\n\t\t\t\tif (isDirectlyExposed(tool.name)) nextActiveToolNames.push(tool.name);\n\t\t\t}\n\t\t} else if (!options?.activeToolNames) {\n\t\t\tfor (const toolName of this._toolRegistry.keys()) {\n\t\t\t\tif (!previousRegistryNames.has(toolName) && isDirectlyExposed(toolName)) {\n\t\t\t\t\tnextActiveToolNames.push(toolName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.setActiveToolsByName([...new Set(nextActiveToolNames)]);\n\t}\n\n\tprivate _buildRuntime(options: {\n\t\tactiveToolNames?: string[];\n\t\tflagValues?: Map<string, boolean | string>;\n\t\tincludeAllExtensionTools?: boolean;\n\t\tpreviousActiveToolRegistrationIds?: ReadonlyMap<string, string>;\n\t}): void {\n\t\tthis._delegatedCompactionKey = undefined;\n\t\tconst autoResizeImages = this.settingsManager.getImageAutoResize();\n\t\tconst shellCommandPrefix = this.settingsManager.getShellCommandPrefix();\n\t\tconst shellPath = this.settingsManager.getShellPath();\n\t\tconst extensionsResult = this._resourceLoader.getExtensions();\n\t\tconst filesystemPolicy = composeFilesystemPolicies(\n\t\t\textensionsResult.extensions.flatMap((extension) => extension.filesystemPolicies ?? []),\n\t\t);\n\t\tconst baseToolDefinitions = this._baseToolsOverride\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(this._baseToolsOverride).map(([name, tool]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcreateToolDefinitionFromAgentTool(tool),\n\t\t\t\t\t]),\n\t\t\t\t)\n\t\t\t: createAllToolDefinitions(this._cwd, {\n\t\t\t\t\tread: { autoResizeImages, filesystemPolicy },\n\t\t\t\t\tbash: { commandPrefix: shellCommandPrefix, shellPath },\n\t\t\t\t\twrite: { filesystemPolicy },\n\t\t\t\t\tedit: { filesystemPolicy },\n\t\t\t\t\tgrep: { filesystemPolicy },\n\t\t\t\t\tfind: { filesystemPolicy },\n\t\t\t\t\tls: { filesystemPolicy },\n\t\t\t\t});\n\n\t\tthis._baseToolDefinitions = new Map(\n\t\t\tObject.entries(baseToolDefinitions).map(([name, tool]) => [name, tool as ToolDefinition]),\n\t\t);\n\t\tif (options.flagValues) {\n\t\t\tfor (const [name, value] of options.flagValues) {\n\t\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\t}\n\t\t}\n\n\t\tthis._extensionRunner = new ExtensionRunner(\n\t\t\textensionsResult.extensions,\n\t\t\textensionsResult.runtime,\n\t\t\tthis._cwd,\n\t\t\tthis.sessionManager,\n\t\t\tthis._modelRegistry,\n\t\t\textensionsResult.eventBus,\n\t\t);\n\t\tif (this._extensionRunnerRef) {\n\t\t\tthis._extensionRunnerRef.current = this._extensionRunner;\n\t\t}\n\t\tthis._bindExtensionCore(this._extensionRunner);\n\t\tthis._applyExtensionBindings(this._extensionRunner);\n\n\t\tconst defaultActiveToolNames = this._baseToolsOverride\n\t\t\t? Object.keys(this._baseToolsOverride)\n\t\t\t: [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst baseActiveToolNames = options.activeToolNames ?? defaultActiveToolNames;\n\t\tthis._refreshToolRegistry({\n\t\t\tactiveToolNames: baseActiveToolNames,\n\t\t\tincludeAllExtensionTools: options.includeAllExtensionTools,\n\t\t\tpreviousActiveToolRegistrationIds: options.previousActiveToolRegistrationIds,\n\t\t});\n\t}\n\n\tasync reload(options?: { beforeSessionStart?: () => void | Promise<void> }): Promise<{\n\t\tcancelled: boolean;\n\t\treason?: string;\n\t}> {\n\t\tconst veto = await this.checkReloadVeto();\n\t\tif (veto.cancelled) {\n\t\t\treturn veto;\n\t\t}\n\t\tresetTimings(\"reload\");\n\t\tconst oldExtensionRunner = this._extensionRunner;\n\t\tconst oldExtensionIdentities = oldExtensionRunner.getExtensionIdentities();\n\t\tconst previousFlagValues = oldExtensionRunner.getFlagValues();\n\t\tconst previousActiveToolRegistrationIds = new Map<string, string>();\n\t\t// Cover withheld eval-only tools too: the rebuild drops any seeded name missing from this\n\t\t// map, which would strand shell tools when the policy disarms during this reload.\n\t\tfor (const name of this._requestedActiveToolNames ?? this.getActiveToolNames()) {\n\t\t\tconst entry = this._toolDefinitions.get(name);\n\t\t\tif (entry) previousActiveToolRegistrationIds.set(name, deriveExtensionRegistrationId(entry.sourceInfo, name));\n\t\t}\n\t\tawait emitSessionShutdownEvent(oldExtensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason: \"reload\",\n\t\t});\n\t\ttime(\"shutdown\", \"reload\");\n\t\tawait this.settingsManager.reload();\n\t\tthis._delegatedCompactionKey = undefined;\n\t\t// Capture the unfiltered request BEFORE the rebuild reassigns it, so a policy that\n\t\t// disarms during this reload can still restore its withheld shell tools.\n\t\tconst requestedActiveToolNamesBeforeRebuild = [...(this._requestedActiveToolNames ?? this.getActiveToolNames())];\n\t\t// A flag change must take effect on reload, matching documented settings hot-reload behavior.\n\t\tthis._evalOnlyToolNames = this._resolveEvalOnlyToolNames();\n\t\tthis.syncQueueModesFromSettings();\n\t\tresetApiProviders();\n\t\ttime(\"settings\", \"reload\");\n\t\tawait this._modelRuntime.reloadConfig();\n\t\t// Resolving both scopes from the completed refresh avoids two extra availability\n\t\t// scans, but only a snapshot from a SUCCESSFUL refresh may be trusted: refresh()\n\t\t// swallows availability errors, so a failed scan must fall back to the runtime and\n\t\t// keep the previous refresh-and-surface-the-error behavior.\n\t\tconst refreshedModels: AvailableModelsSource = this._modelRuntime.hasFreshAvailabilitySnapshot()\n\t\t\t? {\n\t\t\t\t\tgetAvailable: async () => this._modelRuntime.getAvailableSnapshot(),\n\t\t\t\t}\n\t\t\t: this._modelRuntime;\n\t\tthis.setScopedModels(\n\t\t\tawait resolveModelScope(\n\t\t\t\tgetModelNarrowingPatterns({\n\t\t\t\t\tlegacyEnabledPatterns: this.settingsManager.getEnabledModels(),\n\t\t\t\t}),\n\t\t\t\trefreshedModels,\n\t\t\t),\n\t\t);\n\t\tthis.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels() ?? [], refreshedModels));\n\t\ttime(\"models\", \"reload\");\n\t\tawait this._resourceLoader.reload({\n\t\t\tsettingsAlreadyReloadedFor: this.settingsManager,\n\t\t});\n\t\ttime(\"resources\", \"reload\");\n\t\ttry {\n\t\t\tthis._buildRuntime({\n\t\t\t\tactiveToolNames: requestedActiveToolNamesBeforeRebuild,\n\t\t\t\tflagValues: previousFlagValues,\n\t\t\t\tincludeAllExtensionTools: true,\n\t\t\t\tpreviousActiveToolRegistrationIds,\n\t\t\t});\n\t\t} finally {\n\t\t\t// An extension removed by this reload must be told even if the rebuild throws\n\t\t\t// (e.g. _refreshToolRegistry rejecting an extension's tool metadata): the new\n\t\t\t// runner is already installed without it, so nothing else would dispose it.\n\t\t\tconst newExtensionResolvedPaths = new Set(\n\t\t\t\tthis._extensionRunner.getExtensionIdentities().map((extension) => extension.resolvedPath),\n\t\t\t);\n\t\t\tconst removed = oldExtensionIdentities.filter(\n\t\t\t\t(extension) => !newExtensionResolvedPaths.has(extension.resolvedPath),\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tif (removed.length > 0) {\n\t\t\t\t\tawait oldExtensionRunner.emit({\n\t\t\t\t\t\ttype: \"session_extensions_removed\",\n\t\t\t\t\t\treason: \"reload\",\n\t\t\t\t\t\tremoved,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\toldExtensionRunner.invalidate(\"stale extension generation after reload\");\n\t\t\t}\n\t\t\ttime(\"runtime\", \"reload\");\n\t\t}\n\n\t\tconst hasBindings =\n\t\t\tthis._extensionUIContext ||\n\t\t\tthis._extensionCommandContextActions ||\n\t\t\tthis._extensionShutdownHandler ||\n\t\t\tthis._extensionErrorListener;\n\t\tif (hasBindings) {\n\t\t\tawait options?.beforeSessionStart?.();\n\t\t\tthis.syncPromptCacheSafeWaitEnv();\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"reload\",\n\t\t\t});\n\t\t\tawait this.extendResourcesFromExtensions(\"reload\");\n\t\t}\n\t\ttime(\"lifecycle\", \"reload\");\n\t\treturn { cancelled: false };\n\t}\n\n\t/**\n\t * Ask extensions whether a full session reload may proceed by emitting the\n\t * cancellable `session_before_reload` event. `reload()` always consults this\n\t * gate itself, so a cancelling extension prevents the teardown on every\n\t * reload path; interactive hosts may additionally pre-check it to warn\n\t * without starting their reload UI.\n\t */\n\tasync checkReloadVeto(): Promise<{ cancelled: boolean; reason?: string }> {\n\t\tif (!this._extensionRunner.hasHandlers(\"session_before_reload\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\t\tconst result = await this._extensionRunner.emit({\n\t\t\ttype: \"session_before_reload\",\n\t\t});\n\t\tif (result?.cancel !== true) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\t\treturn result.reason === undefined ? { cancelled: true } : { cancelled: true, reason: result.reason };\n\t}\n\n\t// =========================================================================\n\t// Auto-Retry\n\t// =========================================================================\n\n\t/**\n\t * Check if an error is retryable (overloaded, rate limit, server errors).\n\t * Context overflow errors are NOT retryable (handled by compaction instead).\n\t */\n\tprivate _isRetryableError(message: AssistantMessage): boolean {\n\t\t// Providers mark post-delta failures to prevent replaying visible text/tool calls.\n\t\tif (message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX)) return false;\n\n\t\t// Context overflow is handled by compaction, not retry.\n\t\tif (isContextOverflow(message, this.model?.contextWindow ?? 0)) return false;\n\n\t\tif (isClassifierRefusal(message)) return true;\n\t\tif (!message.errorMessage) return false;\n\n\t\tif (message.stopReason === \"aborted\") {\n\t\t\treturn isProviderTimeoutError(message);\n\t\t}\n\n\t\treturn isRetryableAssistantError(message);\n\t}\n\n\tprivate _isCursorPayloadOverflow(message: AssistantMessage): boolean {\n\t\treturn isCursorPayloadResourceExhausted(message, 0);\n\t}\n\n\tprivate _truncateAgentMessagesToLastUserTurn(): boolean {\n\t\tconst messages = this.agent?.state?.messages;\n\t\tif (!Array.isArray(messages) || messages.length === 0) return false;\n\t\tlet lastUser = -1;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tif (messages[i]?.role === \"user\") {\n\t\t\t\tlastUser = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (lastUser <= 0) return false;\n\t\tthis.agent.state.messages = messages.slice(lastUser);\n\t\treturn true;\n\t}\n\n\tprivate _isHardErrorFallbackEligible(message: AssistantMessage): boolean {\n\t\treturn (\n\t\t\t!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX) &&\n\t\t\tmessage.stopReason === \"error\" &&\n\t\t\t!isContextOverflow(message, this.model?.contextWindow ?? 0) &&\n\t\t\t!this._isCursorPayloadOverflow(message) &&\n\t\t\t!isCursorZeroTokenResourceExhausted(message) &&\n\t\t\t!isClassifierRefusal(message) &&\n\t\t\t!message.content.some((content) => content.type === \"toolCall\") &&\n\t\t\tthis._retryFallback.canTryFallback()\n\t\t);\n\t}\n\n\tprivate _getProviderRetryDelayMs(errorMessage: string): number | undefined {\n\t\tconst markerMs = parseRetryAfterMsMarker(errorMessage);\n\t\tif (markerMs !== undefined) return markerMs;\n\t\tconst hintMs = extract429RetryAfterMs({ bodyText: errorMessage });\n\t\treturn hintMs;\n\t}\n\n\t/**\n\t * Retry policy + callbacks shared by compaction and branch-summary summarization calls.\n\t * Uses the same `settings.retry` budget/backoff as agent-turn retries so a single transient\n\t * stream drop no longer fails the whole operation. `source` carries the context\n\t * the TUI needs to render the retry and recreate the underlying indicator.\n\t */\n\tprivate _summarizationRetryCallbacks(\n\t\tsource: { source: \"branchSummary\" } | { source: \"compaction\"; reason: CompactionReason },\n\t): RetryCallbacks {\n\t\treturn {\n\t\t\tonRetryScheduled: (attempt, maxAttempts, delayMs, errorMessage) => {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"summarization_retry_scheduled\",\n\t\t\t\t\tattempt,\n\t\t\t\t\tmaxAttempts,\n\t\t\t\t\tdelayMs,\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonRetryAttemptStart: () => {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"summarization_retry_attempt_start\",\n\t\t\t\t\t...source,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonRetryFinished: () => {\n\t\t\t\tthis._emit({ type: \"summarization_retry_finished\" });\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * A 429-class failure with no usable fallback candidate must not fail the\n\t * turn with zero attempts: a provider answering 429 is asking for a retry.\n\t * No-hint and tier2 waits degrade to same-model in-turn retries under the\n\t * normal retry budget (tier2 clamps the hinted wait to the in-turn cap);\n\t * only tier3 hour-plus waits stay terminal, with the requested wait named\n\t * in the final error. Returns the in-turn retry delay, or undefined after\n\t * emitting the terminal auto_retry_end.\n\t */\n\tprivate _degradeRateLimitedWithoutFallback(\n\t\ttier: HintTier,\n\t\thintMs: number | undefined,\n\t\tmessage: AssistantMessage,\n\t\terrorMessage: string,\n\t): number | undefined {\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\t// Budget checks use the resolved profile (same value as settings.maxRetries\n\t\t// for providers without a declared profile).\n\t\tconst turnMaxRetries = this._resolveRetryProfile().turn.maxRetries;\n\t\tconst hintSettings = this.settingsManager.getHintPolicySettings();\n\t\tconst finishTurn = (attempt: number, finalError: string | undefined) => {\n\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\tif (exhaustedChainKey) {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\tsuccess: false,\n\t\t\t\tattempt,\n\t\t\t\tfinalError,\n\t\t\t});\n\t\t\tthis._retryAttempt = 0;\n\t\t\tthis._resetHintTierState();\n\t\t\tthis._resolveRetry();\n\t\t};\n\t\tconst degraded = degradeWithoutFallback(\n\t\t\ttier,\n\t\t\thintMs,\n\t\t\tthis._retryAttempt + 1,\n\t\t\tsettings.baseDelayMs,\n\t\t\thintSettings.hintedWaitCapMs,\n\t\t);\n\t\tif (degraded.kind === \"fail\") {\n\t\t\tconst waitSeconds = Math.ceil(degraded.hintMs / 1000);\n\t\t\tfinishTurn(\n\t\t\t\tthis._retryAttempt,\n\t\t\t\t`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage ?? \"\"}`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\tthis._retryAttempt++;\n\t\tif (this._retryAttempt > turnMaxRetries) {\n\t\t\tfinishTurn(this._retryAttempt - 1, message.errorMessage);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn degraded.delayMs;\n\t}\n\n\t/**\n\t * Handle retryable errors with exponential backoff.\n\t * @returns whether retry continuation started, was blocked by compaction, or was not handled\n\t */\n\tprivate async _handleRetryableError(\n\t\tmessage: AssistantMessage,\n\t\toptions: { hardErrorFallback?: boolean; sameModelRemint?: boolean } = {},\n\t): Promise<\"continued\" | \"blocked\" | \"not-handled\" | \"cancelled\"> {\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\tthis._resolveRetry();\n\t\t\treturn \"not-handled\";\n\t\t}\n\n\t\t// Resolve the effective retry profile for the current provider.\n\t\t// Profile-driven behaviour only diverges when a provider declares one;\n\t\t// the senpi-default profile preserves today's tier routing exactly.\n\t\tconst retryProfile = this._resolveRetryProfile();\n\n\t\t// Retry promise is created synchronously in _handleAgentEvent for agent_end.\n\t\t// Keep a defensive fallback here in case a future refactor bypasses that path.\n\t\tif (!this._retryPromise) {\n\t\t\tthis._retryPromise = new Promise((resolve) => {\n\t\t\t\tthis._retryResolve = resolve;\n\t\t\t});\n\t\t}\n\n\t\tconst errorMessage = message.errorMessage || \"Unknown error\";\n\t\tconst isRefusal = isClassifierRefusal(message);\n\t\tconst hardErrorFallback = options.hardErrorFallback === true;\n\t\tconst sameModelRemint = options.sameModelRemint === true;\n\t\tlet switchedFallback = false;\n\t\tlet is429TierRouted = false;\n\t\tlet hintTierDelayMs: number | undefined;\n\t\tif (sameModelRemint) {\n\t\t\tthis._retryAttempt++;\n\t\t\tif (this._retryAttempt > retryProfile.turn.maxRetries) {\n\t\t\t\tif (this._retryAttempt > 1) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t} else if (hardErrorFallback) {\n\t\t\t// A non-retryable provider failure must never replay on the same model.\n\t\t\t// Billing-class failures never recover on this account, so the fallback\n\t\t\t// switch pins as the session model instead of reverting after the cooldown.\n\t\t\tconst reason = isBillingErrorMessage(errorMessage) ? \"billing\" : \"hard-error\";\n\t\t\tswitchedFallback = await this._retryFallback.tryFallback(reason, {\n\t\t\t\terrorMessage,\n\t\t\t});\n\t\t\tif (!switchedFallback) {\n\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t\t// The fallback starts fresh; the failed model's transient attempts do not carry over.\n\t\t\tthis._retryAttempt = 1;\n\t\t} else if (isRefusal) {\n\t\t\t// Refusals are only retried through a new chain candidate. They never use\n\t\t\t// same-model retries or the transient over-budget fallback escape hatch.\n\t\t\tif (this._retryAttempt + 1 > retryProfile.turn.maxRetries) {\n\t\t\t\tif (this._retryAttempt > 0) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"refusal\", {});\n\t\t\tif (!switchedFallback) {\n\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (this._retryAttempt > 0) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t\tthis._retryAttempt++;\n\t\t} else {\n\t\t\t// A provider-stream stall is an ordinary transient failure: it consumes\n\t\t\t// the same bounded same-model budget (the resolved profile's turn\n\t\t\t// maxRetries) as every other retryable class and escalates to the fallback chain only when\n\t\t\t// that budget is exhausted. It is excluded from 429-class tier routing\n\t\t\t// because a stall carries no rate-limit markers or retry-after hint.\n\t\t\tconst stallError = isProviderStreamStallError(message);\n\t\t\t// 429-class detection: retryable AND message carries rate-limit markers.\n\t\t\t// Every same-model wait derived below is floored by the exponential schedule\n\t\t\t// inside the pure hint policy, so repeated tiny retry-after hints cannot pin\n\t\t\t// the cadence at a few milliseconds. Do not recompute that floor here.\n\t\t\tconst is429Class =\n\t\t\t\t!stallError &&\n\t\t\t\t/rate.?limit|(?:^429(?=\\s+\\{)|(?:\\bHTTP\\/1\\.[01]\\s+|\\bHTTP\\s+|\\bstatus(?:\\s+code)?\\s+|\\berror\\s+|\\bcode\\s+)429\\b)|too many requests|resource.?exhausted/i.test(\n\t\t\t\t\terrorMessage,\n\t\t\t\t);\n\t\t\t// Profile-driven routing: \"after-turn-budget\" (Kimi) keeps 429s on the\n\t\t\t// ordinary same-model budget; \"tiered\" (senpi default) uses hint tiers.\n\t\t\tif (is429Class && retryProfile.fallback.rateLimited === \"after-turn-budget\") {\n\t\t\t\t// Kimi profile: 429s consume the same-model budget like any transient.\n\t\t\t\t// Mark tier-routed so the generic non-429 path below does not double-count.\n\t\t\t\tis429TierRouted = true;\n\t\t\t\tthis._retryAttempt++;\n\t\t\t\tif (this._retryAttempt > retryProfile.turn.maxRetries) {\n\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\tretryAfterMs: this._getProviderRetryDelayMs(errorMessage),\n\t\t\t\t\t});\n\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t\t\treturn \"not-handled\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (is429Class) {\n\t\t\t\tconst hintMs = this._getProviderRetryDelayMs(errorMessage);\n\t\t\t\tconst hintSettings = this.settingsManager.getHintPolicySettings();\n\t\t\t\tconst tier = classifyRateLimitedWait(hintMs, hintSettings);\n\t\t\t\tis429TierRouted = true;\n\t\t\t\tif (tier === \"no-hint-fast-fallback\") {\n\t\t\t\t\t// Fall back immediately when a candidate exists; otherwise degrade\n\t\t\t\t\t// to same-model in-turn retries instead of failing the turn.\n\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", { errorMessage });\n\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst degradedDelayMs = this._degradeRateLimitedWithoutFallback(tier, hintMs, message, errorMessage);\n\t\t\t\t\t\tif (degradedDelayMs === undefined) return \"not-handled\";\n\t\t\t\t\t\thintTierDelayMs = degradedDelayMs;\n\t\t\t\t\t}\n\t\t\t\t} else if (tier === \"tier1-in-turn\") {\n\t\t\t\t\tthis._retryAttempt++;\n\t\t\t\t\tif (this._retryAttempt > retryProfile.turn.maxRetries) {\n\t\t\t\t\t\t// Budget exhausted within tier1; fall back.\n\t\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\tretryAfterMs: this._getProviderRetryDelayMs(errorMessage),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t\t\t\treturn \"not-handled\";\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst inTurnResult = nextInTurnDelayMs(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tprobePhase: this._probePhase,\n\t\t\t\t\t\t\t\thintDeadlineMs: this._hintDeadlineMs,\n\t\t\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t\t\t\tcumulativeHintedWaitMs: this._cumulativeHintedWaitMs,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\thintMs,\n\t\t\t\t\t\t\tsettings.baseDelayMs,\n\t\t\t\t\t\t\thintSettings.hintedWaitCapMs,\n\t\t\t\t\t\t\tDate.now(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis._probePhase = inTurnResult.probePhase;\n\t\t\t\t\t\tthis._hintDeadlineMs = inTurnResult.hintDeadlineMs;\n\t\t\t\t\t\tthis._cumulativeHintedWaitMs = inTurnResult.cumulativeHintedWaitMs;\n\t\t\t\t\t\tif (inTurnResult.demoteToProbeBack) {\n\t\t\t\t\t\t\t// Cumulative hinted wait exceeded cap; demote to tier2 fallback path.\n\t\t\t\t\t\t\tconst remainingHintMs = Math.max(0, (this._hintDeadlineMs ?? Date.now()) - Date.now());\n\t\t\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\t\tretryAfterMs: remainingHintMs,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\t\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t\t\t\t\treturn \"not-handled\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thintTierDelayMs = inTurnResult.delayMs;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// tier2-fallback-probe-back or tier3-fallback-only: immediate fallback.\n\t\t\t\t\tconst remainingHintMs = hintMs ?? 0;\n\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\tretryAfterMs: remainingHintMs,\n\t\t\t\t\t});\n\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t\tif (tier === \"tier2-fallback-probe-back\") {\n\t\t\t\t\t\t\tconst selector = this._retryFallback.activeState?.originalSelector ?? \"\";\n\t\t\t\t\t\t\tthis._armProbeBackForDemotedSelector(selector, remainingHintMs);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst degradedDelayMs = this._degradeRateLimitedWithoutFallback(tier, hintMs, message, errorMessage);\n\t\t\t\t\t\tif (degradedDelayMs === undefined) return \"not-handled\";\n\t\t\t\t\t\thintTierDelayMs = degradedDelayMs;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!is429TierRouted) {\n\t\t\t\tthis._retryAttempt++;\n\t\t\t}\n\t\t\tif (!is429TierRouted && this._retryAttempt > retryProfile.turn.maxRetries) {\n\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tretryAfterMs: this._getProviderRetryDelayMs(errorMessage),\n\t\t\t\t});\n\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t// The new model receives a fresh retry budget; the failed model does not.\n\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t} else {\n\t\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t\treturn \"not-handled\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst providerDelayMs = isRefusal || hardErrorFallback ? undefined : this._getProviderRetryDelayMs(errorMessage);\n\t\tconst maxRetryDelayMs = this.settingsManager.getProviderRetrySettings().maxRetryDelayMs;\n\t\t// Profile ceiling null (Kimi) bypasses the over-ceiling error path entirely.\n\t\tconst profileCeiling =\n\t\t\tretryProfile.turn.serverHint.mode === \"override\"\n\t\t\t\t? retryProfile.turn.serverHint.ceiling.maxDelayMs\n\t\t\t\t: maxRetryDelayMs;\n\t\tconst effectiveMaxRetryDelayMs = profileCeiling ?? Number.MAX_SAFE_INTEGER;\n\t\t// For 429-class failures the tier routing replaces the over-budget gate.\n\t\tif (!is429TierRouted && providerDelayMs !== undefined && providerDelayMs > effectiveMaxRetryDelayMs) {\n\t\t\t// A wait this long means the model is unavailable rather than busy, so the\n\t\t\t// configured chain beats failing the turn. The switch is gated: the over-budget\n\t\t\t// branch above may have already switched on this same error, and hopping again\n\t\t\t// here would skip that candidate's own retry budget.\n\t\t\tif (!switchedFallback) {\n\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tretryAfterMs: providerDelayMs,\n\t\t\t\t});\n\t\t\t\tif (switchedFallback) {\n\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!switchedFallback) {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\tfinalError: `Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`,\n\t\t\t\t});\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t}\n\n\t\t// Transient failures stay on the same model until the retry budget is spent;\n\t\t// only the over-budget branch above switches the chain. Both branches that can\n\t\t// reach this point with a fallback already applied (hard-error, refusal) set\n\t\t// switchedFallback first and force providerDelayMs undefined, so no branch may\n\t\t// be reordered to fall through here expecting an implicit switch.\n\t\t// 429-tier delays already carry the exponential floor from nextInTurnDelayMs /\n\t\t// degradeWithoutFallback; the non-tier branch keeps its own exponential fallback.\n\t\tconst nonTierProviderDelayMs = providerDelayMs === 0 ? undefined : providerDelayMs;\n\t\t// Locally computed exponential goes through the profile's backoff policy\n\t\t// (cap + jitter), sampled through the injectable retryRandom seam so tests\n\t\t// stay deterministic; provider-derived hints on the non-429 path remain\n\t\t// authoritative and fallback switches stay exact.\n\t\tconst localExponentialMs = retryBackoffDelayMs(\n\t\t\tretryProfile.turn.backoff,\n\t\t\tthis._retryAttempt,\n\t\t\tthis._retryRandom(),\n\t\t);\n\t\tconst delayMs = switchedFallback\n\t\t\t? 0\n\t\t\t: is429TierRouted\n\t\t\t\t? (hintTierDelayMs ?? providerDelayMs ?? localExponentialMs)\n\t\t\t\t: (nonTierProviderDelayMs ?? localExponentialMs);\n\t\t// Prepare before auto_retry_start so an immediate Esc can cancel the retry sleep.\n\t\tthis._retryAbortController = new AbortController();\n\n\t\tthis._emit({\n\t\t\ttype: \"auto_retry_start\",\n\t\t\tattempt: this._retryAttempt,\n\t\t\tmaxAttempts: retryProfile.turn.maxRetries,\n\t\t\tdelayMs,\n\t\t\terrorMessage,\n\t\t});\n\n\t\t// Remove error message from agent state (keep in session for history)\n\t\tconst messages = this.agent.state.messages;\n\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\tthis.agent.state.messages = messages.slice(0, -1);\n\t\t\tthis._incrementMessageRevision();\n\t\t}\n\n\t\t// Wait with exponential backoff (abortable)\n\t\ttry {\n\t\t\tawait sleep(delayMs, this._retryAbortController.signal);\n\t\t} catch {\n\t\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\t\tconst attempt = this._retryAttempt;\n\t\t\tthis._retryAttempt = 0;\n\t\t\tthis._resetHintTierState();\n\t\t\tthis._retryAbortController = undefined;\n\t\t\tawait this._emitAgentSettled();\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\tsuccess: false,\n\t\t\t\tattempt,\n\t\t\t\tfinalError: \"Retry cancelled\",\n\t\t\t});\n\t\t\tthis._resolveRetry();\n\t\t\treturn \"cancelled\";\n\t\t}\n\t\tthis._retryAbortController = undefined;\n\n\t\t// Turn boundary: a suppression that expired during the backoff sleep lets\n\t\t// the retry continue on the restored primary instead of the fallback model.\n\t\tawait this._maybeRestoreFallbackPrimary();\n\n\t\t// Model fallback (or reversion) can select a smaller context window after\n\t\t// the prior retry checks. Revalidate canonical session context immediately\n\t\t// before the continuation so a rejected compaction never admits that model.\n\t\tconst model = this.model;\n\t\tconst compactionSettings = this.settingsManager.getCompactionSettings();\n\t\tconst contextTokens = estimateContextTokens(\n\t\t\tfilterContextExcludedMessages(this.sessionManager.buildSessionContext().messages),\n\t\t).tokens;\n\t\tif (\n\t\t\tcompactionSettings.enabled &&\n\t\t\tmodel &&\n\t\t\tshouldCompact(contextTokens, model.contextWindow, compactionSettings)\n\t\t) {\n\t\t\tconst preRetryCompaction = await this._runPrePromptCompaction(message, true, \"threshold\", true, true);\n\t\t\tif (\n\t\t\t\t!preRetryCompaction &&\n\t\t\t\t!this._isCompactionOnCooldown() &&\n\t\t\t\t!this._isCompactionDelegated() &&\n\t\t\t\t!this._hasSupersedingCompactionClaim()\n\t\t\t) {\n\t\t\t\tconst attempt = this._retryAttempt;\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tattempt,\n\t\t\t\t\tfinalError: new RequiredCompactionError().message,\n\t\t\t\t});\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"blocked\";\n\t\t\t}\n\t\t\tthis._skipNextPostRetryCompactionCheck = true;\n\t\t}\n\n\t\t// Retry through the barrier-owned scheduled-continuation path after the\n\t\t// event handler chain settles. Lifecycle suppression protects queued work\n\t\t// while admission settles; known provider-timeout retries additionally skip\n\t\t// the first queue poll so user input stays deferred until that request proves\n\t\t// responsive. A concurrent low-level Agent prompt is a benign takeover, not\n\t\t// a terminal continuation failure.\n\t\tconst continuation = createProviderTimeoutRetryPlan({\n\t\t\tmessage,\n\t\t\tstreamRetryTimeoutMs: this.settingsManager.getProviderStreamRetryTimeoutMs(),\n\t\t\ttimeoutMs: this.agent.timeoutMs,\n\t\t\tstreamStartTimeoutMs: this.agent.streamStartTimeoutMs,\n\t\t});\n\t\tif (continuation.options.deferQueuedMessages === true) {\n\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.add(this);\n\t\t} else {\n\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.delete(this);\n\t\t}\n\t\tthis.agent.suppressQueuedMessageDrain();\n\t\tthis._scheduleContinuationAfterCurrentEvent(continuation.options, true, continuation.watchdogTimeoutMs);\n\n\t\treturn \"continued\";\n\t}\n\n\t/**\n\t * Cancel in-progress retry.\n\t */\n\tabortRetry(): void {\n\t\tthis._retryAbortController?.abort();\n\t\t// Note: _retryAttempt is reset in the catch block of _autoRetry\n\t\tthis._resolveRetry();\n\t}\n\n\t/**\n\t * Wait for any in-progress retry to complete.\n\t * Returns immediately if no retry is in progress.\n\t */\n\tprivate async waitForRetry(): Promise<void> {\n\t\tif (!this._retryPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this._retryPromise;\n\t\tawait this.agent.waitForIdle();\n\t}\n\n\t/** Whether auto-retry is currently in progress */\n\tget isRetrying(): boolean {\n\t\treturn this._retryPromise !== undefined;\n\t}\n\n\t/** Whether auto-retry is enabled */\n\tget autoRetryEnabled(): boolean {\n\t\treturn this.settingsManager.getRetryEnabled();\n\t}\n\n\t/**\n\t * Toggle auto-retry setting.\n\t */\n\tsetAutoRetryEnabled(enabled: boolean): void {\n\t\tthis.settingsManager.setRetryEnabled(enabled);\n\t}\n\n\t// =========================================================================\n\t// Bash Execution\n\t// =========================================================================\n\n\t/**\n\t * Execute a bash command.\n\t * Adds result to agent context and session.\n\t * @param command The bash command to execute\n\t * @param onChunk Optional streaming callback for output\n\t * @param options.excludeFromContext If true, command output won't be sent to LLM (!! prefix)\n\t * @param options.id Optional identifier included in bash execution update events\n\t * @param options.operations Custom BashOperations for remote execution\n\t */\n\tasync executeBash(\n\t\tcommand: string,\n\t\tonChunk?: (chunk: string) => void,\n\t\toptions?: {\n\t\t\texcludeFromContext?: boolean;\n\t\t\tid?: string;\n\t\t\toperations?: BashOperations;\n\t\t},\n\t): Promise<BashResult> {\n\t\tconst abortController = new AbortController();\n\t\tthis._bashAbortControllers.add(abortController);\n\n\t\t// Apply command prefix if configured (e.g., \"shopt -s expand_aliases\" for alias support)\n\t\tconst prefix = this.settingsManager.getShellCommandPrefix();\n\t\tconst shellPath = this.settingsManager.getShellPath();\n\t\tconst resolvedCommand = prefix ? `${prefix}\\n${command}` : command;\n\n\t\ttry {\n\t\t\tconst result = await executeBashWithOperations(\n\t\t\t\tresolvedCommand,\n\t\t\t\tthis.sessionManager.getCwd(),\n\t\t\t\toptions?.operations ?? createLocalBashOperations({ shellPath }),\n\t\t\t\t{\n\t\t\t\t\tonChunk: (delta) => {\n\t\t\t\t\t\tconst callbackResult = onChunk?.(delta);\n\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\ttype: \"bash_execution_update\",\n\t\t\t\t\t\t\tid: options?.id,\n\t\t\t\t\t\t\tdelta,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn callbackResult;\n\t\t\t\t\t},\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tthis.recordBashResult(command, result, options);\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tthis._bashAbortControllers.delete(abortController);\n\t\t}\n\t}\n\n\t/**\n\t * Record a bash execution result in session history.\n\t * Used by executeBash and by extensions that handle bash execution themselves.\n\t */\n\trecordBashResult(command: string, result: BashResult, options?: { excludeFromContext?: boolean }): void {\n\t\tconst bashMessage: BashExecutionMessage = {\n\t\t\trole: \"bashExecution\",\n\t\t\tcommand,\n\t\t\toutput: result.output,\n\t\t\texitCode: result.exitCode,\n\t\t\tcancelled: result.cancelled,\n\t\t\ttruncated: result.truncated,\n\t\t\tfullOutputPath: result.fullOutputPath,\n\t\t\ttimestamp: Date.now(),\n\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t};\n\n\t\t// If agent is streaming, defer adding to avoid breaking tool_use/tool_result ordering\n\t\tif (this.isStreaming) {\n\t\t\t// Queue for later - will be flushed on agent_end\n\t\t\tthis._pendingBashMessages.push(bashMessage);\n\t\t} else {\n\t\t\t// Add to agent state immediately\n\t\t\tthis.agent.state.messages.push(bashMessage);\n\n\t\t\t// Save to session\n\t\t\tthis.sessionManager.appendMessage(bashMessage);\n\t\t\tthis._incrementMessageRevision();\n\t\t}\n\t}\n\n\t/**\n\t * Cancel running bash command.\n\t */\n\tabortBash(): void {\n\t\tfor (const abortController of [...this._bashAbortControllers]) {\n\t\t\tabortController.abort();\n\t\t}\n\t}\n\n\t/** Remove a host-owned full-output spill after a remote observer failed. */\n\tasync cleanupBashOutput(path: string): Promise<void> {\n\t\tawait rm(path, { force: true });\n\t}\n\n\t/** Whether a bash command is currently running */\n\tget isBashRunning(): boolean {\n\t\treturn this._bashAbortControllers.size > 0;\n\t}\n\n\t/** Whether there are pending bash messages waiting to be flushed */\n\tget hasPendingBashMessages(): boolean {\n\t\treturn this._pendingBashMessages.length > 0;\n\t}\n\n\t/**\n\t * Flush pending bash messages to agent state and session.\n\t * Called after agent turn completes to maintain proper message ordering.\n\t */\n\tprivate _flushPendingBashMessages(): void {\n\t\tif (this._pendingBashMessages.length === 0) return;\n\n\t\tfor (const bashMessage of this._pendingBashMessages) {\n\t\t\t// Add to agent state\n\t\t\tthis.agent.state.messages.push(bashMessage);\n\n\t\t\t// Save to session\n\t\t\tthis.sessionManager.appendMessage(bashMessage);\n\t\t\tthis._incrementMessageRevision();\n\t\t}\n\n\t\tthis._pendingBashMessages = [];\n\t}\n\n\t// =========================================================================\n\t// Session Management\n\t// =========================================================================\n\n\t/**\n\t * Set a display name for the current session.\n\t */\n\tsetSessionName(name: string): void {\n\t\tthis.sessionManager.appendSessionInfo(name);\n\t\tconst event = {\n\t\t\ttype: \"session_info_changed\",\n\t\t\tname: this.sessionManager.getSessionName(),\n\t\t} as const;\n\t\tthis._emit(event);\n\t\tvoid this._extensionRunner.emit(event);\n\t}\n\n\t// =========================================================================\n\t// Tree Navigation\n\t// =========================================================================\n\n\t/**\n\t * Navigate to a different node in the session tree.\n\t * Unlike fork() which creates a new session file, this stays in the same file.\n\t *\n\t * @param targetId The entry ID to navigate to\n\t * @param options.summarize Whether user wants to summarize abandoned branch\n\t * @param options.customInstructions Custom instructions for summarizer\n\t * @param options.replaceInstructions If true, customInstructions replaces the default prompt\n\t * @param options.label Label to attach to the branch summary entry\n\t * @returns Result with editorText (if user message) and cancelled status\n\t */\n\tasync navigateTree(\n\t\ttargetId: string,\n\t\toptions: {\n\t\t\tsummarize?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\treplaceInstructions?: boolean;\n\t\t\tlabel?: string;\n\t\t} = {},\n\t): Promise<{\n\t\teditorText?: string;\n\t\tcancelled: boolean;\n\t\taborted?: boolean;\n\t\tsummaryEntry?: BranchSummaryEntry;\n\t}> {\n\t\tif (this.isStreaming) {\n\t\t\tthrow new Error(\"Wait for the current response to finish before navigating the session tree.\");\n\t\t}\n\n\t\tconst oldLeafId = this.sessionManager.getLeafId();\n\n\t\t// No-op if already at target\n\t\tif (targetId === oldLeafId) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\t// Model required for summarization\n\t\tif (options.summarize && !this.model) {\n\t\t\tthrow new Error(\"No model available for summarization\");\n\t\t}\n\n\t\tconst targetEntry = this.sessionManager.getEntry(targetId);\n\t\tif (!targetEntry) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\n\t\t// Collect entries to summarize (from old leaf to common ancestor)\n\t\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\t\tthis.sessionManager,\n\t\t\toldLeafId,\n\t\t\ttargetId,\n\t\t);\n\n\t\t// Prepare event data - mutable so extensions can override\n\t\tlet customInstructions = options.customInstructions;\n\t\tlet replaceInstructions = options.replaceInstructions;\n\t\tlet label = options.label;\n\n\t\tconst preparation: TreePreparation = {\n\t\t\ttargetId,\n\t\t\toldLeafId,\n\t\t\tcommonAncestorId,\n\t\t\tentriesToSummarize,\n\t\t\tuserWantsSummary: options.summarize ?? false,\n\t\t\tcustomInstructions,\n\t\t\treplaceInstructions,\n\t\t\tlabel,\n\t\t};\n\n\t\t// Set up abort controller for summarization\n\t\tthis._branchSummaryAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tlet extensionSummary: { summary: string; details?: unknown; usage?: Usage } | undefined;\n\t\t\tlet fromExtension = false;\n\n\t\t\t// Emit session_before_tree event\n\t\t\tif (this._extensionRunner.hasHandlers(\"session_before_tree\")) {\n\t\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t}\n\n\t\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\t\textensionSummary = result.summary;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow extensions to override instructions and label\n\t\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t\t}\n\t\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t\t}\n\t\t\t\tif (result?.label !== undefined) {\n\t\t\t\t\tlabel = result.label;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Run default summarizer if needed\n\t\t\tlet summaryText: string | undefined;\n\t\t\tlet summaryDetails: unknown;\n\t\t\tlet summaryUsage: Usage | undefined;\n\t\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\t\tconst model = this.model!;\n\t\t\t\tconst {\n\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\theaders,\n\t\t\t\t\textraBody,\n\t\t\t\t\tenv,\n\t\t\t\t} = await this._getCompactionRequestAuth(model);\n\t\t\t\tconst branchSummarySettings = this.settingsManager.getBranchSummarySettings();\n\t\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\theaders,\n\t\t\t\t\textraBody,\n\t\t\t\t\tenv,\n\t\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\treplaceInstructions,\n\t\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t\t\t\tcallbacks: this._summarizationRetryCallbacks({\n\t\t\t\t\t\tsource: \"branchSummary\",\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t\tif (result.aborted) {\n\t\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t\t}\n\t\t\t\tif (result.error) {\n\t\t\t\t\tthrow new Error(result.error);\n\t\t\t\t}\n\t\t\t\tsummaryText = result.summary;\n\t\t\t\tsummaryUsage = result.usage;\n\t\t\t\tsummaryDetails = {\n\t\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t\t};\n\t\t\t} else if (extensionSummary) {\n\t\t\t\tsummaryText = extensionSummary.summary;\n\t\t\t\tsummaryDetails = extensionSummary.details;\n\t\t\t\tsummaryUsage = extensionSummary.usage;\n\t\t\t}\n\n\t\t\t// Determine the new leaf position based on target type\n\t\t\tlet newLeafId: string | null;\n\t\t\tlet editorText: string | undefined;\n\n\t\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t\t// User message: leaf = parent (null if root), text goes to editor\n\t\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\t\teditorText = contentText(targetEntry.message.content, \"\");\n\t\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t\t// Custom message: leaf = parent (null if root), text goes to editor\n\t\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\t\teditorText = contentText(targetEntry.content, \"\");\n\t\t\t} else {\n\t\t\t\t// Non-user message: leaf = selected node\n\t\t\t\tnewLeafId = targetId;\n\t\t\t}\n\n\t\t\t// Switch leaf (with or without summary)\n\t\t\t// Summary is attached at the navigation target position (newLeafId), not the old branch\n\t\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\t\tif (summaryText) {\n\t\t\t\t// Create summary at target position (can be null for root)\n\t\t\t\tconst summaryId = this.sessionManager.branchWithSummary(\n\t\t\t\t\tnewLeafId,\n\t\t\t\t\tsummaryText,\n\t\t\t\t\tsummaryDetails,\n\t\t\t\t\tfromExtension,\n\t\t\t\t\tsummaryUsage,\n\t\t\t\t);\n\t\t\t\tsummaryEntry = this.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t\t// Attach label to the summary entry\n\t\t\t\tif (label) {\n\t\t\t\t\tthis.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t\t}\n\t\t\t} else if (newLeafId === null) {\n\t\t\t\t// No summary, navigating to root - reset leaf\n\t\t\t\tthis.sessionManager.resetLeaf();\n\t\t\t} else {\n\t\t\t\t// No summary, navigating to non-root\n\t\t\t\tthis.sessionManager.branch(newLeafId);\n\t\t\t}\n\n\t\t\t// Attach label to target entry when not summarizing (no summary entry to label)\n\t\t\tif (label && !summaryText) {\n\t\t\t\tthis.sessionManager.appendLabelChange(targetId, label);\n\t\t\t}\n\n\t\t\t// Update agent state (preserving exact messages still awaiting persistence)\n\t\t\tthis._restoreAgentMessagesFromSession();\n\t\t\tthis._delegatedCompactionKey = undefined;\n\t\t\tthis._incrementMessageRevision();\n\n\t\t\t// Emit session_tree event\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_tree\",\n\t\t\t\tnewLeafId: this.sessionManager.getLeafId(),\n\t\t\t\toldLeafId,\n\t\t\t\tsummaryEntry,\n\t\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t\t});\n\n\t\t\t// Emit to custom tools\n\n\t\t\treturn { editorText, cancelled: false, summaryEntry };\n\t\t} finally {\n\t\t\tthis._branchSummaryAbortController = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Get all user messages from session for fork selector.\n\t */\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }> {\n\t\tconst entries = this.sessionManager.getEntries();\n\t\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tif (entry.message.role !== \"user\") continue;\n\n\t\t\tconst text = contentText(entry.message.content, \"\");\n\t\t\tif (text) {\n\t\t\t\tresult.push({ entryId: entry.id, text });\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get session statistics. Aggregates over ALL session entries (including\n\t * history that was compacted away), so token/cost totals reflect what was\n\t * actually billed across the session.\n\t */\n\tgetSessionStats(): SessionStats {\n\t\tlet userMessages = 0;\n\t\tlet assistantMessages = 0;\n\t\tlet toolResults = 0;\n\t\tlet totalMessages = 0;\n\t\tlet toolCalls = 0;\n\t\tconst usageTotals = createUsageTotals();\n\n\t\tfor (const entry of this.sessionManager.getEntries()) {\n\t\t\tif ((entry.type === \"branch_summary\" || entry.type === \"compaction\") && entry.usage) {\n\t\t\t\taddUsageToTotals(usageTotals, entry.usage);\n\t\t\t}\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\ttotalMessages++;\n\t\t\tconst message = entry.message;\n\t\t\tif (message.role === \"user\") {\n\t\t\t\tuserMessages++;\n\t\t\t} else if (message.role === \"toolResult\") {\n\t\t\t\ttoolResults++;\n\t\t\t\tif (message.usage) {\n\t\t\t\t\taddUsageToTotals(usageTotals, message.usage);\n\t\t\t\t}\n\t\t\t} else if (message.role === \"assistant\") {\n\t\t\t\tassistantMessages++;\n\t\t\t\tconst assistantMsg = message as AssistantMessage;\n\t\t\t\tif (Array.isArray(assistantMsg.content)) {\n\t\t\t\t\ttoolCalls += assistantMsg.content.filter((c) => c.type === \"toolCall\").length;\n\t\t\t\t}\n\t\t\t\taddUsageToTotals(usageTotals, assistantMsg.usage);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tsessionId: this.sessionId,\n\t\t\tuserMessages,\n\t\t\tassistantMessages,\n\t\t\ttoolCalls,\n\t\t\ttoolResults,\n\t\t\ttotalMessages,\n\t\t\ttokens: {\n\t\t\t\tinput: usageTotals.input,\n\t\t\t\toutput: usageTotals.output,\n\t\t\t\tcacheRead: usageTotals.cacheRead,\n\t\t\t\tcacheWrite: usageTotals.cacheWrite,\n\t\t\t\ttotal: usageTotals.input + usageTotals.output + usageTotals.cacheRead + usageTotals.cacheWrite,\n\t\t\t},\n\t\t\tcost: usageTotals.cost,\n\t\t\tcontextUsage: this.getContextUsage(),\n\t\t};\n\t}\n\n\t/**\n\t * Cache-safe foreground wait budget for the LIVE current model. Recomputed on\n\t * every call so a model switch takes effect immediately.\n\t */\n\tresolvePromptCacheSafeWaitSeconds(): number | undefined {\n\t\tconst global = this.settingsManager.getGlobalSettings().promptCache;\n\t\tconst project = this.settingsManager.getProjectSettings().promptCache;\n\t\tconst merged = global || project ? { ...global, ...project } : undefined;\n\t\treturn resolvePromptCacheSafeWaitSeconds(this.model, merged, process.env);\n\t}\n\n\t/**\n\t * Mirror the budget into the advisory env var read by out-of-process tools.\n\t * Last writer wins across in-process sessions; consumers treat it as a hint.\n\t */\n\tsyncPromptCacheSafeWaitEnv(): void {\n\t\tconst budget = this.resolvePromptCacheSafeWaitSeconds();\n\t\tif (budget === undefined) delete process.env[PROMPT_CACHE_SAFE_WAIT_ENV];\n\t\telse process.env[PROMPT_CACHE_SAFE_WAIT_ENV] = String(budget);\n\t}\n\n\tgetContextUsage(): ContextUsage | undefined {\n\t\tconst model = this.model;\n\t\tif (!model) return undefined;\n\n\t\tconst contextWindow = model.contextWindow ?? 0;\n\t\tif (contextWindow <= 0) return undefined;\n\n\t\tconst messages = filterContextExcludedMessages(this.messages);\n\n\t\t// After compaction, kept assistant usage reflects pre-compaction context size.\n\t\t// If no assistant has responded after the boundary yet, fall back to content\n\t\t// estimates so auto-compaction can still see current context pressure.\n\t\tconst branchEntries = this.sessionManager.getBranch();\n\t\tconst latestCompaction = getLatestCompactionEntry(branchEntries);\n\n\t\tif (latestCompaction) {\n\t\t\t// Check if there's a valid assistant usage after the compaction boundary\n\t\t\tconst compactionIndex = branchEntries.lastIndexOf(latestCompaction);\n\t\t\tlet hasPostCompactionUsage = false;\n\t\t\tfor (let i = branchEntries.length - 1; i > compactionIndex; i--) {\n\t\t\t\tconst entry = branchEntries[i];\n\t\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\t\tconst assistant = entry.message;\n\t\t\t\t\tif (assistant.stopReason !== \"aborted\" && assistant.stopReason !== \"error\") {\n\t\t\t\t\t\tconst contextTokens = calculateContextTokens(assistant.usage);\n\t\t\t\t\t\tif (contextTokens > 0) {\n\t\t\t\t\t\t\thasPostCompactionUsage = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!hasPostCompactionUsage) {\n\t\t\t\tconst tokens = messages.reduce((sum, message) => sum + estimateTokens(message), 0);\n\t\t\t\treturn {\n\t\t\t\t\ttokens,\n\t\t\t\t\tcontextWindow,\n\t\t\t\t\tpercent: (tokens / contextWindow) * 100,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst estimate = estimateContextTokens(messages);\n\t\tconst percent = (estimate.tokens / contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokens: estimate.tokens,\n\t\t\tcontextWindow,\n\t\t\tpercent,\n\t\t};\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t * @param outputPath Optional output path (defaults to session directory)\n\t * @param options Optional export presentation settings\n\t * @returns Path to exported file\n\t */\n\tasync exportToHtml(outputPath?: string, options: { themeName?: string } = {}): Promise<string> {\n\t\tconst themeName = [options.themeName, this.settingsManager.getTheme()].find(\n\t\t\t(candidate) => candidate !== undefined && getThemeByName(candidate) !== undefined,\n\t\t);\n\n\t\t// Create tool renderer if we have an extension runner (for custom tool HTML rendering)\n\t\tconst toolRenderer: ToolHtmlRenderer = createToolHtmlRenderer({\n\t\t\tgetToolDefinition: (name) => this.getToolDefinition(name),\n\t\t\ttheme,\n\t\t\tcwd: this.sessionManager.getCwd(),\n\t\t});\n\n\t\treturn await exportSessionToHtml(this.sessionManager, this.state, {\n\t\t\toutputPath,\n\t\t\tthemeName,\n\t\t\ttoolRenderer,\n\t\t});\n\t}\n\n\t/**\n\t * Export the current session branch to a JSONL file.\n\t * Writes the session header followed by all entries on the current branch path.\n\t * @param outputPath Target file path. If omitted, generates a timestamped file in cwd.\n\t * @returns The resolved output file path.\n\t */\n\texportToJsonl(outputPath?: string): string {\n\t\tconst filePath = resolvePath(\n\t\t\toutputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, \"-\")}.jsonl`,\n\t\t\tprocess.cwd(),\n\t\t);\n\t\tconst dir = dirname(filePath);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionManager.getSessionId(),\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcwd: this.sessionManager.getCwd(),\n\t\t};\n\n\t\tconst branchEntries = this.sessionManager.getBranch();\n\t\tconst lines = [JSON.stringify(header)];\n\n\t\t// Re-chain parentIds to form a linear sequence\n\t\tlet prevId: string | null = null;\n\t\tfor (const entry of branchEntries) {\n\t\t\tconst linear = { ...entry, parentId: prevId };\n\t\t\tlines.push(JSON.stringify(linear));\n\t\t\tprevId = entry.id;\n\t\t}\n\n\t\twriteFileSync(filePath, `${lines.join(\"\\n\")}\\n`);\n\t\treturn filePath;\n\t}\n\n\t// =========================================================================\n\t// Utilities\n\t// =========================================================================\n\n\t/**\n\t * Get text content of last assistant message.\n\t * Useful for /copy command.\n\t * @returns Text content, or undefined if no assistant message exists\n\t */\n\tgetLastAssistantText(): string | undefined {\n\t\tconst lastAssistant = this.messages\n\t\t\t.slice()\n\t\t\t.reverse()\n\t\t\t.find((m) => {\n\t\t\t\tif (m.role !== \"assistant\") return false;\n\t\t\t\tconst msg = m as AssistantMessage;\n\t\t\t\t// Skip aborted messages with no content\n\t\t\t\tif (msg.stopReason === \"aborted\" && msg.content.length === 0) return false;\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\tif (!lastAssistant) return undefined;\n\n\t\tlet text = \"\";\n\t\tfor (const content of (lastAssistant as AssistantMessage).content) {\n\t\t\tif (content.type === \"text\") {\n\t\t\t\ttext += content.text;\n\t\t\t}\n\t\t}\n\n\t\treturn text.trim() || undefined;\n\t}\n\n\t// =========================================================================\n\t// Extension System\n\t// =========================================================================\n\n\tcreateReplacedSessionContext(): ReplacedSessionContext {\n\t\tconst context = Object.defineProperties(\n\t\t\t{},\n\t\t\tObject.getOwnPropertyDescriptors(this._extensionRunner.createCommandContext()),\n\t\t) as ReplacedSessionContext;\n\t\tcontext.sendMessage = (message, options) => this.sendCustomMessage(message, options);\n\t\tcontext.sendUserMessage = (content, options) => this.sendUserMessage(content, options);\n\t\treturn context;\n\t}\n\n\t/**\n\t * Check if extensions have handlers for a specific event type.\n\t */\n\thasExtensionHandlers(eventType: string): boolean {\n\t\treturn this._extensionRunner.hasHandlers(eventType);\n\t}\n\n\t/**\n\t * Get the extension runner (for setting UI context and error handlers).\n\t */\n\tget extensionRunner(): ExtensionRunner {\n\t\treturn this._extensionRunner;\n\t}\n}\n"]}
1
+ {"version":3,"file":"agent-session.js","sourceRoot":"","sources":["../../src/core/agent-session.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * AgentSession - Core abstraction for agent lifecycle and session management.\n *\n * This class is shared between all run modes (interactive, print, rpc).\n * It encapsulates:\n * - Agent state access\n * - Event subscription with automatic session persistence\n * - Model and thinking level management\n * - Compaction (manual and auto)\n * - Bash execution\n * - Session switching and branching\n *\n * Modes use this class and add their own I/O layer on top.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { rm } from \"node:fs/promises\";\nimport { basename, dirname } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport type {\n\tAgent,\n\tAgentContinuationOptions,\n\tAgentEvent,\n\tAgentMessage,\n\tAgentState,\n\tAgentTool,\n\tAgentToolCall,\n\tAgentToolResult,\n\tAgentToolUpdateCallback,\n\tPreparedAgentToolCall,\n\tPrepareNextTurnContext,\n\tThinkingLevel,\n} from \"@earendil-works/pi-agent-core\";\nimport { ProviderRetryWatchdogAbortError, prepareAgentToolCall } from \"@earendil-works/pi-agent-core\";\nimport {\n\tcontentText,\n\tmeasureCursorHistorySerializedBytes,\n\tSERVER_FALLBACK_ABORTED_DIAGNOSTIC,\n\ttype ThinkingSelection,\n} from \"@earendil-works/pi-ai\";\nimport type {\n\tApi,\n\tAssistantMessage,\n\tAuthResult,\n\tContext,\n\tImageContent,\n\tMessage,\n\tModel,\n\tProviderHeaders,\n\tSimpleStreamOptions,\n\tTextContent,\n\tUsage,\n} from \"@earendil-works/pi-ai/compat\";\nimport {\n\tcleanupSessionResources,\n\tcursorOverflowCompactionSettings,\n\tisClassifierRefusal,\n\tisContextOverflow,\n\tisCursorPayloadResourceExhausted,\n\tisCursorQuotaResourceExhausted,\n\tisCursorZeroTokenResourceExhausted,\n\tisProviderStreamStallError,\n\tisProviderTimeoutError,\n\tisRecoverableLength,\n\tisRetryableAssistantError,\n\tmodelsAreEqual,\n\ttype RetryCallbacks,\n\tresetApiProviders,\n\tshouldRetryOverflowWithoutCompact,\n\tstreamSimple,\n} from \"@earendil-works/pi-ai/compat\";\nimport { extract429RetryAfterMs, parseRetryAfterMsMarker } from \"@earendil-works/pi-ai/utils/retry-hint\";\nimport { retryBackoffDelayMs } from \"@earendil-works/pi-ai/utils/retry-profile/backoff\";\nimport { getAgentDir } from \"../config.ts\";\nimport { getThemeByName, theme } from \"../modes/interactive/theme/theme.ts\";\nimport { stripFrontmatter } from \"../utils/frontmatter.ts\";\nimport { resolvePath } from \"../utils/paths.ts\";\nimport { sleep } from \"../utils/sleep.ts\";\nimport { normalizeToolResultImages } from \"../utils/tool-result-images.ts\";\nimport { AgentAbortProvenance, type AgentAbortSource } from \"./agent-abort-provenance.ts\";\nimport {\n\tAgentSettledDelivery,\n\ttype DeferredAgentSettledAction,\n\ttype DeferredTurnClaim,\n} from \"./agent-settled-delivery.ts\";\nimport { formatNoApiKeyFoundMessage, formatNoModelSelectedMessage } from \"./auth-guidance.ts\";\nimport { type BashResult, executeBashWithOperations } from \"./bash-executor.ts\";\nimport { envValue } from \"./brand.ts\";\nimport {\n\ttype CacheFriendlySummaryOptions,\n\ttype CompactionPreparation,\n\ttype CompactionResult,\n\tcalculateContextTokens,\n\tcollectEntriesForBranchSummary,\n\tcompact,\n\testimateContextTokens,\n\testimateTokens,\n\tgenerateBranchSummary,\n\tprepareCompaction,\n\tresolveThresholdContextTokens,\n\tshouldCompact,\n} from \"./compaction/index.ts\";\nimport { CompactionLifecycleCoordinator, type CompactionLifecycleState } from \"./compaction/lifecycle.ts\";\nimport { isWarmSummaryAnchorValid } from \"./compaction/warm-anchor.ts\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport { type BuildDynamicSystemPromptOptions, buildDynamicSystemPrompt } from \"./dynamic-prompt/index.ts\";\nimport { areExperimentalFeaturesEnabled } from \"./experimental.ts\";\nimport { exportSessionToHtml, type ToolHtmlRenderer } from \"./export-html/index.ts\";\nimport { createToolHtmlRenderer } from \"./export-html/tool-renderer.ts\";\nimport {\n\tModelUsabilityBudgetError,\n\tprojectModelUsabilityBudget,\n} from \"./extensions/builtin/compaction/model-usability-budget.ts\";\nimport { resolveReserveTokens } from \"./extensions/builtin/compaction/policy.ts\";\nimport { WAKE_SOURCE_STATE_EVENT } from \"./extensions/builtin/monitor-state-event.ts\";\nimport { CODEX_RESPONSES_API, type ServiceTier } from \"./extensions/builtin/service-tier.ts\";\nimport { deriveExtensionRegistrationId } from \"./extensions/builtin/tool-search/engine/marker.ts\";\nimport { getToolSearchService } from \"./extensions/builtin/tool-search/service.ts\";\nimport {\n\ttype ContextUsage,\n\tExecuteToolError,\n\ttype ExecuteToolOptions,\n\ttype ExtensionCommandContextActions,\n\ttype ExtensionErrorListener,\n\ttype ExtensionMode,\n\tExtensionRunner,\n\ttype ExtensionToolHookLifecycleEvent,\n\ttype ExtensionUIContext,\n\ttype InputSource,\n\ttype MessageEndEvent,\n\ttype MessageStartEvent,\n\ttype MessageUpdateEvent,\n\ttype ReplacedSessionContext,\n\ttype SessionBeforeCompactResult,\n\ttype SessionBeforeTreeResult,\n\ttype SessionCompactFailedEvent,\n\ttype SessionStartEvent,\n\ttype ShutdownHandler,\n\ttype SystemPromptChangeEvent,\n\ttype ToolDefinition,\n\ttype ToolExecutionEndEvent,\n\ttype ToolExecutionStartEvent,\n\ttype ToolExecutionUpdateEvent,\n\ttype ToolInfo,\n\ttype TreePreparation,\n\ttype TurnEndEvent,\n\ttype TurnStartEvent,\n\twrapRegisteredTools,\n} from \"./extensions/index.ts\";\nimport { emitSessionShutdownEvent } from \"./extensions/runner.ts\";\nimport type {\n\tApplyCompactionOptions,\n\tApplyCompactionResult,\n\tCompactionReason,\n\tCompactionRejectionCause,\n\tLazyToolActivator,\n\tModelSelectSource,\n} from \"./extensions/types.ts\";\nimport { normalizeToolExposure, RUNTIME_EXTENSION_PATH } from \"./extensions/types.ts\";\nimport { shouldWarnHighReasoning } from \"./high-reasoning-warning.ts\";\nimport {\n\ttype BashExecutionMessage,\n\ttype CustomMessage,\n\tconvertToLlm,\n\tfilterContextExcludedMessages,\n} from \"./messages.ts\";\nimport { ModelRegistry } from \"./model-registry.ts\";\nimport { type AvailableModelsSource, getModelNarrowingPatterns, resolveModelScope } from \"./model-resolver.ts\";\nimport type { ModelRuntime } from \"./model-runtime.ts\";\nimport { PROMPT_CACHE_SAFE_WAIT_ENV, resolvePromptCacheSafeWaitSeconds } from \"./prompt-cache-budget.ts\";\nimport { expandPromptTemplateWithMetadata, type PromptTemplate } from \"./prompt-templates.ts\";\nimport { createProviderTimeoutRetryPlan, runBoundedRetryContinuation } from \"./provider-timeout-retry.ts\";\nimport type { ResourceExtensionPaths, ResourceLoader } from \"./resource-loader.ts\";\nimport { isBillingErrorMessage } from \"./retry-fallback/billing.ts\";\nimport { formatSelector } from \"./retry-fallback/chains.ts\";\nimport { RetryFallbackController } from \"./retry-fallback/controller.ts\";\nimport { SelectorCooldowns } from \"./retry-fallback/cooldown.ts\";\nimport {\n\tclassifyRateLimitedWait,\n\tdegradeWithoutFallback,\n\ttype HintTier,\n\tnextInTurnDelayMs,\n\ttype ProbePhase,\n\tprobeBackSchedule,\n} from \"./retry-fallback/hint-policy.ts\";\nimport { createFallbackLogger } from \"./retry-fallback/log.ts\";\nimport { ProbeBackScheduler } from \"./retry-fallback/probe-scheduler.ts\";\nimport { validateFallbackChains } from \"./retry-fallback/validate.ts\";\nimport { isSessionBusySnapshot, type SessionActivitySnapshot, WakeSourceTracker } from \"./session-activity.ts\";\nimport { createSessionLogger, type SessionLogger } from \"./session-log.ts\";\nimport type { BranchSummaryEntry, CompactionEntry, SessionEntry, SessionManager } from \"./session-manager.ts\";\nimport {\n\tbuildSessionContext,\n\tCURRENT_SESSION_VERSION,\n\tgetLatestCompactionEntry,\n\ttype SessionHeader,\n} from \"./session-manager.ts\";\nimport { generateSessionTitle, sessionTitleRetryPolicy, shouldSkipSessionTitle } from \"./session-title-generator.ts\";\nimport { SessionWorkBarrier } from \"./session-work-barrier.ts\";\nimport type { SettingsManager, SettingsSourceSelection } from \"./settings-manager.ts\";\nimport type { SlashCommandInfo } from \"./slash-commands.ts\";\nimport { createSyntheticSourceInfo, type SourceInfo } from \"./source-info.ts\";\nimport { getSupportedThinkingLevels, supportsMax, supportsXhigh } from \"./thinking-levels.ts\";\nimport { resetTimings, time } from \"./timings.ts\";\nimport { type BashOperations, createLocalBashOperations } from \"./tools/bash.ts\";\nimport { composeFilesystemPolicies } from \"./tools/filesystem-policy.ts\";\nimport { createAllToolDefinitions, temporarilyDisabledToolNames } from \"./tools/index.ts\";\nimport { createToolDefinitionFromAgentTool } from \"./tools/tool-definition-wrapper.ts\";\nimport { addUsageToTotals, createUsageTotals } from \"./usage-totals.ts\";\n\n/** Tools routed exclusively through eval while the registered eval tool is available. */\nconst EVAL_ONLY_TOOL_NAMES: ReadonlySet<string> = new Set([\"bash\", \"powershell\", \"workflow\", \"monitor\"]);\n\n/** Sample eval-cell call for an eval-only tool, using the argument name that tool actually takes. */\nfunction evalHelperCall(name: string): string {\n\tif (name === \"bash\" || name === \"powershell\") return `tool.${name}({ command: \"...\" })`;\n\tif (name === \"workflow\") return `tool.${name}({ action: \"...\" })`;\n\tif (name === \"monitor\") return `tool.monitor({ description: \"...\", command: \"...\", filter: \"...\" })`;\n\treturn `tool.${name}({ ... })`;\n}\nconst TURN_RETRY_SUPPRESSION_PREFIX = \"senpi:no-turn-retry:\";\nconst DEFERRED_RETRY_QUEUE_OWNERS = new WeakSet<object>();\n\n// ============================================================================\n// Skill Invocation Formatting and Parsing\n// ============================================================================\n\nexport interface SkillInvocationPromptSkill {\n\tname: string;\n\tfilePath: string;\n\tbaseDir: string;\n\tbody: string;\n}\n\n/** Format the user-attributed payload for one or more explicit skill invocations. */\nexport function formatSkillInvocationPrompt(\n\tskills: readonly SkillInvocationPromptSkill[],\n\tuserRequest?: string,\n): string {\n\tconst skillBlocks = skills.map(\n\t\t(skill) =>\n\t\t\t`The user explicitly invoked the \"${skill.name}\" skill. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions.\\n\\n<skill-instruction name=\"${skill.name}\" location=\"${skill.filePath}\">\\nReferences are relative to ${skill.baseDir}.\\n\\n${skill.body}\\n</skill-instruction>`,\n\t);\n\tconst expandedSkills = skillBlocks.join(\"\\n\\n\");\n\treturn userRequest && /\\S/.test(userRequest)\n\t\t? `${expandedSkills}\\n\\n<user-request>\\n${userRequest}\\n</user-request>`\n\t\t: expandedSkills;\n}\n\n/** Parsed skill block from a user message */\nexport interface ParsedSkillBlock {\n\tname: string;\n\tlocation: string;\n\tcontent: string;\n\tuserMessage: string | undefined;\n}\n\n/**\n * Parse a skill block from message text.\n * Returns null if the text doesn't contain a skill block.\n */\nexport function parseSkillBlock(text: string): ParsedSkillBlock | null {\n\tconst instructionPattern =\n\t\t/^The user explicitly invoked the \"([^\"]+)\" skill\\. Follow the instructions in <skill-instruction> as binding for this request, while respecting higher-priority instructions\\.\\n\\n<skill-instruction name=\"([^\"]+)\" location=\"([^\"]+)\">\\n([\\s\\S]*?)\\n<\\/skill-instruction>/;\n\tconst instructionMatch = text.match(instructionPattern);\n\tif (instructionMatch) {\n\t\tif (instructionMatch[1] !== instructionMatch[2]) return null;\n\t\tlet remainder = text.slice(instructionMatch[0].length);\n\t\twhile (remainder.startsWith(\"\\n\\nThe user explicitly invoked the \")) {\n\t\t\tconst chainedMatch = remainder.slice(2).match(instructionPattern);\n\t\t\tif (!chainedMatch || chainedMatch[1] !== chainedMatch[2]) return null;\n\t\t\tremainder = remainder.slice(chainedMatch[0].length + 2);\n\t\t}\n\t\tconst requestMatch = remainder.match(/^\\n\\n<user-request>\\n([\\s\\S]*?)\\n<\\/user-request>$/);\n\t\tif (remainder && !requestMatch) return null;\n\t\treturn {\n\t\t\tname: instructionMatch[1],\n\t\t\tlocation: instructionMatch[3],\n\t\t\tcontent: instructionMatch[4],\n\t\t\tuserMessage: requestMatch?.[1].trim() || undefined,\n\t\t};\n\t}\n\n\tconst legacyMatch = text.match(\n\t\t/^<skill name=\"([^\"]+)\" location=\"([^\"]+)\">\\n([\\s\\S]*?)\\n<\\/skill>(?:\\n\\n([\\s\\S]+))?$/,\n\t);\n\tif (!legacyMatch) return null;\n\treturn {\n\t\tname: legacyMatch[1],\n\t\tlocation: legacyMatch[2],\n\t\tcontent: legacyMatch[3],\n\t\tuserMessage: legacyMatch[4]?.trim() || undefined,\n\t};\n}\n\nexport type SkillInvocationSyntax = \"dollar\" | \"slash\";\n\nexport interface CommandInvocation {\n\tname: string;\n\tsource: \"extension\" | \"prompt\";\n\tsourceInfo: SourceInfo;\n\tsyntax: \"slash\";\n}\n\nexport interface SkillInvocationToken {\n\tname: string;\n\tsyntax: SkillInvocationSyntax;\n\tstart: number;\n\tend: number;\n\tposition: \"inline\" | \"leading\";\n}\n\nexport const MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT = 64;\n\nconst LEADING_SKILL_INVOCATION_PATTERN = /^(?:\\/skill:([a-zA-Z][a-zA-Z0-9:_-]*)|\\$([a-zA-Z][a-zA-Z0-9:_-]*))(?=\\s|$)/;\nconst INLINE_DOLLAR_SKILL_INVOCATION_PATTERN = /(^|\\s)\\$skill:([a-zA-Z][a-zA-Z0-9:_-]*)(?=\\s|$)/g;\n\n/**\n * Find explicit skill invocation tokens without treating ordinary inline dollar\n * prose (for example `$HOME`) as executable.\n *\n * Leading runs accept `/skill:name`, `$name`, and `$skill:name`. Outside the\n * leading run only the desktop's explicit `$skill:name` token is executable.\n */\nexport function parseSkillInvocationTokens(text: string): SkillInvocationToken[] {\n\tconst tokens: SkillInvocationToken[] = [];\n\tlet cursor = 0;\n\n\twhile (cursor < text.length) {\n\t\twhile (cursor < text.length && /\\s/.test(text[cursor]!)) cursor++;\n\t\tconst match = text.slice(cursor).match(LEADING_SKILL_INVOCATION_PATTERN);\n\t\tif (!match) break;\n\t\tconst syntax: SkillInvocationSyntax = match[1] ? \"slash\" : \"dollar\";\n\t\tconst dollarName = match[2];\n\t\tconst name = match[1] ?? (dollarName?.startsWith(\"skill:\") ? dollarName.slice(\"skill:\".length) : dollarName);\n\t\tif (!name) break;\n\t\ttokens.push({\n\t\t\tname,\n\t\t\tsyntax,\n\t\t\tstart: cursor,\n\t\t\tend: cursor + match[0].length,\n\t\t\tposition: \"leading\",\n\t\t});\n\t\tif (tokens.length >= MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT) return tokens;\n\t\tcursor += match[0].length;\n\t}\n\n\tINLINE_DOLLAR_SKILL_INVOCATION_PATTERN.lastIndex = cursor;\n\tfor (const match of text.matchAll(INLINE_DOLLAR_SKILL_INVOCATION_PATTERN)) {\n\t\tconst start = (match.index ?? 0) + match[1].length;\n\t\ttokens.push({\n\t\t\tname: match[2],\n\t\t\tsyntax: \"dollar\",\n\t\t\tstart,\n\t\t\tend: start + `$skill:${match[2]}`.length,\n\t\t\tposition: \"inline\",\n\t\t});\n\t\tif (tokens.length >= MAX_SKILL_INVOCATION_TOKENS_PER_PROMPT) break;\n\t}\n\n\treturn tokens;\n}\n\nfunction stripLeadingInvocationSeparators(text: string): string {\n\tlet cursor = 0;\n\twhile (text[cursor] === \" \" || text[cursor] === \"\\t\") cursor++;\n\twhile (text[cursor] === \"\\n\" || (text[cursor] === \"\\r\" && text[cursor + 1] === \"\\n\")) {\n\t\tcursor += text[cursor] === \"\\r\" ? 2 : 1;\n\t\tconst lineStart = cursor;\n\t\twhile (text[cursor] === \" \" || text[cursor] === \"\\t\") cursor++;\n\t\tif (text[cursor] !== \"\\n\" && !(text[cursor] === \"\\r\" && text[cursor + 1] === \"\\n\")) {\n\t\t\treturn text.slice(lineStart);\n\t\t}\n\t}\n\treturn text.slice(cursor);\n}\n\nfunction removeSkillInvocationTokens(text: string, tokens: readonly SkillInvocationToken[]): string {\n\tlet cursor = 0;\n\tlet result = \"\";\n\tfor (const token of tokens) {\n\t\tresult += text.slice(cursor, token.start);\n\t\tcursor = token.end;\n\t\tif (\n\t\t\ttoken.position === \"inline\" &&\n\t\t\t(result.endsWith(\" \") || result.endsWith(\"\\t\")) &&\n\t\t\t(text[cursor] === \" \" || text[cursor] === \"\\t\")\n\t\t) {\n\t\t\tcursor++;\n\t\t}\n\t}\n\tresult += text.slice(cursor);\n\treturn tokens.some((token) => token.position === \"leading\") ? stripLeadingInvocationSeparators(result) : result;\n}\n\n/** Session-specific events that extend the core AgentEvent */\ntype AgentSessionAgentEndEvent = Extract<AgentEvent, { type: \"agent_end\" }> & {\n\twillRetry: boolean;\n};\n\nexport type AgentSessionEvent =\n\t| Exclude<AgentEvent, { type: \"agent_end\" }>\n\t| AgentSessionAgentEndEvent\n\t| { type: \"agent_settled\" }\n\t| { type: \"agent_idle\" }\n\t| { type: \"session_abort\" }\n\t| { type: \"continuation_error\"; errorMessage: string }\n\t| {\n\t\t\ttype: \"skill_invocation\";\n\t\t\tskills: readonly {\n\t\t\t\tname: string;\n\t\t\t\tpath: string;\n\t\t\t\tsyntax: SkillInvocationSyntax;\n\t\t\t}[];\n\t }\n\t| {\n\t\t\ttype: \"command_invocation\";\n\t\t\tcommand: CommandInvocation;\n\t }\n\t| {\n\t\t\ttype: \"queue_update\";\n\t\t\tsteering: readonly string[];\n\t\t\tfollowUp: readonly string[];\n\t\t\tordered: readonly { text: string; mode: \"steer\" | \"followUp\"; enqueueOrder: number }[];\n\t }\n\t| { type: \"compaction_start\"; reason: CompactionReason; requestId?: string }\n\t| {\n\t\t\ttype: \"compaction_progress\";\n\t\t\treason: CompactionReason;\n\t\t\tdelta?: string;\n\t\t\ttext?: string;\n\t }\n\t| { type: \"entry_appended\"; entry: SessionEntry }\n\t| { type: \"session_info_changed\"; name: string | undefined }\n\t| ExtensionToolHookLifecycleEvent\n\t| SystemPromptChangeEvent\n\t| { type: \"thinking_level_changed\"; level: ThinkingLevel }\n\t| {\n\t\t\ttype: \"high_reasoning_warning\";\n\t\t\tmodelId: string;\n\t\t\tprovider: string;\n\t\t\tthinkingLevel: ThinkingLevel;\n\t }\n\t| ({ type: \"settings_source_selected\" } & SettingsSourceSelection)\n\t/** Active model changed; `thinkingLevel` is the level in force AFTER the switch. */\n\t| {\n\t\t\ttype: \"model_changed\";\n\t\t\tmodel: Model<any>;\n\t\t\tthinkingLevel: ThinkingLevel;\n\t\t\tsource: ModelSelectSource;\n\t }\n\t/** Effective service tier or fast-mode state changed. */\n\t| { type: \"service_tier_changed\"; tier?: ServiceTier; fastMode: boolean }\n\t| {\n\t\t\ttype: \"session_settings_changed\";\n\t\t\tsteeringMode: \"all\" | \"one-at-a-time\";\n\t\t\tfollowUpMode: \"all\" | \"one-at-a-time\";\n\t\t\tautoCompactionEnabled: boolean;\n\t }\n\t| {\n\t\t\ttype: \"compaction_end\";\n\t\t\treason: CompactionReason;\n\t\t\tresult: CompactionResult | undefined;\n\t\t\taborted: boolean;\n\t\t\twillRetry: boolean;\n\t\t\trequestId?: string;\n\t\t\taccepted?: boolean;\n\t\t\trejectionCause?: CompactionRejectionCause;\n\t\t\terrorMessage?: string;\n\t }\n\t| {\n\t\t\ttype: \"auto_retry_start\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdelayMs: number;\n\t\t\terrorMessage: string;\n\t }\n\t| {\n\t\t\ttype: \"auto_retry_end\";\n\t\t\tsuccess: boolean;\n\t\t\tattempt: number;\n\t\t\tfinalError?: string;\n\t }\n\t| {\n\t\t\ttype: \"retry_fallback_applied\";\n\t\t\tfrom: string;\n\t\t\tto: string;\n\t\t\tchainKey: string;\n\t\t\treason: \"transient\" | \"refusal\" | \"hard-error\" | \"billing\";\n\t }\n\t| { type: \"retry_fallback_succeeded\"; model: string; chainKey: string }\n\t| { type: \"retry_fallback_reverted\"; from: string; to: string }\n\t| { type: \"retry_fallback_exhausted\"; chainKey: string; lastError: string }\n\t| {\n\t\t\ttype: \"server_fallback_aborted\";\n\t\t\tfrom: string;\n\t\t\tto: string;\n\t\t\tchainConfigured: boolean;\n\t }\n\t// Auth login flow (task 13) is additive with event-only completion. The\n\t// login_start command responds immediately, then the OAuth URL and the\n\t// terminal result arrive here, because an interactive browser round-trip\n\t// cannot fit inside the request timeout.\n\t| { type: \"auth_login_url\"; provider: string; url: string }\n\t| {\n\t\t\ttype: \"auth_login_end\";\n\t\t\tprovider: string;\n\t\t\tsuccess: boolean;\n\t\t\terror?: string;\n\t }\n\t| {\n\t\t\ttype: \"summarization_retry_scheduled\";\n\t\t\tattempt: number;\n\t\t\tmaxAttempts: number;\n\t\t\tdelayMs: number;\n\t\t\terrorMessage: string;\n\t }\n\t| { type: \"summarization_retry_attempt_start\"; source: \"branchSummary\" }\n\t| {\n\t\t\ttype: \"summarization_retry_attempt_start\";\n\t\t\tsource: \"compaction\";\n\t\t\treason: CompactionReason;\n\t }\n\t| { type: \"summarization_retry_finished\" }\n\t| {\n\t\t\ttype: \"retry_probe_scheduled\";\n\t\t\tselector: string;\n\t\t\tatMs: number;\n\t\t\tprobeIndex: 1 | 2;\n\t }\n\t| {\n\t\t\ttype: \"retry_probe_result\";\n\t\t\tselector: string;\n\t\t\tok: boolean;\n\t\t\terrorMessage?: string;\n\t }\n\t| { type: \"bash_execution_update\"; id?: string; delta: string };\n\n/** Listener function for agent session events */\nexport type AgentSessionEventListener = (event: AgentSessionEvent) => void;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nfunction withoutDeletedHeaders(headers: ProviderHeaders | undefined): Record<string, string> | undefined {\n\treturn headers\n\t\t? Object.fromEntries(Object.entries(headers).filter((entry): entry is [string, string] => entry[1] !== null))\n\t\t: undefined;\n}\n\nexport interface AgentSessionConfig {\n\tagent: Agent;\n\tsessionManager: SessionManager;\n\tsettingsManager: SettingsManager;\n\tcwd: string;\n\t/** Directory containing runtime logs and global agent configuration. */\n\tagentDir?: string;\n\t/** Clock override for fallback selector cooldowns (tests only). */\n\tfallbackNow?: () => number;\n\t/** Random source for retry jitter (tests only). */\n\tretryRandom?: () => number;\n\t/** Global model narrowing for selectors and startup model choice (from --models / enabledModels) */\n\tscopedModels?: Array<{\n\t\tmodel: Model<any>;\n\t\tthinkingLevel?: ThinkingLevel;\n\t\tthinkingSelection?: ThinkingSelection;\n\t\tserviceTier?: ServiceTier;\n\t}>;\n\t/** Favorite models to cycle through with Ctrl+P */\n\tfavoriteModels?: Array<{\n\t\tmodel: Model<any>;\n\t\tthinkingLevel?: ThinkingLevel;\n\t\tthinkingSelection?: ThinkingSelection;\n\t\tserviceTier?: ServiceTier;\n\t}>;\n\t/** Resource loader for extensions, skills, prompts, themes, context files, and system prompt */\n\tresourceLoader: ResourceLoader;\n\t/** SDK custom tools registered outside extensions */\n\tcustomTools?: ToolDefinition[];\n\t/** Canonical model/auth runtime used by coding-agent internals. */\n\tmodelRuntime?: ModelRuntime;\n\t/** Legacy model facade retained for extensions and SDK consumers. */\n\tmodelRegistry?: ModelRegistry;\n\t/** Initial active built-in tool names. Default: [read, bash, edit, write] */\n\tinitialActiveToolNames?: string[];\n\t/** Configured built-in defaults; fork-native builtin extension tools outside this set are omitted. */\n\tdefaultToolNames?: string[];\n\t/** Tool names that remain executable only through the registered eval tool. */\n\tevalOnlyToolNames?: string[];\n\t/** Optional allowlist of tool names. When provided, only these tool names are exposed. */\n\tallowedToolNames?: string[];\n\t/** Optional denylist of tool names. When provided, these tool names are not exposed. */\n\texcludedToolNames?: string[];\n\t/**\n\t * Override base tools (useful for custom runtimes).\n\t *\n\t * These are synthesized into minimal ToolDefinitions internally so AgentSession can keep\n\t * a definition-first registry even when callers provide plain AgentTool instances.\n\t */\n\tbaseToolsOverride?: Record<string, AgentTool>;\n\t/** Mutable ref used by Agent to access the current ExtensionRunner */\n\textensionRunnerRef?: { current?: ExtensionRunner };\n\t/** Session start event metadata emitted when extensions bind to this runtime. */\n\tsessionStartEvent?: SessionStartEvent;\n\tautoTitleSessions?: boolean;\n}\n\ntype SessionModelEntry = {\n\tmodel: Model<any>;\n\tthinkingLevel?: ThinkingLevel;\n\tthinkingSelection?: ThinkingSelection;\n\tserviceTier?: ServiceTier;\n};\n\ninterface CompactionExecutionRequest {\n\tcontroller: AbortController;\n\towner: \"auto\" | \"compaction\";\n\treason: CompactionReason;\n\trequestId?: string;\n\tcustomInstructions?: string;\n\twillRetry: boolean;\n\tskipAbortedCheck?: boolean;\n\tlastAssistantMessage?: AgentMessage;\n\tprecomputed?: CompactionResult;\n\tallowSummaryOnly?: boolean;\n\tagentMessagesAtStart?: readonly AgentMessage[];\n}\n\ntype CompactionExecutionResult =\n\t| {\n\t\t\taccepted: true;\n\t\t\trequestId: string;\n\t\t\tresult: CompactionResult;\n\t\t\tcompactionEntry: CompactionEntry;\n\t\t\tfromExtension: boolean;\n\t }\n\t| {\n\t\t\taccepted: false;\n\t\t\trequestId: string;\n\t\t\trejectionCause: CompactionRejectionCause;\n\t };\n\ntype PendingCompactionAdmission = {\n\treadonly controller: AbortController;\n\treadonly finishSessionWork: () => void;\n\toutcome?: \"completed\" | \"failed\" | \"aborted\";\n};\n\nfunction isCompactionOwnedPreCompactDiagnostic(message: AgentMessage, requestId: string): boolean {\n\tif (message.role !== \"custom\" || message.customType !== \"senpi.hook\") return false;\n\tconst details = message.details;\n\tif (!details || typeof details !== \"object\") return false;\n\tconst diagnostic = details as {\n\t\tevent?: unknown;\n\t\tcompactionRequestId?: unknown;\n\t};\n\treturn diagnostic.event === \"PreCompact\" && diagnostic.compactionRequestId === requestId;\n}\n\n/**\n * Human-readable rejection message paired with a `CompactionRejectionCause`.\n *\n * Kept exhaustive over the union so the compiler flags any new cause that would\n * otherwise reintroduce silent failures at the `compaction_end` UI seam.\n */\nfunction describeCompactionRejection(cause: CompactionRejectionCause): string {\n\tswitch (cause) {\n\t\tcase \"would-overflow\":\n\t\t\treturn \"Compaction rejected: the produced summary would still overflow the model context window. Reduce context (e.g. /new, drop attachments) or switch to a larger-context model.\";\n\t\tcase \"cancelled-by-extension\":\n\t\t\treturn \"Compaction rejected: cancelled by an extension.\";\n\t\tcase \"external-owner\":\n\t\t\treturn \"Compaction rejected: the active provider owns compaction for this session.\";\n\t\tcase \"circuit-breaker\":\n\t\t\treturn \"Compaction rejected: the compaction circuit breaker is open after repeated failures. Wait for the cooldown and retry.\";\n\t\tcase \"per-turn-cap\":\n\t\t\t// Historical cause identifier kept for extension-API stability; since the\n\t\t\t// per-turn soft cap was removed it fires only at the absolute session cap.\n\t\t\treturn \"Compaction rejected: absolute compaction cap reached for this session.\";\n\t\tcase \"stale-revision\":\n\t\t\treturn \"Compaction rejected: the session changed while the summary was being prepared. Retry compaction against the latest context.\";\n\t}\n}\n\nclass CompactionRejectedError extends Error {\n\treadonly rejectionCause: CompactionRejectionCause;\n\n\tconstructor(rejectionCause: CompactionRejectionCause) {\n\t\tsuper(\n\t\t\trejectionCause === \"cancelled-by-extension\"\n\t\t\t\t? \"Compaction cancelled\"\n\t\t\t\t: describeCompactionRejection(rejectionCause),\n\t\t);\n\t\tthis.name = \"CompactionRejectedError\";\n\t\tthis.rejectionCause = rejectionCause;\n\t}\n}\n\nclass CompactionCancelledError extends Error {\n\tconstructor() {\n\t\tsuper(\"Compaction cancelled\");\n\t\tthis.name = \"CompactionCancelledError\";\n\t}\n}\n\n/**\n * An execution failure annotated with whether this operation still owns its\n * terminal transition. Callers must not publish a terminal event for an\n * operation that a newer compaction generation has superseded.\n */\nclass CompactionExecutionError extends Error {\n\treadonly ownsTerminalTransition: boolean;\n\treadonly aborted: boolean;\n\n\tconstructor(error: unknown, ownsTerminalTransition: boolean, aborted: boolean) {\n\t\tsuper(error instanceof Error ? error.message : String(error));\n\t\tthis.name = \"CompactionExecutionError\";\n\t\tthis.ownsTerminalTransition = ownsTerminalTransition;\n\t\tthis.aborted = aborted;\n\t}\n}\n\nfunction compactionExecutionOwnsTerminalTransition(error: unknown): boolean {\n\treturn !(error instanceof CompactionExecutionError) || error.ownsTerminalTransition;\n}\n\nfunction isCompactionExecutionAborted(error: unknown): boolean {\n\treturn (\n\t\t(error instanceof CompactionExecutionError && error.aborted) ||\n\t\terror instanceof CompactionCancelledError ||\n\t\t(error instanceof Error && error.name === \"AbortError\")\n\t);\n}\n\nclass RequiredCompactionError extends Error {\n\tconstructor() {\n\t\tsuper(\"Context remains above the compaction threshold because compaction did not complete\");\n\t\tthis.name = \"RequiredCompactionError\";\n\t}\n}\n\nclass MissingModelAccessError extends Error {\n\tconstructor() {\n\t\tsuper(\"AgentSession requires modelRuntime or modelRegistry\");\n\t\tthis.name = \"MissingModelAccessError\";\n\t}\n}\nexport interface ExtensionBindings {\n\tuiContext?: ExtensionUIContext;\n\tmode?: ExtensionMode;\n\tcommandContextActions?: ExtensionCommandContextActions;\n\tabortHandler?: () => void;\n\tshutdownHandler?: ShutdownHandler;\n\tonError?: ExtensionErrorListener;\n}\n\n/** Options for AgentSession.prompt() */\nexport type PromptDisposition = \"handled\" | \"queued\" | \"started\";\n\nexport type QueuedInput = {\n\treadonly text: string;\n\treadonly mode: \"steer\" | \"followUp\";\n\treadonly enqueueOrder: number;\n};\n\nexport type ClearedQueue = {\n\tsteering: string[];\n\tfollowUp: string[];\n\t/** Global enqueue order, independent of native delivery priority. */\n\treadonly ordered: readonly QueuedInput[];\n};\n\nexport interface PromptOptions {\n\t/** Whether to dispatch extension commands and expand skill commands and prompt templates (default: true) */\n\texpandPromptTemplates?: boolean;\n\t/** Image attachments */\n\timages?: ImageContent[];\n\t/** When streaming, how to queue the message: \"steer\" (interrupt) or \"followUp\" (wait). Required if streaming. */\n\tstreamingBehavior?: \"steer\" | \"followUp\";\n\t/** Session-only thinking level applied before starting this prompt. */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Source of input for extension input event handlers. Defaults to \"interactive\". */\n\tsource?: InputSource;\n\t/** Internal hook used by RPC mode to observe prompt preflight acceptance or rejection. */\n\tpreflightResult?: (success: boolean) => void;\n\t/** Internal hook used by the TUI to distinguish handled input from owned prompt work. */\n\tpromptDisposition?: (disposition: PromptDisposition) => void;\n\t/** Internal cancellation signal for a prompt that has not acquired session-work ownership yet. */\n\tsignal?: AbortSignal;\n\t/** Internal callback used by fire-and-forget extension input to retain session-work ownership after its barrier wait. */\n\tonSessionWorkReady?: () => void;\n\tsessionTitlePrompt?: string | false;\n}\n\n/** Result from cycleModel() */\nexport interface ModelCycleResult {\n\tmodel: Model<any>;\n\tthinkingLevel: ThinkingLevel;\n\t/** Whether cycling used the configured favorite model list */\n\tisScoped: boolean;\n\t/** Present when the model switch also changed the active system prompt. */\n\tsystemPromptChange?: SystemPromptChangeEvent;\n}\n\n/** Session statistics for /session command */\nexport interface SessionStats {\n\tsessionFile: string | undefined;\n\tsessionId: string;\n\tuserMessages: number;\n\tassistantMessages: number;\n\ttoolCalls: number;\n\ttoolResults: number;\n\ttotalMessages: number;\n\ttokens: {\n\t\tinput: number;\n\t\toutput: number;\n\t\tcacheRead: number;\n\t\tcacheWrite: number;\n\t\ttotal: number;\n\t};\n\tcost: number;\n\tcontextUsage?: ContextUsage;\n}\n\ninterface ToolDefinitionEntry {\n\tdefinition: ToolDefinition;\n\tsourceInfo: SourceInfo;\n}\n\nfunction estimateMessagesTokens(messages: AgentMessage[]): number {\n\tlet tokens = 0;\n\tfor (const message of messages) {\n\t\ttokens += estimateTokens(message);\n\t}\n\treturn tokens;\n}\n\nfunction isSameOverflowSource(\n\tmessage: AssistantMessage,\n\tmodel: Model<Api>,\n\tupstreamModelId: string | undefined,\n): boolean {\n\tif (message.provider !== model.provider) return false;\n\tif (message.model === model.id) return true;\n\treturn message.model === upstreamModelId;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/** Thinking levels including native max (Opus 4.6 legacy / Opus 4.7 native). */\nconst THINKING_LEVELS_WITH_MAX: ThinkingLevel[] = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\n\n/** Caps explicit skill expansion so one prompt cannot consume unbounded context. */\nexport const MAX_SKILL_EXPANSIONS_PER_PROMPT = 5;\n\n/** Cursor ingest rejects large verbatim tool payloads. The bound is UTF-8 bytes. */\nexport const CURSOR_TOOL_RESULT_MAX_CHARS = 2000;\nexport const CURSOR_TOOL_RESULT_MAX_BYTES = 50_000;\nconst CURSOR_TRUNCATION_MARKER = \"\\n...[truncated]\";\n\nexport function truncateToolResultBodies(\n\tmessages: AgentMessage[] | undefined,\n\tmaxChars = CURSOR_TOOL_RESULT_MAX_CHARS,\n\tmaxBytes = CURSOR_TOOL_RESULT_MAX_BYTES,\n\tconvert = (candidate: AgentMessage[]) => convertToLlm(candidate),\n): { messages: AgentMessage[] | undefined; changed: boolean } {\n\tif (!Array.isArray(messages) || messages.length === 0) return { messages, changed: false };\n\tconst segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\tconst markerChars = [...segmenter.segment(CURSOR_TRUNCATION_MARKER)].length;\n\tconst result = messages.slice();\n\tlet changed = false;\n\n\t// Apply the per-result character cap first, independent of the aggregate wire cap.\n\tfor (let messageIndex = result.length - 1; messageIndex >= 0; messageIndex--) {\n\t\tconst message = result[messageIndex];\n\t\tif (message.role !== \"toolResult\" || !Array.isArray(message.content)) continue;\n\t\tlet content = message.content;\n\t\tfor (let partIndex = content.length - 1; partIndex >= 0; partIndex--) {\n\t\t\tconst part = content[partIndex];\n\t\t\tif (part.type === \"image\" && typeof part.data === \"string\") continue;\n\t\t\tif (part.type !== \"text\" || typeof part.text !== \"string\") continue;\n\t\t\tconst graphemes = [...segmenter.segment(part.text)].map((item) => item.segment);\n\t\t\tif (graphemes.length <= maxChars) continue;\n\t\t\tconst kept = graphemes.slice(0, Math.max(0, maxChars - markerChars)).join(\"\");\n\t\t\tconst nextText = kept + CURSOR_TRUNCATION_MARKER;\n\t\t\tcontent = content === message.content ? content.slice() : content;\n\t\t\tcontent[partIndex] = { ...part, text: nextText };\n\t\t\tresult[messageIndex] = { ...message, content };\n\t\t\tchanged = true;\n\t\t}\n\t}\n\n\tconst measure = (candidate: AgentMessage[]): number => {\n\t\tconst converted = convert(candidate);\n\t\tconst activeUserMessageIndex = converted.at(-1)?.role === \"user\" ? converted.length - 1 : -1;\n\t\treturn measureCursorHistorySerializedBytes(converted, activeUserMessageIndex);\n\t};\n\tconst fits = (candidate = result) => measure(candidate) <= maxBytes;\n\tif (fits()) return { messages: changed ? result : messages, changed };\n\n\t// Empty the oldest result bodies. Search the monotonic prefix of candidates\n\t// rather than serializing once for every result (admission must stay bounded).\n\tconst emptyToolResult = (message: AgentMessage): AgentMessage => {\n\t\tif (message.role !== \"toolResult\" || !Array.isArray(message.content)) return message;\n\t\tconst emptiedContent = message.content.map((part) =>\n\t\t\tpart.type === \"text\" ? { ...part, text: \"\" } : part.type === \"image\" ? { ...part, data: \"\" } : part,\n\t\t);\n\t\tconst content = emptiedContent.filter((part, index) => {\n\t\t\tif (index === 0) return true;\n\t\t\tconst previous = emptiedContent[index - 1];\n\t\t\tconst empty = part.type === \"text\" ? part.text === \"\" : part.type === \"image\" && part.data === \"\";\n\t\t\tconst previousEmpty =\n\t\t\t\tprevious.type === \"text\" ? previous.text === \"\" : previous.type === \"image\" && previous.data === \"\";\n\t\t\treturn !empty || !previousEmpty;\n\t\t});\n\t\treturn { ...message, content };\n\t};\n\tconst toolResultIndexes = result.flatMap((message, index) =>\n\t\tmessage.role === \"toolResult\" && Array.isArray(message.content) ? [index] : [],\n\t);\n\tconst withEmptyPrefix = (count: number): AgentMessage[] => {\n\t\tconst candidate = result.slice();\n\t\tfor (let i = 0; i < count; i++)\n\t\t\tcandidate[toolResultIndexes[i]] = emptyToolResult(candidate[toolResultIndexes[i]]);\n\t\treturn candidate;\n\t};\n\tlet low = 0;\n\tlet high = toolResultIndexes.length;\n\twhile (low < high) {\n\t\tconst middle = Math.floor((low + high) / 2);\n\t\tif (fits(withEmptyPrefix(middle + 1))) high = middle;\n\t\telse low = middle + 1;\n\t}\n\tconst emptyCount = Math.min(low + 1, toolResultIndexes.length);\n\tif (emptyCount > 0) {\n\t\tresult.splice(0, result.length, ...withEmptyPrefix(emptyCount));\n\t\tchanged = true;\n\t}\n\tif (fits()) return { messages: changed ? result : messages, changed };\n\n\t// If metadata alone exceeds the cap, discard the oldest complete turns. This\n\t// search is also monotonic and avoids quadratic whole-history reserialization.\n\tconst turnRanges: Array<[number, number]> = [];\n\tconst isConvertedUser = (message: AgentMessage): boolean => convert([message])[0]?.role === \"user\";\n\tfor (let index = 0; index < result.length; index++) {\n\t\tif (!isConvertedUser(result[index])) continue;\n\t\tconst nextUser = result.findIndex((message, nextIndex) => nextIndex > index && isConvertedUser(message));\n\t\tturnRanges.push([index, nextUser < 0 ? result.length : nextUser]);\n\t}\n\tconst withoutTurns = (count: number): AgentMessage[] => {\n\t\tif (count === 0) return result;\n\t\tconst start = turnRanges[0]?.[0] ?? 0;\n\t\tconst end = turnRanges[count - 1]?.[1] ?? start;\n\t\treturn [...result.slice(0, start), ...result.slice(end)];\n\t};\n\tlow = 0;\n\thigh = turnRanges.length;\n\twhile (low < high) {\n\t\tconst middle = Math.floor((low + high) / 2);\n\t\tif (fits(withoutTurns(middle + 1))) high = middle;\n\t\telse low = middle + 1;\n\t}\n\tconst turnCount = Math.min(low + 1, turnRanges.length);\n\tif (turnCount > 0) {\n\t\tconst next = withoutTurns(turnCount);\n\t\tresult.splice(0, result.length, ...next);\n\t\tchanged = true;\n\t}\n\treturn { messages: changed ? result : messages, changed };\n}\n\n// ============================================================================\n// AgentSession Class\n// ============================================================================\n\nexport function providerRetryWatchdogAbortMessage(\n\tretryTimeoutMs: number | undefined,\n\tstreamStartTimeoutMs: number | undefined,\n): string {\n\treturn (\n\t\t`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms` +\n\t\t(streamStartTimeoutMs === undefined\n\t\t\t? \" (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)\"\n\t\t\t: ` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`)\n\t);\n}\n\nexport class AgentSession {\n\treadonly agent: Agent;\n\treadonly sessionManager: SessionManager;\n\treadonly settingsManager: SettingsManager;\n\n\tprivate _scopedModels: SessionModelEntry[];\n\tprivate _favoriteModels: SessionModelEntry[];\n\n\t// Event subscription state\n\tprivate _unsubscribeAgent?: () => void;\n\tprivate _unsubscribeSettingsSource?: () => void;\n\tprivate _eventListeners: AgentSessionEventListener[] = [];\n\tprivate _agentEventQueue: Promise<void> = Promise.resolve();\n\t/**\n\t * Exact message objects whose message_end persistence is still queued.\n\t * Agent core appends messages to agent.state.messages before emitting\n\t * message_end; until that event settles on _agentEventQueue, compaction must\n\t * treat these identities as pending persistence, never as stale or droppable.\n\t */\n\tprivate readonly _messageEndsAwaitingPersistence = new Set<AgentMessage>();\n\tprivate _isAgentRunActive = false;\n\tprivate _toolExecutionDepth = 0;\n\tprivate _promptStartPending = false;\n\tprivate _nextInputId = 0;\n\tprivate _idleWaitPromise: Promise<void> | undefined;\n\tprivate _resolveIdleWait: (() => void) | undefined;\n\tprivate _settlementEpoch = 0;\n\n\t/** Tracks pending steering messages for UI display. Removed when delivered. */\n\tprivate _steeringMessages: string[] = [];\n\t/** Tracks pending follow-up messages for UI display. Removed when delivered. */\n\tprivate _followUpMessages: string[] = [];\n\t/** Recovery-only order across both native queue modes and TUI compaction ownership. */\n\tprivate _queuedInputOrder: QueuedInput[] = [];\n\tprivate _nextQueuedInputOrder = 0;\n\tprivate _sessionLogger: SessionLogger;\n\tprivate _activeCompactionLogAttempt:\n\t\t| { id: string; reason: CompactionReason; tokensBefore: number | undefined }\n\t\t| undefined;\n\tprivate readonly _supersededCompactionLogAttemptIds = new Set<string>();\n\t/** Messages queued to be included with the next user prompt as context (\"asides\"). */\n\tprivate _pendingNextTurnMessages: CustomMessage[] = [];\n\tprivate _pendingCustomMessages: CustomMessage[] = [];\n\t// Queues held while the first post-compaction response is classified. Agent\n\t// core otherwise drains steering immediately before AgentSession can consume\n\t// the stale-usage exemption and schedule the continuation itself.\n\tprivate _postCompactionDeferredSteeringMessages: AgentMessage[] = [];\n\tprivate _postCompactionDeferredFollowUpMessages: AgentMessage[] = [];\n\n\t// Compaction state\n\tprivate _compactionAbortController: AbortController | undefined = undefined;\n\tprivate _autoCompactionAbortController: AbortController | undefined = undefined;\n\tprivate _pendingCompactionAdmission: PendingCompactionAdmission | undefined = undefined;\n\tprivate readonly _compactionLifecycle = new CompactionLifecycleCoordinator();\n\tprivate readonly _sessionWorkBarrier = new SessionWorkBarrier();\n\t/**\n\t * Extension-published activity that outlives a turn (background terminal\n\t * jobs, terminal monitors, loop-guard holds). Counts persist across extension\n\t * reloads on purpose: a stale \"busy\" only delays reclamation, while a lost\n\t * one would let the host evict a session still doing work.\n\t */\n\tprivate readonly _wakeSources = new WakeSourceTracker();\n\tprivate _unsubscribeWakeSources: (() => void) | undefined;\n\tprivate _overflowRecoveryAttempted = false;\n\tprivate _compactionSkippedTooSmall = false;\n\tprivate _requiredCompactionAdmissionError: RequiredCompactionError | undefined;\n\t// Preserve provenance across agent-core's conversion of our admission error\n\t// into an assistant error message. Matching provider text alone is not proof\n\t// that AgentSession initiated required-compaction recovery.\n\tprivate _requiredCompactionTurnError: RequiredCompactionError | undefined;\n\t// A retry continuation immediately follows an accepted compaction. Its first\n\t// response must not retrigger threshold compaction from stale provider usage.\n\tprivate _skipNextPostRetryCompactionCheck = false;\n\tprivate _blockedPostCompactionAssistant: { assistant: AssistantMessage; revision: number } | undefined;\n\tprivate _delegatedCompactionKey: { provider: string; id: string } | undefined;\n\tprivate _skipNextPostCompactionAssistantCheck = false;\n\tprivate _scheduledContinuationRecompacted = false;\n\tprivate readonly _assistantsPendingAtCompaction = new WeakSet<AssistantMessage>();\n\tprivate readonly _postCompactionUsageExemptAssistants = new WeakSet<AssistantMessage>();\n\tprivate _messageRevision = 0;\n\n\t// Branch summarization state\n\tprivate _branchSummaryAbortController: AbortController | undefined = undefined;\n\n\tprivate _sessionTitleAbortController: AbortController | undefined = undefined;\n\tprivate _sessionTitlePromise: Promise<void> | undefined = undefined;\n\tprivate readonly _autoTitleSessions: boolean;\n\n\t// Retry state\n\tprivate _retryAbortController: AbortController | undefined = undefined;\n\tprivate _retryAttempt = 0;\n\n\t/**\n\t * Resolve the effective retry profile for the current model's provider.\n\t * Falls back to the senpi-default profile when the provider declares none.\n\t */\n\tprivate _resolveRetryProfile() {\n\t\tconst providerId = this.model?.provider;\n\t\tconst declared = providerId !== undefined ? this._modelRuntime.getProvider(providerId)?.retryPolicy : undefined;\n\t\treturn this.settingsManager.resolveRetryProfile(\n\t\t\tproviderId !== undefined ? { id: providerId, retryPolicy: declared } : undefined,\n\t\t);\n\t}\n\tprivate _probePhase: ProbePhase = \"idle\";\n\tprivate _hintDeadlineMs: number | undefined = undefined;\n\tprivate _cumulativeHintedWaitMs = 0;\n\tprivate _retryPromise: Promise<void> | undefined = undefined;\n\tprivate _retryResolve: (() => void) | undefined = undefined;\n\tprivate _userAbortPromise: Promise<void> | undefined = undefined;\n\tprivate readonly _abortProvenance = new AgentAbortProvenance();\n\tprivate readonly _agentSettledDelivery = new AgentSettledDelivery();\n\tprivate _suppressQueuedContinuationAfterUserAbort = false;\n\tprivate _userAbortGeneration = 0;\n\t/** Set when clearQueue({ abortWillFollow: true }) drains queues immediately before abort(). */\n\tprivate _hadClearedQueuedMessages = false;\n\tprivate _extensionEventSignal: AbortSignal | undefined = undefined;\n\n\t// Bash execution state\n\tprivate readonly _bashAbortControllers = new Set<AbortController>();\n\tprivate _pendingBashMessages: BashExecutionMessage[] = [];\n\n\t// Extension system\n\tprivate _extensionRunner!: ExtensionRunner;\n\tprivate _turnIndex = 0;\n\n\tprivate _resourceLoader: ResourceLoader;\n\tprivate _customTools: ToolDefinition[];\n\tprivate _baseToolDefinitions: Map<string, ToolDefinition> = new Map();\n\tprivate _cwd: string;\n\tprivate _agentDir: string;\n\tprivate _extensionRunnerRef?: { current?: ExtensionRunner };\n\tprivate _initialActiveToolNames?: string[];\n\tprivate _defaultToolNames?: Set<string>;\n\tprivate _evalOnlyToolNames?: ReadonlySet<string>;\n\t/** Explicit config override; when supplied it wins over the fixed policy across reloads. */\n\tprivate readonly _evalOnlyToolNamesOverride?: ReadonlySet<string>;\n\t/** Policy tools withheld from the model, retained so disarming can restore direct access. */\n\tprivate readonly _withheldEvalOnlyToolNames = new Set<string>();\n\t/** Eval-only hint names this session published, so a disarm can withdraw exactly those. */\n\tprivate readonly _publishedEvalOnlyHintNames = new Set<string>();\n\t/** Active-tool selection as requested by callers, before eval-only filtering. */\n\tprivate _requestedActiveToolNames?: string[];\n\tprivate _allowedToolNames?: Set<string>;\n\tprivate _excludedToolNames?: Set<string>;\n\tprivate _baseToolsOverride?: Record<string, AgentTool>;\n\tprivate _sessionStartEvent: SessionStartEvent;\n\tprivate _extensionUIContext?: ExtensionUIContext;\n\tprivate _extensionMode: ExtensionMode = \"print\";\n\tprivate _extensionCommandContextActions?: ExtensionCommandContextActions;\n\tprivate _extensionAbortHandler?: () => void;\n\tprivate _extensionShutdownHandler?: ShutdownHandler;\n\tprivate _extensionErrorListener?: ExtensionErrorListener;\n\tprivate _extensionErrorUnsubscriber?: () => void;\n\tprivate _extensionBindingPromptReadiness: Set<Promise<void>> | undefined;\n\n\tprivate _modelRuntime: ModelRuntime;\n\tprivate _modelRegistry: ModelRegistry;\n\tprivate readonly _fallbackValidationWarnings: readonly string[];\n\tprivate readonly _retryFallback: RetryFallbackController;\n\tprivate readonly _selectorCooldowns: SelectorCooldowns;\n\tprivate readonly _probeBackScheduler: ProbeBackScheduler;\n\tprivate readonly _fallbackNow: () => number;\n\tprivate readonly _retryRandom: () => number;\n\n\t// Tool registry for extension getTools/setTools\n\tprivate _toolRegistry: Map<string, AgentTool> = new Map();\n\tprivate _lazyToolActivators: LazyToolActivator[] = [];\n\tprivate _toolDefinitions: Map<string, ToolDefinitionEntry> = new Map();\n\tprivate _toolPromptSnippets: Map<string, string> = new Map();\n\tprivate _toolPromptGuidelines: Map<string, string[]> = new Map();\n\n\t// Base system prompt (without extension appends) - used to apply fresh appends each turn\n\tprivate _baseSystemPrompt = \"\";\n\tprivate _currentServiceTier: ServiceTier | undefined = undefined;\n\tprivate _sessionFastMode = false;\n\tprivate readonly _shownHighReasoningWarningKeys = new Set<string>();\n\t// Widened with the upstream BuildSystemPromptOptions user-override fields so\n\t// extensions (prompt-preset) can see CLI/SDK custom prompts via\n\t// before_agent_start/model_select systemPromptOptions and ctx.getSystemPromptOptions().\n\tprivate _baseSystemPromptOptions!: BuildDynamicSystemPromptOptions & {\n\t\tcustomPrompt?: string;\n\t\tappendSystemPrompt?: string;\n\t};\n\tprivate _systemPromptOverride?: string;\n\n\tconstructor(config: AgentSessionConfig) {\n\t\tthis.agent = config.agent;\n\t\tthis.sessionManager = config.sessionManager;\n\t\tthis.settingsManager = config.settingsManager;\n\t\tthis._unsubscribeSettingsSource = this.settingsManager.subscribeToSourceSelection((source) => {\n\t\t\tthis._emit({ type: \"settings_source_selected\", ...source });\n\t\t});\n\t\tconst noModelFallback =\n\t\t\tconfig.resourceLoader.getExtensions().runtime.flagValues.get(\"no-model-fallback\") === true ||\n\t\t\tenvValue(\"NO_FALLBACK\") === \"1\";\n\t\tif (noModelFallback) {\n\t\t\tthis.settingsManager.applyOverrides({ retry: { modelFallback: false } });\n\t\t}\n\t\tthis._scopedModels = config.scopedModels ?? [];\n\t\tthis._favoriteModels = config.favoriteModels ?? [];\n\t\tthis._resourceLoader = config.resourceLoader;\n\t\tthis._customTools = config.customTools ?? [];\n\t\tthis._cwd = config.cwd;\n\t\tconst modelRuntime = config.modelRuntime ?? config.modelRegistry?.modelRuntime;\n\t\tif (!modelRuntime) {\n\t\t\tthrow new MissingModelAccessError();\n\t\t}\n\t\tthis._modelRuntime = modelRuntime;\n\t\tthis._modelRegistry = config.modelRegistry ?? new ModelRegistry(modelRuntime);\n\t\tthis._agentDir = config.agentDir ?? getAgentDir();\n\t\tconst fallbackLogger = createFallbackLogger(this._agentDir);\n\t\tthis._sessionLogger = createSessionLogger(this._agentDir);\n\t\tthis._fallbackValidationWarnings = validateFallbackChains(\n\t\t\tthis.settingsManager.getRawFallbackChains(),\n\t\t\tthis._modelRegistry,\n\t\t);\n\t\t// `source` names the scope that supplied the chains so a single log line\n\t\t// points at the file to open; \"default\" means no scope configured any.\n\t\tconst fallbackChainsSource = this.settingsManager.getFallbackChainsScope() ?? \"default\";\n\t\tfor (const warning of this._fallbackValidationWarnings) {\n\t\t\tfallbackLogger.warn(\"validation_warning\", {\n\t\t\t\twarning,\n\t\t\t\tsource: fallbackChainsSource,\n\t\t\t});\n\t\t}\n\t\tthis._selectorCooldowns = new SelectorCooldowns(config.fallbackNow ?? (() => Date.now()));\n\t\tthis._fallbackNow = config.fallbackNow ?? (() => Date.now());\n\t\tthis._retryRandom = config.retryRandom ?? Math.random;\n\t\tthis._retryFallback = new RetryFallbackController({\n\t\t\tgetSettings: () => this.settingsManager.getRetryFallbackSettings(),\n\t\t\tregistry: this._modelRegistry,\n\t\t\tcooldowns: this._selectorCooldowns,\n\t\t\tlogger: fallbackLogger,\n\t\t\tswitchModel: async (model, thinking, reason) => {\n\t\t\t\tawait this._switchActiveModel(model, {\n\t\t\t\t\tpersistDefault: false,\n\t\t\t\t\tappendSessionEntry: true,\n\t\t\t\t\tentryReason: reason,\n\t\t\t\t\temitModelSelect: true,\n\t\t\t\t\tmodelSelectSource: reason,\n\t\t\t\t\tinvalidateCompaction: true,\n\t\t\t\t\tephemeralThinkingLevel: thinking,\n\t\t\t\t});\n\t\t\t},\n\t\t\temit: (event) => this._emit(event),\n\t\t\tgetCurrentSelector: () => (this.model ? { model: this.model, thinkingLevel: this.thinkingLevel } : undefined),\n\t\t\tisAuthAvailable: (provider) => this._modelRuntime.hasConfiguredAuth(provider),\n\t\t});\n\t\tthis._probeBackScheduler = new ProbeBackScheduler({\n\t\t\tnow: this._fallbackNow,\n\t\t});\n\t\tthis._extensionRunnerRef = config.extensionRunnerRef;\n\t\tthis._initialActiveToolNames = config.initialActiveToolNames;\n\t\tthis._defaultToolNames = config.defaultToolNames ? new Set(config.defaultToolNames) : undefined;\n\t\tthis._evalOnlyToolNamesOverride = config.evalOnlyToolNames ? new Set(config.evalOnlyToolNames) : undefined;\n\t\tthis._evalOnlyToolNames = this._resolveEvalOnlyToolNames();\n\t\tthis._allowedToolNames = config.allowedToolNames ? new Set(config.allowedToolNames) : undefined;\n\t\tthis._excludedToolNames = config.excludedToolNames ? new Set(config.excludedToolNames) : undefined;\n\t\tthis._baseToolsOverride = config.baseToolsOverride;\n\t\tthis._sessionStartEvent = config.sessionStartEvent ?? {\n\t\t\ttype: \"session_start\",\n\t\t\treason: \"startup\",\n\t\t};\n\t\tthis._autoTitleSessions = config.autoTitleSessions ?? false;\n\n\t\tconst initialModel = this.agent.state.model;\n\t\tif (initialModel) {\n\t\t\tconst scopedMatch = this._scopedModels.find((sm) => modelsAreEqual(sm.model, initialModel));\n\t\t\tthis._currentServiceTier = this._resolveServiceTier(initialModel, scopedMatch?.serviceTier);\n\t\t}\n\n\t\tthis._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);\n\t\tthis._installAgentToolHooks();\n\t\tthis._installAgentNextTurnRefresh();\n\n\t\tthis._buildRuntime({\n\t\t\tactiveToolNames: this._initialActiveToolNames,\n\t\t\tincludeAllExtensionTools: true,\n\t\t});\n\t}\n\n\tget modelRuntime(): ModelRuntime {\n\t\treturn this._modelRuntime;\n\t}\n\n\tget modelRegistry(): ModelRegistry {\n\t\treturn this._modelRegistry;\n\t}\n\n\tprivate async _getRequiredRequestAuth(model: Model<any>): Promise<{\n\t\tmodel: Model<any>;\n\t\tapiKey?: string;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t\tenv?: Record<string, string>;\n\t}> {\n\t\tlet result: AuthResult | undefined;\n\t\ttry {\n\t\t\tresult = await this._modelRuntime.getAuth(model);\n\t\t} catch (error) {\n\t\t\tconst cause = error instanceof Error ? error.cause : undefined;\n\t\t\tif (cause instanceof Error && cause.message === \"authHeader requires a resolved API key\") {\n\t\t\t\tthrow new Error(formatNoApiKeyFoundMessage(model.provider));\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t\tif (result && (result.auth.apiKey || result.auth.headers)) {\n\t\t\tconst requestModel = result.auth.baseUrl ? { ...model, baseUrl: result.auth.baseUrl } : model;\n\t\t\treturn {\n\t\t\t\tmodel: requestModel,\n\t\t\t\tapiKey: result.auth.apiKey,\n\t\t\t\theaders: withoutDeletedHeaders(result.auth.headers),\n\t\t\t\textraBody: this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,\n\t\t\t\tenv: result.env,\n\t\t\t};\n\t\t}\n\n\t\tconst isOAuth = this._modelRuntime.isUsingOAuth(model.provider);\n\t\tif (isOAuth) {\n\t\t\tthrow new Error(\n\t\t\t\t`Authentication failed for \"${model.provider}\". ` +\n\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t`Run '/login ${model.provider}' to re-authenticate.`,\n\t\t\t);\n\t\t}\n\t\tthrow new Error(formatNoApiKeyFoundMessage(model.provider));\n\t}\n\n\t/**\n\t * Resolve optional auth for a summarization stream. Native/custom stream\n\t * functions may provide ambient credentials, unlike streamSimple.\n\t */\n\tprivate async _getSummarizationRequestAuth(model: Model<any>): Promise<{\n\t\tmodel: Model<any>;\n\t\tapiKey?: string;\n\t\theaders?: Record<string, string>;\n\t\tenv?: Record<string, string>;\n\t}> {\n\t\tif (this.agent.streamFunction === streamSimple) {\n\t\t\treturn this._getRequiredRequestAuth(model);\n\t\t}\n\n\t\ttry {\n\t\t\tconst storedResult = await this._modelRuntime.getAuth(model);\n\t\t\tconst activeApiKey = await this.agent.getApiKey?.(model.provider);\n\t\t\tconst result =\n\t\t\t\tactiveApiKey !== undefined && storedResult?.source !== \"OAuth\"\n\t\t\t\t\t? await this._modelRuntime.getAuth(model, { apiKey: activeApiKey })\n\t\t\t\t\t: storedResult;\n\t\t\tif (!result) return { model };\n\t\t\tconst requestModel = result.auth.baseUrl ? { ...model, baseUrl: result.auth.baseUrl } : model;\n\t\t\treturn {\n\t\t\t\tmodel: requestModel,\n\t\t\t\tapiKey: result.auth.apiKey,\n\t\t\t\theaders: withoutDeletedHeaders(result.auth.headers),\n\t\t\t\tenv: result.env,\n\t\t\t};\n\t\t} catch {\n\t\t\treturn { model };\n\t\t}\n\t}\n\n\tprivate async _getCompactionRequestAuth(model: Model<any>): Promise<{\n\t\tmodel: Model<any>;\n\t\tapiKey?: string;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t\tenv?: Record<string, string>;\n\t}> {\n\t\tconst auth = await this._getSummarizationRequestAuth(model);\n\t\treturn {\n\t\t\t...auth,\n\t\t\textraBody: this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,\n\t\t};\n\t}\n\n\t/**\n\t * Install tool hooks once on the Agent instance.\n\t *\n\t * The callbacks read `this._extensionRunner` at execution time, so extension reload swaps in the\n\t * new runner without reinstalling hooks. Extension-specific tool wrappers are still used to adapt\n\t * registered tool execution to the extension context. Tool call and tool result interception now\n\t * happens here instead of in wrappers.\n\t */\n\t/**\n\t * Surface a provider-level server-fallback abort before retry handling runs so\n\t * the UI can explain the switch. Emitted synchronously here because retry work\n\t * for the following agent_end starts before queued message_end processing\n\t * drains. `chainConfigured` is required because the no-chain refusal path\n\t * emits no retry_fallback_exhausted, leaving the UI no other signal.\n\t */\n\tprivate _emitServerFallbackAborted(message: AssistantMessage): void {\n\t\tconst details = message.diagnostics?.find((entry) => entry.type === SERVER_FALLBACK_ABORTED_DIAGNOSTIC)?.details;\n\t\tif (details === undefined) return;\n\t\tthis._emit({\n\t\t\ttype: \"server_fallback_aborted\",\n\t\t\tfrom: typeof details.from === \"string\" ? details.from : message.model,\n\t\t\tto: typeof details.to === \"string\" ? details.to : message.model,\n\t\t\tchainConfigured: this._retryFallback.hasConfiguredChain(),\n\t\t});\n\t}\n\n\tprivate _installAgentToolHooks(): void {\n\t\tthis.agent.resolveUnknownToolCall = (toolName) => {\n\t\t\tlet service: ReturnType<typeof getToolSearchService>;\n\t\t\ttry {\n\t\t\t\tservice = getToolSearchService();\n\t\t\t} catch {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst catalogTool = service.getCatalog().some((doc) => doc.name === toolName);\n\t\t\tif (!catalogTool || !this._activateLazyTool(toolName)) return undefined;\n\t\t\treturn this.agent.state.tools.find((tool) => tool.name === toolName);\n\t\t};\n\n\t\tthis.agent.beforeToolCall = async ({ toolCall, args }) => {\n\t\t\tthis._toolExecutionDepth++;\n\t\t\ttry {\n\t\t\t\tconst result = await this.preflightToolCall(toolCall, args);\n\t\t\t\tif (result?.block) {\n\t\t\t\t\tthis._toolExecutionDepth--;\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} catch (err) {\n\t\t\t\tthis._toolExecutionDepth--;\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t};\n\n\t\tthis.agent.afterToolCall = async ({ toolCall, args, result, isError }) => {\n\t\t\ttry {\n\t\t\t\treturn await this._emitAfterToolCallHooks(toolCall, args, result, isError);\n\t\t\t} finally {\n\t\t\t\tthis._toolExecutionDepth--;\n\t\t\t}\n\t\t};\n\t}\n\n\tasync preflightToolCall(toolCall: AgentToolCall, args: unknown, options: { waitForEventQueue?: boolean } = {}) {\n\t\tif (options.waitForEventQueue !== false) {\n\t\t\tawait this._agentEventQueue;\n\t\t}\n\n\t\tconst runner = this._extensionRunner;\n\t\tif (!runner.hasHandlers(\"tool_call\")) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\ttry {\n\t\t\treturn await runner.emitToolCall({\n\t\t\t\ttype: \"tool_call\",\n\t\t\t\ttoolName: toolCall.name,\n\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\tinput: args as Record<string, unknown>,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tif (err instanceof Error) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new Error(`Extension failed, blocking execution: ${String(err)}`);\n\t\t}\n\t}\n\n\tprivate async _emitAfterToolCallHooks(\n\t\ttoolCall: AgentToolCall,\n\t\targs: unknown,\n\t\tresult: AgentToolResult<unknown>,\n\t\tisError: boolean,\n\t) {\n\t\tconst runner = this._extensionRunner;\n\t\tconst hookResult = runner.hasHandlers(\"tool_result\")\n\t\t\t? await runner.emitToolResult({\n\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\ttoolName: toolCall.name,\n\t\t\t\t\ttoolCallId: toolCall.id,\n\t\t\t\t\tinput: args as Record<string, unknown>,\n\t\t\t\t\tcontent: result.content,\n\t\t\t\t\tdetails: result.details,\n\t\t\t\t\tisError,\n\t\t\t\t\tusage: result.usage,\n\t\t\t\t})\n\t\t\t: undefined;\n\t\tconst content = hookResult?.content ?? result.content ?? [];\n\t\tconst normalizedContent = await normalizeToolResultImages(content, {\n\t\t\tautoResizeImages: this.settingsManager.getImageAutoResize(),\n\t\t});\n\n\t\tif (!hookResult && normalizedContent === content) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tcontent: normalizedContent,\n\t\t\tdetails: hookResult?.details,\n\t\t\tisError: hookResult?.isError ?? isError,\n\t\t\tusage: hookResult?.usage,\n\t\t};\n\t}\n\n\tprivate _installAgentNextTurnRefresh(): void {\n\t\tconst previousPrepareNextTurnWithContext =\n\t\t\tthis.agent.prepareNextTurnWithContext ??\n\t\t\t(this.agent.prepareNextTurn\n\t\t\t\t? async (_turn: PrepareNextTurnContext, signal?: AbortSignal) => await this.agent.prepareNextTurn?.(signal)\n\t\t\t\t: undefined);\n\t\tconst previousTransformContext = this.agent.transformContext;\n\t\tthis.agent.transformContext = async (messages, signal) => {\n\t\t\tconst transformed = previousTransformContext ? await previousTransformContext(messages, signal) : messages;\n\t\t\tif (this.model?.provider === \"cursor\" || this.model?.provider === \"cursor-cli-oauth\") {\n\t\t\t\treturn (\n\t\t\t\t\t(\n\t\t\t\t\t\tawait truncateToolResultBodies(\n\t\t\t\t\t\t\ttransformed,\n\t\t\t\t\t\t\tCURSOR_TOOL_RESULT_MAX_CHARS,\n\t\t\t\t\t\t\tCURSOR_TOOL_RESULT_MAX_BYTES,\n\t\t\t\t\t\t\t(candidate) => this.agent.convertToLlm(candidate) as Message[],\n\t\t\t\t\t\t)\n\t\t\t\t\t).messages ?? transformed\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn transformed;\n\t\t};\n\n\t\tthis.agent.prepareNextTurnWithContext = async (turn, signal) => {\n\t\t\t// Enforce compaction only when this prepare precedes an actual provider\n\t\t\t// admission: a tool continuation or queued steer/follow-up messages. A\n\t\t\t// completed turn with no continuation keeps pre-PR timing, while the\n\t\t\t// prior prepare callback and context refresh below still run every turn.\n\t\t\tconst compactBeforeNextAdmission = async (): Promise<boolean> => {\n\t\t\t\tconst provider = this.model?.provider;\n\t\t\t\t// Cursor rebuilds the full conversation each hop. Compacting here\n\t\t\t\t// mutates rootPrompt mid-run and poisons conversationId (#984).\n\t\t\t\t// Still truncate verbatim toolResult bodies so the skip cannot send MB-scale payloads (#1043).\n\t\t\t\tif (provider === \"cursor\" || provider === \"cursor-cli-oauth\") {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tif (turn.toolResults.length === 0 && !this.agent.hasQueuedMessages()) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tawait this._agentEventQueue;\n\t\t\t\t// A queue can be cleared while waiting for persistence. Re-sample it\n\t\t\t\t// immediately before compaction so a completed turn never compacts\n\t\t\t\t// merely because it once had a possible continuation.\n\t\t\t\tif (turn.toolResults.length === 0 && !this.agent.hasQueuedMessages()) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\treturn await this._enforceCompactionBeforeProvider(turn.message, true, \"threshold\");\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (error instanceof RequiredCompactionError) {\n\t\t\t\t\t\tthis._requiredCompactionTurnError = error;\n\t\t\t\t\t\tif (this.agent.hasQueuedMessages()) {\n\t\t\t\t\t\t\tthis._requiredCompactionAdmissionError = error;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst compactedBeforeCallback = await compactBeforeNextAdmission();\n\t\t\tconst messages = compactedBeforeCallback ? this.agent.state.messages.slice() : turn.context.messages;\n\n\t\t\tconst postCompactionTurn = {\n\t\t\t\t...turn,\n\t\t\t\tcontext: { ...turn.context, messages },\n\t\t\t};\n\t\t\tlet previousSnapshot = await previousPrepareNextTurnWithContext?.(postCompactionTurn, signal);\n\t\t\tlet previousContext = previousSnapshot?.context ?? postCompactionTurn.context;\n\t\t\t// The previous callback may await while agent_end extensions enqueue\n\t\t\t// continuation work. Re-sample after it returns so that work cannot\n\t\t\t// slip through with the stale provider snapshot it observed on entry.\n\t\t\tlet compactedAfterCallback = false;\n\t\t\tif (!compactedBeforeCallback) {\n\t\t\t\tcompactedAfterCallback = await compactBeforeNextAdmission();\n\t\t\t}\n\t\t\tif (compactedAfterCallback) {\n\t\t\t\t// The callback's first result describes the stale pre-compaction\n\t\t\t\t// context. Reapply it once to the compacted context so any host\n\t\t\t\t// transformation reaches the provider request. Do not re-sample after\n\t\t\t\t// this invocation: one replay is the bounded admission path.\n\t\t\t\tconst postLateCompactionTurn = {\n\t\t\t\t\t...turn,\n\t\t\t\t\tcontext: {\n\t\t\t\t\t\t...turn.context,\n\t\t\t\t\t\tmessages: this.agent.state.messages.slice(),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tconst postLateCompactionSnapshot = await previousPrepareNextTurnWithContext?.(\n\t\t\t\t\tpostLateCompactionTurn,\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t\tpreviousSnapshot = {\n\t\t\t\t\t...previousSnapshot,\n\t\t\t\t\t...postLateCompactionSnapshot,\n\t\t\t\t\tcontext: postLateCompactionSnapshot?.context ?? postLateCompactionTurn.context,\n\t\t\t\t};\n\t\t\t\tpreviousContext = previousSnapshot.context ?? postLateCompactionTurn.context;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...previousSnapshot,\n\t\t\t\tcontext: {\n\t\t\t\t\t...previousContext,\n\t\t\t\t\tmessages: previousContext.messages,\n\t\t\t\t\tsystemPrompt: this._systemPromptOverride ?? this._baseSystemPrompt,\n\t\t\t\t\ttools: this.agent.state.tools.slice(),\n\t\t\t\t},\n\t\t\t\tmodel: this.agent.state.model,\n\t\t\t\tthinkingLevel: this.agent.state.thinkingLevel,\n\t\t\t\tthinkingSelection: this.agent.state.thinkingSelection ?? null,\n\t\t\t\tabortServerSideFallback:\n\t\t\t\t\tthis.settingsManager.getAbortServerSideFallback() && this._retryFallback.hasConfiguredChain(),\n\t\t\t};\n\t\t};\n\t}\n\n\t// =========================================================================\n\t// Event Subscription\n\t// =========================================================================\n\n\t/** Emit an event to all listeners */\n\tprivate _emitEntryAppended(entryId: string): void {\n\t\tif (this._extensionMode !== \"rpc\") return;\n\t\tconst entry = this.sessionManager.getEntry(entryId);\n\t\tif (entry) this._emit({ type: \"entry_appended\", entry });\n\t}\n\n\t/** Append a transport-provided entry and publish it on the RPC event stream. */\n\tappendSessionEntry(entry: SessionEntry): void {\n\t\tthis.sessionManager.appendEntry(entry);\n\t\tthis.agent.state.messages = this.sessionManager.buildSessionContext().messages;\n\t\tthis._emitEntryAppended(entry.id);\n\t}\n\n\tprivate _emit(event: AgentSessionEvent): void {\n\t\tthis._logSessionEvent(event);\n\t\tfor (const l of this._eventListeners) {\n\t\t\tl(event);\n\t\t}\n\t}\n\n\tprivate async _emitSessionCompactFailed(event: Omit<SessionCompactFailedEvent, \"type\">): Promise<void> {\n\t\tif (this._extensionRunner.hasHandlers(\"session_compact_failed\")) {\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_compact_failed\",\n\t\t\t\t...event,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Mirror stuck-prone lifecycle transitions into logs/session.log (content-free). */\n\tprivate _logSessionEvent(event: AgentSessionEvent): void {\n\t\tif (event.type === \"compaction_start\") {\n\t\t\tconst previousAttempt = this._activeCompactionLogAttempt;\n\t\t\tif (previousAttempt) {\n\t\t\t\tconst tokensAfter = this._estimateCompactionLogTokens(\"persisted\");\n\t\t\t\tthis._sessionLogger.info(\"compaction_decision\", {\n\t\t\t\t\tattemptId: previousAttempt.id,\n\t\t\t\t\treason: previousAttempt.reason,\n\t\t\t\t\tmode: previousAttempt.reason === \"manual\" ? \"manual\" : \"auto\",\n\t\t\t\t\taction: \"compact\",\n\t\t\t\t\tdisposition: \"superseded\",\n\t\t\t\t\taccepted: false,\n\t\t\t\t\tskipped: true,\n\t\t\t\t\taborted: true,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\ttokensBefore: previousAttempt.tokensBefore,\n\t\t\t\t\ttokensAfter,\n\t\t\t\t});\n\t\t\t\tthis._supersededCompactionLogAttemptIds.add(previousAttempt.id);\n\t\t\t}\n\t\t\tconst attempt = {\n\t\t\t\tid: event.requestId ?? randomUUID(),\n\t\t\t\treason: event.reason,\n\t\t\t\ttokensBefore: this._estimateCompactionLogTokens(\"persisted\"),\n\t\t\t};\n\t\t\tthis._activeCompactionLogAttempt = attempt;\n\t\t\tthis._sessionLogger.info(\"compaction_start\", {\n\t\t\t\tattemptId: attempt.id,\n\t\t\t\treason: event.reason,\n\t\t\t\tmode: event.reason === \"manual\" ? \"manual\" : \"auto\",\n\t\t\t\taction: \"compact\",\n\t\t\t\ttokensBefore: attempt.tokensBefore,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (event.type === \"compaction_end\") {\n\t\t\tif (event.requestId && this._supersededCompactionLogAttemptIds.delete(event.requestId)) return;\n\t\t\tconst activeAttempt = this._activeCompactionLogAttempt;\n\t\t\tconst attempt =\n\t\t\t\tevent.requestId !== undefined && activeAttempt?.id === event.requestId ? activeAttempt : undefined;\n\t\t\tconst accepted = event.accepted ?? event.result !== undefined;\n\t\t\tconst rejected = event.rejectionCause !== undefined;\n\t\t\tconst skipped = !accepted && (attempt === undefined || (!rejected && !event.aborted && !event.errorMessage));\n\t\t\tconst disposition = accepted\n\t\t\t\t? \"committed\"\n\t\t\t\t: attempt === undefined\n\t\t\t\t\t? \"skipped\"\n\t\t\t\t\t: rejected\n\t\t\t\t\t\t? \"rejected\"\n\t\t\t\t\t\t: event.aborted\n\t\t\t\t\t\t\t? \"aborted\"\n\t\t\t\t\t\t\t: event.errorMessage\n\t\t\t\t\t\t\t\t? \"failed\"\n\t\t\t\t\t\t\t\t: \"skipped\";\n\t\t\tconst tokensAfter = this._estimateCompactionLogTokens(accepted ? \"active\" : \"persisted\");\n\t\t\tthis._sessionLogger.info(\"compaction_decision\", {\n\t\t\t\tattemptId: attempt?.id ?? event.requestId,\n\t\t\t\treason: event.reason,\n\t\t\t\tmode: event.reason === \"manual\" ? \"manual\" : \"auto\",\n\t\t\t\taction: accepted || attempt ? \"compact\" : \"none\",\n\t\t\t\tdisposition,\n\t\t\t\taccepted,\n\t\t\t\tskipped,\n\t\t\t\taborted: event.aborted,\n\t\t\t\twillRetry: event.willRetry,\n\t\t\t\trejectionCause: event.rejectionCause,\n\t\t\t\terror: event.errorMessage,\n\t\t\t\ttokensBefore: attempt?.tokensBefore ?? tokensAfter,\n\t\t\t\ttokensAfter,\n\t\t\t});\n\t\t\tif (attempt) this._activeCompactionLogAttempt = undefined;\n\t\t\treturn;\n\t\t}\n\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\tconst message = event.message as AssistantMessage;\n\t\t\tif (message.stopReason !== \"error\") return;\n\t\t\tconst kind = isProviderStreamStallError(message)\n\t\t\t\t? \"stall\"\n\t\t\t\t: isProviderTimeoutError(message)\n\t\t\t\t\t? \"timeout\"\n\t\t\t\t\t: \"error\";\n\t\t\tthis._sessionLogger.warn(\"provider_error\", {\n\t\t\t\tkind,\n\t\t\t\terror: message.errorMessage,\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _estimateCompactionLogTokens(source: \"active\" | \"persisted\"): number | undefined {\n\t\ttry {\n\t\t\tconst messages =\n\t\t\t\tsource === \"active\" ? this.agent.state.messages : this.sessionManager.buildSessionContext().messages;\n\t\t\treturn estimateMessagesTokens(filterContextExcludedMessages(messages));\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tprivate _emitQueueUpdate(): void {\n\t\tthis._emit({\n\t\t\ttype: \"queue_update\",\n\t\t\tsteering: [...this._steeringMessages],\n\t\t\tfollowUp: [...this._followUpMessages],\n\t\t\tordered: [...this._queuedInputOrder].sort((a, b) => a.enqueueOrder - b.enqueueOrder),\n\t\t});\n\t}\n\n\tprivate _incrementMessageRevision(): void {\n\t\tthis._messageRevision++;\n\t\tthis._blockedPostCompactionAssistant = undefined;\n\t}\n\n\tgetMessageRevision(): number {\n\t\treturn this._messageRevision;\n\t}\n\n\t/** Resolved agent state directory for this session. */\n\tget agentDir(): string {\n\t\treturn this._agentDir;\n\t}\n\n\t/**\n\t * Working directory this session resolves settings against — the same value extensions\n\t * receive as `ctx.cwd`, so a host surface (RPC) reads project settings identically.\n\t */\n\tget cwd(): string {\n\t\treturn this._cwd;\n\t}\n\n\tprivate async _waitForSettledSessionWork(): Promise<void> {\n\t\tawait this._sessionWorkBarrier.waitForSettled(() => this._agentEventQueue);\n\t}\n\n\tasync waitForSettledSessionWork(): Promise<void> {\n\t\tawait this._waitForSettledSessionWork();\n\t\tconst titlePromise = this._sessionTitlePromise;\n\t\tif (titlePromise !== undefined) {\n\t\t\tawait titlePromise;\n\t\t}\n\t\tawait this._waitForSettledSessionWork();\n\t}\n\n\tprivate _modelSelectionChangesContext(previousModel: Model<any> | undefined, nextModel: Model<any>): boolean {\n\t\tif (!modelsAreEqual(previousModel, nextModel)) return true;\n\t\tif (previousModel?.contextWindow !== nextModel.contextWindow) return true;\n\t\treturn previousModel?.api !== nextModel.api;\n\t}\n\n\tprivate _invalidateCompactionForModelSelection(): void {\n\t\tthis.abortCompaction();\n\t\tthis.abortBranchSummary();\n\t\tthis._delegatedCompactionKey = undefined;\n\t\tthis._incrementMessageRevision();\n\t}\n\n\tprivate _getIdleWaitPromise(): Promise<void> {\n\t\tif (!this._idleWaitPromise) {\n\t\t\tthis._idleWaitPromise = new Promise((resolve) => {\n\t\t\t\tthis._resolveIdleWait = resolve;\n\t\t\t});\n\t\t}\n\t\treturn this._idleWaitPromise;\n\t}\n\n\tprivate _resolveIdleWaitIfIdle(): void {\n\t\tif (this._isAgentRunActive || !this._resolveIdleWait) {\n\t\t\treturn;\n\t\t}\n\t\tconst resolve = this._resolveIdleWait;\n\t\tthis._idleWaitPromise = undefined;\n\t\tthis._resolveIdleWait = undefined;\n\t\tresolve();\n\t}\n\n\tprivate async _emitAgentSettled(): Promise<void> {\n\t\tif (this.agent.state.isStreaming) {\n\t\t\tawait this.agent.waitForIdle();\n\t\t}\n\t\tif (!this._isAgentRunActive) {\n\t\t\tthis._abortProvenance.closeAgentEndBoundary();\n\t\t\tthis._resolveIdleWaitIfIdle();\n\t\t\treturn;\n\t\t}\n\t\tthis._isAgentRunActive = false;\n\t\tlet deferredActions: DeferredAgentSettledAction[] = [];\n\t\tlet deferredTurnClaims: DeferredTurnClaim[] = [];\n\t\tthis._agentSettledDelivery.begin(this._userAbortGeneration);\n\t\tconst settlementEpoch = ++this._settlementEpoch;\n\t\ttry {\n\t\t\tawait this._extensionRunner.emit({ type: \"agent_settled\" });\n\t\t\tthis._emit({ type: \"agent_settled\" });\n\t\t\tif (this._abortProvenance.takeLateUserJoin()) await this._emitSessionAbort();\n\t\t\t({ actions: deferredActions, turnClaims: deferredTurnClaims } = this._agentSettledDelivery.finish(\n\t\t\t\tthis._userAbortGeneration,\n\t\t\t));\n\t\t} finally {\n\t\t\tthis._agentSettledDelivery.cancel();\n\t\t\tthis._abortProvenance.closeAgentEndBoundary();\n\t\t\tthis._resolveIdleWaitIfIdle();\n\t\t}\n\t\tfor (const action of deferredActions) action();\n\t\tqueueMicrotask(() => {\n\t\t\tvoid this._emitAgentIdleAfterDeferredTurns(settlementEpoch, deferredTurnClaims);\n\t\t});\n\t}\n\n\tprivate async _emitAgentIdleAfterDeferredTurns(\n\t\tsettlementEpoch: number,\n\t\tdeferredTurnClaims: DeferredTurnClaim[],\n\t): Promise<void> {\n\t\tconst dispositions = await Promise.all(deferredTurnClaims.map((claim) => claim.disposition));\n\t\tif (dispositions.includes(\"started\")) return;\n\t\tif (dispositions.includes(\"delegated\") || this._sessionWorkBarrier.hasActiveWork) {\n\t\t\tawait this._waitForSettledSessionWork();\n\t\t}\n\t\tif (settlementEpoch !== this._settlementEpoch) return;\n\t\tif (this._isAgentRunActive || this._sessionWorkBarrier.hasActiveWork) return;\n\t\tthis._emit({ type: \"agent_idle\" });\n\t}\n\n\tprivate async _promptAgent(\n\t\tmessages: AgentMessage | AgentMessage[],\n\t\tdeferredTurnClaim?: DeferredTurnClaim,\n\t): Promise<void> {\n\t\tdeferredTurnClaim?.resolve(\"started\");\n\t\tthis._isAgentRunActive = true;\n\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\tthis.agent.abortServerSideFallback =\n\t\t\tthis.settingsManager.getAbortServerSideFallback() && this._retryFallback.hasConfiguredChain();\n\t\ttry {\n\t\t\tawait this.agent.prompt(messages);\n\t\t\t// AgentSession's subscriber intentionally queues event work instead of\n\t\t\t// blocking Agent core. Wait for this run's queued recovery decision\n\t\t\t// before reporting prompt completion to the caller.\n\t\t\tawait this._agentEventQueue;\n\t\t\tconst requiredCompactionError = this._requiredCompactionAdmissionError;\n\t\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\t\tif (requiredCompactionError) {\n\t\t\t\tthis._sessionLogger.warn(\"prompt_rejected\", {\n\t\t\t\t\tstage: \"admission\",\n\t\t\t\t\terror: \"RequiredCompactionError\",\n\t\t\t\t});\n\t\t\t\tthrow requiredCompactionError;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\terror instanceof Error &&\n\t\t\t\terror.message ===\n\t\t\t\t\t\"Agent is already processing a prompt. Use steer() or followUp() to queue messages, or wait for completion.\"\n\t\t\t) {\n\t\t\t\tconst queuedMessages = Array.isArray(messages) ? messages : [messages];\n\t\t\t\tfor (const message of queuedMessages) this.agent.steer(message);\n\t\t\t\tconst userMessage = queuedMessages.find((message) => message.role === \"user\");\n\t\t\t\tif (userMessage?.role === \"user\") {\n\t\t\t\t\tconst text = this._extractUserMessageText(userMessage.content);\n\t\t\t\t\tthis._steeringMessages.push(text);\n\t\t\t\t\tthis._recordQueuedInput(text, \"steer\");\n\t\t\t\t\tthis._emitQueueUpdate();\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this._emitAgentSettled();\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/** Extract text content used to track fork-owned queued user messages. */\n\tprivate _extractUserMessageText(content: string | Array<{ type: string; text?: string }>): string {\n\t\tif (typeof content === \"string\") return content;\n\t\treturn content\n\t\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\")\n\t\t\t.map((part) => part.text)\n\t\t\t.join(\"\");\n\t}\n\n\t// Track last assistant message for auto-compaction check\n\tprivate _lastAssistantMessage: AssistantMessage | undefined = undefined;\n\n\t/** Internal handler for agent events - shared by subscribe and reconnect */\n\tprivate _handleAgentEvent = (event: AgentEvent, signal: AbortSignal): void => {\n\t\t// Agent core drains native steer/follow-up queues immediately after its\n\t\t// final agent_end. This subscriber intentionally processes its own event\n\t\t// queue asynchronously, so a later recovery rejection cannot abort that\n\t\t// drain in time. agent_end itself is still an awaited synchronous boundary\n\t\t// before that drain: transfer every required overflow or threshold\n\t\t// compaction to AgentSession, retaining queues until recovery is accepted.\n\t\tif (event.type === \"agent_end\") {\n\t\t\tconst lastAssistant = this._findLastAssistantInMessages(event.messages);\n\t\t\tconst requiredAutoCompaction = lastAssistant\n\t\t\t\t? this._getRequiredAutoCompactionReason(lastAssistant)\n\t\t\t\t: undefined;\n\t\t\tif (requiredAutoCompaction) {\n\t\t\t\tthis.agent.suppressQueuedMessageDrain();\n\t\t\t}\n\t\t}\n\n\t\t// Create retry promise synchronously before queueing async processing.\n\t\t// Agent.emit() calls this handler synchronously, and prompt() calls waitForRetry()\n\t\t// as soon as agent.prompt() resolves. If _retryPromise is created only inside\n\t\t// _processAgentEvent, slow earlier queued events can delay agent_end processing\n\t\t// and waitForRetry() can miss the in-flight retry.\n\t\tthis._createRetryPromiseForAgentEnd(event);\n\n\t\t// The message object is already in agent.state.messages when message_end\n\t\t// fires; track its exact identity until this event's queued processing\n\t\t// settles so compaction can distinguish pending persistence from stale state.\n\t\tif (event.type === \"message_end\" && event.message.role === \"assistant\") {\n\t\t\tthis._emitServerFallbackAborted(event.message);\n\t\t}\n\n\t\tconst pendingMessage = event.type === \"message_end\" ? event.message : undefined;\n\t\tif (pendingMessage !== undefined) {\n\t\t\tthis._messageEndsAwaitingPersistence.add(pendingMessage);\n\t\t}\n\n\t\tconst processing = this._agentEventQueue.then(\n\t\t\t() => this._processAgentEvent(event, signal),\n\t\t\t() => this._processAgentEvent(event, signal),\n\t\t);\n\t\tthis._agentEventQueue =\n\t\t\tpendingMessage !== undefined\n\t\t\t\t? processing.finally(() => {\n\t\t\t\t\t\tthis._messageEndsAwaitingPersistence.delete(pendingMessage);\n\t\t\t\t\t})\n\t\t\t\t: processing;\n\n\t\t// Keep queue alive if an event handler fails\n\t\tthis._agentEventQueue.catch(() => {});\n\t};\n\n\tprivate _createRetryPromiseForAgentEnd(event: AgentEvent): void {\n\t\tif (event.type !== \"agent_end\" || this._retryPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lastAssistant = this._findLastAssistantInMessages(event.messages);\n\t\tif (\n\t\t\t!lastAssistant ||\n\t\t\t(!this._isRetryableError(lastAssistant) &&\n\t\t\t\t!this._isHardErrorFallbackEligible(lastAssistant) &&\n\t\t\t\t!isCursorZeroTokenResourceExhausted(lastAssistant) &&\n\t\t\t\t!isCursorQuotaResourceExhausted(lastAssistant, this.model?.contextWindow ?? 0))\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._retryPromise = new Promise((resolve) => {\n\t\t\tthis._retryResolve = resolve;\n\t\t});\n\t\t// Agent core normally drains queued input immediately after agent_end.\n\t\t// Retry owns that continuation until its final provider-admission check has\n\t\t// either started it or reported a terminal rejection.\n\t\tthis.agent.suppressQueuedMessageDrain();\n\t}\n\n\tprivate _findLastAssistantInMessages(messages: AgentMessage[]): AssistantMessage | undefined {\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst message = messages[i];\n\t\t\tif (message.role === \"assistant\") {\n\t\t\t\treturn message as AssistantMessage;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Synchronously mirror the auto-compaction decision that _checkCompaction()\n\t * will make after agent_end. Agent core drains queues before that async work\n\t * runs, so only this preflight can transfer required admissions safely.\n\t */\n\tprivate _getRequiredAutoCompactionReason(message: AssistantMessage): \"overflow\" | \"threshold\" | undefined {\n\t\tconst reason = this._getAutoCompactionReason(message);\n\t\t// Retry and post-compaction exemptions only cover stale usage estimates.\n\t\t// A provider-confirmed overflow must always retain queue ownership and run\n\t\t// fail-closed recovery.\n\t\tif (\n\t\t\treason === \"overflow\" &&\n\t\t\tmessage.stopReason === \"stop\" &&\n\t\t\tthis._hasPendingPostCompactionUsageExemption(message)\n\t\t) {\n\t\t\t// A successful post-compaction response can carry stale provider usage.\n\t\t\t// Retain its queues while the asynchronous check consumes the exemption.\n\t\t\treturn \"threshold\";\n\t\t}\n\t\tif (reason === \"overflow\") return reason;\n\t\t// Keep queued continuations under AgentSession ownership while the\n\t\t// asynchronous check consumes this post-compaction usage exemption.\n\t\tif (this._hasPendingPostCompactionUsageExemption(message)) return \"threshold\";\n\t\tif (\n\t\t\treason === \"threshold\" &&\n\t\t\t(this._skipNextPostRetryCompactionCheck || this._postCompactionUsageExemptAssistants.has(message))\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn reason;\n\t}\n\n\t/**\n\t * Threshold checks measure the larger of the provider-reported context and\n\t * the plain local-transcript estimate. Providers whose usage tracks a\n\t * server-side summarized conversation (native Cursor checkpoints) can report\n\t * a context far smaller than the transcript this client replays every turn,\n\t * and that small figure must not hide a transcript already past the window.\n\t */\n\tprivate _resolveThresholdContextTokens(directContextTokens: number): number {\n\t\tconst messages = filterContextExcludedMessages(this.agent.state.messages);\n\t\treturn resolveThresholdContextTokens(directContextTokens, estimateMessagesTokens(messages));\n\t}\n\n\tprivate _getAutoCompactionReason(message: AssistantMessage): \"overflow\" | \"threshold\" | undefined {\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled || message.stopReason === \"aborted\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst model = this.model;\n\t\tif (!model || this._isAssistantFromBeforeLatestCompaction(message)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst sameModel = isSameOverflowSource(\n\t\t\tmessage,\n\t\t\tmodel,\n\t\t\tthis._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId,\n\t\t);\n\t\tconst contextUsage = this.getContextUsage();\n\t\tconst currentContextNeedsCompaction =\n\t\t\tcontextUsage !== undefined &&\n\t\t\tcontextUsage.tokens !== null &&\n\t\t\tshouldCompact(contextUsage.tokens, contextUsage.contextWindow, settings);\n\t\tif (isContextOverflow(message, model.contextWindow) && (sameModel || currentContextNeedsCompaction)) {\n\t\t\treturn \"overflow\";\n\t\t}\n\t\tif (this._isCursorPayloadOverflow(message)) {\n\t\t\treturn \"overflow\";\n\t\t}\n\n\t\tlet contextTokens: number;\n\t\tconst directContextTokens = message.usage ? calculateContextTokens(message.usage) : 0;\n\t\tif (message.stopReason !== \"error\" && directContextTokens !== 0) {\n\t\t\tcontextTokens = this._resolveThresholdContextTokens(directContextTokens);\n\t\t} else {\n\t\t\tconst messages = filterContextExcludedMessages(this.agent.state.messages);\n\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\tif (estimate.lastUsageIndex === null) {\n\t\t\t\tif (!this._isRequiredCompactionError(message)) return undefined;\n\t\t\t} else {\n\t\t\t\tconst compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\t\t\tconst usageMessage = messages[estimate.lastUsageIndex];\n\t\t\t\tif (\n\t\t\t\t\tcompactionEntry &&\n\t\t\t\t\tusageMessage?.role === \"assistant\" &&\n\t\t\t\t\tthis._isAssistantFromBeforeLatestCompaction(usageMessage)\n\t\t\t\t) {\n\t\t\t\t\treturn undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontextTokens = estimate.tokens;\n\t\t}\n\n\t\treturn shouldCompact(contextTokens, model.contextWindow, settings) ? \"threshold\" : undefined;\n\t}\n\n\tprivate _hasPendingPostCompactionUsageExemption(message: AssistantMessage): boolean {\n\t\treturn (\n\t\t\tthis._skipNextPostCompactionAssistantCheck &&\n\t\t\t!this._assistantsPendingAtCompaction.has(message) &&\n\t\t\t!this._overflowRecoveryAttempted\n\t\t);\n\t}\n\n\tprivate _isPostCompactionUsageExempt(message: AssistantMessage): boolean {\n\t\treturn (\n\t\t\tthis._postCompactionUsageExemptAssistants.has(message) || this._hasPendingPostCompactionUsageExemption(message)\n\t\t);\n\t}\n\n\tprivate _consumePostCompactionUsageExemption(message: AssistantMessage): boolean {\n\t\tif (this._postCompactionUsageExemptAssistants.has(message)) return true;\n\t\tif (!this._isPostCompactionUsageExempt(message)) return false;\n\t\tthis._skipNextPostCompactionAssistantCheck = false;\n\t\tthis._postCompactionUsageExemptAssistants.add(message);\n\t\treturn true;\n\t}\n\n\tprivate _agentEndAllowsQueuedContinuation(messages: AgentMessage[]): boolean {\n\t\tlet lastAssistantIndex = -1;\n\t\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\t\tif (messages[index]?.role === \"assistant\") {\n\t\t\t\tlastAssistantIndex = index;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (lastAssistantIndex === -1) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst lastAssistant = messages[lastAssistantIndex];\n\t\tif (lastAssistant?.role !== \"assistant\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (lastAssistant.stopReason === \"aborted\" || lastAssistant.stopReason === \"error\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (this._getRequiredAutoCompactionReason(lastAssistant)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (let index = lastAssistantIndex + 1; index < messages.length; index++) {\n\t\t\tconst message = messages[index];\n\t\t\tif (\n\t\t\t\tmessage?.role === \"toolResult\" &&\n\t\t\t\tmessage.isError &&\n\t\t\t\tmessage.content.some((content) => content.type === \"text\" && /\\babort(?:ed)?\\b/i.test(content.text))\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tprivate _willRetryAfterAgentEnd(messages: AgentMessage[]): boolean {\n\t\tconst lastAssistant = this._lastAssistantMessage ?? this._findLastAssistantInMessages(messages);\n\t\tif (!lastAssistant) {\n\t\t\treturn false;\n\t\t}\n\t\tif (\n\t\t\tthis._isRequiredCompactionError(lastAssistant) &&\n\t\t\tthis._getRequiredAutoCompactionReason(lastAssistant) !== undefined\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\treturn false;\n\t\t}\n\t\t// The same-model budget comes from the resolved profile so a provider-declared\n\t\t// budget (e.g. kimi-code's 9) is honoured; identical to settings.maxRetries for\n\t\t// providers without a profile.\n\t\tconst turnMaxRetries = this._resolveRetryProfile().turn.maxRetries;\n\n\t\tconst retryableError = this._isRetryableError(lastAssistant);\n\t\tif (isCursorZeroTokenResourceExhausted(lastAssistant)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (isCursorQuotaResourceExhausted(lastAssistant, this.model?.contextWindow ?? 0)) {\n\t\t\treturn this._retryFallback.canTryFallback();\n\t\t}\n\t\tif (!retryableError && this._isHardErrorFallbackEligible(lastAssistant)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (!retryableError) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (isClassifierRefusal(lastAssistant)) {\n\t\t\treturn this._retryAttempt + 1 <= turnMaxRetries && this._retryFallback.canTryFallback();\n\t\t}\n\n\t\tif (this._retryAttempt + 1 > turnMaxRetries) {\n\t\t\treturn this._retryFallback.canTryFallback();\n\t\t}\n\n\t\tconst errorMessage = lastAssistant.errorMessage || \"Unknown error\";\n\t\tconst providerDelayMs = this._getProviderRetryDelayMs(errorMessage);\n\t\tif (providerDelayMs === undefined) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (providerDelayMs <= this.settingsManager.getProviderRetrySettings().maxRetryDelayMs) {\n\t\t\treturn true;\n\t\t}\n\t\treturn this._retryFallback.canTryFallback();\n\t}\n\n\tprivate _isRequiredCompactionError(message: AssistantMessage): boolean {\n\t\treturn (\n\t\t\tthis._requiredCompactionTurnError !== undefined &&\n\t\t\tmessage.stopReason === \"error\" &&\n\t\t\tmessage.errorMessage === this._requiredCompactionTurnError.message\n\t\t);\n\t}\n\n\tprivate async _processAgentEvent(event: AgentEvent, signal: AbortSignal): Promise<void> {\n\t\tif (event.type === \"agent_start\") {\n\t\t\tthis._requiredCompactionTurnError = undefined;\n\t\t}\n\t\t// When a user message starts, check if it's from either queue and remove it BEFORE emitting\n\t\t// This ensures the UI sees the updated queue state\n\t\tif (event.type === \"message_start\" && event.message.role === \"user\") {\n\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\tthis._retryFallback.resetTurn();\n\t\t\tconst messageText = contentText(event.message.content, \"\");\n\t\t\tif (messageText) {\n\t\t\t\t// Check steering queue first\n\t\t\t\tconst steeringIndex = this._steeringMessages.indexOf(messageText);\n\t\t\t\tif (steeringIndex !== -1) {\n\t\t\t\t\tthis._steeringMessages.splice(steeringIndex, 1);\n\t\t\t\t\tthis._removeQueuedInput(messageText, \"steer\");\n\t\t\t\t\tthis._emitQueueUpdate();\n\t\t\t\t} else {\n\t\t\t\t\t// Check follow-up queue\n\t\t\t\t\tconst followUpIndex = this._followUpMessages.indexOf(messageText);\n\t\t\t\t\tif (followUpIndex !== -1) {\n\t\t\t\t\t\tthis._followUpMessages.splice(followUpIndex, 1);\n\t\t\t\t\t\tthis._removeQueuedInput(messageText, \"followUp\");\n\t\t\t\t\t\tthis._emitQueueUpdate();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst agentEndWillRetry = event.type === \"agent_end\" && this._willRetryAfterAgentEnd(event.messages);\n\n\t\t// Emit to extensions first. Agent event persistence is intentionally\n\t\t// asynchronous, so retain the source run signal while dispatching.\n\t\tthis._extensionEventSignal = signal;\n\t\ttry {\n\t\t\tawait this._emitExtensionEvent(event, agentEndWillRetry);\n\t\t} finally {\n\t\t\tthis._extensionEventSignal = undefined;\n\t\t}\n\t\tif (event.type === \"agent_end\" && this._abortProvenance.takeLateUserJoin()) await this._emitSessionAbort();\n\n\t\t// Notify all listeners\n\t\tthis._emit(event.type === \"agent_end\" ? { ...event, willRetry: agentEndWillRetry } : event);\n\t\tif (event.type === \"agent_end\") {\n\t\t\tif (this._abortProvenance.takeLateUserJoin()) await this._emitSessionAbort();\n\t\t}\n\n\t\t// Handle session persistence\n\t\tif (event.type === \"message_end\") {\n\t\t\t// Check if this is a custom message from extensions\n\t\t\tif (event.message.role === \"custom\") {\n\t\t\t\t// Persist as CustomMessageEntry\n\t\t\t\tthis.sessionManager.appendCustomMessageEntry(\n\t\t\t\t\tevent.message.customType,\n\t\t\t\t\tevent.message.content,\n\t\t\t\t\tevent.message.display,\n\t\t\t\t\tevent.message.details,\n\t\t\t\t);\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t} else if (\n\t\t\t\tevent.message.role === \"user\" ||\n\t\t\t\tevent.message.role === \"assistant\" ||\n\t\t\t\tevent.message.role === \"toolResult\"\n\t\t\t) {\n\t\t\t\t// Regular LLM message - persist as SessionMessageEntry\n\t\t\t\tthis._emitEntryAppended(this.sessionManager.appendMessage(event.message));\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t}\n\t\t\t// Other message types (bashExecution, compactionSummary, branchSummary) are persisted elsewhere\n\n\t\t\t// Track assistant message for auto-compaction (checked on agent_end)\n\t\t\tif (event.message.role === \"assistant\") {\n\t\t\t\tthis._lastAssistantMessage = event.message;\n\n\t\t\t\tconst assistantMsg = event.message as AssistantMessage;\n\t\t\t\tconst succeeded =\n\t\t\t\t\t!assistantMsg.errorMessage &&\n\t\t\t\t\tassistantMsg.stopReason !== \"error\" &&\n\t\t\t\t\tassistantMsg.stopReason !== \"aborted\" &&\n\t\t\t\t\t!isClassifierRefusal(assistantMsg);\n\t\t\t\tif (succeeded && assistantMsg.stopReason !== \"length\") {\n\t\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t\t}\n\n\t\t\t\t// Reset retry state only after a genuinely successful response. Provider\n\t\t\t\t// transport timeouts can arrive as `aborted` and must keep consuming the\n\t\t\t\t// same bounded retry budget instead of reporting a false success.\n\t\t\t\tif (succeeded && this._retryAttempt > 0) {\n\t\t\t\t\tconst fallback = this._retryFallback.activeState;\n\t\t\t\t\tif (fallback) {\n\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\ttype: \"retry_fallback_succeeded\",\n\t\t\t\t\t\t\tmodel: this.model ? `${this.model.provider}/${this.model.id}` : \"\",\n\t\t\t\t\t\t\tchainKey: fallback.chainKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t});\n\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Check auto-retry and auto-compaction after agent completes.\n\t\tlet launchedContinuation = false;\n\t\tlet retryContinuationBlocked = false;\n\t\tlet retryExhaustionAllowsQueuedContinuation = false;\n\t\tlet allowsPostCompactionUsageExemptContinuation = false;\n\t\tconst userAbortSuppressedQueuedContinuation =\n\t\t\tevent.type === \"agent_end\" && this._suppressQueuedContinuationAfterUserAbort;\n\t\tif (userAbortSuppressedQueuedContinuation) {\n\t\t\tthis._suppressQueuedContinuationAfterUserAbort = false;\n\t\t}\n\t\tconst allowsQueuedContinuation =\n\t\t\tevent.type === \"agent_end\" && !userAbortSuppressedQueuedContinuation\n\t\t\t\t? this._agentEndAllowsQueuedContinuation(event.messages)\n\t\t\t\t: false;\n\t\tif (event.type === \"agent_end\" && this._lastAssistantMessage) {\n\t\t\tconst msg = this._lastAssistantMessage;\n\t\t\tthis._lastAssistantMessage = undefined;\n\t\t\tthis._skipNextPostRetryCompactionCheck = false;\n\t\t\tconst requiredAutoCompaction = this._getRequiredAutoCompactionReason(msg);\n\t\t\tconst retryAfterRequiredCompaction =\n\t\t\t\trequiredAutoCompaction !== undefined && this._isRequiredCompactionError(msg);\n\n\t\t\t// Retry transient failures normally and eligible hard errors only through a fallback.\n\t\t\tconst retryableError = this._isRetryableError(msg);\n\t\t\tconst hardErrorFallbackEligible = this._isHardErrorFallbackEligible(msg);\n\t\t\tconst cursorZeroTokenRe = isCursorZeroTokenResourceExhausted(msg);\n\t\t\tconst cursorQuotaRe = isCursorQuotaResourceExhausted(msg, this.model?.contextWindow ?? 0);\n\t\t\tconst retryCanAdmitProvider =\n\t\t\t\t!userAbortSuppressedQueuedContinuation &&\n\t\t\t\tthis.settingsManager.getRetrySettings().enabled &&\n\t\t\t\t(retryableError || hardErrorFallbackEligible || cursorZeroTokenRe || cursorQuotaRe);\n\t\t\tlet compactedBeforeRetry = false;\n\t\t\tif (\n\t\t\t\tretryCanAdmitProvider &&\n\t\t\t\trequiredAutoCompaction &&\n\t\t\t\t!(requiredAutoCompaction === \"threshold\" && this._hasPendingPostCompactionUsageExemption(msg))\n\t\t\t) {\n\t\t\t\tthis._retireFailedRetryAssistant(msg);\n\t\t\t\tcompactedBeforeRetry = await this._runPrePromptCompaction(msg, true, requiredAutoCompaction, true);\n\t\t\t\tretryContinuationBlocked =\n\t\t\t\t\t!compactedBeforeRetry && !this._isCompactionDelegated() && !cursorQuotaRe && !hardErrorFallbackEligible;\n\t\t\t}\n\n\t\t\tlet retryOutcome: \"continued\" | \"blocked\" | \"not-handled\" | \"cancelled\" = \"not-handled\";\n\t\t\tconst retryOwnedDeferredQueue = DEFERRED_RETRY_QUEUE_OWNERS.has(this);\n\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.delete(this);\n\t\t\tif (!retryContinuationBlocked && !userAbortSuppressedQueuedContinuation) {\n\t\t\t\tif (cursorZeroTokenRe) {\n\t\t\t\t\tretryOutcome = await this._handleRetryableError(msg, { sameModelRemint: true });\n\t\t\t\t} else if (cursorQuotaRe) {\n\t\t\t\t\t// Mid-turn Cursor errors may retain unpaired tool calls. Remove the\n\t\t\t\t\t// failed assistant before provider fallback so replay stays valid.\n\t\t\t\t\tthis._retireFailedRetryAssistant(msg);\n\t\t\t\t\tretryOutcome = await this._handleRetryableError(msg, { hardErrorFallback: true });\n\t\t\t\t} else if (retryableError) {\n\t\t\t\t\tretryOutcome = await this._handleRetryableError(msg);\n\t\t\t\t} else if (hardErrorFallbackEligible) {\n\t\t\t\t\tretryOutcome = await this._handleRetryableError(msg, {\n\t\t\t\t\t\thardErrorFallback: true,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (retryOutcome === \"continued\") {\n\t\t\t\tthis._abortProvenance.closeAgentEndBoundary();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Provider-timeout retries deliberately skip their first queue poll so\n\t\t\t// steering cannot be consumed by another doomed retry request. Once the\n\t\t\t// managed retry owner exhausts its budget, hand that retained queue back\n\t\t\t// to the normal scheduled-continuation path instead of parking it until\n\t\t\t// an unrelated later prompt arrives.\n\t\t\tretryExhaustionAllowsQueuedContinuation =\n\t\t\t\t!userAbortSuppressedQueuedContinuation &&\n\t\t\t\tretryOwnedDeferredQueue &&\n\t\t\t\tretryOutcome === \"not-handled\" &&\n\t\t\t\t(msg.stopReason === \"error\" || msg.stopReason === \"aborted\");\n\n\t\t\tif (retryOutcome === \"not-handled\" && cursorQuotaRe && msg.errorMessage) {\n\t\t\t\tmsg.errorMessage = `${msg.errorMessage} (likely provider usage/quota exhaustion: conversation is well below the model context window)`;\n\t\t\t}\n\t\t\tif (retryOutcome === \"not-handled\" && this._retryAttempt > 0 && msg.errorMessage) {\n\t\t\t\tconst attempt = this._retryAttempt;\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tattempt,\n\t\t\t\t\tfinalError: msg.errorMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis._resolveRetry();\n\t\t\tretryContinuationBlocked ||= retryOutcome === \"blocked\";\n\t\t\tif (!retryContinuationBlocked && !userAbortSuppressedQueuedContinuation) {\n\t\t\t\tif (compactedBeforeRetry && this.agent.hasQueuedMessages()) {\n\t\t\t\t\t// Accepted recovery supersedes the stored admission rejection: the\n\t\t\t\t\t// queued continuation is about to run, so the originating prompt must\n\t\t\t\t\t// not observe the stale RequiredCompactionError.\n\t\t\t\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\t\tlaunchedContinuation = true;\n\t\t\t\t} else {\n\t\t\t\t\tlaunchedContinuation = await this._checkCompaction(msg, true, undefined, retryAfterRequiredCompaction);\n\t\t\t\t\tif (launchedContinuation && this.agent.hasQueuedMessages()) {\n\t\t\t\t\t\t// Same supersession on the post-check path: an accepted recovery\n\t\t\t\t\t\t// compaction owns the continuation now.\n\t\t\t\t\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\t\t\t\t}\n\t\t\t\t\tallowsPostCompactionUsageExemptContinuation = this._postCompactionUsageExemptAssistants.has(msg);\n\t\t\t\t\tif (allowsPostCompactionUsageExemptContinuation) {\n\t\t\t\t\t\tthis._flushPostCompactionDeferredMessages();\n\t\t\t\t\t}\n\t\t\t\t\t// _runAutoCompaction() returns false both when recovery was rejected and\n\t\t\t\t\t// when an accepted compaction had no queue to continue. Re-sample after\n\t\t\t\t\t// it settles so only the still-required (rejected) case fails admission.\n\t\t\t\t\tif (\n\t\t\t\t\t\trequiredAutoCompaction &&\n\t\t\t\t\t\t!launchedContinuation &&\n\t\t\t\t\t\tthis.agent.hasQueuedMessages() &&\n\t\t\t\t\t\tthis._getRequiredAutoCompactionReason(msg) !== undefined\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis._requiredCompactionAdmissionError = new RequiredCompactionError();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (event.type === \"agent_end\") {\n\t\t\tthis._flushPendingBashMessages();\n\t\t\tif (\n\t\t\t\t!launchedContinuation &&\n\t\t\t\t!retryContinuationBlocked &&\n\t\t\t\t(allowsQueuedContinuation ||\n\t\t\t\t\tallowsPostCompactionUsageExemptContinuation ||\n\t\t\t\t\tretryExhaustionAllowsQueuedContinuation) &&\n\t\t\t\tthis.agent.hasQueuedMessages()\n\t\t\t) {\n\t\t\t\t// A scheduled continuation owns the queue now; the stored admission\n\t\t\t\t// rejection from a superseded required compaction must not surface.\n\t\t\t\tthis._requiredCompactionAdmissionError = undefined;\n\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\tlaunchedContinuation = true;\n\t\t\t}\n\t\t\tif (!launchedContinuation) {\n\t\t\t\tawait this._emitAgentSettled();\n\t\t\t} else {\n\t\t\t\tthis._abortProvenance.closeAgentEndBoundary();\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Resolve the pending retry promise */\n\tprivate _resolveRetry(): void {\n\t\tif (this._retryResolve) {\n\t\t\tthis._retryResolve();\n\t\t\tthis._retryResolve = undefined;\n\t\t\tthis._retryPromise = undefined;\n\t\t}\n\t}\n\n\tprivate _resetHintTierState(): void {\n\t\tthis._probePhase = \"idle\";\n\t\tthis._hintDeadlineMs = undefined;\n\t\tthis._cumulativeHintedWaitMs = 0;\n\t}\n\n\tprivate async _emitSessionAbort(): Promise<void> {\n\t\tawait this._extensionRunner.emit({ type: \"session_abort\" });\n\t\tthis._emit({ type: \"session_abort\" });\n\t}\n\n\t/**\n\t * Arm the probe-back scheduler for a tier-2 demoted selector. The scheduler\n\t * will fire at most two probes (half-hint, then deadline) and clear the\n\t * selector cooldown on success so maybeRestorePrimary reverts at the next\n\t * turn boundary.\n\t */\n\tprivate _armProbeBackForDemotedSelector(selector: string, hintMs: number): void {\n\t\tif (!selector) return;\n\n\t\t// Guard: skip when the demoted selector is the ACTIVE model.\n\t\tconst currentModel = this.model;\n\t\tif (currentModel && formatSelector(currentModel) === selector) return;\n\n\t\t// Guard: skip when auth is unavailable at arm time.\n\t\tconst parts = selector.split(\"/\");\n\t\tif (parts.length < 2) return;\n\t\tconst provider = parts[0];\n\t\tif (!this._modelRuntime.hasConfiguredAuth(provider)) return;\n\n\t\tconst now = this._fallbackNow();\n\t\tconst schedule = probeBackSchedule(hintMs, now);\n\t\tconst modelId = parts.slice(1).join(\"/\");\n\t\tconst demotedModel = this._modelRuntime.getModel(provider, modelId);\n\t\tif (!demotedModel) return;\n\n\t\tthis._probeBackScheduler.arm({\n\t\t\tselector,\n\t\t\tfirstAtMs: schedule.firstAtMs,\n\t\t\tdeadlineMs: schedule.deadlineMs,\n\t\t\tauthAvailable: () => this._modelRuntime.hasConfiguredAuth(provider),\n\t\t\trunProbe: async (signal: AbortSignal): Promise<boolean> => {\n\t\t\t\ttry {\n\t\t\t\t\tconst result = await this._modelRuntime.completeSimple(\n\t\t\t\t\t\tdemotedModel,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsystemPrompt: \"Reply with OK.\",\n\t\t\t\t\t\t\tmessages: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"OK\" }],\n\t\t\t\t\t\t\t\t\ttimestamp: now,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{ maxTokens: 1, signal },\n\t\t\t\t\t);\n\t\t\t\t\treturn result.stopReason !== \"error\" && result.stopReason !== \"aborted\";\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tonCleared: (sel: string) => {\n\t\t\t\tthis._selectorCooldowns.clear(sel);\n\t\t\t},\n\t\t\temit: (event) => {\n\t\t\t\tif (event.type === \"retry_probe_scheduled\") {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"retry_probe_scheduled\",\n\t\t\t\t\t\tselector: event.selector,\n\t\t\t\t\t\tatMs: event.atMs,\n\t\t\t\t\t\tprobeIndex: event.probeIndex,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"retry_probe_result\",\n\t\t\t\t\t\tselector: event.selector,\n\t\t\t\t\t\tok: event.ok,\n\t\t\t\t\t\terrorMessage: event.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t}\n\n\t/** Find the last assistant message in agent state (including aborted ones) */\n\tprivate _findLastAssistantMessage(): AssistantMessage | undefined {\n\t\tconst messages = this.agent.state.messages;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst msg = messages[i];\n\t\t\tif (msg.role === \"assistant\") {\n\t\t\t\treturn msg as AssistantMessage;\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Retry failures stay in append-only history but must not be retained in the\n\t * active context branch. Otherwise split-turn compaction keeps the failed\n\t * assistant response verbatim and cannot make progress before a retry.\n\t */\n\tprivate _retireFailedRetryAssistant(message: AssistantMessage): void {\n\t\tconst position = this.sessionManager.getMessageEntryPosition(message);\n\t\tif (!position || this.sessionManager.getLeafId() !== position.entryId) return;\n\t\tconst entry = this.sessionManager.getEntry(position.entryId);\n\t\tif (entry?.type !== \"message\") return;\n\n\t\tif (entry.parentId === null) {\n\t\t\tthis.sessionManager.resetLeaf();\n\t\t} else {\n\t\t\tthis.sessionManager.branch(entry.parentId);\n\t\t}\n\t\tconst messageIndex = this.agent.state.messages.lastIndexOf(message);\n\t\tif (messageIndex !== -1) {\n\t\t\tthis.agent.state.messages = this.agent.state.messages.slice(0, messageIndex);\n\t\t}\n\t\tthis._incrementMessageRevision();\n\t}\n\n\tprivate _isAssistantFromBeforeLatestCompaction(assistantMessage: AssistantMessage): boolean {\n\t\tconst compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\tif (compactionEntry === null) return false;\n\n\t\t// An agent message_end can still be awaiting persistence while compaction\n\t\t// commits. It is necessarily a post-boundary message, even when a provider\n\t\t// supplied an older payload timestamp.\n\t\tif (this._messageEndsAwaitingPersistence.has(assistantMessage)) return false;\n\n\t\tconst messagePosition = this.sessionManager.getMessageEntryPosition(assistantMessage);\n\t\tconst compactionOrder = this.sessionManager.getEntryOrder(compactionEntry.id);\n\t\tif (messagePosition !== undefined && compactionOrder !== undefined) {\n\t\t\treturn messagePosition.order <= compactionOrder;\n\t\t}\n\n\t\t// Reloaded/reconstructed messages have no runtime identity. Retain the\n\t\t// historical timestamp heuristic only for that compatibility path.\n\t\treturn assistantMessage.timestamp <= new Date(compactionEntry.timestamp).getTime();\n\t}\n\n\tprivate _replaceMessageInPlace(target: AgentMessage, replacement: AgentMessage): void {\n\t\t// Agent-core stores the finalized message object in its state before emitting message_end.\n\t\t// SessionManager persistence happens later in _processAgentEvent() with event.message.\n\t\t// Mutating this object in place keeps agent state, later turn/agent events, listeners,\n\t\t// and the eventual SessionManager.appendMessage(event.message) persistence in sync.\n\t\tif (target === replacement) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const key of Object.keys(target)) {\n\t\t\tReflect.deleteProperty(target, key);\n\t\t}\n\t\tObject.assign(target, replacement);\n\t}\n\n\t/** Emit extension events based on agent events */\n\tprivate async _emitExtensionEvent(event: AgentEvent, agentEndWillRetry = false): Promise<void> {\n\t\tif (event.type === \"agent_start\") {\n\t\t\tthis._turnIndex = 0;\n\t\t\tawait this._extensionRunner.emit({ type: \"agent_start\" });\n\t\t} else if (event.type === \"agent_end\") {\n\t\t\tconst extensionEvent = this._abortProvenance.beginAgentEnd(\n\t\t\t\tevent.messages,\n\t\t\t\tagentEndWillRetry,\n\t\t\t\tthis._findLastAssistantInMessages(event.messages)?.stopReason === \"aborted\",\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\t} finally {\n\t\t\t\tthis._abortProvenance.endAgentEnd(extensionEvent);\n\t\t\t}\n\t\t} else if (event.type === \"turn_start\") {\n\t\t\tconst extensionEvent: TurnStartEvent = {\n\t\t\t\ttype: \"turn_start\",\n\t\t\t\tturnIndex: this._turnIndex,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"turn_end\") {\n\t\t\tconst extensionEvent: TurnEndEvent = {\n\t\t\t\ttype: \"turn_end\",\n\t\t\t\tturnIndex: this._turnIndex,\n\t\t\t\tmessage: event.message,\n\t\t\t\ttoolResults: event.toolResults,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t\tthis._turnIndex++;\n\t\t\tthis._flushPendingCustomMessages();\n\t\t} else if (event.type === \"message_start\") {\n\t\t\tconst extensionEvent: MessageStartEvent = {\n\t\t\t\ttype: \"message_start\",\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"message_update\") {\n\t\t\tconst extensionEvent: MessageUpdateEvent = {\n\t\t\t\ttype: \"message_update\",\n\t\t\t\tmessage: event.message,\n\t\t\t\tassistantMessageEvent: event.assistantMessageEvent,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"message_end\") {\n\t\t\tconst extensionEvent: MessageEndEvent = {\n\t\t\t\ttype: \"message_end\",\n\t\t\t\tmessage: event.message,\n\t\t\t};\n\t\t\tconst replacement = await this._extensionRunner.emitMessageEnd(extensionEvent);\n\t\t\tif (replacement) {\n\t\t\t\t// Untyped extension handlers can return messages with null/missing content;\n\t\t\t\t// normalize so it never enters agent state or session history.\n\t\t\t\tconst normalized =\n\t\t\t\t\t(replacement.role === \"user\" ||\n\t\t\t\t\t\treplacement.role === \"assistant\" ||\n\t\t\t\t\t\treplacement.role === \"toolResult\" ||\n\t\t\t\t\t\treplacement.role === \"custom\") &&\n\t\t\t\t\treplacement.content == null\n\t\t\t\t\t\t? ({ ...replacement, content: [] } as AgentMessage)\n\t\t\t\t\t\t: replacement;\n\t\t\t\tthis._replaceMessageInPlace(event.message, normalized);\n\t\t\t}\n\t\t} else if (event.type === \"tool_execution_start\") {\n\t\t\tconst extensionEvent: ToolExecutionStartEvent = {\n\t\t\t\ttype: \"tool_execution_start\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"tool_execution_update\") {\n\t\t\tconst extensionEvent: ToolExecutionUpdateEvent = {\n\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\targs: event.args,\n\t\t\t\tpartialResult: event.partialResult,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t} else if (event.type === \"tool_execution_end\") {\n\t\t\tconst extensionEvent: ToolExecutionEndEvent = {\n\t\t\t\ttype: \"tool_execution_end\",\n\t\t\t\ttoolCallId: event.toolCallId,\n\t\t\t\ttoolName: event.toolName,\n\t\t\t\tresult: event.result,\n\t\t\t\tisError: event.isError,\n\t\t\t};\n\t\t\tawait this._extensionRunner.emit(extensionEvent);\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to agent events.\n\t * Session persistence is handled internally (saves messages on message_end).\n\t * Multiple listeners can be added. Returns unsubscribe function for this listener.\n\t */\n\tsubscribe(listener: AgentSessionEventListener): () => void {\n\t\tthis._eventListeners.push(listener);\n\t\tfor (const source of this.settingsManager.getSelectedSettingsSources()) {\n\t\t\tlistener({ type: \"settings_source_selected\", ...source });\n\t\t}\n\n\t\t// Return unsubscribe function for this specific listener\n\t\treturn () => {\n\t\t\tconst index = this._eventListeners.indexOf(listener);\n\t\t\tif (index !== -1) {\n\t\t\t\tthis._eventListeners.splice(index, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t/**\n\t * Temporarily disconnect from agent events.\n\t * User listeners are preserved and will receive events again after resubscribe().\n\t * Used internally during operations that need to pause event processing.\n\t */\n\tprivate _disconnectFromAgent(): void {\n\t\tif (this._unsubscribeAgent) {\n\t\t\tthis._unsubscribeAgent();\n\t\t\tthis._unsubscribeAgent = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Reconnect to agent events after _disconnectFromAgent().\n\t * Preserves all existing listeners.\n\t */\n\tprivate _reconnectToAgent(): void {\n\t\tif (this._unsubscribeAgent) return; // Already connected\n\t\tthis._unsubscribeAgent = this.agent.subscribe(this._handleAgentEvent);\n\t}\n\n\t/**\n\t * Remove all listeners and disconnect from agent.\n\t * Call this when completely done with the session.\n\t */\n\tdispose(): void {\n\t\ttry {\n\t\t\tthis._probeBackScheduler.cancel(\"dispose\");\n\t\t\tthis.abortRetry();\n\t\t\tthis.abortCompaction();\n\t\t\tthis.abortBranchSummary();\n\t\t\tthis.abortSessionTitleGeneration();\n\t\t\tthis.abortBash();\n\t\t\tthis.agent.abort();\n\t\t} catch {\n\t\t\t// Dispose must succeed even if an abort hook throws.\n\t\t}\n\n\t\tthis._extensionRunner.invalidate(\n\t\t\t\"This extension ctx is stale after session replacement or reload. Do not use a captured pi or command ctx after ctx.newSession(), ctx.fork(), ctx.switchSession(), or ctx.reload(). For newSession, fork, and switchSession, move post-replacement work into withSession and use the ctx passed to withSession. For reload, do not use the old ctx after await ctx.reload().\",\n\t\t);\n\t\tthis._disconnectFromAgent();\n\t\tthis._unsubscribeSettingsSource?.();\n\t\tthis._unsubscribeSettingsSource = undefined;\n\t\tthis._unsubscribeWakeSources?.();\n\t\tthis._unsubscribeWakeSources = undefined;\n\t\tthis._eventListeners = [];\n\t\tcleanupSessionResources(this.sessionId);\n\t}\n\n\t/** Live in-session activity signals; see `session-activity.ts` for the contract. */\n\tget activitySnapshot(): SessionActivitySnapshot {\n\t\treturn {\n\t\t\tisStreaming: this._isAgentRunActive,\n\t\t\tisBashRunning: this.isBashRunning,\n\t\t\tisCompacting: this.isCompacting,\n\t\t\thasSessionWork: this._sessionWorkBarrier.hasActiveWork,\n\t\t\thasActiveWakeSource: this._wakeSources.hasActive,\n\t\t};\n\t}\n\n\t/**\n\t * Whether this session owns work that must outlive a teardown decision: an\n\t * agent run, bash, compaction, barrier-held session work, or an\n\t * extension-published wake source. Occupancy sweeps (the shared RPC host's\n\t * idle eviction) MUST consult this rather than individual flags, so a new\n\t * activity source is picked up by every call site at once.\n\t */\n\tget isSessionBusy(): boolean {\n\t\treturn isSessionBusySnapshot(this.activitySnapshot);\n\t}\n\n\t// =========================================================================\n\t// Read-only State Access\n\t// =========================================================================\n\n\t/** Full agent state */\n\tget state(): AgentState {\n\t\treturn this.agent.state;\n\t}\n\n\t/** Current model (may be undefined if not yet selected) */\n\tget model(): Model<any> | undefined {\n\t\treturn this.agent.state.model;\n\t}\n\n\t/** Current thinking level */\n\tget thinkingLevel(): ThinkingLevel {\n\t\treturn this.agent.state.thinkingLevel;\n\t}\n\n\t/** Explicit selector provenance, absent for SDK-defaulted effective levels. */\n\tget thinkingSelection(): ThinkingSelection | undefined {\n\t\treturn this.agent.state.thinkingSelection;\n\t}\n\n\tget serviceTier(): ServiceTier | undefined {\n\t\treturn this._currentServiceTier;\n\t}\n\n\t/**\n\t * True when the active model is served at the priority (\"fast\") tier: either the model\n\t * itself is configured for it (an `openai` `-fast` catalog variant, a scoped\n\t * `provider/id:priority`) or an extension turned fast mode on for this session.\n\t *\n\t * Display-only: it never feeds request composition, so an extension toggling fast mode\n\t * for one provider cannot leak `service_tier` into another provider's payload.\n\t * `serviceTier` stays the single request-side source.\n\t */\n\tisFastModeActive(): boolean {\n\t\treturn this._sessionFastMode || this._currentServiceTier === \"priority\";\n\t}\n\n\t/**\n\t * The tier a request would carry right now: `serviceTier`, promoted to `\"priority\"` while\n\t * session fast mode is on (which is exactly what the service-tier extension puts on the\n\t * wire). Reported to clients so `serviceTier` and `fastMode` can never disagree.\n\t */\n\tget effectiveServiceTier(): ServiceTier | undefined {\n\t\treturn this.isFastModeActive() ? \"priority\" : this._currentServiceTier;\n\t}\n\n\t/**\n\t * Session-scoped fast-mode indicator; never persisted, reset on session start.\n\t *\n\t * Turning fast OFF also clears the cached priority tier: `/fast off` writes a remembered\n\t * `\"auto\"` that must override an inherited catalog-priority tier immediately (display and\n\t * request side), not only on the next session. Only codex-response models are touched, and\n\t * never when an explicit scoped/favorite `:priority` pin is in force — those are pinned by\n\t * the user's model selection, not by `/fast`.\n\t */\n\tsetSessionFastMode(enabled: boolean): void {\n\t\tconst previousFastMode = this.isFastModeActive();\n\t\tconst previousTier = this._currentServiceTier;\n\t\tthis._sessionFastMode = enabled;\n\t\tif (!enabled && this._currentServiceTier === \"priority\" && this.model?.api === CODEX_RESPONSES_API) {\n\t\t\t// Only an INHERITED (catalog) priority is cleared. A priority the catalog does not\n\t\t\t// explain came from an explicit scoped/favorite `:priority` pin, which `/fast` must not undo.\n\t\t\tif (this._modelRuntime.getCompatibilityRequestConfig(this.model).serviceTier === \"priority\") {\n\t\t\t\tthis._currentServiceTier = undefined;\n\t\t\t}\n\t\t}\n\t\tthis._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);\n\t}\n\n\t/**\n\t * Emit `service_tier_changed` when the effective tier or the fast-mode indicator actually\n\t * moved. Both are observable state for RPC clients (`get_state.serviceTier` / `.fastMode`),\n\t * and they can move independently: a session fast-mode toggle need not change the resolved\n\t * tier, and a model switch can change the tier with fast mode untouched.\n\t */\n\tprivate _emitServiceTierChangeIfNeeded(previousTier: ServiceTier | undefined, previousFastMode: boolean): void {\n\t\tconst fastMode = this.isFastModeActive();\n\t\tif (previousTier === this._currentServiceTier && previousFastMode === fastMode) return;\n\t\tthis._emit({\n\t\t\ttype: \"service_tier_changed\",\n\t\t\ttier: this.effectiveServiceTier,\n\t\t\tfastMode,\n\t\t});\n\t}\n\n\t/**\n\t * Explicit scoped/favorite tiers win; otherwise fall back to the model's\n\t * configured serviceTier from models.json/extension compatibility config. The per-model\n\t * `/fast` memory is honored by the service-tier extension (`liveMemoryTier` + the session\n\t * flag in `before_provider_request`), not cached here: caching it would survive a same-session\n\t * `/fast off` (no model switch to re-resolve) and leak an inherited priority onto the wire.\n\t */\n\tprivate _resolveServiceTier(\n\t\tmodel: Model<any> | undefined,\n\t\texplicit: ServiceTier | undefined,\n\t): ServiceTier | undefined {\n\t\tif (explicit) return explicit;\n\t\tif (!model) return undefined;\n\t\treturn this._modelRuntime.getCompatibilityRequestConfig(model).serviceTier;\n\t}\n\n\t/** Whether the session is currently processing an agent run or post-run continuation. */\n\tget isStreaming(): boolean {\n\t\treturn this._isAgentRunActive;\n\t}\n\n\t/** Whether the session has no active agent run, retry, auto-compaction, or queued continuation. */\n\tget isIdle(): boolean {\n\t\treturn !this._isAgentRunActive;\n\t}\n\n\t/** Current effective system prompt (includes any per-turn extension modifications) */\n\tget systemPrompt(): string {\n\t\treturn this.agent.state.systemPrompt;\n\t}\n\n\t/** Current retry attempt (0 if not retrying) */\n\tget retryAttempt(): number {\n\t\treturn this._retryAttempt;\n\t}\n\n\t/** Abort owner for the current turn boundary, used by internal renderers. */\n\tget currentAbortSource(): AgentAbortSource | undefined {\n\t\treturn this._abortProvenance.currentSource;\n\t}\n\n\t/**\n\t * Get the names of currently active tools.\n\t * Returns the names of tools currently set on the agent.\n\t */\n\tgetActiveToolNames(): string[] {\n\t\treturn this.agent.state.tools.map((t) => t.name);\n\t}\n\n\t/**\n\t * Get all configured tools with normalized exposure metadata and source metadata.\n\t */\n\tgetAllTools(): ToolInfo[] {\n\t\treturn Array.from(this._toolDefinitions.values()).map(({ definition, sourceInfo }) => ({\n\t\t\tname: definition.name,\n\t\t\tlabel: definition.label,\n\t\t\tdescription: definition.description,\n\t\t\tparameters: definition.parameters,\n\t\t\tpromptGuidelines: definition.promptGuidelines,\n\t\t\tsourceInfo,\n\t\t\t...normalizeToolExposure(definition),\n\t\t}));\n\t}\n\n\tgetToolDefinition(name: string): ToolDefinition | undefined {\n\t\treturn this._toolDefinitions.get(name)?.definition;\n\t}\n\n\tasync executeTool<TDetails = unknown>(\n\t\ttoolName: string,\n\t\tparams: unknown,\n\t\toptions?: ExecuteToolOptions<TDetails>,\n\t): Promise<AgentToolResult<TDetails>> {\n\t\tlet activeTools = this.getActiveToolNames();\n\t\tlet tool = this.agent.state.tools.find((candidate) => candidate.name === toolName);\n\t\tif (!tool && this._isEvalOnlyPolicyArmed() && this._evalOnlyToolNames?.has(toolName)) {\n\t\t\ttool = this._toolRegistry.get(toolName);\n\t\t}\n\t\tif (\n\t\t\t!tool &&\n\t\t\toptions?.activateInactiveTool === true &&\n\t\t\tthis._toolDefinitions.has(toolName) &&\n\t\t\tthis._activateLazyTool(toolName)\n\t\t) {\n\t\t\tactiveTools = this.getActiveToolNames();\n\t\t\ttool = this.agent.state.tools.find((candidate) => candidate.name === toolName);\n\t\t}\n\t\tif (!tool) {\n\t\t\tconst knownToolNames = new Set(this._toolDefinitions.keys());\n\t\t\tconst code = knownToolNames.has(toolName) ? \"inactive_tool\" : \"unknown_tool\";\n\t\t\tconst activeList = activeTools.length > 0 ? activeTools.join(\", \") : \"(none)\";\n\t\t\tthrow new ExecuteToolError(\n\t\t\t\tcode,\n\t\t\t\ttoolName,\n\t\t\t\tcode === \"inactive_tool\"\n\t\t\t\t\t? `Tool ${toolName} is registered but inactive. Active tools: ${activeList}`\n\t\t\t\t\t: `Unknown tool ${toolName}. Active tools: ${activeList}`,\n\t\t\t\tactiveTools,\n\t\t\t);\n\t\t}\n\n\t\tconst toolCall: AgentToolCall = {\n\t\t\ttype: \"toolCall\",\n\t\t\tid: `codemode-${randomUUID()}`,\n\t\t\tname: toolName,\n\t\t\targuments: params as Record<string, unknown>,\n\t\t};\n\n\t\tlet prepared: PreparedAgentToolCall;\n\t\ttry {\n\t\t\tprepared = prepareAgentToolCall(tool, toolCall);\n\t\t} catch (err) {\n\t\t\tthrow new ExecuteToolError(\n\t\t\t\t\"invalid_params\",\n\t\t\t\ttoolName,\n\t\t\t\terr instanceof Error ? err.message : String(err),\n\t\t\t\tactiveTools,\n\t\t\t);\n\t\t}\n\n\t\tconst beforeResult = await this.preflightToolCall(prepared.toolCall, prepared.args, {\n\t\t\twaitForEventQueue: this._toolExecutionDepth === 0,\n\t\t});\n\t\tif (beforeResult?.block) {\n\t\t\tthrow new ExecuteToolError(\n\t\t\t\t\"blocked\",\n\t\t\t\ttoolName,\n\t\t\t\tbeforeResult.reason || \"Tool execution was blocked\",\n\t\t\t\tactiveTools,\n\t\t\t);\n\t\t}\n\n\t\tlet result: AgentToolResult<unknown>;\n\t\tlet isError = false;\n\t\ttry {\n\t\t\tresult = await prepared.tool.execute(\n\t\t\t\tprepared.toolCall.id,\n\t\t\t\tprepared.args as never,\n\t\t\t\toptions?.signal,\n\t\t\t\toptions?.onUpdate as AgentToolUpdateCallback<unknown> | undefined,\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tresult = {\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tdetails: { isError: true },\n\t\t\t};\n\t\t\tisError = true;\n\t\t}\n\t\tconst hookResult = await this._emitAfterToolCallHooks(prepared.toolCall, prepared.args, result, isError);\n\n\t\tif (!hookResult) {\n\t\t\treturn result as AgentToolResult<TDetails>;\n\t\t}\n\n\t\treturn {\n\t\t\tcontent: hookResult.content ?? result.content,\n\t\t\tdetails: (hookResult.details ?? result.details) as TDetails,\n\t\t\tterminate: result.terminate,\n\t\t};\n\t}\n\n\t/**\n\t * Lazily activate a registered inactive tool.\n\t *\n\t * Resolution order is deliberate: resolve the winning definition and enforce its\n\t * `allowLazyActivation` hard stop, then invoke activators in registration order.\n\t * The caller re-resolves the tool from the active registry before execution.\n\t */\n\tprivate _activateLazyTool(toolName: string): boolean {\n\t\tconst definition = this._toolDefinitions.get(toolName)?.definition;\n\t\tif (!definition || !normalizeToolExposure(definition).allowLazyActivation) return false;\n\t\treturn this._lazyToolActivators.some((activate) => activate(toolName));\n\t}\n\n\tprivate _isEvalOnlyPolicyArmed(): boolean {\n\t\treturn this._evalOnlyToolNames !== undefined && this._toolRegistry.has(\"eval\");\n\t}\n\n\t/** Resolve the fixed eval-only policy, unless an SDK embedder supplied an override. */\n\tprivate _resolveEvalOnlyToolNames(): ReadonlySet<string> {\n\t\treturn this._evalOnlyToolNamesOverride ?? EVAL_ONLY_TOOL_NAMES;\n\t}\n\n\t/**\n\t * Publish per-tool eval-only redirect hints so a direct call names its own eval helper.\n\t *\n\t * Hints published here are tracked so a disarm - or a shrinking armed set, e.g. bash+workflow\n\t * down to workflow only - withdraws the stale ones. Only tracked names are ever deleted, so\n\t * hints owned by other publishers survive.\n\t */\n\tprivate _publishEvalOnlyToolHints(): void {\n\t\tconst armed = this._isEvalOnlyPolicyArmed() ? (this._evalOnlyToolNames ?? new Set<string>()) : undefined;\n\t\tconst registered = armed ? new Set([...armed].filter((name) => this._toolRegistry.has(name))) : undefined;\n\t\tfor (const name of this._publishedEvalOnlyHintNames) {\n\t\t\tif (registered?.has(name)) continue;\n\t\t\tdelete this.agent.removedToolHints[name];\n\t\t}\n\t\tthis._publishedEvalOnlyHintNames.clear();\n\t\tif (!registered) return;\n\t\tfor (const name of registered) {\n\t\t\tthis.agent.removedToolHints[name] =\n\t\t\t\t`Run ${name} inside an eval cell via ${evalHelperCall(name)}; hooks and permissions still apply.`;\n\t\t\tthis._publishedEvalOnlyHintNames.add(name);\n\t\t}\n\t}\n\n\t/**\n\t * Set active tools by name.\n\t * Only tools in the registry can be enabled. Unknown tool names are ignored.\n\t * Also rebuilds the system prompt to reflect the new tool set.\n\t * Changes take effect on the next agent turn.\n\t */\n\t/**\n\t * Resolve an executable tool from the full registry (builtin + extension\n\t * tools), independent of the active set. The Cursor exec bridge uses this:\n\t * Cursor drives its native tools (read/bash/grep/ls/write) over the exec\n\t * channel regardless of which tools the request advertised.\n\t */\n\tgetRegisteredTool(name: string): AgentTool | undefined {\n\t\treturn this._toolRegistry.get(name);\n\t}\n\n\t/** Cursor exec already ran the tool; still emit tool_result so plan-touch trackers see .omo/plans writes. */\n\tasync emitExecBridgeToolResult(\n\t\ttoolName: string,\n\t\ttoolCallId: string,\n\t\targs: unknown,\n\t\tresult: AgentToolResult<unknown>,\n\t\tisError: boolean,\n\t): Promise<void> {\n\t\tawait this._emitAfterToolCallHooks(\n\t\t\t{\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tid: toolCallId,\n\t\t\t\tname: toolName,\n\t\t\t\targuments:\n\t\t\t\t\targs && typeof args === \"object\" && !Array.isArray(args) ? (args as Record<string, unknown>) : {},\n\t\t\t},\n\t\t\targs,\n\t\t\tresult,\n\t\t\tisError,\n\t\t);\n\t}\n\n\tsetActiveToolsByName(toolNames: string[]): void {\n\t\tconst tools: AgentTool[] = [];\n\t\tconst validToolNames: string[] = [];\n\t\tconst policyArmed = this._isEvalOnlyPolicyArmed();\n\t\tthis._publishEvalOnlyToolHints();\n\t\tconst policyNames = this._evalOnlyToolNames;\n\t\tlet filteredToolNames = toolNames;\n\t\tif (policyArmed && policyNames) {\n\t\t\tfor (const name of toolNames) {\n\t\t\t\tif (policyNames.has(name)) this._withheldEvalOnlyToolNames.add(name);\n\t\t\t}\n\t\t\tfilteredToolNames = toolNames.filter((name) => !policyNames.has(name));\n\t\t} else {\n\t\t\tthis._withheldEvalOnlyToolNames.clear();\n\t\t}\n\t\t// Remember the unfiltered request so a later disarm can restore withheld eval-only tools.\n\t\tthis._requestedActiveToolNames = [...new Set([...toolNames, ...this._withheldEvalOnlyToolNames])];\n\t\tfor (const name of filteredToolNames) {\n\t\t\tconst tool = this._toolRegistry.get(name);\n\t\t\tif (tool) {\n\t\t\t\ttools.push(tool);\n\t\t\t\tvalidToolNames.push(name);\n\t\t\t}\n\t\t}\n\t\tconst activeToolNamesChanged =\n\t\t\tvalidToolNames.length !== this.agent.state.tools.length ||\n\t\t\tvalidToolNames.some((name, index) => name !== this.agent.state.tools[index]?.name);\n\t\tthis.agent.state.tools = tools;\n\n\t\t// Rebuild base system prompt with new tool set\n\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);\n\t\tthis.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;\n\t\tif (activeToolNamesChanged) {\n\t\t\t// A tool change emitted while extensions are still binding belongs to the\n\t\t\t// binding itself, not to a mid-session change. The session was already\n\t\t\t// committed to the client, so cancelling or invalidating work it started\n\t\t\t// against that session would be spurious.\n\t\t\tif (this._extensionBindingPromptReadiness === undefined) {\n\t\t\t\tthis.abortCompaction();\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Whether compaction or branch summarization is currently running */\n\tget isCompacting(): boolean {\n\t\treturn (\n\t\t\tthis._compactionLifecycle.state.status === \"running\" ||\n\t\t\tthis._autoCompactionAbortController !== undefined ||\n\t\t\tthis._compactionAbortController !== undefined ||\n\t\t\tthis._branchSummaryAbortController !== undefined\n\t\t);\n\t}\n\n\tget compactionState(): Readonly<CompactionLifecycleState> {\n\t\treturn this._compactionLifecycle.state;\n\t}\n\n\t/** All messages including custom types like BashExecutionMessage */\n\tget messages(): AgentMessage[] {\n\t\treturn this.agent.state.messages;\n\t}\n\n\t/** Current steering mode */\n\tget steeringMode(): \"all\" | \"one-at-a-time\" {\n\t\treturn this.agent.steeringMode;\n\t}\n\n\t/** Current follow-up mode */\n\tget followUpMode(): \"all\" | \"one-at-a-time\" {\n\t\treturn this.agent.followUpMode;\n\t}\n\n\t/** Current session file path, or undefined if sessions are disabled */\n\tget sessionFile(): string | undefined {\n\t\treturn this.sessionManager.getSessionFile();\n\t}\n\n\t/** Current session ID */\n\tget sessionId(): string {\n\t\treturn this.sessionManager.getSessionId();\n\t}\n\n\t/** Subscribe to the internal event bus shared by this session's extensions. */\n\tonExtensionEvent(channel: string, handler: (data: unknown) => void): () => void {\n\t\treturn this._resourceLoader.onExtensionEvent?.(channel, handler) ?? (() => {});\n\t}\n\n\t/** Publish on the internal event bus shared by this session's extensions. */\n\temitExtensionEvent(channel: string, data: unknown): void {\n\t\tthis._resourceLoader.emitExtensionEvent?.(channel, data);\n\t}\n\n\t/** Current session display name, if set */\n\tget sessionName(): string | undefined {\n\t\treturn this.sessionManager.getSessionName();\n\t}\n\n\t/** Globally narrowed models (from --models / enabledModels) */\n\tget scopedModels(): ReadonlyArray<SessionModelEntry> {\n\t\treturn this._scopedModels;\n\t}\n\n\t/** Update global model narrowing */\n\tsetScopedModels(scopedModels: SessionModelEntry[]): void {\n\t\tthis._scopedModels = scopedModels;\n\t}\n\n\t/** Favorite models for Ctrl+P cycling */\n\tget favoriteModels(): ReadonlyArray<SessionModelEntry> {\n\t\treturn this._getCurrentFavoriteModels();\n\t}\n\n\t/** Update favorite models for Ctrl+P cycling */\n\tsetFavoriteModels(favoriteModels: SessionModelEntry[]): void {\n\t\tthis._favoriteModels = favoriteModels;\n\t}\n\n\tprivate _getCurrentFavoriteModels(): SessionModelEntry[] {\n\t\tconst availableById = new Map(\n\t\t\tthis._modelRuntime.getAvailableSnapshot().map((model) => [`${model.provider}/${model.id}`, model]),\n\t\t);\n\t\tconst narrowedModelIds =\n\t\t\tthis._scopedModels.length > 0\n\t\t\t\t? new Set(this._scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`))\n\t\t\t\t: undefined;\n\t\tconst seenModelIds = new Set<string>();\n\t\tconst favoriteModels: SessionModelEntry[] = [];\n\n\t\tfor (const favorite of this._favoriteModels) {\n\t\t\tconst modelId = `${favorite.model.provider}/${favorite.model.id}`;\n\t\t\tif (seenModelIds.has(modelId)) continue;\n\n\t\t\tconst model = availableById.get(modelId);\n\t\t\tif (!model) continue;\n\t\t\tif (narrowedModelIds && !narrowedModelIds.has(modelId)) continue;\n\n\t\t\tseenModelIds.add(modelId);\n\t\t\tfavoriteModels.push({\n\t\t\t\tmodel,\n\t\t\t\tthinkingLevel: favorite.thinkingLevel,\n\t\t\t\tthinkingSelection: favorite.thinkingSelection,\n\t\t\t\tserviceTier: favorite.serviceTier,\n\t\t\t});\n\t\t}\n\n\t\treturn favoriteModels;\n\t}\n\n\t/** File-based prompt templates */\n\tget promptTemplates(): ReadonlyArray<PromptTemplate> {\n\t\treturn this._resourceLoader.getPrompts().prompts;\n\t}\n\n\tprivate _normalizePromptSnippet(text: string | undefined): string | undefined {\n\t\tif (!text) return undefined;\n\t\tconst oneLine = text\n\t\t\t.replace(/[\\r\\n]+/g, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\t\treturn oneLine.length > 0 ? oneLine : undefined;\n\t}\n\n\tprivate _normalizePromptGuidelines(guidelines: string[] | undefined): string[] {\n\t\tif (!guidelines || guidelines.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst unique = new Set<string>();\n\t\tfor (const guideline of guidelines) {\n\t\t\tconst normalized = guideline.trim();\n\t\t\tif (normalized.length > 0) {\n\t\t\t\tunique.add(normalized);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(unique);\n\t}\n\n\tprivate _rebuildSystemPrompt(toolNames: string[]): string {\n\t\tconst validToolNames = toolNames.filter((name) => this._toolRegistry.has(name));\n\t\t// An eval-only tool is hidden from the model but still callable as `tool.<name>(...)`,\n\t\t// so its own snippet and guidelines still apply and must survive the withholding.\n\t\t// `selectedTools` stays the model-visible list; only the contributions are widened.\n\t\t// This can run before the field initializers below it during construction, so the\n\t\t// withheld set is read defensively rather than spread directly.\n\t\tconst withheld = this._withheldEvalOnlyToolNames ?? new Set<string>();\n\t\tconst contributingToolNames = [\n\t\t\t...validToolNames,\n\t\t\t...[...withheld].filter((name) => this._toolRegistry.has(name) && !validToolNames.includes(name)),\n\t\t];\n\t\tconst toolSnippets: Record<string, string> = {};\n\t\tconst promptGuidelines: string[] = [];\n\t\tfor (const name of contributingToolNames) {\n\t\t\tconst snippet = this._toolPromptSnippets.get(name);\n\t\t\tif (snippet) {\n\t\t\t\ttoolSnippets[name] = snippet;\n\t\t\t}\n\n\t\t\tconst toolGuidelines = this._toolPromptGuidelines.get(name);\n\t\t\tif (toolGuidelines) {\n\t\t\t\tpromptGuidelines.push(...toolGuidelines);\n\t\t\t}\n\t\t}\n\n\t\tconst loadedSkills = this._resourceLoader.getSkills().skills;\n\t\tconst loadedContextFiles = this._resourceLoader.getAgentsFiles().agentsFiles;\n\t\tconst loaderSystemPrompt = this._resourceLoader.getSystemPrompt();\n\t\tconst loaderAppendSystemPrompt = this._resourceLoader.getAppendSystemPrompt();\n\n\t\tthis._baseSystemPromptOptions = {\n\t\t\tcwd: this._cwd,\n\t\t\tskills: loadedSkills,\n\t\t\tcontextFiles: loadedContextFiles,\n\t\t\tselectedTools: validToolNames,\n\t\t\ttoolSnippets,\n\t\t\tpromptGuidelines,\n\t\t\tcustomPrompt: loaderSystemPrompt,\n\t\t\tappendSystemPrompt: loaderAppendSystemPrompt.length > 0 ? loaderAppendSystemPrompt.join(\"\\n\\n\") : undefined,\n\t\t};\n\t\tconst basePrompt = loaderSystemPrompt ?? buildDynamicSystemPrompt(this._baseSystemPromptOptions);\n\t\tconst prompt =\n\t\t\tloaderAppendSystemPrompt.length > 0 ? `${basePrompt}\\n\\n${loaderAppendSystemPrompt.join(\"\\n\\n\")}` : basePrompt;\n\t\tif (!this._isEvalOnlyPolicyArmed()) return prompt;\n\t\tconst armed = this._evalOnlyToolNames ?? new Set<string>();\n\t\tconst registered = new Set([...armed].filter((name) => this._toolRegistry.has(name)));\n\t\tconst sentences: string[] = [];\n\t\tconst shellHelpers = [\"bash\", \"powershell\"].filter((name) => registered.has(name)).map(evalHelperCall);\n\t\tif (shellHelpers.length > 0) {\n\t\t\tsentences.push(\n\t\t\t\t`Shell commands run ONLY inside eval cells via ${shellHelpers.join(\" or \")}; hooks and permissions still apply.`,\n\t\t\t);\n\t\t}\n\t\tif (registered.has(\"workflow\")) {\n\t\t\tsentences.push(\n\t\t\t\t`The workflow tool runs ONLY inside eval cells via ${evalHelperCall(\"workflow\")}; hooks and permissions still apply.`,\n\t\t\t);\n\t\t}\n\t\t// SDK embedders can arm names outside the built-in groups; they still need eval guidance.\n\t\tconst otherHelpers = [...registered]\n\t\t\t.filter((name) => name !== \"bash\" && name !== \"powershell\" && name !== \"workflow\")\n\t\t\t.map(evalHelperCall);\n\t\tif (otherHelpers.length > 0) {\n\t\t\tsentences.push(\n\t\t\t\t`These tools run ONLY inside eval cells via ${otherHelpers.join(\" or \")}; hooks and permissions still apply.`,\n\t\t\t);\n\t\t}\n\t\treturn sentences.length > 0 ? `${prompt}\\n\\n${sentences.join(\"\\n\\n\")}` : prompt;\n\t}\n\n\t/**\n\t * Send a prompt to the agent.\n\t * - Handles extension commands (registered via pi.registerCommand) immediately, even during streaming\n\t * - Expands file-based prompt templates by default\n\t * - During streaming, queues via steer() or followUp() based on streamingBehavior option\n\t * - Validates model and API key before sending (when not streaming)\n\t * @throws Error if streaming and no streamingBehavior specified\n\t * @throws Error if no model selected or no API key available (when not streaming)\n\t */\n\tasync prompt(text: string, options?: PromptOptions): Promise<void> {\n\t\tconst throwIfCancelled = (): void => {\n\t\t\tif (!options?.signal?.aborted) return;\n\t\t\tconst error = new Error(\"Prompt cancelled before acceptance\");\n\t\t\terror.name = \"AbortError\";\n\t\t\tthrow error;\n\t\t};\n\t\tthrowIfCancelled();\n\t\tconst userAbortPromise = this._userAbortPromise;\n\t\tif (userAbortPromise) {\n\t\t\tawait userAbortPromise;\n\t\t\tthrowIfCancelled();\n\t\t}\n\n\t\t// Extension commands are UI actions, not prompts: dispatch them before the\n\t\t// settled-session-work gate below. That gate makes a bare prompt() wait for\n\t\t// _sessionWorkBarrier, which a scheduled continuation (goal chain, queued\n\t\t// follow-up) holds for an entire run, so a command typed mid-turn used to run\n\t\t// only after the turn ended. The registry lookup stays synchronous so ordinary\n\t\t// text beginning with \"/\" gains no await before the prompt-start bookkeeping.\n\t\ttry {\n\t\t\tif ((options?.expandPromptTemplates ?? true) && text.startsWith(\"/\")) {\n\t\t\t\tconst spaceIndex = text.indexOf(\" \");\n\t\t\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\t\t\tif (this._extensionRunner.getCommand(commandName)) {\n\t\t\t\t\tconst handled = await this._tryExecuteExtensionCommand(text);\n\t\t\t\t\tthrowIfCancelled();\n\t\t\t\t\tif (handled) {\n\t\t\t\t\t\toptions?.promptDisposition?.(\"handled\");\n\t\t\t\t\t\toptions?.preflightResult?.(true);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\toptions?.preflightResult?.(false);\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (options?.source !== \"extension\" && this._compactionAbortController !== undefined) {\n\t\t\toptions?.preflightResult?.(false);\n\t\t\tthrow new Error(\n\t\t\t\t\"Cannot submit a prompt while compaction is in progress. Wait for compaction to finish and retry.\",\n\t\t\t);\n\t\t}\n\n\t\tconst ownsPromptStart =\n\t\t\t!this.isStreaming && !this._promptStartPending && options?.streamingBehavior === undefined;\n\t\tif (ownsPromptStart) this._promptStartPending = true;\n\t\t// Extension bindings deliberately fire-and-forget sendUserMessage(), so an\n\t\t// extension callback cannot deadlock on this wait. The resulting provider\n\t\t// turn must still serialize behind compaction and other session work just\n\t\t// like an interactive prompt does.\n\t\tconst shouldWaitForSessionWork = true;\n\t\tconst pendingCompactionAdmissionAtExtensionAdmission =\n\t\t\toptions?.source === \"extension\" ? this._pendingCompactionAdmission : undefined;\n\t\tconst compactionGenerationAtExtensionAdmission =\n\t\t\toptions?.source === \"extension\" &&\n\t\t\tthis._sessionWorkBarrier.hasActiveWork &&\n\t\t\tthis._compactionLifecycle.state.status !== \"idle\"\n\t\t\t\t? this._compactionLifecycle.state.generation\n\t\t\t\t: undefined;\n\t\t// A steer/followUp submission during an active run can be queued immediately.\n\t\t// Waiting on the session-work barrier here would trap the message inside this\n\t\t// call for the rest of the run whenever a queued continuation (e.g. an active\n\t\t// goal chain) holds the barrier, making typed input invisible until the run\n\t\t// ends or the user aborts.\n\t\tconst canQueueWhileStreaming =\n\t\t\t(this.isStreaming || this._promptStartPending) &&\n\t\t\t!this.isCompacting &&\n\t\t\toptions?.streamingBehavior !== undefined;\n\t\t// Auto-compaction claims only _autoCompactionAbortController, which the\n\t\t// admission guard above deliberately ignores so background compaction never\n\t\t// rejects typed input. Without a queue route that message matched no branch\n\t\t// below and fell through neither queued nor started (field bug: input typed\n\t\t// while the TUI showed \"Compacting context...\" was accepted and dropped).\n\t\t// Manual compaction keeps its fail-closed admission path untouched.\n\t\tconst canQueueDuringAutoCompaction =\n\t\t\tthis._autoCompactionAbortController !== undefined &&\n\t\t\tthis._compactionAbortController === undefined &&\n\t\t\t!this.isStreaming &&\n\t\t\t!this._promptStartPending &&\n\t\t\toptions?.streamingBehavior !== undefined;\n\t\tif (\n\t\t\tshouldWaitForSessionWork &&\n\t\t\t!canQueueWhileStreaming &&\n\t\t\t!canQueueDuringAutoCompaction &&\n\t\t\t(!this.isStreaming || this.isCompacting || this._sessionWorkBarrier.hasActiveWork)\n\t\t) {\n\t\t\tawait this._waitForSettledSessionWork();\n\t\t\tthrowIfCancelled();\n\t\t\toptions?.onSessionWorkReady?.();\n\t\t}\n\n\t\t// Turn boundary: restore the primary model if the fallback cooldown expired.\n\t\tif (!this.isStreaming) {\n\t\t\ttry {\n\t\t\t\tawait this._maybeRestoreFallbackPrimary();\n\t\t\t} catch (error) {\n\t\t\t\tif (ownsPromptStart) this._promptStartPending = false;\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t}\n\n\t\tconst expandPromptTemplates = options?.expandPromptTemplates ?? true;\n\t\tconst preflightResult = options?.preflightResult;\n\t\tconst promptDisposition = options?.promptDisposition;\n\t\tlet messages: AgentMessage[] | undefined;\n\t\tlet titlePrompt: string | undefined;\n\t\tlet consumedNextTurnMessages: CustomMessage[] | undefined;\n\t\tlet inputId: string | undefined;\n\t\tlet pendingCommandInvocation: CommandInvocation | undefined;\n\t\tconst emitPendingCommandInvocation = (): void => {\n\t\t\tif (!pendingCommandInvocation) return;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"command_invocation\",\n\t\t\t\tcommand: pendingCommandInvocation,\n\t\t\t});\n\t\t\tpendingCommandInvocation = undefined;\n\t\t};\n\t\tconst emitInputDisposition = async (\n\t\t\tdisposition: \"handled\" | \"queued\" | \"started\" | \"rejected\",\n\t\t): Promise<void> => {\n\t\t\tif (inputId === undefined) return;\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"input_disposition\",\n\t\t\t\tinputId,\n\t\t\t\tdisposition,\n\t\t\t});\n\t\t};\n\n\t\ttry {\n\t\t\t// Emit input event for extension interception (before skill/template expansion)\n\t\t\tlet currentText = text;\n\t\t\tlet currentImages = options?.images;\n\t\t\tif (this._extensionRunner.hasHandlers(\"input\")) {\n\t\t\t\tinputId = `${this.sessionManager.getSessionId()}:${++this._nextInputId}`;\n\t\t\t\tconst inputResult = await this._extensionRunner.emitInput(\n\t\t\t\t\tcurrentText,\n\t\t\t\t\tcurrentImages,\n\t\t\t\t\toptions?.source ?? \"interactive\",\n\t\t\t\t\tthis.isStreaming ? options?.streamingBehavior : undefined,\n\t\t\t\t\tinputId,\n\t\t\t\t);\n\t\t\t\tthrowIfCancelled();\n\t\t\t\tif (inputResult.action === \"handled\") {\n\t\t\t\t\tawait emitInputDisposition(\"handled\");\n\t\t\t\t\tpromptDisposition?.(\"handled\");\n\t\t\t\t\tpreflightResult?.(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (inputResult.action === \"transform\") {\n\t\t\t\t\tcurrentText = inputResult.text;\n\t\t\t\t\tcurrentImages = inputResult.images ?? currentImages;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Expand skill commands (/skill:name args) and prompt templates (/template args)\n\t\t\tlet expandedText = currentText;\n\t\t\tif (expandPromptTemplates) {\n\t\t\t\texpandedText = this._expandSkillCommand(expandedText);\n\t\t\t\tconst templateExpansion = expandPromptTemplateWithMetadata(expandedText, [...this.promptTemplates]);\n\t\t\t\texpandedText = templateExpansion.text;\n\t\t\t\tif (templateExpansion.template) {\n\t\t\t\t\tpendingCommandInvocation = {\n\t\t\t\t\t\tname: templateExpansion.template.name,\n\t\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\t\tsourceInfo: templateExpansion.template.sourceInfo,\n\t\t\t\t\t\tsyntax: \"slash\",\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\ttitlePrompt = options?.sessionTitlePrompt === false ? undefined : (options?.sessionTitlePrompt ?? text);\n\n\t\t\t// If streaming, queue via steer() or followUp() based on option\n\t\t\tif (this.isStreaming) {\n\t\t\t\tif (!options?.streamingBehavior) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"Agent is already processing. Specify streamingBehavior ('steer' or 'followUp') to queue the message.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (options.thinkingLevel !== undefined) {\n\t\t\t\t\tthrow new Error(\"Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.\");\n\t\t\t\t}\n\t\t\t\tif (options.streamingBehavior === \"followUp\") {\n\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t}\n\t\t\t\temitPendingCommandInvocation();\n\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\tpreflightResult?.(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Input accepted while a run was active remains queued even if that run\n\t\t\t// ends while extension input handling or template expansion is pending.\n\t\t\t// Starting a fresh prompt here would let it overtake the held continuation.\n\t\t\tif (canQueueWhileStreaming && !this.isStreaming) {\n\t\t\t\tif (options?.thinkingLevel !== undefined) {\n\t\t\t\t\tthrow new Error(\"Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.\");\n\t\t\t\t}\n\t\t\t\tif (options?.streamingBehavior === \"followUp\") {\n\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t}\n\t\t\t\temitPendingCommandInvocation();\n\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\tpreflightResult?.(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Auto-compaction owns the session without claiming the admission controller,\n\t\t\t// so a queueable submission reaches here with no branch above matching and\n\t\t\t// would fall through neither queued nor started. Queue it instead of starting\n\t\t\t// a turn against a context that is still being compacted.\n\t\t\tif (canQueueDuringAutoCompaction && !this.isStreaming) {\n\t\t\t\tif (options?.thinkingLevel !== undefined) {\n\t\t\t\t\tthrow new Error(\"Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.\");\n\t\t\t\t}\n\t\t\t\tif (options?.streamingBehavior === \"followUp\") {\n\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t}\n\t\t\t\temitPendingCommandInvocation();\n\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\tpreflightResult?.(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// The queue-while-streaming bypass above skipped the settled-work wait. If\n\t\t\t// the run ended while input was being expanded, serialize with remaining\n\t\t\t// session work before sending a fresh prompt, and re-queue if a scheduled\n\t\t\t// continuation started a new run in the meantime.\n\t\t\tif (\n\t\t\t\tcanQueueWhileStreaming &&\n\t\t\t\tshouldWaitForSessionWork &&\n\t\t\t\t(this.isCompacting || this._sessionWorkBarrier.hasActiveWork)\n\t\t\t) {\n\t\t\t\tawait this._waitForSettledSessionWork();\n\t\t\t\tthrowIfCancelled();\n\t\t\t\tif (this.isStreaming) {\n\t\t\t\t\tif (options?.thinkingLevel !== undefined) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\"Cannot set thinkingLevel on a queued prompt; set it after the current turn completes.\",\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (options?.streamingBehavior === \"followUp\") {\n\t\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t\t}\n\t\t\t\t\temitPendingCommandInvocation();\n\t\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\t\tpreflightResult?.(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// A background extension prompt that arrived during a manual compaction\n\t\t\t// must never overtake a rejected or aborted compaction. Keep its normal\n\t\t\t// queue ownership instead of attempting another provider admission.\n\t\t\tif (\n\t\t\t\t(pendingCompactionAdmissionAtExtensionAdmission !== undefined &&\n\t\t\t\t\tpendingCompactionAdmissionAtExtensionAdmission.outcome !== \"completed\") ||\n\t\t\t\t(compactionGenerationAtExtensionAdmission !== undefined &&\n\t\t\t\t\tthis._compactionLifecycle.state.generation === compactionGenerationAtExtensionAdmission &&\n\t\t\t\t\t(this._compactionLifecycle.state.status === \"failed\" ||\n\t\t\t\t\t\tthis._compactionLifecycle.state.status === \"aborted\"))\n\t\t\t) {\n\t\t\t\tif (options?.streamingBehavior === \"followUp\") {\n\t\t\t\t\tawait this._queueFollowUp(expandedText, currentImages);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueSteer(expandedText, currentImages);\n\t\t\t\t}\n\t\t\t\temitPendingCommandInvocation();\n\t\t\t\tawait emitInputDisposition(\"queued\");\n\t\t\t\tpromptDisposition?.(\"queued\");\n\t\t\t\tpreflightResult?.(true);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Flush any pending bash messages before the new prompt\n\t\t\tthis._flushPendingBashMessages();\n\n\t\t\t// Validate model\n\t\t\tif (!this.model) {\n\t\t\t\tthrow new Error(formatNoModelSelectedMessage());\n\t\t\t}\n\n\t\t\tconst hasConfiguredAuth =\n\t\t\t\tthis._modelRuntime.hasConfiguredAuth(this.model.provider) ||\n\t\t\t\t(await this._modelRuntime.checkAuth(this.model.provider)) !== undefined;\n\t\t\tif (!hasConfiguredAuth) {\n\t\t\t\tconst isOAuth = this._modelRuntime.isUsingOAuth(this.model.provider);\n\t\t\t\tif (isOAuth) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Authentication failed for \"${this.model.provider}\". ` +\n\t\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t\t`Run '/login ${this.model.provider}' to re-authenticate.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tthrow new Error(formatNoApiKeyFoundMessage(this.model.provider));\n\t\t\t}\n\n\t\t\t// The user's new prompt is sent below, so do not call agent.continue() here.\n\t\t\tawait this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(), false, \"pre_prompt\");\n\n\t\t\t// Build messages array (custom message if any, then user message)\n\t\t\tmessages = [];\n\n\t\t\t// Add user message\n\t\t\tconst userContent: (TextContent | ImageContent)[] = [{ type: \"text\", text: expandedText }];\n\t\t\tif (currentImages) {\n\t\t\t\tuserContent.push(...currentImages);\n\t\t\t}\n\t\t\tmessages.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: userContent,\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t});\n\n\t\t\t// Consume next-turn messages transactionally: a final admission rejection\n\t\t\t// restores them in their original order rather than dropping or duplicating\n\t\t\t// one-shot extension state.\n\t\t\tconsumedNextTurnMessages = this._pendingNextTurnMessages;\n\t\t\tthis._pendingNextTurnMessages = [];\n\t\t\tfor (const msg of consumedNextTurnMessages) {\n\t\t\t\tmessages.push(msg);\n\t\t\t}\n\n\t\t\t// Emit before_agent_start extension event\n\t\t\tconst result = await this._extensionRunner.emitBeforeAgentStart(\n\t\t\t\texpandedText,\n\t\t\t\tcurrentImages,\n\t\t\t\tthis._baseSystemPrompt,\n\t\t\t\tthis._baseSystemPromptOptions,\n\t\t\t);\n\t\t\t// Add all custom messages from extensions\n\t\t\tif (result?.messages) {\n\t\t\t\tfor (const msg of result.messages) {\n\t\t\t\t\tmessages.push({\n\t\t\t\t\t\trole: \"custom\",\n\t\t\t\t\t\tcustomType: msg.customType,\n\t\t\t\t\t\t// Untyped extensions can pass null/missing content; normalize at ingestion.\n\t\t\t\t\t\tcontent: msg.content ?? [],\n\t\t\t\t\t\tdisplay: msg.display,\n\t\t\t\t\t\tdetails: msg.details,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Apply extension-modified system prompt, or reset to base\n\t\t\tif (result?.systemPrompt !== undefined) {\n\t\t\t\tthis._systemPromptOverride = result.systemPrompt;\n\t\t\t\tthis.agent.state.systemPrompt = result.systemPrompt;\n\t\t\t} else {\n\t\t\t\t// Ensure we're using the base prompt (in case previous turn had modifications)\n\t\t\t\tthis._systemPromptOverride = undefined;\n\t\t\t\tthis.agent.state.systemPrompt = this._baseSystemPrompt;\n\t\t\t}\n\n\t\t\t// The preflight above only sees persisted session context. These prompt,\n\t\t\t// next-turn, and before_agent_start additions are also provider-visible,\n\t\t\t// so make one final admission decision against the complete request.\n\t\t\tawait this._enforceFinalProviderAdmission(messages);\n\t\t\tthrowIfCancelled();\n\t\t\tawait emitInputDisposition(\"started\");\n\t\t} catch (error) {\n\t\t\tawait emitInputDisposition(\"rejected\");\n\t\t\tif (consumedNextTurnMessages && consumedNextTurnMessages.length > 0) {\n\t\t\t\tthis._pendingNextTurnMessages = [...consumedNextTurnMessages, ...this._pendingNextTurnMessages];\n\t\t\t}\n\t\t\tpreflightResult?.(false);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (ownsPromptStart) this._promptStartPending = false;\n\t\t}\n\n\t\tif (!messages) {\n\t\t\treturn;\n\t\t}\n\n\t\tpromptDisposition?.(\"started\");\n\t\temitPendingCommandInvocation();\n\t\tpreflightResult?.(true);\n\t\tif (options?.thinkingLevel !== undefined) {\n\t\t\tthis.setSessionThinkingLevel(options.thinkingLevel);\n\t\t}\n\t\tawait this._promptAgent(messages);\n\t\tawait this.waitForRetry();\n\t\tawait this.waitForIdle();\n\t\tif (options?.onSessionWorkReady) {\n\t\t\t// This prompt owns a session-work token acquired after waiting for a\n\t\t\t// prior operation, so waiting for the global barrier here would await\n\t\t\t// itself. _promptAgent() already drained its event queue; any newly\n\t\t\t// scheduled continuation retains its own barrier ownership.\n\t\t\tawait this.agent.waitForIdle();\n\t\t} else if (shouldWaitForSessionWork) {\n\t\t\tawait this._waitForSettledSessionWork();\n\t\t} else {\n\t\t\tawait this.agent.waitForIdle();\n\t\t}\n\t\tif (titlePrompt !== undefined) {\n\t\t\tthis._startSessionTitleGeneration(titlePrompt);\n\t\t}\n\t}\n\n\t/**\n\t * Try to execute an extension command. Returns true if command was found and executed.\n\t */\n\tprivate async _tryExecuteExtensionCommand(text: string): Promise<boolean> {\n\t\t// Parse command name and args\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\tconst args = spaceIndex === -1 ? \"\" : text.slice(spaceIndex + 1);\n\n\t\tconst command = this._extensionRunner.getCommand(commandName);\n\t\tif (!command) return false;\n\t\tthis._emit({\n\t\t\ttype: \"command_invocation\",\n\t\t\tcommand: {\n\t\t\t\tname: commandName,\n\t\t\t\tsource: \"extension\",\n\t\t\t\tsourceInfo: command.sourceInfo,\n\t\t\t\tsyntax: \"slash\",\n\t\t\t},\n\t\t});\n\n\t\t// Get command context from extension runner (includes session control methods)\n\t\tconst ctx = this._extensionRunner.createCommandContext();\n\n\t\ttry {\n\t\t\tawait command.handler(args, ctx);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\t// Emit error via extension runner\n\t\t\tthis._extensionRunner.emitError({\n\t\t\t\textensionPath: `command:${commandName}`,\n\t\t\t\tevent: \"command\",\n\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\t}\n\n\t/**\n\t * Expand explicit skill invocations to their full content.\n\t * Leading runs accept slash and dollar syntax; inline expansion is limited to\n\t * the desktop's explicit `$skill:name` token so ordinary dollar prose stays literal.\n\t */\n\tprivate _expandSkillCommand(text: string): string {\n\t\tconst invocationTokens = parseSkillInvocationTokens(text);\n\t\tif (invocationTokens.length === 0) return text;\n\n\t\tconst skills = this.resourceLoader.getSkills().skills;\n\t\tconst expandedSkillNames = new Set<string>();\n\t\tconst skillBlocks: SkillInvocationPromptSkill[] = [];\n\t\tconst invocationMetadata: Array<{\n\t\t\tname: string;\n\t\t\tpath: string;\n\t\t\tsyntax: SkillInvocationSyntax;\n\t\t}> = [];\n\t\tconst removedTokens: SkillInvocationToken[] = [];\n\n\t\tfor (const token of invocationTokens) {\n\t\t\tconst skill = skills.find((candidate) => candidate.name === token.name);\n\t\t\tif (!skill) {\n\t\t\t\tif (token.position === \"leading\") break;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (skillBlocks.length >= MAX_SKILL_EXPANSIONS_PER_PROMPT) {\n\t\t\t\tthis._extensionRunner.emitError({\n\t\t\t\t\textensionPath: \"skill:expansion\",\n\t\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\t\terror: `Expanded at most ${MAX_SKILL_EXPANSIONS_PER_PROMPT} skills; remaining skill commands were left as literal text.`,\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tremovedTokens.push(token);\n\t\t\tif (expandedSkillNames.has(skill.name)) {\n\t\t\t\tthis._extensionRunner.emitError({\n\t\t\t\t\textensionPath: skill.filePath,\n\t\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\t\terror: `Skipped duplicate skill invocation: ${skill.name}`,\n\t\t\t\t});\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tconst content = readFileSync(skill.filePath, \"utf-8\");\n\t\t\t\tconst body = stripFrontmatter(content).trim();\n\t\t\t\tskillBlocks.push({\n\t\t\t\t\tname: skill.name,\n\t\t\t\t\tfilePath: skill.filePath,\n\t\t\t\t\tbaseDir: skill.baseDir,\n\t\t\t\t\tbody,\n\t\t\t\t});\n\t\t\t\texpandedSkillNames.add(skill.name);\n\t\t\t\tinvocationMetadata.push({\n\t\t\t\t\tname: skill.name,\n\t\t\t\t\tpath: skill.filePath,\n\t\t\t\t\tsyntax: token.syntax,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tthis._extensionRunner.emitError({\n\t\t\t\t\textensionPath: skill.filePath,\n\t\t\t\t\tevent: \"skill_expansion\",\n\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t});\n\t\t\t\treturn text; // Return the original prompt when any skill file cannot be read.\n\t\t\t}\n\t\t}\n\n\t\tif (skillBlocks.length === 0) return text;\n\t\tconst userRequest = removeSkillInvocationTokens(text, removedTokens);\n\t\tthis._emit({ type: \"skill_invocation\", skills: invocationMetadata });\n\t\treturn formatSkillInvocationPrompt(skillBlocks, userRequest);\n\t}\n\n\t/**\n\t * Queue a steering message while the agent is running.\n\t * Delivered after the current assistant turn finishes executing its tool calls,\n\t * before the next LLM call.\n\t * Expands skill commands and prompt templates. Errors on extension commands.\n\t * @param images Optional image attachments to include with the message\n\t * @throws Error if text is an extension command\n\t */\n\tasync steer(text: string, images?: ImageContent[], recovery?: { enqueueOrder?: number }): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\tconst templateExpansion = expandPromptTemplateWithMetadata(expandedText, [...this.promptTemplates]);\n\t\texpandedText = templateExpansion.text;\n\n\t\tawait this._queueSteer(expandedText, images, recovery?.enqueueOrder);\n\t\tif (templateExpansion.template) {\n\t\t\tthis._emit({\n\t\t\t\ttype: \"command_invocation\",\n\t\t\t\tcommand: {\n\t\t\t\t\tname: templateExpansion.template.name,\n\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\tsourceInfo: templateExpansion.template.sourceInfo,\n\t\t\t\t\tsyntax: \"slash\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Queue a follow-up message to be processed after the agent finishes.\n\t * Delivered only when agent has no more tool calls or steering messages.\n\t * Expands skill commands and prompt templates. Errors on extension commands.\n\t * @param images Optional image attachments to include with the message\n\t * @throws Error if text is an extension command\n\t */\n\tasync followUp(text: string, images?: ImageContent[], recovery?: { enqueueOrder?: number }): Promise<void> {\n\t\t// Check for extension commands (cannot be queued)\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tthis._throwIfExtensionCommand(text);\n\t\t}\n\n\t\t// Expand skill commands and prompt templates\n\t\tlet expandedText = this._expandSkillCommand(text);\n\t\tconst templateExpansion = expandPromptTemplateWithMetadata(expandedText, [...this.promptTemplates]);\n\t\texpandedText = templateExpansion.text;\n\n\t\tawait this._queueFollowUp(expandedText, images, recovery?.enqueueOrder);\n\t\tif (templateExpansion.template) {\n\t\t\tthis._emit({\n\t\t\t\ttype: \"command_invocation\",\n\t\t\t\tcommand: {\n\t\t\t\t\tname: templateExpansion.template.name,\n\t\t\t\t\tsource: \"prompt\",\n\t\t\t\t\tsourceInfo: templateExpansion.template.sourceInfo,\n\t\t\t\t\tsyntax: \"slash\",\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _startSessionTitleGeneration(firstPrompt: string): void {\n\t\tif (!this._autoTitleSessions || this.sessionManager.getSessionName() || shouldSkipSessionTitle(firstPrompt)) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._sessionTitleAbortController !== undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst model = this.model;\n\t\tif (!model) {\n\t\t\treturn;\n\t\t}\n\t\tconst abortController = new AbortController();\n\t\tthis._sessionTitleAbortController = abortController;\n\t\tthis._sessionTitlePromise = this._generateSessionTitle(firstPrompt, model, abortController);\n\t}\n\n\tprivate async _generateSessionTitle(\n\t\tfirstPrompt: string,\n\t\tmodel: Model<Api>,\n\t\tabortController: AbortController,\n\t): Promise<void> {\n\t\ttry {\n\t\t\tconst auth = await this._getSummarizationRequestAuth(model);\n\t\t\tconst title = await generateSessionTitle({\n\t\t\t\tfirstPrompt,\n\t\t\t\tmodel,\n\t\t\t\tauth,\n\t\t\t\tsessionId: this.sessionId,\n\t\t\t\tbaseOptions: this._buildSessionTitleBaseOptions(),\n\t\t\t\tretry: sessionTitleRetryPolicy(this.settingsManager.getRetrySettings()),\n\t\t\t\tsignal: abortController.signal,\n\t\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\t});\n\t\t\tif (abortController.signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (title && !this.sessionManager.getSessionName()) {\n\t\t\t\tthis.setSessionName(title);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (abortController.signal.aborted) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthis._extensionRunner.emitError({\n\t\t\t\textensionPath: RUNTIME_EXTENSION_PATH,\n\t\t\t\tevent: \"session_title_generation\",\n\t\t\t\terror: message,\n\t\t\t});\n\t\t} finally {\n\t\t\tif (this._sessionTitleAbortController === abortController) {\n\t\t\t\tthis._sessionTitleAbortController = undefined;\n\t\t\t}\n\t\t\tif (this._sessionTitlePromise !== undefined) {\n\t\t\t\tthis._sessionTitlePromise = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate abortSessionTitleGeneration(): void {\n\t\tthis._sessionTitleAbortController?.abort();\n\t\tthis._sessionTitleAbortController = undefined;\n\t}\n\n\tprivate _buildSessionTitleBaseOptions(): SimpleStreamOptions {\n\t\treturn {\n\t\t\tonPayload: this.agent.onPayload,\n\t\t\tonResponse: this.agent.onResponse,\n\t\t\ttransport: this.agent.transport,\n\t\t\tthinkingBudgets: this.agent.thinkingBudgets,\n\t\t\ttimeoutMs: this.agent.timeoutMs,\n\t\t\tmaxRetryDelayMs: this.agent.maxRetryDelayMs,\n\t\t};\n\t}\n\n\t/**\n\t * Internal: Queue a steering message (already expanded, no extension command check).\n\t */\n\tprivate async _queueSteer(text: string, images?: ImageContent[], enqueueOrder?: number): Promise<void> {\n\t\tthis._steeringMessages.push(text);\n\t\tthis._recordQueuedInput(text, \"steer\", enqueueOrder);\n\t\tthis._sessionLogger.debug(\"queue_enqueue\", {\n\t\t\tmode: \"steer\",\n\t\t\tcount: this._steeringMessages.length,\n\t\t});\n\t\tthis._emitQueueUpdate();\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\tconst message: AgentMessage = {\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tif (this._promptStartPending && this._skipNextPostCompactionAssistantCheck) {\n\t\t\tthis._postCompactionDeferredSteeringMessages.push(message);\n\t\t\treturn;\n\t\t}\n\t\tthis.agent.steer(message);\n\t}\n\n\t/**\n\t * Internal: Queue a follow-up message (already expanded, no extension command check).\n\t */\n\tprivate async _queueFollowUp(text: string, images?: ImageContent[], enqueueOrder?: number): Promise<void> {\n\t\tthis._followUpMessages.push(text);\n\t\tthis._recordQueuedInput(text, \"followUp\", enqueueOrder);\n\t\tthis._sessionLogger.debug(\"queue_enqueue\", {\n\t\t\tmode: \"followUp\",\n\t\t\tcount: this._followUpMessages.length,\n\t\t});\n\t\tthis._emitQueueUpdate();\n\t\tconst content: (TextContent | ImageContent)[] = [{ type: \"text\", text }];\n\t\tif (images) {\n\t\t\tcontent.push(...images);\n\t\t}\n\t\tconst message: AgentMessage = {\n\t\t\trole: \"user\",\n\t\t\tcontent,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t\tif (this._promptStartPending && this._skipNextPostCompactionAssistantCheck) {\n\t\t\tthis._postCompactionDeferredFollowUpMessages.push(message);\n\t\t\treturn;\n\t\t}\n\t\tthis.agent.followUp(message);\n\t}\n\n\tprivate _flushPostCompactionDeferredMessages(): void {\n\t\tfor (const message of this._postCompactionDeferredSteeringMessages) {\n\t\t\tthis.agent.steer(message);\n\t\t}\n\t\tthis._postCompactionDeferredSteeringMessages = [];\n\t\tfor (const message of this._postCompactionDeferredFollowUpMessages) {\n\t\t\tthis.agent.followUp(message);\n\t\t}\n\t\tthis._postCompactionDeferredFollowUpMessages = [];\n\t}\n\n\t/**\n\t * Throw an error if the text is an extension command.\n\t */\n\tprivate _throwIfExtensionCommand(text: string): void {\n\t\tconst spaceIndex = text.indexOf(\" \");\n\t\tconst commandName = spaceIndex === -1 ? text.slice(1) : text.slice(1, spaceIndex);\n\t\tconst command = this._extensionRunner.getCommand(commandName);\n\n\t\tif (command) {\n\t\t\tthrow new Error(\n\t\t\t\t`Extension command \"/${commandName}\" cannot be queued. Use prompt() or execute the command when not streaming.`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Send a custom message to the session. Creates a CustomMessageEntry.\n\t *\n\t * Handles three cases:\n\t * - Streaming: queues message, processed when loop pulls from queue\n\t * - Not streaming + triggerTurn: appends to state/session, starts new turn\n\t * - Not streaming + no trigger: appends to state/session, no turn\n\t *\n\t * @param message Custom message with customType, content, display, details\n\t * @param options.triggerTurn If true and not streaming, triggers a new LLM turn\n\t * @param options.deliverAs Delivery mode: \"steer\", \"followUp\", or \"nextTurn\"\n\t */\n\tasync sendCustomMessage<T = unknown>(\n\t\tmessage: Pick<CustomMessage<T>, \"customType\" | \"content\" | \"display\" | \"details\">,\n\t\toptions?: {\n\t\t\ttriggerTurn?: boolean;\n\t\t\tdeliverAs?: \"steer\" | \"followUp\" | \"nextTurn\";\n\t\t},\n\t\tdeferredTurnClaim?: DeferredTurnClaim,\n\t): Promise<void> {\n\t\tconst userAbortGeneration = this._userAbortGeneration;\n\t\tconst appMessage = {\n\t\t\trole: \"custom\" as const,\n\t\t\tcustomType: message.customType,\n\t\t\t// Untyped extensions can pass null/missing content; normalize at ingestion.\n\t\t\tcontent: message.content ?? [],\n\t\t\tdisplay: message.display,\n\t\t\tdetails: message.details,\n\t\t\ttimestamp: Date.now(),\n\t\t} satisfies CustomMessage<T>;\n\t\tconst waitForExistingSessionWork =\n\t\t\toptions?.triggerTurn === true &&\n\t\t\toptions.deliverAs !== \"nextTurn\" &&\n\t\t\t!this.isStreaming &&\n\t\t\tthis._sessionWorkBarrier.hasActiveWork &&\n\t\t\t// The session-start binding itself holds the barrier while it emits\n\t\t\t// session_start; a triggerTurn message queued from that emission (e.g. a\n\t\t\t// goal continuation) must not wait on the very work that is delivering it.\n\t\t\tthis._extensionBindingPromptReadiness === undefined;\n\t\tconst pendingCompactionAdmission = this._pendingCompactionAdmission;\n\t\tconst activeCompactionGeneration =\n\t\t\tthis._compactionLifecycle.state.status === \"running\" ? this._compactionLifecycle.state.generation : undefined;\n\t\tlet finishSessionWork: (() => void) | undefined;\n\t\ttry {\n\t\t\tif (waitForExistingSessionWork) {\n\t\t\t\tawait this._waitForSettledSessionWork();\n\t\t\t\tif (userAbortGeneration !== this._userAbortGeneration) return;\n\t\t\t\tfinishSessionWork = this._sessionWorkBarrier.begin();\n\t\t\t}\n\n\t\t\tif (options?.deliverAs === \"nextTurn\") {\n\t\t\t\tthis._pendingNextTurnMessages.push(appMessage);\n\t\t\t} else if (this.isStreaming && options?.triggerTurn !== false) {\n\t\t\t\tdeferredTurnClaim?.resolve(\"delegated\");\n\t\t\t\tif (options?.deliverAs === \"followUp\") {\n\t\t\t\t\tthis.agent.followUp(appMessage);\n\t\t\t\t} else {\n\t\t\t\t\tthis.agent.steer(appMessage);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\toptions?.triggerTurn === true &&\n\t\t\t\t((pendingCompactionAdmission !== undefined && pendingCompactionAdmission.outcome !== \"completed\") ||\n\t\t\t\t\t(activeCompactionGeneration !== undefined &&\n\t\t\t\t\t\tthis._compactionLifecycle.state.generation === activeCompactionGeneration &&\n\t\t\t\t\t\tthis._compactionLifecycle.state.status !== \"completed\"))\n\t\t\t) {\n\t\t\t\tdeferredTurnClaim?.resolve(\"delegated\");\n\t\t\t\tif (options?.deliverAs === \"followUp\") {\n\t\t\t\t\tthis.agent.followUp(appMessage);\n\t\t\t\t} else {\n\t\t\t\t\tthis.agent.steer(appMessage);\n\t\t\t\t}\n\t\t\t} else if (options?.triggerTurn) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this._enforceCompactionBeforeProvider(this._findLastAssistantMessage(), false, \"pre_prompt\");\n\t\t\t\t\tawait this._enforceFinalProviderAdmission([appMessage]);\n\t\t\t\t} catch (error) {\n\t\t\t\t\t// Mirror sendUserMessage's retention contract: an admission\n\t\t\t\t\t// rejection must retain the message for later delivery instead\n\t\t\t\t\t// of silently dropping it (the fire-and-forget extension action\n\t\t\t\t\t// swallows this rejection).\n\t\t\t\t\tif (options.deliverAs === \"followUp\") {\n\t\t\t\t\t\tthis.agent.followUp(appMessage);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.agent.steer(appMessage);\n\t\t\t\t\t}\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t\tawait this._promptAgent(appMessage, deferredTurnClaim);\n\t\t\t} else if (this.isStreaming) {\n\t\t\t\tthis._pendingCustomMessages.push(appMessage);\n\t\t\t} else {\n\t\t\t\tthis._appendCustomMessage(appMessage);\n\t\t\t}\n\t\t} finally {\n\t\t\tdeferredTurnClaim?.resolve(\"finished-without-start\");\n\t\t\tfinishSessionWork?.();\n\t\t}\n\t}\n\n\tprivate _appendCustomMessage(appMessage: CustomMessage): void {\n\t\tthis.agent.state.messages.push(appMessage);\n\t\tthis._emitEntryAppended(\n\t\t\tthis.sessionManager.appendCustomMessageEntry(\n\t\t\t\tappMessage.customType,\n\t\t\t\tappMessage.content,\n\t\t\t\tappMessage.display,\n\t\t\t\tappMessage.details,\n\t\t\t),\n\t\t);\n\t\tthis._incrementMessageRevision();\n\t\tthis._emit({ type: \"message_start\", message: appMessage });\n\t\tthis._emit({ type: \"message_end\", message: appMessage });\n\t}\n\n\tprivate _flushPendingCustomMessages(): void {\n\t\tconst pending = this._pendingCustomMessages;\n\t\tthis._pendingCustomMessages = [];\n\t\tfor (const message of pending) this._appendCustomMessage(message);\n\t}\n\n\t/**\n\t * Send a user message to the agent. Always triggers a turn.\n\t * When the agent is streaming, use deliverAs to specify how to queue the message.\n\t * If the prompt path rejects before the message reaches a queue or a turn\n\t * (e.g. a required compaction that cannot complete), the message is retained\n\t * in the steering/followUp queue for later delivery and the error still propagates.\n\t *\n\t * @param content User message content (string or content array)\n\t * @param options.deliverAs Delivery mode when streaming: \"steer\" or \"followUp\"\n\t * @param options.expandPromptTemplates Whether to dispatch extension commands and expand skill commands and prompt templates. Default: false.\n\t */\n\tasync sendUserMessage(\n\t\tcontent: string | (TextContent | ImageContent)[],\n\t\toptions?: {\n\t\t\tdeliverAs?: \"steer\" | \"followUp\";\n\t\t\texpandPromptTemplates?: boolean;\n\t\t},\n\t\tdeferredTurnClaim?: DeferredTurnClaim,\n\t): Promise<void> {\n\t\tconst bindingPromptReadiness = this._extensionBindingPromptReadiness;\n\t\tlet resolveBindingPromptReadiness: (() => void) | undefined;\n\t\tif (bindingPromptReadiness) {\n\t\t\tconst readiness = new Promise<void>((resolve) => {\n\t\t\t\tresolveBindingPromptReadiness = resolve;\n\t\t\t});\n\t\t\tbindingPromptReadiness.add(readiness);\n\t\t}\n\t\t// Normalize content to text string + optional images. A throw here (null or a\n\t\t// content array whose iterator/part getter throws) happens before the guarded\n\t\t// try below, so resolve the deferred-turn claim first to keep agent_idle reachable.\n\t\tlet text: string;\n\t\tlet images: ImageContent[] | undefined;\n\n\t\ttry {\n\t\t\tif (typeof content === \"string\") {\n\t\t\t\ttext = content;\n\t\t\t} else {\n\t\t\t\tconst textParts: string[] = [];\n\t\t\t\timages = [];\n\t\t\t\tfor (const part of content) {\n\t\t\t\t\tif (part.type === \"text\") {\n\t\t\t\t\t\ttextParts.push(part.text);\n\t\t\t\t\t} else {\n\t\t\t\t\t\timages.push(part);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttext = textParts.join(\"\\n\");\n\t\t\t\tif (images.length === 0) images = undefined;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tdeferredTurnClaim?.resolve(\"finished-without-start\");\n\t\t\tresolveBindingPromptReadiness?.();\n\t\t\tthrow error;\n\t\t}\n\n\t\t// An extension binding invokes this method fire-and-forget. When it\n\t\t// arrives during session work, retain a barrier token after the prior work\n\t\t// settles so callers observing session idle cannot race its provider turn.\n\t\tconst waitForExistingSessionWork = this._sessionWorkBarrier.hasActiveWork;\n\t\tlet finishSessionWork: (() => void) | undefined;\n\t\tlet disposition: PromptDisposition | undefined;\n\t\ttry {\n\t\t\tawait this.prompt(text, {\n\t\t\t\texpandPromptTemplates: options?.expandPromptTemplates ?? false,\n\t\t\t\tstreamingBehavior: options?.deliverAs,\n\t\t\t\timages,\n\t\t\t\tsource: \"extension\",\n\t\t\t\tpromptDisposition: (nextDisposition) => {\n\t\t\t\t\tdisposition = nextDisposition;\n\t\t\t\t\tif (nextDisposition === \"started\") deferredTurnClaim?.resolve(\"started\");\n\t\t\t\t\telse if (nextDisposition === \"queued\") deferredTurnClaim?.resolve(\"delegated\");\n\t\t\t\t\tresolveBindingPromptReadiness?.();\n\t\t\t\t},\n\t\t\t\tonSessionWorkReady: waitForExistingSessionWork\n\t\t\t\t\t? () => {\n\t\t\t\t\t\t\tfinishSessionWork ??= this._sessionWorkBarrier.begin();\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t\tsessionTitlePrompt: false,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\t// Extension bindings invoke this method fire-and-forget, so a rejection\n\t\t\t// before prompt() accepted the message must not silently drop it.\n\t\t\tif (disposition === undefined) {\n\t\t\t\tif (options?.deliverAs === \"steer\") {\n\t\t\t\t\tawait this._queueSteer(text, images);\n\t\t\t\t} else {\n\t\t\t\t\tawait this._queueFollowUp(text, images);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\t// A path that neither started nor delegated a turn (handled, rejected,\n\t\t\t// admission failure, cancellation) resolves as finished-without-start.\n\t\t\tdeferredTurnClaim?.resolve(\"finished-without-start\");\n\t\t\tresolveBindingPromptReadiness?.();\n\t\t\tfinishSessionWork?.();\n\t\t}\n\t}\n\n\t/** Reserve a global order for input temporarily owned outside the native queues. */\n\treserveQueuedInputOrder(): number {\n\t\tthis._nextQueuedInputOrder += 1;\n\t\treturn this._nextQueuedInputOrder;\n\t}\n\n\tprivate _recordQueuedInput(text: string, mode: QueuedInput[\"mode\"], enqueueOrder?: number): void {\n\t\tconst order = enqueueOrder ?? this.reserveQueuedInputOrder();\n\t\tthis._nextQueuedInputOrder = Math.max(this._nextQueuedInputOrder, order);\n\t\tthis._queuedInputOrder.push({ text, mode, enqueueOrder: order });\n\t}\n\n\tprivate _removeQueuedInput(text: string, mode: QueuedInput[\"mode\"]): void {\n\t\tconst index = this._queuedInputOrder.findIndex((message) => message.mode === mode && message.text === text);\n\t\tif (index !== -1) this._queuedInputOrder.splice(index, 1);\n\t}\n\n\t/**\n\t * Clear all queued messages and return them. The non-enumerable `ordered`\n\t * view preserves legacy object equality and native queue semantics.\n\t * @param options.abortWillFollow Mark a non-empty drain so an immediately following abort can emit session_abort.\n\t */\n\tclearQueue(options: { abortWillFollow: boolean } = { abortWillFollow: false }): ClearedQueue {\n\t\tconst steering = [...this._steeringMessages];\n\t\tconst followUp = [...this._followUpMessages];\n\t\tconst ordered = [...this._queuedInputOrder].sort((a, b) => a.enqueueOrder - b.enqueueOrder);\n\t\tif (options.abortWillFollow && (steering.length > 0 || followUp.length > 0)) {\n\t\t\tthis._hadClearedQueuedMessages = true;\n\t\t}\n\t\t// Clear every queue synchronously. Deferred post-compaction messages are\n\t\t// already represented in visible bookkeeping, so they must not be returned\n\t\t// a second time or later resurrected into Agent's native queues.\n\t\tthis._steeringMessages = [];\n\t\tthis._followUpMessages = [];\n\t\tthis._queuedInputOrder = [];\n\t\tthis._postCompactionDeferredSteeringMessages = [];\n\t\tthis._postCompactionDeferredFollowUpMessages = [];\n\t\tthis.agent.clearAllQueues();\n\t\tthis._emitQueueUpdate();\n\t\tconst cleared = { steering, followUp } as ClearedQueue;\n\t\tObject.defineProperty(cleared, \"ordered\", {\n\t\t\tvalue: ordered,\n\t\t\tenumerable: false,\n\t\t});\n\t\treturn cleared;\n\t}\n\n\t/** Number of pending messages (includes both steering and follow-up) */\n\tget pendingMessageCount(): number {\n\t\treturn this._steeringMessages.length + this._followUpMessages.length;\n\t}\n\n\t/** Get pending steering messages (read-only) */\n\tgetSteeringMessages(): readonly string[] {\n\t\treturn this._steeringMessages;\n\t}\n\n\t/** Get pending follow-up messages (read-only) */\n\tgetFollowUpMessages(): readonly string[] {\n\t\treturn this._followUpMessages;\n\t}\n\n\tget resourceLoader(): ResourceLoader {\n\t\treturn this._resourceLoader;\n\t}\n\n\t/**\n\t * Abort current operation and wait for agent to become idle.\n\t */\n\tasync abort(): Promise<void> {\n\t\t// Streaming aborts are carried by agent_end provenance; only gaps need session_abort.\n\t\tconst wasMidRun = this.isStreaming && this._retryAbortController === undefined;\n\t\tconst hadRetryBackoff = this._retryAbortController !== undefined;\n\t\tconst hadCompactionOrPending = !this.isStreaming && (this.isCompacting || this.pendingMessageCount > 0);\n\t\tconst hadClearedQueues = this._hadClearedQueuedMessages;\n\t\tconst joinedAgentEndBoundary = this._abortProvenance.hasOpenAgentEndBoundary;\n\t\tthis._hadClearedQueuedMessages = false;\n\t\tconst shouldEmitAbort =\n\t\t\t!joinedAgentEndBoundary && !wasMidRun && (hadRetryBackoff || hadCompactionOrPending || hadClearedQueues);\n\t\tthis.abortCompaction();\n\t\tawait this._abortActiveAgentAndRetry(\"user\");\n\t\tif (!shouldEmitAbort) return;\n\t\ttry {\n\t\t\tawait this._emitSessionAbort();\n\t\t} catch {\n\t\t\t// Extension runner may be torn down during RPC close — best-effort.\n\t\t}\n\t}\n\n\tasync waitForIdle(): Promise<void> {\n\t\tif (this.isIdle) {\n\t\t\treturn;\n\t\t}\n\t\tawait this._getIdleWaitPromise();\n\t}\n\n\t// =========================================================================\n\t// Model Management\n\t// =========================================================================\n\n\tprivate async _emitModelSelect(\n\t\tnextModel: Model<any>,\n\t\tpreviousModel: Model<any> | undefined,\n\t\tsource: ModelSelectSource,\n\t): Promise<SystemPromptChangeEvent | undefined> {\n\t\tthis.syncPromptCacheSafeWaitEnv();\n\t\tif (!this._modelSelectionChangesContext(previousModel, nextModel)) return undefined;\n\t\tconst result = await this._extensionRunner.emitModelSelect({\n\t\t\ttype: \"model_select\",\n\t\t\tmodel: nextModel,\n\t\t\tpreviousModel,\n\t\t\tsource,\n\t\t\tsystemPrompt: this.agent.state.systemPrompt,\n\t\t\tsystemPromptOptions: this._baseSystemPromptOptions,\n\t\t});\n\t\tif (result?.systemPrompt === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst previousSystemPrompt = this.agent.state.systemPrompt;\n\t\tconst systemPrompt = result.systemPrompt ?? this._baseSystemPrompt;\n\t\tif (previousSystemPrompt === systemPrompt) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tthis.agent.state.systemPrompt = systemPrompt;\n\t\tconst event: SystemPromptChangeEvent = {\n\t\t\ttype: \"system_prompt_change\",\n\t\t\tsystemPrompt,\n\t\t\tpreviousSystemPrompt,\n\t\t\tmodel: nextModel,\n\t\t\tpreviousModel,\n\t\t\tsource: \"model_select\",\n\t\t};\n\t\tif (result.systemPromptName) {\n\t\t\tevent.systemPromptName = result.systemPromptName;\n\t\t}\n\t\tawait this._extensionRunner.emit(event);\n\t\tthis._emit(event);\n\t\treturn event;\n\t}\n\n\t/**\n\t * Set model directly.\n\t * Validates that auth is configured, saves to session and settings.\n\t * @throws Error if no auth is configured for the model\n\t */\n\tasync setModel(model: Model<any>): Promise<SystemPromptChangeEvent | undefined> {\n\t\treturn this._setModel(model, true);\n\t}\n\n\tassertModelUsable(model: Model<Api> | undefined = this.model, liveContextTokens = 0): void {\n\t\tif (!model || model.contextWindow <= 0) return;\n\t\tconst projection = projectModelUsabilityBudget({\n\t\t\tmodel,\n\t\t\tsystemPrompt: this.agent.state.systemPrompt,\n\t\t\ttools: this.agent.state.tools,\n\t\t\tliveContextTokens,\n\t\t\tcompaction: this.settingsManager.getCompactionSettings(),\n\t\t});\n\t\tif (!projection.usable) throw new ModelUsabilityBudgetError(projection);\n\t}\n\n\tprivate _getDownswitchLiveContextTokens(model: Model<Api>): number {\n\t\tconst currentModel = this.model;\n\t\tif (!currentModel) return 0;\n\t\tconst compaction = this.settingsManager.getCompactionSettings();\n\t\tconst currentBudget = projectModelUsabilityBudget({\n\t\t\tmodel: currentModel,\n\t\t\tsystemPrompt: this.agent.state.systemPrompt,\n\t\t\ttools: this.agent.state.tools,\n\t\t\tcompaction,\n\t\t});\n\t\tconst targetBudget = projectModelUsabilityBudget({\n\t\t\tmodel,\n\t\t\tsystemPrompt: this.agent.state.systemPrompt,\n\t\t\ttools: this.agent.state.tools,\n\t\t\tcompaction,\n\t\t});\n\t\tconst currentUsableContext = currentBudget.contextWindow - currentBudget.requiredTokens;\n\t\tconst targetUsableContext = targetBudget.contextWindow - targetBudget.requiredTokens;\n\t\tif (targetUsableContext >= currentUsableContext) return 0;\n\t\tconst fixedPrefixTokens = currentBudget.systemPromptTokens + currentBudget.activeToolSchemaTokens;\n\t\treturn Math.max(0, (this.getContextUsage()?.tokens ?? 0) - fixedPrefixTokens);\n\t}\n\n\t/**\n\t * Set the model for this session without changing the global model defaults.\n\t * The selection is still persisted in this session's history.\n\t */\n\tasync setSessionModel(model: Model<Api>): Promise<SystemPromptChangeEvent | undefined> {\n\t\treturn this._setModel(model, false);\n\t}\n\n\tprivate async _setModel(\n\t\tmodel: Model<Api>,\n\t\tupdateGlobalDefaults: boolean,\n\t): Promise<SystemPromptChangeEvent | undefined> {\n\t\tthis.assertModelUsable(model, this._getDownswitchLiveContextTokens(model));\n\t\tif (!(await this._modelRuntime.checkAuth(model.provider))) {\n\t\t\tthrow new Error(`No API key for ${model.provider}/${model.id}`);\n\t\t}\n\n\t\t// A manual model change abandons any active fallback window; if a fallback\n\t\t// retry sleep is still pending, cancel it so no surprise continuation fires.\n\t\tconst hadActiveFallback = this._retryFallback.activeState !== undefined;\n\t\tthis._probeBackScheduler.cancel(\"manual-model-change\");\n\t\tthis._retryFallback.clearForManualModelChange(model);\n\t\tif (hadActiveFallback && this._retryAbortController) {\n\t\t\tthis.abortRetry();\n\t\t}\n\n\t\treturn await this._switchActiveModel(model, {\n\t\t\tpersistDefault: updateGlobalDefaults,\n\t\t\tappendSessionEntry: true,\n\t\t\temitModelSelect: true,\n\t\t\tmodelSelectSource: \"set\",\n\t\t\tinvalidateCompaction: true,\n\t\t});\n\t}\n\n\tprivate async _maybeRestoreFallbackPrimary(): Promise<void> {\n\t\ttry {\n\t\t\tawait this._retryFallback.maybeRestorePrimary(this.settingsManager.getRetryFallbackSettings().revertPolicy);\n\t\t} catch (error) {\n\t\t\tthis._retryFallback.clear();\n\t\t\tconsole.error(\"fallback revert failed; cleared fallback state\", error);\n\t\t}\n\t}\n\n\t/**\n\t * A senpi-owned compaction just rewrote the conversation context: release any\n\t * refusal-caused fallback pin (the \"same context refuses again\" assumption no\n\t * longer holds) and, while no run is active, eagerly re-attempt the original\n\t * model through the existing revert gate. Billing-caused pins never release.\n\t */\n\tprivate async _onCompactionContextChanged(): Promise<void> {\n\t\tconst released = this._retryFallback.notifyCompactionApplied();\n\t\tif (released && !this.isStreaming) await this._maybeRestoreFallbackPrimary();\n\t}\n\n\tprivate async _switchActiveModel(\n\t\tmodel: Model<Api>,\n\t\topts: {\n\t\t\tpersistDefault: boolean;\n\t\t\tappendSessionEntry: boolean;\n\t\t\tentryReason?: \"fallback\" | \"fallback-revert\";\n\t\t\temitModelSelect: boolean;\n\t\t\tmodelSelectSource: ModelSelectSource;\n\t\t\tinvalidateCompaction: boolean;\n\t\t\tephemeralThinkingLevel?: ThinkingLevel;\n\t\t},\n\t): Promise<SystemPromptChangeEvent | undefined> {\n\t\tconst previousModel = this.model;\n\t\tif (\n\t\t\topts.invalidateCompaction &&\n\t\t\t(this._modelSelectionChangesContext(previousModel, model) ||\n\t\t\t\tpreviousModel?.provider !== model.provider ||\n\t\t\t\tpreviousModel?.id !== model.id)\n\t\t) {\n\t\t\tthis._invalidateCompactionForModelSelection();\n\t\t}\n\t\tconst thinking = this._getThinkingForModelSwitch(model, opts.ephemeralThinkingLevel);\n\t\tconst liveContextTokens = this._getDownswitchLiveContextTokens(model);\n\t\tthis.agent.state.model = model;\n\t\tthis.agent.abortServerSideFallback =\n\t\t\tthis.settingsManager.getAbortServerSideFallback() && this._retryFallback.hasConfiguredChain();\n\t\tif (opts.appendSessionEntry) {\n\t\t\tthis.sessionManager.appendModelChange(\n\t\t\t\tmodel.provider,\n\t\t\t\tmodel.id,\n\t\t\t\topts.entryReason,\n\t\t\t\tpreviousModel?.provider,\n\t\t\t\tpreviousModel?.id,\n\t\t\t);\n\t\t}\n\t\tif (opts.persistDefault) {\n\t\t\tthis.settingsManager.setDefaultModelAndProvider(model.provider, model.id);\n\t\t}\n\n\t\tconst scopedMatch = this._scopedModels.find((sm) => modelsAreEqual(sm.model, model));\n\t\tconst previousTier = this._currentServiceTier;\n\t\tconst previousFastMode = this.isFastModeActive();\n\t\tthis._currentServiceTier = this._resolveServiceTier(model, scopedMatch?.serviceTier);\n\n\t\tif (opts.ephemeralThinkingLevel !== undefined) {\n\t\t\tthis._applyEphemeralThinkingLevel(thinking.level);\n\t\t} else {\n\t\t\tthis._setThinkingLevel(thinking.level, false, thinking.selection);\n\t\t}\n\n\t\tthis._emitHighReasoningWarningIfNeeded();\n\t\t// Post-switch: the level reported here is the one actually in force (clamped, or restored\n\t\t// from this model's memory), not the level requested for the previous model.\n\t\tthis._emit({\n\t\t\ttype: \"model_changed\",\n\t\t\tmodel,\n\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\tsource: opts.modelSelectSource,\n\t\t});\n\t\tthis._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);\n\n\t\tif (!opts.emitModelSelect) return undefined;\n\t\tconst previousSystemPrompt = this.agent.state.systemPrompt;\n\t\ttry {\n\t\t\tconst systemPromptChange = await this._emitModelSelect(model, previousModel, opts.modelSelectSource);\n\t\t\tthis.assertModelUsable(model, liveContextTokens);\n\t\t\treturn systemPromptChange;\n\t\t} catch (error) {\n\t\t\tif (previousModel) this.agent.state.model = previousModel;\n\t\t\telse delete (this.agent.state as { model?: Model<Api> }).model;\n\t\t\tthis.agent.state.systemPrompt = previousSystemPrompt;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate _applyEphemeralThinkingLevel(level: ThinkingLevel): void {\n\t\tconst previousLevel = this.agent.state.thinkingLevel;\n\t\tthis.agent.state.thinkingLevel = level;\n\t\tthis.agent.state.thinkingSelection = undefined;\n\t\tif (previousLevel !== level) {\n\t\t\tthis._emit({ type: \"thinking_level_changed\", level });\n\t\t}\n\t}\n\n\t/**\n\t * Cycle to next/previous model.\n\t * Uses favorite models, constrained by any global model narrowing.\n\t * @param direction - \"forward\" (default) or \"backward\"\n\t * @returns The new model info, or undefined if only one model available\n\t */\n\tasync cycleModel(direction: \"forward\" | \"backward\" = \"forward\"): Promise<ModelCycleResult | undefined> {\n\t\tconst favoriteModels = this._getCurrentFavoriteModels();\n\t\tif (favoriteModels.length > 0) {\n\t\t\treturn this._cycleFavoriteModel(direction, favoriteModels);\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async _cycleFavoriteModel(\n\t\tdirection: \"forward\" | \"backward\",\n\t\tfavoriteModels: SessionModelEntry[],\n\t): Promise<ModelCycleResult | undefined> {\n\t\tif (favoriteModels.length <= 1) return undefined;\n\n\t\tconst currentModel = this.model;\n\t\tconst currentIndex = favoriteModels.findIndex((sm) => modelsAreEqual(sm.model, currentModel));\n\n\t\tlet nextIndex: number;\n\t\tif (currentIndex === -1) {\n\t\t\tnextIndex = direction === \"forward\" ? 0 : favoriteModels.length - 1;\n\t\t} else {\n\t\t\tconst len = favoriteModels.length;\n\t\t\tnextIndex = direction === \"forward\" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;\n\t\t}\n\t\tconst next = favoriteModels[nextIndex];\n\t\tconst liveContextTokens = this._getDownswitchLiveContextTokens(next.model);\n\t\tthis.assertModelUsable(next.model, liveContextTokens);\n\t\tconst invalidatesCompaction =\n\t\t\tthis._modelSelectionChangesContext(currentModel, next.model) ||\n\t\t\tcurrentModel?.provider !== next.model.provider ||\n\t\t\tcurrentModel?.id !== next.model.id;\n\t\tif (invalidatesCompaction) {\n\t\t\tthis._invalidateCompactionForModelSelection();\n\t\t}\n\t\tthis._probeBackScheduler.cancel(\"manual-model-change\");\n\t\tthis._retryFallback.clearForManualModelChange(next.model);\n\t\tconst thinking = this._getThinkingForModelSwitch(next.model, next.thinkingLevel, next.thinkingSelection);\n\n\t\tthis.agent.state.model = next.model;\n\t\tthis.sessionManager.appendModelChange(next.model.provider, next.model.id);\n\t\tthis.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);\n\t\tconst previousTier = this._currentServiceTier;\n\t\tconst previousFastMode = this.isFastModeActive();\n\t\tthis._currentServiceTier = this._resolveServiceTier(next.model, next.serviceTier);\n\n\t\t// Apply thinking level and provenance from the favorite projection or remembered preference.\n\t\tthis._setThinkingLevel(thinking.level, false, thinking.selection);\n\n\t\t// Post-switch, same contract as _switchActiveModel: the level in force AFTER the cycle.\n\t\tthis._emit({\n\t\t\ttype: \"model_changed\",\n\t\t\tmodel: next.model,\n\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\tsource: \"cycle\",\n\t\t});\n\t\tthis._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);\n\n\t\tconst previousSystemPrompt = this.agent.state.systemPrompt;\n\t\ttry {\n\t\t\tconst systemPromptChange = await this._emitModelSelect(next.model, currentModel, \"cycle\");\n\t\t\tthis.assertModelUsable(next.model, liveContextTokens);\n\n\t\t\tconst cycleResult: ModelCycleResult = {\n\t\t\t\tmodel: next.model,\n\t\t\t\tthinkingLevel: this.thinkingLevel,\n\t\t\t\tisScoped: true,\n\t\t\t};\n\t\t\tif (systemPromptChange) {\n\t\t\t\tcycleResult.systemPromptChange = systemPromptChange;\n\t\t\t}\n\t\t\treturn cycleResult;\n\t\t} catch (error) {\n\t\t\tif (currentModel) this.agent.state.model = currentModel;\n\t\t\telse delete (this.agent.state as { model?: Model<Api> }).model;\n\t\t\tthis.agent.state.systemPrompt = previousSystemPrompt;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// Thinking Level Management\n\t// =========================================================================\n\n\t/**\n\t * Set thinking level.\n\t * Clamps to model capabilities based on available thinking levels.\n\t * Persistent calls refresh per-model memory; session entries and events are emitted only on change.\n\t */\n\tsetThinkingLevel(level: ThinkingLevel): void {\n\t\tthis._setThinkingLevel(level, true, { level, source: \"explicit\" });\n\t}\n\n\t/**\n\t * Set the thinking level for this session without changing the global default.\n\t * The effective level is still persisted in this session's history.\n\t */\n\tsetSessionThinkingLevel(level: ThinkingLevel): void {\n\t\tthis._setThinkingLevel(level, false, { level, source: \"explicit\" });\n\t}\n\n\tprivate _setThinkingLevel(\n\t\tlevel: ThinkingLevel,\n\t\tupdateGlobalDefault: boolean,\n\t\tselection: ThinkingSelection | undefined,\n\t): void {\n\t\tconst availableLevels = this.getAvailableThinkingLevels();\n\t\tconst effectiveLevel = availableLevels.includes(level) ? level : this._clampThinkingLevel(level, availableLevels);\n\n\t\t// Only persist if actually changing\n\t\tconst previousLevel = this.agent.state.thinkingLevel;\n\t\tconst previousSelection = this.agent.state.thinkingSelection;\n\t\tconst effectiveSelection = selection ? { ...selection, level: effectiveLevel } : undefined;\n\t\tconst selectionChanged =\n\t\t\tpreviousSelection?.level !== effectiveSelection?.level ||\n\t\t\tpreviousSelection?.source !== effectiveSelection?.source ||\n\t\t\tpreviousSelection?.legacyVariantId !== effectiveSelection?.legacyVariantId;\n\t\tconst isChanging = effectiveLevel !== previousLevel;\n\t\tif (isChanging || selectionChanged) {\n\t\t\tthis._retryFallback.noteManualThinkingLevel();\n\t\t}\n\n\t\tthis.agent.state.thinkingLevel = effectiveLevel;\n\t\tthis.agent.state.thinkingSelection = effectiveSelection;\n\n\t\tif (updateGlobalDefault) {\n\t\t\tconst model = this.model;\n\t\t\tif (model) {\n\t\t\t\tthis.settingsManager.setModelThinkingLevel(model.provider, model.id, effectiveLevel);\n\t\t\t}\n\t\t}\n\n\t\tif (isChanging || selectionChanged) {\n\t\t\tthis.sessionManager.appendThinkingLevelChange(effectiveLevel, effectiveSelection);\n\t\t\tif (updateGlobalDefault && (this.supportsThinking() || effectiveLevel !== \"off\")) {\n\t\t\t\tthis.settingsManager.setDefaultThinkingLevel(effectiveLevel);\n\t\t\t}\n\t\t\tthis._emit({ type: \"thinking_level_changed\", level: effectiveLevel });\n\t\t\tvoid this._extensionRunner.emit({\n\t\t\t\ttype: \"thinking_level_select\",\n\t\t\t\tlevel: effectiveLevel,\n\t\t\t\tpreviousLevel,\n\t\t\t});\n\t\t\tthis._emitHighReasoningWarningIfNeeded();\n\t\t}\n\t}\n\n\tprivate _emitHighReasoningWarningIfNeeded(): void {\n\t\tconst model = this.model;\n\t\tconst level = this.thinkingLevel;\n\t\tif (!model || !shouldWarnHighReasoning(model, level)) return;\n\t\tconst key = `${model.provider}/${model.id}`;\n\t\tif (this._shownHighReasoningWarningKeys.has(key)) return;\n\t\tthis._shownHighReasoningWarningKeys.add(key);\n\t\tthis._emit({\n\t\t\ttype: \"high_reasoning_warning\",\n\t\t\tmodelId: model.id,\n\t\t\tprovider: model.provider,\n\t\t\tthinkingLevel: level,\n\t\t});\n\t}\n\n\t/**\n\t * Cycle to next thinking level.\n\t * @returns New level, or undefined if model doesn't support thinking\n\t */\n\tcycleThinkingLevel(): ThinkingLevel | undefined {\n\t\tif (!this.supportsThinking()) return undefined;\n\n\t\tconst levels = this.getAvailableThinkingLevels();\n\t\tconst currentIndex = levels.indexOf(this.thinkingLevel);\n\t\tconst nextIndex = (currentIndex + 1) % levels.length;\n\t\tconst nextLevel = levels[nextIndex];\n\n\t\tthis.setThinkingLevel(nextLevel);\n\t\treturn nextLevel;\n\t}\n\n\t/**\n\t * Get available thinking levels for current model.\n\t * The provider will clamp to what the specific model supports internally.\n\t */\n\tgetAvailableThinkingLevels(): ThinkingLevel[] {\n\t\tconst model = this.model;\n\t\treturn model ? (getSupportedThinkingLevels(model) as ThinkingLevel[]) : [\"off\"];\n\t}\n\n\t/**\n\t * Check if current model supports xhigh thinking level.\n\t */\n\tsupportsXhighThinking(): boolean {\n\t\treturn this.model ? supportsXhigh(this.model) : false;\n\t}\n\n\t/**\n\t * Check if current model exposes the native \"max\" adaptive thinking tier\n\t * (currently Anthropic Opus 4.6 legacy and Opus 4.7 native).\n\t */\n\tsupportsMaxThinking(): boolean {\n\t\treturn this.model ? supportsMax(this.model) : false;\n\t}\n\n\t/**\n\t * Check if current model supports thinking/reasoning.\n\t */\n\tsupportsThinking(): boolean {\n\t\treturn !!this.model?.reasoning;\n\t}\n\n\tprivate _getThinkingForModelSwitch(\n\t\tmodel: Model<Api>,\n\t\texplicitLevel?: ThinkingLevel,\n\t\texplicitSelection?: ThinkingSelection,\n\t): { level: ThinkingLevel; selection?: ThinkingSelection } {\n\t\tlet requestedLevel = explicitLevel;\n\t\tlet selection = explicitSelection;\n\t\tif (requestedLevel !== undefined && !selection) selection = { level: requestedLevel, source: \"explicit\" };\n\t\tif (requestedLevel === undefined) {\n\t\t\tconst remembered = this.settingsManager.getModelThinkingLevel(model.provider, model.id);\n\t\t\tif (remembered !== undefined) {\n\t\t\t\trequestedLevel = remembered;\n\t\t\t\tselection = { level: remembered, source: \"explicit\" };\n\t\t\t}\n\t\t}\n\t\tif (requestedLevel === undefined) {\n\t\t\tconst configuredDefault = this.settingsManager.getDefaultThinkingLevel();\n\t\t\tif (configuredDefault !== undefined) {\n\t\t\t\trequestedLevel = configuredDefault;\n\t\t\t\tselection = { level: configuredDefault, source: \"explicit\" };\n\t\t\t}\n\t\t}\n\t\trequestedLevel ??= DEFAULT_THINKING_LEVEL;\n\t\tconst level = this._clampThinkingLevel(requestedLevel, getSupportedThinkingLevels(model) as ThinkingLevel[]);\n\t\treturn {\n\t\t\tlevel,\n\t\t\tselection: selection ? { ...selection, level } : undefined,\n\t\t};\n\t}\n\n\tprivate _clampThinkingLevel(level: ThinkingLevel, availableLevels: ThinkingLevel[]): ThinkingLevel {\n\t\tconst available = new Set(availableLevels);\n\t\tconst requestedIndex = THINKING_LEVELS_WITH_MAX.indexOf(level);\n\t\tif (requestedIndex === -1) return availableLevels[0] ?? \"off\";\n\n\t\tfor (let index = requestedIndex; index < THINKING_LEVELS_WITH_MAX.length; index++) {\n\t\t\tconst candidate = THINKING_LEVELS_WITH_MAX[index];\n\t\t\tif (candidate && available.has(candidate)) return candidate;\n\t\t}\n\t\tfor (let index = requestedIndex - 1; index >= 0; index--) {\n\t\t\tconst candidate = THINKING_LEVELS_WITH_MAX[index];\n\t\t\tif (candidate && available.has(candidate)) return candidate;\n\t\t}\n\t\treturn availableLevels[0] ?? \"off\";\n\t}\n\n\t// =========================================================================\n\t// Queue Mode Management\n\t// =========================================================================\n\n\tprivate syncQueueModesFromSettings(): void {\n\t\tthis.agent.steeringMode = this.settingsManager.getSteeringMode();\n\t\tthis.agent.followUpMode = this.settingsManager.getFollowUpMode();\n\t}\n\n\t/**\n\t * Set steering message mode.\n\t * Saves to settings.\n\t */\n\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.agent.steeringMode = mode;\n\t\tthis.settingsManager.setSteeringMode(mode);\n\t\tthis._emitSessionSettingsChanged();\n\t}\n\n\t/**\n\t * Set follow-up message mode.\n\t * Saves to settings.\n\t */\n\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\"): void {\n\t\tthis.agent.followUpMode = mode;\n\t\tthis.settingsManager.setFollowUpMode(mode);\n\t\tthis._emitSessionSettingsChanged();\n\t}\n\n\t// =========================================================================\n\t// Compaction\n\t// =========================================================================\n\n\tprivate _claimCompactionController(controller: AbortController, owner: \"auto\" | \"compaction\"): void {\n\t\tconst supersedesCurrentOperation =\n\t\t\t(this._compactionAbortController !== undefined && this._compactionAbortController !== controller) ||\n\t\t\t(this._autoCompactionAbortController !== undefined && this._autoCompactionAbortController !== controller);\n\t\tif (supersedesCurrentOperation) {\n\t\t\t// Supersession has no public terminal event: the stale operation no\n\t\t\t// longer owns the route. Finishing its lifecycle state here prevents a\n\t\t\t// missing late feedback end from keeping isCompacting true.\n\t\t\tthis._compactionLifecycle.abort(this._messageRevision);\n\t\t}\n\t\tif (this._compactionAbortController && this._compactionAbortController !== controller) {\n\t\t\tthis._compactionAbortController.abort();\n\t\t\tthis._compactionAbortController = undefined;\n\t\t}\n\t\tif (this._autoCompactionAbortController && this._autoCompactionAbortController !== controller) {\n\t\t\tthis._autoCompactionAbortController.abort();\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t}\n\t\tif (owner === \"auto\") {\n\t\t\tthis._autoCompactionAbortController = controller;\n\t\t} else {\n\t\t\tthis._compactionAbortController = controller;\n\t\t}\n\t}\n\n\tprivate _ownsCompactionController(controller: AbortController, owner: \"auto\" | \"compaction\"): boolean {\n\t\treturn (\n\t\t\t!controller.signal.aborted &&\n\t\t\t(owner === \"auto\"\n\t\t\t\t? this._autoCompactionAbortController === controller\n\t\t\t\t: this._compactionAbortController === controller)\n\t\t);\n\t}\n\n\tprivate _releaseCompactionController(signal: AbortSignal): void {\n\t\tif (this._compactionAbortController?.signal === signal) {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t}\n\t\tif (this._autoCompactionAbortController?.signal === signal) {\n\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t}\n\t}\n\n\tprivate _claimPendingCompactionAdmission(): PendingCompactionAdmission {\n\t\tconst priorAdmission = this._pendingCompactionAdmission;\n\t\tif (priorAdmission) {\n\t\t\tpriorAdmission.controller.abort();\n\t\t\tpriorAdmission.outcome = \"aborted\";\n\t\t\tpriorAdmission.finishSessionWork();\n\t\t}\n\n\t\tconst controller = new AbortController();\n\t\tconst admission: PendingCompactionAdmission = {\n\t\t\tcontroller,\n\t\t\tfinishSessionWork: this._sessionWorkBarrier.begin(),\n\t\t};\n\t\tthis._pendingCompactionAdmission = admission;\n\t\tthis._claimCompactionController(controller, \"compaction\");\n\t\treturn admission;\n\t}\n\n\tprivate _releasePendingCompactionAdmission(\n\t\tadmission: PendingCompactionAdmission,\n\t\toutcome: \"completed\" | \"failed\" | \"aborted\",\n\t): void {\n\t\tadmission.outcome = outcome;\n\t\tif (this._pendingCompactionAdmission !== admission) return;\n\t\tthis._pendingCompactionAdmission = undefined;\n\t\tadmission.finishSessionWork();\n\t}\n\n\tprivate _recordUserAbort(): void {\n\t\tthis._suppressQueuedContinuationAfterUserAbort = true;\n\t\tthis._userAbortGeneration += 1;\n\t}\n\n\tprivate async _abortActiveAgentAndRetry(source: \"user\" | \"system\"): Promise<void> {\n\t\tthis.abortRetry();\n\t\tthis.abortBranchSummary();\n\t\tif (this._userAbortPromise === undefined) {\n\t\t\tconst boundaryJoin = this._abortProvenance.joinOpenBoundary(source);\n\t\t\tif (boundaryJoin !== undefined) {\n\t\t\t\tif (boundaryJoin.userOwned) this._recordUserAbort();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (this._userAbortPromise) {\n\t\t\tconst joined = this._abortProvenance.join(source, this.isStreaming);\n\t\t\tif (joined.userOwned) this._recordUserAbort();\n\t\t\tif (joined.abortCurrentAgent) this.agent.abort();\n\t\t\tawait this._userAbortPromise;\n\t\t\treturn;\n\t\t}\n\t\tif (this.isStreaming && this._abortProvenance.begin(source)) this._recordUserAbort();\n\n\t\tconst abortPromise = (async () => {\n\t\t\tthis.agent.abort();\n\t\t\tawait this.waitForIdle();\n\t\t})();\n\t\tthis._userAbortPromise = abortPromise;\n\t\ttry {\n\t\t\tawait abortPromise;\n\t\t} finally {\n\t\t\tif (this._userAbortPromise === abortPromise) {\n\t\t\t\tthis._userAbortPromise = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Generate the built-in summary while preserving fork routing identity and transforms. */\n\tprivate async _runDefaultCompaction(\n\t\tpreparation: CompactionPreparation,\n\t\trequestModel: Model<any>,\n\t\tapiKey: string | undefined,\n\t\theaders: Record<string, string> | undefined,\n\t\textraBody: Record<string, unknown> | undefined,\n\t\tcustomInstructions: string | undefined,\n\t\tsignal: AbortSignal,\n\t\tenv: Record<string, string> | undefined,\n\t\treason: CompactionReason,\n\t): Promise<CompactionResult> {\n\t\tlet cacheFriendly: CacheFriendlySummaryOptions | undefined;\n\n\t\tif (areExperimentalFeaturesEnabled()) {\n\t\t\tconst systemPrompt = this.agent.state.systemPrompt;\n\t\t\tconst tools = this.agent.state.tools.slice();\n\t\t\tconst buildSourceContext = (messages: AgentMessage[]) =>\n\t\t\t\tthis.agent.buildProviderContext({ systemPrompt, messages: messages.slice(), tools: tools.slice() }, signal);\n\t\t\tconst fullContext = await buildSourceContext(this.agent.state.messages);\n\t\t\tconst isExactPrefix = (candidate: Context): boolean =>\n\t\t\t\tcandidate.messages.length > 0 &&\n\t\t\t\tcandidate.messages.length <= fullContext.messages.length &&\n\t\t\t\tisDeepStrictEqual(candidate.messages, fullContext.messages.slice(0, candidate.messages.length));\n\n\t\t\tlet sourceContext: Context | undefined;\n\t\t\tif (preparation.messagesToSummarize.length > 0 && preparation.sourceMessages) {\n\t\t\t\tconst candidate = await buildSourceContext(preparation.sourceMessages);\n\t\t\t\tif (isExactPrefix(candidate)) sourceContext = candidate;\n\t\t\t}\n\n\t\t\tlet turnPrefixSourceContext: Context | undefined;\n\t\t\tif (\n\t\t\t\tpreparation.isSplitTurn &&\n\t\t\t\tpreparation.turnPrefixMessages.length > 0 &&\n\t\t\t\tpreparation.turnPrefixSourceMessages\n\t\t\t) {\n\t\t\t\tconst candidate = await buildSourceContext(preparation.turnPrefixSourceMessages);\n\t\t\t\tconst providerTurnPrefix = await this.agent.convertToLlm(preparation.turnPrefixMessages.slice());\n\t\t\t\tif (\n\t\t\t\t\tisExactPrefix(candidate) &&\n\t\t\t\t\tproviderTurnPrefix.length > 0 &&\n\t\t\t\t\tproviderTurnPrefix.length <= candidate.messages.length &&\n\t\t\t\t\tisDeepStrictEqual(candidate.messages.slice(-providerTurnPrefix.length), providerTurnPrefix)\n\t\t\t\t) {\n\t\t\t\t\tturnPrefixSourceContext = candidate;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (sourceContext || turnPrefixSourceContext) {\n\t\t\t\tcacheFriendly = {\n\t\t\t\t\tsourceContext,\n\t\t\t\t\tturnPrefixSourceContext,\n\t\t\t\t\trequestOptions: {\n\t\t\t\t\t\tsessionId: this.agent.sessionId,\n\t\t\t\t\t\tonPayload: this.agent.onPayload,\n\t\t\t\t\t\tonResponse: this.agent.onResponse,\n\t\t\t\t\t\ttransport: this.agent.transport,\n\t\t\t\t\t\tthinkingBudgets: this.agent.thinkingBudgets,\n\t\t\t\t\t\tmaxRetryDelayMs: this.agent.maxRetryDelayMs,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn compact(\n\t\t\tpreparation,\n\t\t\trequestModel,\n\t\t\tapiKey,\n\t\t\theaders,\n\t\t\tcustomInstructions,\n\t\t\tsignal,\n\t\t\textraBody,\n\t\t\tthis.thinkingLevel,\n\t\t\tthis.agent.streamFunction,\n\t\t\tenv,\n\t\t\tthis.agent.transformContext,\n\t\t\tthis.settingsManager.getRetrySettings(),\n\t\t\tthis._summarizationRetryCallbacks({ source: \"compaction\", reason }),\n\t\t\tthis.sessionManager.getSessionId(),\n\t\t\tcacheFriendly,\n\t\t);\n\t}\n\n\t/**\n\t * Manually compact the session context.\n\t *\n\t * This is the manual entry point used by `/compact`, RPC, and extensions. It is\n\t * separate from automatic threshold/overflow compaction, which enters through\n\t * `_checkCompaction()` and `_runAutoCompaction()`. After preparation and the\n\t * `session_before_compact` hook, both paths call the lower-level `compact()`\n\t * function imported from `./compaction/index.ts`, unless the hook cancels or\n\t * supplies a custom result.\n\t *\n\t * Aborts the current agent operation first. Manual compaction never retries or\n\t * continues the interrupted agent turn.\n\t *\n\t * @param customInstructions Optional instructions for the compaction summary\n\t */\n\tasync compact(customInstructions?: string): Promise<CompactionResult> {\n\t\tconst model = this.model;\n\t\tif (!model) throw new Error(formatNoModelSelectedMessage());\n\t\tconst pathEntries = this.sessionManager.getBranch();\n\t\tconst settings = cursorOverflowCompactionSettings(\n\t\t\tthis.settingsManager.getCompactionSettings(),\n\t\t\tmodel.provider,\n\t\t\t\"manual\",\n\t\t);\n\t\tif (!prepareCompaction(pathEntries, settings)) {\n\t\t\tconst requestId = randomUUID();\n\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\tconst error = new Error(\n\t\t\t\tlastEntry?.type === \"compaction\" ? \"Already compacted\" : \"Nothing to compact (session too small)\",\n\t\t\t);\n\t\t\tconst errorMessage = `Compaction failed: ${error.message}`;\n\t\t\tthis._emit({ type: \"compaction_start\", reason: \"manual\", requestId });\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: \"manual\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage,\n\t\t\t});\n\t\t\tawait this._emitSessionCompactFailed({\n\t\t\t\treason: \"manual\",\n\t\t\t\terrorMessage,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: false,\n\t\t\t\tfromExtension: false,\n\t\t\t});\n\t\t\tthrow error;\n\t\t}\n\n\t\tconst admission = this._claimPendingCompactionAdmission();\n\t\tconst controller = admission.controller;\n\t\tconst requestId = randomUUID();\n\t\tlet outcome: \"completed\" | \"failed\" | \"aborted\" = \"failed\";\n\t\tlet disconnected = false;\n\n\t\ttry {\n\t\t\t// Keep the session subscriber attached until the aborted run emits\n\t\t\t// agent_end. That event clears the active-run and retry state that\n\t\t\t// waitForIdle() depends on.\n\t\t\tawait this._abortActiveAgentAndRetry(\"system\");\n\t\t\tthis._disconnectFromAgent();\n\t\t\tdisconnected = true;\n\t\t\tthis._emit({ type: \"compaction_start\", reason: \"manual\", requestId });\n\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\tcontroller,\n\t\t\t\towner: \"compaction\",\n\t\t\t\treason: \"manual\",\n\t\t\t\trequestId,\n\t\t\t\tcustomInstructions,\n\t\t\t\twillRetry: false,\n\t\t\t});\n\t\t\tif (!execution.accepted) {\n\t\t\t\tthrow new CompactionRejectedError(execution.rejectionCause);\n\t\t\t}\n\t\t\toutcome = \"completed\";\n\t\t\treturn execution.result;\n\t\t} catch (error) {\n\t\t\toutcome = isCompactionExecutionAborted(error) ? \"aborted\" : \"failed\";\n\t\t\tif (error instanceof CompactionRejectedError) {\n\t\t\t\tthrow new Error(error.message);\n\t\t\t}\n\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\tconst errorMessage = aborted ? undefined : `Compaction failed: ${message}`;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: \"manual\",\n\t\t\t\tresult: undefined,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage,\n\t\t\t});\n\t\t\tawait this._emitSessionCompactFailed({\n\t\t\t\treason: \"manual\",\n\t\t\t\terrorMessage,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\tfromExtension: false,\n\t\t\t});\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tif (this._compactionAbortController === controller && this._compactionLifecycle.state.status !== \"running\") {\n\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t}\n\t\t\tthis._releasePendingCompactionAdmission(admission, outcome);\n\t\t\tif (disconnected && !this.isCompacting) this._reconnectToAgent();\n\t\t\tif (outcome === \"completed\") this._resumeQueuedMessagesAfterCompaction();\n\t\t}\n\t}\n\n\tasync applyCompaction(\n\t\tprecomputed: CompactionResult,\n\t\toptions: ApplyCompactionOptions,\n\t): Promise<ApplyCompactionResult> {\n\t\tif (options.signal !== undefined && options.signal !== this._compactionAbortController?.signal) {\n\t\t\treturn { applied: false, reason: \"stale\" };\n\t\t}\n\t\tif (options.expectedRevision !== undefined && options.expectedRevision !== this._messageRevision) {\n\t\t\treturn { applied: false, reason: \"stale\" };\n\t\t}\n\t\tif (\n\t\t\toptions.expectedWarmAnchor !== undefined &&\n\t\t\t!isWarmSummaryAnchorValid(options.expectedWarmAnchor, this.sessionManager.getBranch())\n\t\t) {\n\t\t\treturn { applied: false, reason: \"stale\" };\n\t\t}\n\n\t\tconst ownsController = this._compactionAbortController === undefined;\n\t\tconst lifecycleState = this._compactionLifecycle.state;\n\t\tconst requestId =\n\t\t\t!ownsController && lifecycleState.status === \"running\" && lifecycleState.stage === \"feedback\"\n\t\t\t\t? lifecycleState.operationId\n\t\t\t\t: randomUUID();\n\t\tif (ownsController) {\n\t\t\tthis._claimCompactionController(new AbortController(), \"compaction\");\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_start\",\n\t\t\t\treason: options.reason,\n\t\t\t\trequestId,\n\t\t\t});\n\t\t}\n\t\tconst controller = this._compactionAbortController;\n\t\tif (!controller) return { applied: false, reason: \"rejected\" };\n\t\tthis._claimCompactionController(controller, \"compaction\");\n\n\t\ttry {\n\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\tcontroller,\n\t\t\t\towner: \"compaction\",\n\t\t\t\treason: options.reason,\n\t\t\t\trequestId,\n\t\t\t\twillRetry: false,\n\t\t\t\tprecomputed,\n\t\t\t});\n\t\t\tif (!execution.accepted) {\n\t\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t\t}\n\t\t\tthis._resumeQueuedMessagesAfterCompaction();\n\t\t\treturn { applied: true, reason: \"ok\" };\n\t\t} catch (error) {\n\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t\t}\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: options.reason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage: aborted ? undefined : `Compaction failed: ${message}`,\n\t\t\t});\n\t\t\treturn { applied: false, reason: \"rejected\" };\n\t\t} finally {\n\t\t\tif (this._compactionAbortController === controller && this._compactionLifecycle.state.status !== \"running\") {\n\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _beginExtensionCompactionFeedback(reason: CompactionReason): AbortSignal {\n\t\tconst controller = new AbortController();\n\t\tthis._claimCompactionController(controller, \"compaction\");\n\t\tconst model = this.model;\n\t\tconst requestId = randomUUID();\n\t\tthis._compactionLifecycle.begin(\n\t\t\t{\n\t\t\t\toperationId: requestId,\n\t\t\t\tstage: \"feedback\",\n\t\t\t\treason,\n\t\t\t\tmodel: model ? { provider: model.provider, id: model.id } : undefined,\n\t\t\t\tstartedRevision: this._messageRevision,\n\t\t\t},\n\t\t\tcontroller,\n\t\t);\n\t\tthis._emit({ type: \"compaction_start\", reason, requestId });\n\t\treturn controller.signal;\n\t}\n\n\tprivate _updateExtensionCompactionFeedback(options: {\n\t\treason: CompactionReason;\n\t\tsignal?: AbortSignal;\n\t\tdelta?: string;\n\t\ttext?: string;\n\t}): void {\n\t\tif (!options.signal || !this._compactionLifecycle.hasCurrentSignal(options.signal)) return;\n\t\tthis._emit({\n\t\t\ttype: \"compaction_progress\",\n\t\t\treason: options.reason,\n\t\t\t...(options.delta !== undefined ? { delta: options.delta } : {}),\n\t\t\t...(options.text !== undefined ? { text: options.text } : {}),\n\t\t});\n\t}\n\n\tprivate _endExtensionCompactionFeedback(options: {\n\t\treason: CompactionReason;\n\t\tsignal?: AbortSignal;\n\t\taborted?: boolean;\n\t\terrorMessage?: string;\n\t}): void {\n\t\tif (!options.signal) return;\n\t\tif (!this._compactionLifecycle.hasCurrentSignal(options.signal)) {\n\t\t\tthis._releaseCompactionController(options.signal);\n\t\t\treturn;\n\t\t}\n\t\tconst operation = this._compactionLifecycle.state;\n\t\tif (operation.status !== \"running\" || operation.stage !== \"feedback\") return;\n\t\tconst aborted = options.aborted ?? options.signal.aborted;\n\t\tthis._compactionLifecycle.finish({\n\t\t\toperationId: operation.operationId,\n\t\t\tstatus: aborted ? \"aborted\" : \"failed\",\n\t\t\tendedRevision: this._messageRevision,\n\t\t\t...(aborted\n\t\t\t\t? { errorMessage: \"Compaction cancelled\" }\n\t\t\t\t: { errorMessage: options.errorMessage ?? \"Compaction did not apply\" }),\n\t\t});\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: options.reason,\n\t\t\tresult: undefined,\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\trequestId: operation.operationId,\n\t\t\terrorMessage: aborted ? undefined : (options.errorMessage ?? \"Compaction did not apply\"),\n\t\t});\n\t\tthis._releaseCompactionController(options.signal);\n\t}\n\n\tprivate async _executeCompaction(request: CompactionExecutionRequest): Promise<CompactionExecutionResult> {\n\t\tconst model = this.model;\n\t\tif (!model) throw new Error(formatNoModelSelectedMessage());\n\t\tconst controller = request.controller;\n\t\t// Async auth and provider preparation may yield to a newer route. A stale\n\t\t// controller must never promote itself into a lifecycle generation.\n\t\tif (!this._ownsCompactionController(controller, request.owner)) {\n\t\t\tthrow new CompactionExecutionError(new CompactionCancelledError(), false, true);\n\t\t}\n\t\tconst requestId = request.requestId ?? randomUUID();\n\t\tconst operationId = this._compactionLifecycle.begin(\n\t\t\t{\n\t\t\t\toperationId: requestId,\n\t\t\t\tstage: \"execution\",\n\t\t\t\treason: request.reason,\n\t\t\t\tmodel: { provider: model.provider, id: model.id },\n\t\t\t\tstartedRevision: this._messageRevision,\n\t\t\t},\n\t\t\tcontroller,\n\t\t);\n\t\tconst finishCompactionWork = this._sessionWorkBarrier.begin();\n\t\tconst agentMessagesAtStart = request.agentMessagesAtStart ?? this.agent.state.messages.slice();\n\t\tconst compactionOwnedDiagnosticMessages = new Set<AgentMessage>();\n\t\tconst signal = controller.signal;\n\t\ttry {\n\t\t\tif (signal.aborted) {\n\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t}\n\t\t\tconst pathEntries = this.sessionManager.getBranch();\n\t\t\tconst settings = cursorOverflowCompactionSettings(\n\t\t\t\tthis.settingsManager.getCompactionSettings(),\n\t\t\t\tthis.model?.provider,\n\t\t\t\trequest.reason,\n\t\t\t);\n\n\t\t\tlet compactionResult = request.precomputed;\n\t\t\tlet fromExtension = request.precomputed !== undefined;\n\n\t\t\tif (!compactionResult) {\n\t\t\t\tconst preparation = prepareCompaction(\n\t\t\t\t\tpathEntries,\n\t\t\t\t\tsettings,\n\t\t\t\t\trequest.reason === \"overflow\",\n\t\t\t\t\trequest.allowSummaryOnly,\n\t\t\t\t);\n\n\t\t\t\tif (!preparation) {\n\t\t\t\t\tconst lastEntry = pathEntries[pathEntries.length - 1];\n\t\t\t\t\tif (lastEntry?.type === \"compaction\") {\n\t\t\t\t\t\tthrow new Error(\"Already compacted\");\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\"Nothing to compact (session too small)\");\n\t\t\t\t}\n\n\t\t\t\tif (this._extensionRunner.hasHandlers(\"session_before_compact\")) {\n\t\t\t\t\tconst messagesBeforeExtension = new Set(this.agent.state.messages);\n\t\t\t\t\tconst extensionResult = (await this._extensionRunner.emit({\n\t\t\t\t\t\ttype: \"session_before_compact\",\n\t\t\t\t\t\treason: request.reason,\n\t\t\t\t\t\twillRetry: request.willRetry,\n\t\t\t\t\t\trequestId,\n\t\t\t\t\t\tpreparation,\n\t\t\t\t\t\tbranchEntries: pathEntries,\n\t\t\t\t\t\tcustomInstructions: request.customInstructions,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t})) as SessionBeforeCompactResult | undefined;\n\t\t\t\t\tfor (const message of this.agent.state.messages) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!messagesBeforeExtension.has(message) &&\n\t\t\t\t\t\t\tisCompactionOwnedPreCompactDiagnostic(message, requestId)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tcompactionOwnedDiagnosticMessages.add(message);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!this._compactionLifecycle.isCurrent(operationId, controller)) {\n\t\t\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t\t\t}\n\n\t\t\t\t\tif (extensionResult?.cancel) {\n\t\t\t\t\t\treturn await this._rejectCompaction(\n\t\t\t\t\t\t\trequest,\n\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\toperationId,\n\t\t\t\t\t\t\textensionResult.rejectionCause ?? \"cancelled-by-extension\",\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\textensionResult.reason,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (extensionResult?.compaction) {\n\t\t\t\t\t\tcompactionResult = extensionResult.compaction;\n\t\t\t\t\t\tfromExtension = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!compactionResult) {\n\t\t\t\t\tconst {\n\t\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\textraBody,\n\t\t\t\t\t\tenv,\n\t\t\t\t\t} = await this._getCompactionRequestAuth(model);\n\t\t\t\t\tcompactionResult = await this._runDefaultCompaction(\n\t\t\t\t\t\tpreparation,\n\t\t\t\t\t\trequestModel,\n\t\t\t\t\t\tapiKey,\n\t\t\t\t\t\theaders,\n\t\t\t\t\t\textraBody,\n\t\t\t\t\t\trequest.customInstructions,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t\tenv,\n\t\t\t\t\t\trequest.reason,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (signal.aborted) {\n\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t}\n\t\t\tif (!this._compactionLifecycle.isCurrent(operationId, controller)) {\n\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t}\n\n\t\t\tconst lifecycleState = this._compactionLifecycle.state;\n\t\t\tconst currentMessagesAtCheck = this.agent.state.messages;\n\t\t\tconst startPrefixIntact = agentMessagesAtStart.every(\n\t\t\t\t(message, index) => currentMessagesAtCheck[index] === message,\n\t\t\t);\n\t\t\t// Appends after the start snapshot are fresh only while they are exact\n\t\t\t// message_end identities still awaiting persistence. Any revision change,\n\t\t\t// other append, replacement, or reorder still makes this compaction stale.\n\t\t\tconst onlyPendingPersistenceAppends =\n\t\t\t\tstartPrefixIntact &&\n\t\t\t\tcurrentMessagesAtCheck\n\t\t\t\t\t.slice(agentMessagesAtStart.length)\n\t\t\t\t\t.every(\n\t\t\t\t\t\t(message) =>\n\t\t\t\t\t\t\tthis._messageEndsAwaitingPersistence.has(message) ||\n\t\t\t\t\t\t\tcompactionOwnedDiagnosticMessages.has(message),\n\t\t\t\t\t);\n\t\t\tconst sourceChanged =\n\t\t\t\tlifecycleState.status !== \"running\" ||\n\t\t\t\tlifecycleState.operationId !== operationId ||\n\t\t\t\tlifecycleState.startedRevision + compactionOwnedDiagnosticMessages.size !== this._messageRevision ||\n\t\t\t\t!onlyPendingPersistenceAppends;\n\t\t\tif (sourceChanged) {\n\t\t\t\treturn await this._rejectCompaction(request, requestId, operationId, \"stale-revision\", false);\n\t\t\t}\n\n\t\t\tif (await this._wouldCompactionOverflow(pathEntries, compactionResult, fromExtension, model)) {\n\t\t\t\treturn await this._rejectCompaction(request, requestId, operationId, \"would-overflow\", false);\n\t\t\t}\n\n\t\t\tconst compactionEntryId = this.sessionManager.appendCompaction(\n\t\t\t\tcompactionResult.summary,\n\t\t\t\tcompactionResult.firstKeptEntryId,\n\t\t\t\tcompactionResult.tokensBefore,\n\t\t\t\tcompactionResult.details,\n\t\t\t\tfromExtension,\n\t\t\t\tcompactionResult.usage,\n\t\t\t);\n\t\t\tconst savedEntry = this.sessionManager.getEntry(compactionEntryId);\n\t\t\tif (savedEntry?.type !== \"compaction\") {\n\t\t\t\tthrow new Error(\"Compaction entry was not saved\");\n\t\t\t}\n\n\t\t\tconst sessionContext = this.sessionManager.buildSessionContext();\n\t\t\tconst currentAgentMessages = this.agent.state.messages;\n\t\t\tconst hasUnchangedPrefix = agentMessagesAtStart.every(\n\t\t\t\t(message, index) => currentAgentMessages[index] === message,\n\t\t\t);\n\t\t\tconst messagesAppendedDuringCompaction = hasUnchangedPrefix\n\t\t\t\t? currentAgentMessages.slice(agentMessagesAtStart.length)\n\t\t\t\t: [];\n\t\t\t// Preserve an identity-deduped, agent-ordered union of the append-during-\n\t\t\t// compaction suffix and exact messages still awaiting persistence. Their\n\t\t\t// queued message_end owns exactly-once persistence, so they are kept in\n\t\t\t// agent state only and never persisted here.\n\t\t\tconst preservedIdentities = new Set<AgentMessage>(messagesAppendedDuringCompaction);\n\t\t\tfor (const message of currentAgentMessages) {\n\t\t\t\tif (this._messageEndsAwaitingPersistence.has(message)) {\n\t\t\t\t\tpreservedIdentities.add(message);\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst preservedPendingMessages = currentAgentMessages.filter((message) => preservedIdentities.delete(message));\n\t\t\tthis._skipNextPostCompactionAssistantCheck = true;\n\t\t\tfor (const message of preservedPendingMessages) {\n\t\t\t\tif (message.role === \"assistant\") {\n\t\t\t\t\tthis._assistantsPendingAtCompaction.add(message);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.agent.state.messages = [...sessionContext.messages, ...preservedPendingMessages];\n\t\t\tcompactionResult.estimatedTokensAfter = estimateMessagesTokens(sessionContext.messages);\n\t\t\tthis._incrementMessageRevision();\n\t\t\tif (\n\t\t\t\t!this._compactionLifecycle.finish({\n\t\t\t\t\toperationId,\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\tendedRevision: this._messageRevision,\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\tthrow new CompactionCancelledError();\n\t\t\t}\n\t\t\tthis._delegatedCompactionKey = undefined;\n\t\t\tif (request.owner === \"compaction\" && this._compactionAbortController === request.controller) {\n\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t}\n\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: request.reason,\n\t\t\t\tresult: compactionResult,\n\t\t\t\taborted: false,\n\t\t\t\twillRetry: request.willRetry,\n\t\t\t\trequestId,\n\t\t\t\taccepted: true,\n\t\t\t});\n\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_compact\",\n\t\t\t\treason: request.reason,\n\t\t\t\trequestId,\n\t\t\t\taccepted: true,\n\t\t\t\tcompactionEntry: savedEntry,\n\t\t\t\tfromExtension,\n\t\t\t\twillRetry: request.willRetry,\n\t\t\t});\n\n\t\t\t// Shared success seam: every senpi-owned compaction apply (manual /compact,\n\t\t\t// extension applyCompaction, pre-prompt and auto compaction) funnels through\n\t\t\t// here after the compaction entry is appended and the success event emitted.\n\t\t\tawait this._onCompactionContextChanged();\n\n\t\t\treturn {\n\t\t\t\taccepted: true,\n\t\t\t\trequestId,\n\t\t\t\tresult: compactionResult,\n\t\t\t\tcompactionEntry: savedEntry,\n\t\t\t\tfromExtension,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (error instanceof CompactionExecutionError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tconst lifecycleState = this._compactionLifecycle.state;\n\t\t\tconst ownsTerminalTransition = lifecycleState.status !== \"idle\" && lifecycleState.operationId === operationId;\n\t\t\tconst aborted = signal.aborted || isCompactionExecutionAborted(error);\n\t\t\tif (ownsTerminalTransition && lifecycleState.status === \"running\") {\n\t\t\t\tthis._compactionLifecycle.finish({\n\t\t\t\t\toperationId,\n\t\t\t\t\tstatus: aborted ? \"aborted\" : \"failed\",\n\t\t\t\t\tendedRevision: this._messageRevision,\n\t\t\t\t\terrorMessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t});\n\t\t\t}\n\t\t\tthrow new CompactionExecutionError(error, ownsTerminalTransition, aborted);\n\t\t} finally {\n\t\t\tfinishCompactionWork();\n\t\t}\n\t}\n\n\tprivate async _wouldCompactionOverflow(\n\t\tpathEntries: SessionEntry[],\n\t\tcompactionResult: CompactionResult,\n\t\tfromExtension: boolean,\n\t\tmodel: Model<Api>,\n\t): Promise<boolean> {\n\t\tconst currentLeaf = pathEntries[pathEntries.length - 1];\n\t\tif (!currentLeaf) return false;\n\n\t\tconst simulatedCompactionEntry: CompactionEntry = {\n\t\t\ttype: \"compaction\",\n\t\t\tid: `simulated-${randomUUID()}`,\n\t\t\tparentId: currentLeaf.id,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tsummary: compactionResult.summary,\n\t\t\tfirstKeptEntryId: compactionResult.firstKeptEntryId,\n\t\t\ttokensBefore: compactionResult.tokensBefore,\n\t\t\tdetails: compactionResult.details,\n\t\t\tfromHook: fromExtension,\n\t\t};\n\n\t\tlet simulatedMessages = buildSessionContext(\n\t\t\t[...pathEntries, simulatedCompactionEntry],\n\t\t\tsimulatedCompactionEntry.id,\n\t\t).messages;\n\t\t// Size the same retained context that will be admitted to Cursor. Persisted JSONL\n\t\t// remains verbatim, but the in-memory request representation is bounded first.\n\t\tif (model.provider === \"cursor\" || model.provider === \"cursor-cli-oauth\") {\n\t\t\tsimulatedMessages = truncateToolResultBodies(simulatedMessages).messages ?? simulatedMessages;\n\t\t}\n\t\tconst contextTokens = estimateMessagesTokens(filterContextExcludedMessages(simulatedMessages));\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tconst reserveTokens =\n\t\t\tsettings.reserveScalingEnabled === false\n\t\t\t\t? settings.reserveTokens\n\t\t\t\t: resolveReserveTokens(model.contextWindow, settings.reserveTokens);\n\t\treturn contextTokens > model.contextWindow - reserveTokens;\n\t}\n\n\t/**\n\t * Replaces agent state with the canonical session context while keeping exact\n\t * message objects whose message_end persistence is still queued. Identities\n\t * already present in the session context are kept from the context only, so\n\t * nothing is duplicated; the queued message_end still owns exactly-once\n\t * persistence for the rest.\n\t */\n\tprivate _restoreAgentMessagesFromSession(): void {\n\t\tconst sessionMessages = this.sessionManager.buildSessionContext().messages;\n\t\tconst seen = new Set<AgentMessage>(sessionMessages);\n\t\tconst pendingMessages: AgentMessage[] = [];\n\t\tfor (const message of this.agent.state.messages) {\n\t\t\tif (seen.has(message) || !this._messageEndsAwaitingPersistence.has(message)) continue;\n\t\t\tseen.add(message);\n\t\t\tpendingMessages.push(message);\n\t\t}\n\t\tthis.agent.state.messages = [...sessionMessages, ...pendingMessages];\n\t}\n\n\tprivate async _rejectCompaction(\n\t\trequest: CompactionExecutionRequest,\n\t\trequestId: string,\n\t\toperationId: string,\n\t\trejectionCause: CompactionRejectionCause,\n\t\taborted: boolean,\n\t\textensionReason?: string,\n\t): Promise<CompactionExecutionResult> {\n\t\t// Per plan Section 1: rejection must never be silent. The compaction_end event\n\t\t// carries a non-empty human-readable errorMessage (unless the user aborted, where\n\t\t// the aborted branch already renders \"Compaction cancelled\"). session_compact is\n\t\t// also emitted with accepted:false so the compaction extension's circuit-breaker\n\t\t// bookkeeping stops being dead code; other builtin session_compact handlers guard\n\t\t// on event.accepted.\n\t\tif (rejectionCause === \"external-owner\" && this.model) {\n\t\t\tthis._delegatedCompactionKey = { provider: this.model.provider, id: this.model.id };\n\t\t}\n\t\tconst trimmedExtensionReason = extensionReason?.trim();\n\t\tconst detailedMessage = trimmedExtensionReason\n\t\t\t? `Compaction rejected: ${trimmedExtensionReason}`\n\t\t\t: describeCompactionRejection(rejectionCause);\n\t\tconst errorMessage = aborted && !trimmedExtensionReason ? undefined : detailedMessage;\n\t\tif (\n\t\t\t!this._compactionLifecycle.finish({\n\t\t\t\toperationId,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tendedRevision: this._messageRevision,\n\t\t\t\trejectionCause,\n\t\t\t\t...(trimmedExtensionReason !== undefined ? { errorMessage: trimmedExtensionReason } : {}),\n\t\t\t})\n\t\t) {\n\t\t\tthrow new CompactionCancelledError();\n\t\t}\n\t\tthis._emit({\n\t\t\ttype: \"compaction_end\",\n\t\t\treason: request.reason,\n\t\t\tresult: undefined,\n\t\t\taborted,\n\t\t\twillRetry: false,\n\t\t\trequestId,\n\t\t\taccepted: false,\n\t\t\trejectionCause,\n\t\t\terrorMessage,\n\t\t});\n\t\tawait this._extensionRunner.emit({\n\t\t\ttype: \"session_compact\",\n\t\t\treason: request.reason,\n\t\t\trequestId,\n\t\t\taccepted: false,\n\t\t\trejectionCause,\n\t\t\tfromExtension: false,\n\t\t\twillRetry: false,\n\t\t});\n\t\treturn { accepted: false, requestId, rejectionCause };\n\t}\n\n\t/**\n\t * Cancel in-progress compaction (manual or auto).\n\t */\n\tabortCompaction(): void {\n\t\tconst lifecycleState = this._compactionLifecycle.state;\n\t\tconst activeFeedbackRequestId =\n\t\t\tlifecycleState.status === \"running\" && lifecycleState.stage === \"feedback\"\n\t\t\t\t? lifecycleState.operationId\n\t\t\t\t: undefined;\n\t\tconst feedbackOperation = this._compactionLifecycle.abort(this._messageRevision);\n\t\tthis._compactionAbortController?.abort();\n\t\tthis._autoCompactionAbortController?.abort();\n\t\tif (feedbackOperation?.stage === \"feedback\") {\n\t\t\tthis._compactionAbortController = undefined;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason: feedbackOperation.reason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: true,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId: activeFeedbackRequestId,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Cancel in-progress branch summarization.\n\t */\n\tabortBranchSummary(): void {\n\t\tthis._branchSummaryAbortController?.abort();\n\t}\n\n\t/**\n\t * Dispatch automatic compaction after `agent_end` or before prompt submission.\n\t * Manual compaction does not call this method; it enters through `compact()`.\n\t *\n\t * Two cases:\n\t * 1. Overflow: LLM returned context overflow error, remove error message from agent state, compact, auto-retry\n\t * 2. Threshold: Context over threshold, compact, NO auto-retry (user continues manually)\n\t *\n\t * @param assistantMessage The assistant message to check\n\t * @param skipAbortedCheck If false, include aborted messages (for pre-prompt check). Default: true\n\t * @returns Whether the post-run loop should call `agent.continue()` for overflow recovery or queued messages\n\t */\n\tprivate async _enforceCompactionBeforeProvider(\n\t\tassistantMessage: AssistantMessage | undefined,\n\t\tskipAbortedCheck: boolean,\n\t\tinlineReason: \"pre_prompt\" | \"threshold\",\n\t\tretryAfterCompaction = false,\n\t): Promise<boolean> {\n\t\tconst blockedAdmission = this._blockedPostCompactionAssistant;\n\t\tif (\n\t\t\tblockedAdmission !== undefined &&\n\t\t\tblockedAdmission.assistant === assistantMessage &&\n\t\t\tblockedAdmission.revision === this._messageRevision\n\t\t) {\n\t\t\tthrow new RequiredCompactionError();\n\t\t}\n\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tconst model = this.model;\n\t\tconst contextTokens = estimateContextTokens(\n\t\t\tfilterContextExcludedMessages(this.sessionManager.buildSessionContext().messages),\n\t\t).tokens;\n\t\tconst compacted = assistantMessage\n\t\t\t? await this._checkCompaction(assistantMessage, skipAbortedCheck, inlineReason, retryAfterCompaction)\n\t\t\t: false;\n\t\tif (compacted || (assistantMessage && this._postCompactionUsageExemptAssistants.has(assistantMessage))) {\n\t\t\treturn compacted;\n\t\t}\n\n\t\tif (!settings.enabled || !model || !shouldCompact(contextTokens, model.contextWindow, settings)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst latestCompaction = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\tconst assistantBeforeLatestCompaction =\n\t\t\tassistantMessage !== undefined && this._isAssistantFromBeforeLatestCompaction(assistantMessage);\n\t\tconst hasPostCompactionCustomState =\n\t\t\tlatestCompaction !== null &&\n\t\t\tthis.agent.state.messages.some(\n\t\t\t\t(message) =>\n\t\t\t\t\tmessage.role === \"custom\" && message.timestamp >= new Date(latestCompaction.timestamp).getTime(),\n\t\t\t);\n\t\tif (assistantBeforeLatestCompaction && !hasPostCompactionCustomState) {\n\t\t\treturn false;\n\t\t}\n\t\tif (assistantBeforeLatestCompaction && assistantMessage) {\n\t\t\tconst compacted = await this._runPrePromptCompaction(assistantMessage, skipAbortedCheck, inlineReason);\n\t\t\tif (compacted) return true;\n\t\t}\n\t\tif (this._isCompactionOnCooldown() || this._isCompactionDelegated() || this._hasSupersedingCompactionClaim()) {\n\t\t\treturn false;\n\t\t}\n\t\tthrow new RequiredCompactionError();\n\t}\n\n\t/**\n\t * The normal pre-prompt check only estimates persisted session context. This\n\t * final gate also includes turn-local messages which the provider will see:\n\t * the current prompt, next-turn custom messages, and before_agent_start\n\t * additions. Compaction rewrites only session context, so callers retain and\n\t * reapply their already-assembled one-shot additions after it succeeds.\n\t */\n\tprivate async _enforceFinalProviderAdmission(messages: readonly AgentMessage[]): Promise<void> {\n\t\t// User-only prompts are deliberately admitted without this gate: prompt\n\t\t// admission must never brick on a rejected or cooled-down compaction\n\t\t// (issues #531/#886), so oversized user prompts rely on threshold\n\t\t// compaction — which also samples the local transcript estimate — and on\n\t\t// provider-overflow recovery. This gate closes the separate gap opened by\n\t\t// turn-local custom additions, which the pre-prompt check cannot observe.\n\t\tif (!messages.some((message) => message.role === \"custom\")) return;\n\n\t\tconst model = this.model;\n\t\tif (!model) return;\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tconst reserveTokens =\n\t\t\tsettings.reserveScalingEnabled === false\n\t\t\t\t? settings.reserveTokens\n\t\t\t\t: resolveReserveTokens(model.contextWindow, settings.reserveTokens);\n\t\tconst isOversized = (): boolean => {\n\t\t\tconst providerMessages = filterContextExcludedMessages([...this.agent.state.messages, ...messages]);\n\t\t\tconst estimate = estimateContextTokens(providerMessages);\n\t\t\tconst usageMessage = estimate.lastUsageIndex === null ? undefined : providerMessages[estimate.lastUsageIndex];\n\t\t\t// Kept assistant usage can describe the pre-compaction request. Once a\n\t\t\t// compaction boundary exists, fall back to byte-derived message estimates\n\t\t\t// until a provider response refreshes that usage.\n\t\t\tconst contextTokens =\n\t\t\t\tusageMessage?.role === \"assistant\" && this._isAssistantFromBeforeLatestCompaction(usageMessage)\n\t\t\t\t\t? estimateMessagesTokens(providerMessages)\n\t\t\t\t\t: estimate.tokens;\n\t\t\treturn contextTokens > model.contextWindow - reserveTokens;\n\t\t};\n\n\t\tif (!settings.enabled || !isOversized()) return;\n\n\t\tconst lastAssistantMessage = this._findLastAssistantMessage();\n\t\tif (!lastAssistantMessage) {\n\t\t\tthrow new RequiredCompactionError();\n\t\t}\n\n\t\tconst compacted = await this._runPrePromptCompaction(lastAssistantMessage, false, \"pre_prompt\");\n\t\tif (!compacted && this._isCompactionDelegated()) return;\n\t\tif (!compacted && this._hasSupersedingCompactionClaim()) return;\n\t\tif (!compacted && !isOversized() && this._isCompactionOnCooldown()) return;\n\t\tif (!compacted || isOversized()) {\n\t\t\tthrow new RequiredCompactionError();\n\t\t}\n\t}\n\n\tprivate async _checkCompaction(\n\t\tassistantMessage: AssistantMessage,\n\t\tskipAbortedCheck = true,\n\t\tinlineReason?: \"pre_prompt\" | \"threshold\",\n\t\tretryAfterCompaction = false,\n\t): Promise<boolean> {\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tif (!settings.enabled) return false;\n\n\t\t// Skip if message was aborted (user cancelled) - unless skipAbortedCheck is false\n\t\tif (skipAbortedCheck && assistantMessage.stopReason === \"aborted\") return false;\n\n\t\tconst contextWindow = this.model?.contextWindow ?? 0;\n\n\t\t// Skip overflow check if the message came from a different model.\n\t\t// This handles the case where user switched from a smaller-context model (e.g. opus)\n\t\t// to a larger-context model (e.g. codex) - the overflow error from the old model\n\t\t// shouldn't trigger compaction for the new model.\n\t\tconst sameModel =\n\t\t\tthis.model &&\n\t\t\tisSameOverflowSource(\n\t\t\t\tassistantMessage,\n\t\t\t\tthis.model,\n\t\t\t\tthis._modelRuntime.getCompatibilityRequestConfig(this.model).upstreamModelId,\n\t\t\t);\n\n\t\t// Skip compaction checks if this assistant message is older than the latest\n\t\t// compaction boundary. This prevents a stale pre-compaction usage/error\n\t\t// from retriggering compaction on the first prompt after compaction.\n\t\tconst compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());\n\t\tif (this._isAssistantFromBeforeLatestCompaction(assistantMessage)) {\n\t\t\treturn false;\n\t\t}\n\t\t// Case 1: Overflow - LLM returned context overflow error.\n\t\t// If the saved assistant provider differs from the currently selected provider alias,\n\t\t// still recover as overflow when the current context is also at the compaction limit.\n\t\tconst contextUsage = this.getContextUsage();\n\t\tconst currentContextNeedsCompaction =\n\t\t\tcontextUsage !== undefined &&\n\t\t\tcontextUsage.tokens !== null &&\n\t\t\tshouldCompact(contextUsage.tokens, contextUsage.contextWindow, settings);\n\t\tconst recoverableLength = sameModel && isRecoverableLength(assistantMessage, this.model?.maxTokens ?? 0);\n\t\tconst isOverflow =\n\t\t\t(isContextOverflow(assistantMessage, contextWindow) && (sameModel || currentContextNeedsCompaction)) ||\n\t\t\trecoverableLength ||\n\t\t\tthis._isCursorPayloadOverflow(assistantMessage);\n\t\tif (\n\t\t\tisOverflow &&\n\t\t\tassistantMessage.stopReason === \"stop\" &&\n\t\t\tthis._consumePostCompactionUsageExemption(assistantMessage)\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tif (isOverflow) {\n\t\t\tthis._flushPostCompactionDeferredMessages();\n\t\t\tconst willRetry = retryAfterCompaction || assistantMessage.stopReason !== \"stop\";\n\n\t\t\t// Case 2: the response completed successfully. Compact, but do not retry because\n\t\t\t// agent.continue() cannot continue from a completed assistant response.\n\t\t\tif (!willRetry) {\n\t\t\t\tconst compacted = await this._runAutoCompaction(\"overflow\", false);\n\t\t\t\tif (\n\t\t\t\t\t!compacted &&\n\t\t\t\t\tthis._compactionLifecycle.state.status === \"failed\" &&\n\t\t\t\t\tthis._compactionLifecycle.state.rejectionCause !== \"external-owner\" &&\n\t\t\t\t\tgetLatestCompactionEntry(this.sessionManager.getBranch()) !== null\n\t\t\t\t) {\n\t\t\t\t\tthis._blockedPostCompactionAssistant = {\n\t\t\t\t\t\tassistant: assistantMessage,\n\t\t\t\t\t\trevision: this._messageRevision,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn compacted;\n\t\t\t}\n\n\t\t\tif (this._overflowRecoveryAttempted) {\n\t\t\t\tconst errorMessage =\n\t\t\t\t\t\"Context overflow recovery failed after one compact-and-retry attempt. Try reducing context or switching to a larger-context model.\";\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\treason: \"overflow\",\n\t\t\t\t\tresult: undefined,\n\t\t\t\t\taborted: false,\n\t\t\t\t\twillRetry: false,\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\t\t\t\tif (inlineReason === \"pre_prompt\") {\n\t\t\t\t\tthrow new Error(errorMessage);\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Case 1: remove the failed or truncated message from agent state, compact, and\n\t\t\t// retry once. The message remains in session history but is excluded from retry context.\n\t\t\tthis._overflowRecoveryAttempted = true;\n\t\t\t// Remove the error message from agent state (it IS saved to session for history,\n\t\t\t// but we don't want it in context for the retry)\n\t\t\tconst messages = this.agent.state.messages;\n\t\t\tlet removedOverflowAssistant = false;\n\t\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\t\tthis.agent.state.messages = messages.slice(0, -1);\n\t\t\t\tremovedOverflowAssistant = true;\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t}\n\t\t\tconst compacted = inlineReason\n\t\t\t\t? await this._runPrePromptCompaction(assistantMessage, skipAbortedCheck, \"overflow\", willRetry)\n\t\t\t\t: await this._runAutoCompaction(\"overflow\", willRetry);\n\t\t\tif (!compacted && removedOverflowAssistant) {\n\t\t\t\tthis._restoreAgentMessagesFromSession();\n\t\t\t\tthis._incrementMessageRevision();\n\t\t\t}\n\t\t\tif (!compacted && inlineReason && !this._isCompactionDelegated() && !this._hasSupersedingCompactionClaim()) {\n\t\t\t\tif (this._compactionSkippedTooSmall) {\n\t\t\t\t\tthis._compactionSkippedTooSmall = false;\n\t\t\t\t\tconst provider = this.model?.provider;\n\t\t\t\t\tif (provider === \"cursor\" || provider === \"cursor-cli-oauth\") {\n\t\t\t\t\t\tthis._truncateAgentMessagesToLastUserTurn();\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tthrow new RequiredCompactionError();\n\t\t\t}\n\t\t\treturn compacted;\n\t\t}\n\n\t\t// The first ordinary response can carry provider usage calculated before\n\t\t// compaction. Consume that exemption only after proving this is not an\n\t\t// overflow, then retain the decision for later admission re-sampling.\n\t\tif (this._consumePostCompactionUsageExemption(assistantMessage)) return false;\n\n\t\t// Case 2: Threshold - context is getting large\n\t\t// For error messages or all-zero usage messages, estimate from the last valid response.\n\t\t// This ensures sessions that hit persistent API errors (e.g. 529) or malformed zero-usage\n\t\t// responses can still compact and do not reset context accounting.\n\t\tlet contextTokens: number;\n\t\tif (inlineReason) {\n\t\t\tconst messages = filterContextExcludedMessages(this.sessionManager.buildSessionContext().messages);\n\t\t\tcontextTokens = estimateContextTokens(messages).tokens;\n\t\t} else {\n\t\t\tconst directContextTokens = assistantMessage.usage ? calculateContextTokens(assistantMessage.usage) : 0;\n\t\t\tif (assistantMessage.stopReason !== \"error\" && directContextTokens !== 0) {\n\t\t\t\tcontextTokens = this._resolveThresholdContextTokens(directContextTokens);\n\t\t\t} else {\n\t\t\t\tconst messages = filterContextExcludedMessages(this.agent.state.messages);\n\t\t\t\tconst estimate = estimateContextTokens(messages);\n\t\t\t\tif (estimate.lastUsageIndex !== null) {\n\t\t\t\t\t// Verify the usage source is post-compaction. Kept pre-compaction messages\n\t\t\t\t\t// have stale usage reflecting the old (larger) context and would falsely\n\t\t\t\t\t// trigger compaction right after one just finished.\n\t\t\t\t\tconst usageMsg = messages[estimate.lastUsageIndex];\n\t\t\t\t\tif (\n\t\t\t\t\t\tcompactionEntry &&\n\t\t\t\t\t\tusageMsg.role === \"assistant\" &&\n\t\t\t\t\t\tthis._isAssistantFromBeforeLatestCompaction(usageMsg)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontextTokens = estimate.tokens;\n\t\t\t}\n\t\t}\n\t\tif (shouldCompact(contextTokens, contextWindow, settings)) {\n\t\t\tif (inlineReason) {\n\t\t\t\treturn await this._runPrePromptCompaction(\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\tskipAbortedCheck,\n\t\t\t\t\tinlineReason,\n\t\t\t\t\tretryAfterCompaction,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst compacted = await this._runAutoCompaction(\"threshold\", retryAfterCompaction);\n\t\t\t\tif (\n\t\t\t\t\t!compacted &&\n\t\t\t\t\tthis._compactionLifecycle.state.status === \"failed\" &&\n\t\t\t\t\tthis._compactionLifecycle.state.rejectionCause !== \"external-owner\" &&\n\t\t\t\t\tgetLatestCompactionEntry(this.sessionManager.getBranch()) !== null\n\t\t\t\t) {\n\t\t\t\t\tthis._blockedPostCompactionAssistant = {\n\t\t\t\t\t\tassistant: assistantMessage,\n\t\t\t\t\t\trevision: this._messageRevision,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn compacted;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprivate _isCompactionOnCooldown(): boolean {\n\t\tconst state = this._compactionLifecycle.state;\n\t\treturn state.status === \"failed\" && state.rejectionCause === \"circuit-breaker\";\n\t}\n\n\t/**\n\t * Compaction claims are last-writer-wins: a newer admission aborts the\n\t * incumbent controller (_claimCompactionController). When the failed attempt\n\t * lost that race, a live claimant now owns the route and re-gates admission\n\t * itself, so the loser must not surface RequiredCompactionError (issue #886).\n\t * A user abort leaves no live claimant behind and keeps throwing.\n\t */\n\tprivate _hasSupersedingCompactionClaim(): boolean {\n\t\tconst claimant = this._compactionAbortController ?? this._autoCompactionAbortController;\n\t\treturn claimant !== undefined && !claimant.signal.aborted;\n\t}\n\n\tprivate _isCompactionDelegated(): boolean {\n\t\tconst model = this.model;\n\t\treturn (\n\t\t\tthis._delegatedCompactionKey !== undefined &&\n\t\t\tmodel !== undefined &&\n\t\t\tthis._delegatedCompactionKey.provider === model.provider &&\n\t\t\tthis._delegatedCompactionKey.id === model.id\n\t\t);\n\t}\n\n\tprivate async _runPrePromptCompaction(\n\t\tlastAssistantMessage: AssistantMessage | undefined,\n\t\tskipAbortedCheck: boolean,\n\t\treason: \"pre_prompt\" | \"overflow\" | \"threshold\" = \"pre_prompt\",\n\t\twillRetry = false,\n\t\tallowSummaryOnly = false,\n\t): Promise<boolean> {\n\t\tif (this._isCompactionDelegated()) return false;\n\t\tconst controller = new AbortController();\n\t\tconst requestId = randomUUID();\n\t\tthis._claimCompactionController(controller, \"compaction\");\n\t\tthis._emit({ type: \"compaction_start\", reason, requestId });\n\n\t\ttry {\n\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\tcontroller,\n\t\t\t\towner: \"compaction\",\n\t\t\t\treason,\n\t\t\t\trequestId,\n\t\t\t\twillRetry,\n\t\t\t\tlastAssistantMessage,\n\t\t\t\tskipAbortedCheck,\n\t\t\t\tallowSummaryOnly,\n\t\t\t});\n\t\t\tif (\n\t\t\t\t!execution.accepted &&\n\t\t\t\tlastAssistantMessage &&\n\t\t\t\tisContextOverflow(lastAssistantMessage, this.model?.contextWindow ?? 0)\n\t\t\t) {\n\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t}\n\t\t\treturn execution.accepted;\n\t\t} catch (error) {\n\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (lastAssistantMessage && isContextOverflow(lastAssistantMessage, this.model?.contextWindow ?? 0)) {\n\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t}\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n\t\t\tthis._compactionSkippedTooSmall = shouldRetryOverflowWithoutCompact(false, errorMessage);\n\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage: aborted ? undefined : `Pre-prompt compaction failed: ${errorMessage}`,\n\t\t\t});\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tif (this._compactionAbortController === controller && this._compactionLifecycle.state.status !== \"running\") {\n\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate async _revalidateScheduledContinuationAdmission(): Promise<void> {\n\t\tconst model = this.model;\n\t\tconst settings = this.settingsManager.getCompactionSettings();\n\t\tif (!model || !settings.enabled) return;\n\n\t\tconst canonicalMessages = filterContextExcludedMessages(this.sessionManager.buildSessionContext().messages);\n\t\tconst estimate = estimateContextTokens(canonicalMessages);\n\t\tconst usageMessage = estimate.lastUsageIndex === null ? undefined : canonicalMessages[estimate.lastUsageIndex];\n\t\tconst contextTokens =\n\t\t\tusageMessage?.role === \"assistant\" && this._isAssistantFromBeforeLatestCompaction(usageMessage)\n\t\t\t\t? estimateMessagesTokens(canonicalMessages)\n\t\t\t\t: estimate.tokens;\n\t\tif (!shouldCompact(contextTokens, model.contextWindow, settings)) return;\n\n\t\tconst compacted = await this._runPrePromptCompaction(this._findLastAssistantMessage(), true, \"pre_prompt\");\n\t\tif (!compacted) {\n\t\t\tif (this._isCompactionOnCooldown() || this._isCompactionDelegated() || this._hasSupersedingCompactionClaim()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow new RequiredCompactionError();\n\t\t}\n\t\tthis._scheduledContinuationRecompacted = true;\n\t}\n\n\tprivate async _continueAgentAfterCurrentRun(\n\t\toptions: AgentContinuationOptions = {},\n\t\tretryTimeoutMs?: number,\n\t): Promise<\"continued\" | \"taken-over\"> {\n\t\tawait this.agent.waitForIdle();\n\t\ttry {\n\t\t\tif (this.agent.state.isStreaming) return \"taken-over\";\n\n\t\t\t// Pre-admission restore point. A senpi-owned compaction that succeeds\n\t\t\t// while a run is still active releases its refusal pin through\n\t\t\t// _onCompactionContextChanged() but cannot restore there: model-select\n\t\t\t// work must stay ordered behind the session-work barrier while the run\n\t\t\t// owns it. Every post-compaction continuation admission - auto/overflow\n\t\t\t// compaction recovery, _resumeQueuedMessagesAfterCompaction(), the\n\t\t\t// agent_end queued continuation and the retry continuation - is scheduled\n\t\t\t// through _scheduleContinuationAfterCurrentEvent() and funnels here, so\n\t\t\t// this is the single choke point every such request passes before\n\t\t\t// reaching the provider. Restoring here (a no-op when nothing is pending)\n\t\t\t// keeps the guarantee that the very next request after a compaction runs\n\t\t\t// on the primary, and precedes the admission revalidation below so that\n\t\t\t// check samples the restored model's context window - the same ordering\n\t\t\t// the retry-continuation restore uses.\n\t\t\tawait this._maybeRestoreFallbackPrimary();\n\n\t\t\tawait this._revalidateScheduledContinuationAdmission();\n\t\t\tif (this.agent.state.isStreaming) return \"taken-over\";\n\n\t\t\tawait runBoundedRetryContinuation({\n\t\t\t\tcontinueRun: async () => {\n\t\t\t\t\tif (this._scheduledContinuationRecompacted) {\n\t\t\t\t\t\tconst tail = this.agent.state.messages.at(-1);\n\t\t\t\t\t\tif (tail?.role === \"assistant\" && (tail.stopReason === \"error\" || tail.stopReason === \"aborted\")) {\n\t\t\t\t\t\t\tthis._retireFailedRetryAssistant(tail);\n\t\t\t\t\t\t\tif (this.agent.state.messages.at(-1) === tail) {\n\t\t\t\t\t\t\t\tthis.agent.state.messages = this.agent.state.messages.slice(0, -1);\n\t\t\t\t\t\t\t\tthis._incrementMessageRevision();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.agent.continueWithQueuedMessages(options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tawait this.agent.continue(options);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tgetActiveSignal: () => this.agent.signal,\n\t\t\t\tabortActive: () =>\n\t\t\t\t\tthis.agent.abort(\n\t\t\t\t\t\tnew ProviderRetryWatchdogAbortError(\n\t\t\t\t\t\t\tproviderRetryWatchdogAbortMessage(retryTimeoutMs, this.agent.streamStartTimeoutMs),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\ttimeoutMs: retryTimeoutMs,\n\t\t\t});\n\t\t\treturn \"continued\";\n\t\t} catch (error) {\n\t\t\tif (\n\t\t\t\tthis.agent.state.isStreaming &&\n\t\t\t\terror instanceof Error &&\n\t\t\t\terror.message.startsWith(\"Agent is already processing\")\n\t\t\t) {\n\t\t\t\treturn \"taken-over\";\n\t\t\t}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tthis._scheduledContinuationRecompacted = false;\n\t\t}\n\t}\n\n\t/**\n\t * Mirror _runAutoCompaction's post-success recovery for non-auto compaction\n\t * owners (manual, extension action, extension apply): a custom triggerTurn\n\t * message sent while the compaction was running is parked in the agent-level\n\t * queues without starting a turn, so a settled compaction must deliver it or\n\t * hidden continuations (e.g. goal) wedge until manual user input.\n\t */\n\tprivate _resumeQueuedMessagesAfterCompaction(): void {\n\t\tif (this.pendingMessageCount > 0 || this.agent.hasQueuedMessages()) {\n\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t}\n\t}\n\n\tprivate _scheduleContinuationAfterCurrentEvent(\n\t\toptions: AgentContinuationOptions = {},\n\t\tretryContinuation = false,\n\t\tretryTimeoutMs?: number,\n\t): void {\n\t\t// Tool hooks wait for queued message persistence, so continue() cannot run inside this event promise.\n\t\tconst currentEventQueue = this._agentEventQueue;\n\t\tconst finishContinuationWork = this._sessionWorkBarrier.begin();\n\t\tconst continueAfterEvent = async (): Promise<void> => {\n\t\t\ttry {\n\t\t\t\tconst outcome = await this._continueAgentAfterCurrentRun(options, retryTimeoutMs);\n\t\t\t\tif (retryContinuation && outcome === \"taken-over\") {\n\t\t\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.delete(this);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (retryContinuation) {\n\t\t\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.delete(this);\n\t\t\t\t}\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"continuation_error\",\n\t\t\t\t\terrorMessage: `Failed to continue queued messages: ${message}`,\n\t\t\t\t});\n\t\t\t\tif (!this.agent.state.isStreaming) {\n\t\t\t\t\tawait this._emitAgentSettled();\n\t\t\t\t}\n\t\t\t\tif (retryContinuation) this._resolveRetry();\n\t\t\t}\n\t\t};\n\n\t\tvoid currentEventQueue\n\t\t\t.then(continueAfterEvent, continueAfterEvent)\n\t\t\t.finally(finishContinuationWork)\n\t\t\t.catch(() => undefined);\n\t}\n\n\t/**\n\t * Execute threshold or overflow compaction. Manual compaction uses\n\t * `AgentSession.compact()` instead. Both paths call the lower-level `compact()`\n\t * function imported from `./compaction/index.ts` after preparation and extension\n\t * interception.\n\t *\n\t * @param reason Automatic trigger selected by `_checkCompaction()`\n\t * @param willRetry Whether to continue the interrupted turn after overflow compaction\n\t * @returns Whether the post-run loop should call `agent.continue()`\n\t */\n\tprivate async _runAutoCompaction(reason: \"overflow\" | \"threshold\", willRetry: boolean): Promise<boolean> {\n\t\tif (this._isCompactionDelegated()) return false;\n\t\tconst finishCompactionWork = this._sessionWorkBarrier.begin();\n\t\tconst agentMessagesAtStart = this.agent.state.messages.slice();\n\t\tconst autoCompactionController = new AbortController();\n\t\tconst requestId = randomUUID();\n\t\tthis._claimCompactionController(autoCompactionController, \"auto\");\n\t\tconst endBeforeExecution = (): false => {\n\t\t\tthis._emit({ type: \"compaction_start\", reason, requestId });\n\t\t\tif (reason === \"overflow\" && this._autoCompactionAbortController === autoCompactionController) {\n\t\t\t\tthis._overflowRecoveryAttempted = false;\n\t\t\t}\n\t\t\t// A synchronous compaction_start listener can supersede this controller with a new\n\t\t\t// operation, which then owns its own start/end lifecycle; publishing another terminal\n\t\t\t// event here would be stale. A listener can instead abort this very controller, and\n\t\t\t// that still needs a terminal event: consumers open UI state on compaction_start and\n\t\t\t// close it only on compaction_end.\n\t\t\tif (this._autoCompactionAbortController !== autoCompactionController) return false;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted: autoCompactionController.signal.aborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t});\n\t\t\treturn false;\n\t\t};\n\n\t\ttry {\n\t\t\tif (!this.model) {\n\t\t\t\treturn endBeforeExecution();\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\t// Resolve once before admission so a pending auth refresh remains a\n\t\t\t\t// cancellable boundary. _executeCompaction resolves the policy-specific\n\t\t\t\t// auth after extension compaction hooks have had a chance to provide a\n\t\t\t\t// summary without credentials.\n\t\t\t\tawait this._modelRuntime.getAuth(this.model);\n\t\t\t} catch {\n\t\t\t\tif (!this._ownsCompactionController(autoCompactionController, \"auto\")) return false;\n\t\t\t\treturn endBeforeExecution();\n\t\t\t}\n\t\t\tif (!this._ownsCompactionController(autoCompactionController, \"auto\")) return false;\n\n\t\t\tconst preparation = prepareCompaction(\n\t\t\t\tthis.sessionManager.getBranch(),\n\t\t\t\tcursorOverflowCompactionSettings(\n\t\t\t\t\tthis.settingsManager.getCompactionSettings(),\n\t\t\t\t\tthis.model?.provider,\n\t\t\t\t\treason,\n\t\t\t\t),\n\t\t\t\treason === \"overflow\",\n\t\t\t);\n\t\t\tif (!preparation) {\n\t\t\t\treturn endBeforeExecution();\n\t\t\t}\n\t\t\tif (!this._ownsCompactionController(autoCompactionController, \"auto\")) return false;\n\t\t\tthis._emit({ type: \"compaction_start\", reason, requestId });\n\n\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\tcontroller: autoCompactionController,\n\t\t\t\towner: \"auto\",\n\t\t\t\treason,\n\t\t\t\trequestId,\n\t\t\t\twillRetry,\n\t\t\t\tagentMessagesAtStart,\n\t\t\t});\n\t\t\tif (!execution.accepted) {\n\t\t\t\tif (reason === \"overflow\") this._overflowRecoveryAttempted = false;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (this._autoCompactionAbortController === autoCompactionController) {\n\t\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t\t}\n\n\t\t\tif (willRetry) {\n\t\t\t\tconst messages = this.agent.state.messages;\n\t\t\t\tconst lastMsg = messages[messages.length - 1];\n\t\t\t\tif (\n\t\t\t\t\tlastMsg?.role === \"assistant\" &&\n\t\t\t\t\t((lastMsg as AssistantMessage).stopReason === \"error\" ||\n\t\t\t\t\t\t(lastMsg as AssistantMessage).stopReason === \"length\")\n\t\t\t\t) {\n\t\t\t\t\tthis.agent.state.messages = messages.slice(0, -1);\n\t\t\t\t\tthis._incrementMessageRevision();\n\t\t\t\t}\n\n\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\treturn true;\n\t\t\t} else if (this.pendingMessageCount > 0) {\n\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\treturn true;\n\t\t\t} else if (this.agent.hasQueuedMessages()) {\n\t\t\t\tthis._scheduleContinuationAfterCurrentEvent();\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t} catch (error) {\n\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (reason === \"overflow\") this._overflowRecoveryAttempted = false;\n\t\t\tconst errorMessage = error instanceof Error ? error.message : \"compaction failed\";\n\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\tconst formattedErrorMessage = aborted\n\t\t\t\t? undefined\n\t\t\t\t: reason === \"overflow\"\n\t\t\t\t\t? `Context overflow recovery failed: ${errorMessage}`\n\t\t\t\t\t: `Auto-compaction failed: ${errorMessage}`;\n\t\t\tthis._emit({\n\t\t\t\ttype: \"compaction_end\",\n\t\t\t\treason,\n\t\t\t\tresult: undefined,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\trequestId,\n\t\t\t\terrorMessage: formattedErrorMessage,\n\t\t\t});\n\t\t\tawait this._emitSessionCompactFailed({\n\t\t\t\treason,\n\t\t\t\terrorMessage: formattedErrorMessage,\n\t\t\t\taborted,\n\t\t\t\twillRetry: false,\n\t\t\t\tfromExtension: false,\n\t\t\t});\n\t\t\treturn false;\n\t\t} finally {\n\t\t\tif (this._autoCompactionAbortController === autoCompactionController) {\n\t\t\t\tthis._autoCompactionAbortController = undefined;\n\t\t\t}\n\t\t\tfinishCompactionWork();\n\t\t}\n\t}\n\n\t/**\n\t * Toggle auto-compaction setting.\n\t */\n\tsetAutoCompactionEnabled(enabled: boolean): void {\n\t\tthis.settingsManager.setCompactionEnabled(enabled);\n\t\tthis._emitSessionSettingsChanged();\n\t}\n\n\tprivate _emitSessionSettingsChanged(): void {\n\t\tthis._emit({\n\t\t\ttype: \"session_settings_changed\",\n\t\t\tsteeringMode: this.steeringMode,\n\t\t\tfollowUpMode: this.followUpMode,\n\t\t\tautoCompactionEnabled: this.autoCompactionEnabled,\n\t\t});\n\t}\n\n\t/** Whether auto-compaction is enabled */\n\tget autoCompactionEnabled(): boolean {\n\t\treturn this.settingsManager.getCompactionEnabled();\n\t}\n\n\tasync bindExtensions(bindings: ExtensionBindings): Promise<void> {\n\t\tconst finishBindingWork = this._sessionWorkBarrier.begin();\n\t\tconst bindingPromptReadiness = new Set<Promise<void>>();\n\t\tthis._extensionBindingPromptReadiness = bindingPromptReadiness;\n\t\ttry {\n\t\t\tif (bindings.uiContext !== undefined) {\n\t\t\t\tthis._extensionUIContext = bindings.uiContext;\n\t\t\t}\n\t\t\tif (bindings.mode !== undefined) {\n\t\t\t\tthis._extensionMode = bindings.mode;\n\t\t\t}\n\t\t\tif (bindings.commandContextActions !== undefined) {\n\t\t\t\tthis._extensionCommandContextActions = bindings.commandContextActions;\n\t\t\t}\n\t\t\tif (bindings.abortHandler !== undefined) {\n\t\t\t\tthis._extensionAbortHandler = bindings.abortHandler;\n\t\t\t}\n\t\t\tif (bindings.shutdownHandler !== undefined) {\n\t\t\t\tthis._extensionShutdownHandler = bindings.shutdownHandler;\n\t\t\t}\n\t\t\tif (bindings.onError !== undefined) {\n\t\t\t\tthis._extensionErrorListener = bindings.onError;\n\t\t\t}\n\n\t\t\tthis._applyExtensionBindings(this._extensionRunner);\n\t\t\tthis.syncPromptCacheSafeWaitEnv();\n\t\t\tawait this._extensionRunner.emit(this._sessionStartEvent);\n\t\t\tthis._enforceConfiguredDefaultTools();\n\t\t\tawait this.extendResourcesFromExtensions(this._sessionStartEvent.reason === \"reload\" ? \"reload\" : \"startup\");\n\t\t} finally {\n\t\t\tif (this._extensionBindingPromptReadiness === bindingPromptReadiness) {\n\t\t\t\tthis._extensionBindingPromptReadiness = undefined;\n\t\t\t}\n\t\t\tfinishBindingWork();\n\t\t}\n\t\tawait Promise.all(bindingPromptReadiness);\n\t}\n\n\tprivate async extendResourcesFromExtensions(reason: \"startup\" | \"reload\"): Promise<void> {\n\t\tif (!this._extensionRunner.hasHandlers(\"resources_discover\")) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst { skillPaths, promptPaths, themePaths, hookPaths } = await this._extensionRunner.emitResourcesDiscover(\n\t\t\tthis._cwd,\n\t\t\treason,\n\t\t);\n\n\t\tif (skillPaths.length === 0 && promptPaths.length === 0 && themePaths.length === 0 && hookPaths.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst extensionPaths: ResourceExtensionPaths = {\n\t\t\tskillPaths: this.buildExtensionResourcePaths(skillPaths),\n\t\t\tpromptPaths: this.buildExtensionResourcePaths(promptPaths),\n\t\t\tthemePaths: this.buildExtensionResourcePaths(themePaths),\n\t\t\thookPaths: this.buildExtensionResourcePaths(hookPaths),\n\t\t};\n\n\t\tthis._resourceLoader.extendResources(extensionPaths);\n\t\tif (skillPaths.length > 0 || promptPaths.length > 0 || themePaths.length > 0) {\n\t\t\tthis._baseSystemPrompt = this._rebuildSystemPrompt(this.getActiveToolNames());\n\t\t\tthis.agent.state.systemPrompt = this._baseSystemPrompt;\n\t\t}\n\t}\n\n\tprivate buildExtensionResourcePaths(entries: Array<{ path: string; extensionPath: string }>): Array<{\n\t\tpath: string;\n\t\tmetadata: {\n\t\t\tsource: string;\n\t\t\tscope: \"temporary\";\n\t\t\torigin: \"top-level\";\n\t\t\tbaseDir?: string;\n\t\t};\n\t}> {\n\t\treturn entries.map((entry) => {\n\t\t\tconst source = this.getExtensionSourceLabel(entry.extensionPath);\n\t\t\tconst baseDir = entry.extensionPath.startsWith(\"<\") ? undefined : dirname(entry.extensionPath);\n\t\t\treturn {\n\t\t\t\tpath: entry.path,\n\t\t\t\tmetadata: {\n\t\t\t\t\tsource,\n\t\t\t\t\tscope: \"temporary\",\n\t\t\t\t\torigin: \"top-level\",\n\t\t\t\t\tbaseDir,\n\t\t\t\t},\n\t\t\t};\n\t\t});\n\t}\n\n\tprivate getExtensionSourceLabel(extensionPath: string): string {\n\t\tif (extensionPath.startsWith(\"<\")) {\n\t\t\treturn `extension:${extensionPath.replace(/[<>]/g, \"\")}`;\n\t\t}\n\t\tconst base = basename(extensionPath);\n\t\tconst name = base.replace(/\\.(ts|js)$/, \"\");\n\t\treturn `extension:${name}`;\n\t}\n\n\tprivate _applyExtensionBindings(runner: ExtensionRunner): void {\n\t\trunner.setUIContext(this._extensionUIContext, this._extensionMode);\n\t\trunner.setToolHookLifecycleObserver((event) => {\n\t\t\tthis._emit(event);\n\t\t});\n\t\trunner.bindCommandContext(this._extensionCommandContextActions);\n\n\t\tthis._extensionErrorUnsubscriber?.();\n\t\tthis._extensionErrorUnsubscriber = this._extensionErrorListener\n\t\t\t? runner.onError(this._extensionErrorListener)\n\t\t\t: undefined;\n\t}\n\n\tprivate _refreshCurrentModelFromRegistry(): void {\n\t\tthis._delegatedCompactionKey = undefined;\n\t\tconst currentModel = this.model;\n\t\tif (!currentModel) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst refreshedModel = this._modelRuntime.getModel(currentModel.provider, currentModel.id);\n\t\tif (!refreshedModel || refreshedModel === currentModel) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.agent.state.model = refreshedModel;\n\t}\n\n\tprivate _bindExtensionCore(runner: ExtensionRunner): void {\n\t\t// Activity extensions publish about work outliving a turn (background\n\t\t// terminal jobs, monitors, holds) feeds the session-busy contract. Re-bound\n\t\t// per runner; counts survive the swap so a reload cannot make live work\n\t\t// look idle to an occupancy sweep.\n\t\tthis._unsubscribeWakeSources?.();\n\t\tthis._unsubscribeWakeSources = runner.onBusEvent(WAKE_SOURCE_STATE_EVENT, (data) =>\n\t\t\tthis._wakeSources.observe(data),\n\t\t);\n\t\tconst getCommands = (): SlashCommandInfo[] => {\n\t\t\tconst extensionCommands: SlashCommandInfo[] = runner.getRegisteredCommands().map((command) => ({\n\t\t\t\tname: command.invocationName,\n\t\t\t\tdescription: command.description,\n\t\t\t\tsource: \"extension\",\n\t\t\t\tsourceInfo: command.sourceInfo,\n\t\t\t}));\n\n\t\t\tconst templates: SlashCommandInfo[] = this.promptTemplates.map((template) => ({\n\t\t\t\tname: template.name,\n\t\t\t\tdescription: template.description,\n\t\t\t\tsource: \"prompt\",\n\t\t\t\tsourceInfo: template.sourceInfo,\n\t\t\t}));\n\n\t\t\tconst skills: SlashCommandInfo[] = this._resourceLoader.getSkills().skills.map((skill) => ({\n\t\t\t\tname: `skill:${skill.name}`,\n\t\t\t\tdescription: skill.description,\n\t\t\t\tsource: \"skill\",\n\t\t\t\tsourceInfo: skill.sourceInfo,\n\t\t\t}));\n\n\t\t\treturn [...extensionCommands, ...templates, ...skills];\n\t\t};\n\n\t\trunner.bindCore(\n\t\t\t{\n\t\t\t\tsendMessage: (message, options) => {\n\t\t\t\t\tconst reportError = (err: unknown) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: RUNTIME_EXTENSION_PATH,\n\t\t\t\t\t\t\tevent: \"send_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t\tif (options?.triggerTurn === true) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tthis._agentSettledDelivery.deferTriggerTurn((claim) => {\n\t\t\t\t\t\t\t\tthis.sendCustomMessage(message, options, claim).catch(reportError);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst send = () => this.sendCustomMessage(message, options).catch(reportError);\n\t\t\t\t\tif (this._agentSettledDelivery.defer(send)) return;\n\t\t\t\t\tsend();\n\t\t\t\t},\n\t\t\t\tsendUserMessage: (content, options) => {\n\t\t\t\t\tconst reportError = (err: unknown) => {\n\t\t\t\t\t\trunner.emitError({\n\t\t\t\t\t\t\textensionPath: RUNTIME_EXTENSION_PATH,\n\t\t\t\t\t\t\tevent: \"send_user_message\",\n\t\t\t\t\t\t\terror: err instanceof Error ? err.message : String(err),\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t\t// sendUserMessage always triggers a turn; register a settlement-deferred\n\t\t\t\t\t// turn claim so agent_idle is not emitted before its deferred agent_start.\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis._agentSettledDelivery.deferTriggerTurn((claim) => {\n\t\t\t\t\t\t\tthis.sendUserMessage(content, options, claim).catch(reportError);\n\t\t\t\t\t\t})\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tthis.sendUserMessage(content, options).catch(reportError);\n\t\t\t\t},\n\t\t\t\tappendEntry: (customType, data) => {\n\t\t\t\t\tconst entryId = this.sessionManager.appendCustomEntry(customType, data);\n\t\t\t\t\tconst entry = this.sessionManager.getEntry(entryId);\n\t\t\t\t\tif (entry) {\n\t\t\t\t\t\tthis._emit({ type: \"entry_appended\", entry });\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsetSessionName: (name) => {\n\t\t\t\t\tthis.setSessionName(name);\n\t\t\t\t},\n\t\t\t\tgetSessionName: () => {\n\t\t\t\t\treturn this.sessionManager.getSessionName();\n\t\t\t\t},\n\t\t\t\tsetLabel: (entryId, label) => {\n\t\t\t\t\tthis.sessionManager.appendLabelChange(entryId, label);\n\t\t\t\t},\n\t\t\t\texecuteTool: (toolName, params, options) => this.executeTool(toolName, params, options),\n\t\t\t\tgetActiveTools: () => this.getActiveToolNames(),\n\t\t\t\tgetAllTools: () => this.getAllTools(),\n\t\t\t\tsetActiveTools: (toolNames) => this.setActiveToolsByName(toolNames),\n\t\t\t\trefreshTools: () => this._refreshToolRegistry(),\n\t\t\t\tregisterRemovedToolHint: (name, hint) => {\n\t\t\t\t\tthis.agent.removedToolHints[name] = hint;\n\t\t\t\t},\n\t\t\t\tregisterLazyToolActivator: (activator) => {\n\t\t\t\t\tthis._lazyToolActivators.push(activator);\n\t\t\t\t},\n\t\t\t\tgetCommands,\n\t\t\t\tsetModel: async (model) => {\n\t\t\t\t\tif (!this._modelRuntime.hasConfiguredAuth(model.provider)) return false;\n\t\t\t\t\tawait this.setModel(model);\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tgetThinkingLevel: () => this.thinkingLevel,\n\t\t\t\tsetThinkingLevel: (level) => this.setThinkingLevel(level),\n\t\t\t\tsetSessionModel: async (model) => {\n\t\t\t\t\tif (!this._modelRuntime.hasConfiguredAuth(model.provider)) return false;\n\t\t\t\t\tawait this.setSessionModel(model);\n\t\t\t\t\treturn true;\n\t\t\t\t},\n\t\t\t\tsetSessionThinkingLevel: (level) => this.setSessionThinkingLevel(level),\n\t\t\t\tsetSessionFastMode: (enabled) => this.setSessionFastMode(enabled),\n\t\t\t},\n\t\t\t{\n\t\t\t\tgetModel: () => this.model,\n\t\t\t\tgetServiceTier: () => this.serviceTier,\n\t\t\t\tgetScopedModels: () => this._scopedModels,\n\t\t\t\tisIdle: () => this.isIdle,\n\t\t\t\tgetAgentDir: () => this._agentDir,\n\t\t\t\tisProjectTrusted: () => this.settingsManager.isProjectTrusted(),\n\t\t\t\tgetSignal: () => this._extensionEventSignal ?? this.agent.signal,\n\t\t\t\tabort: (source = \"user\") => {\n\t\t\t\t\tif (source === \"system\") return void this._abortActiveAgentAndRetry(\"system\");\n\t\t\t\t\tif (this._extensionAbortHandler) return this._extensionAbortHandler();\n\t\t\t\t\tvoid this.abort();\n\t\t\t\t},\n\t\t\t\thasPendingMessages: () => this.pendingMessageCount > 0,\n\t\t\t\tisCompacting: () => this.isCompacting,\n\t\t\t\tcheckReloadVeto: () => this.checkReloadVeto(),\n\t\t\t\tshutdown: () => {\n\t\t\t\t\tthis._extensionShutdownHandler?.();\n\t\t\t\t},\n\t\t\t\tgetContextUsage: () => this.getContextUsage(),\n\t\t\t\tgetCompactionSettings: () => this.settingsManager.getCompactionSettings(),\n\t\t\t\tgetPromptCacheSafeWaitSeconds: () => this.resolvePromptCacheSafeWaitSeconds(),\n\t\t\t\tgetPromptCacheGoalBackstopMaxSeconds: () => this.settingsManager.getPromptCacheGoalBackstopMaxSeconds(),\n\t\t\t\tgetPromptCacheKeepAliveSettings: () => this.settingsManager.getPromptCacheKeepAliveSettings(),\n\t\t\t\tgetLookAtSettings: () => {\n\t\t\t\t\tconst global = this.settingsManager.getGlobalSettings().lookAt;\n\t\t\t\t\tconst project = this.settingsManager.getProjectSettings().lookAt;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tenabled: project?.enabled ?? global?.enabled ?? true,\n\t\t\t\t\t\tmodels: project?.models ?? global?.models,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t\tgetImageSettings: () => ({\n\t\t\t\t\tautoResize: this.settingsManager.getImageAutoResize(),\n\t\t\t\t\tblockImages: this.settingsManager.getBlockImages(),\n\t\t\t\t}),\n\t\t\t\tsessionSettings: {\n\t\t\t\t\tgetRetryFallbackSettings: () => this.settingsManager.getRetryFallbackSettings(),\n\t\t\t\t\tsetFallbackChain: async (key, entries) => {\n\t\t\t\t\t\tthis.settingsManager.setFallbackChain(key, [...entries]);\n\t\t\t\t\t\tawait this.settingsManager.flush();\n\t\t\t\t\t},\n\t\t\t\t\tremoveFallbackChain: async (key) => {\n\t\t\t\t\t\tthis.settingsManager.removeFallbackChain(key);\n\t\t\t\t\t\tawait this.settingsManager.flush();\n\t\t\t\t\t},\n\t\t\t\t\tsetModelFallbackEnabled: async (enabled) => {\n\t\t\t\t\t\tthis.settingsManager.setModelFallbackEnabled(enabled);\n\t\t\t\t\t\tawait this.settingsManager.flush();\n\t\t\t\t\t},\n\t\t\t\t\tsetFallbackRevertPolicy: async (policy) => {\n\t\t\t\t\t\tthis.settingsManager.setFallbackRevertPolicy(policy);\n\t\t\t\t\t\tawait this.settingsManager.flush();\n\t\t\t\t\t},\n\t\t\t\t\treload: () => this.settingsManager.reload(),\n\t\t\t\t\tgetFallbackStatus: () => {\n\t\t\t\t\t\tconst active = this._retryFallback.activeState;\n\t\t\t\t\t\tif (!active) return undefined;\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tactive: true,\n\t\t\t\t\t\t\tcurrentModel: this.model ? `${this.model.provider}/${this.model.id}` : undefined,\n\t\t\t\t\t\t\toriginalSelector: active.originalSelector,\n\t\t\t\t\t\t\tpinned: active.pinned,\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcompact: (options) => {\n\t\t\t\t\tconst admission = this._claimPendingCompactionAdmission();\n\t\t\t\t\tconst controller = admission.controller;\n\t\t\t\t\tconst requestId = randomUUID();\n\t\t\t\t\tvoid (async () => {\n\t\t\t\t\t\tlet outcome: \"completed\" | \"failed\" | \"aborted\" = \"failed\";\n\t\t\t\t\t\tlet compactionCompleted = false;\n\t\t\t\t\t\tlet disconnected = false;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this._abortActiveAgentAndRetry(\"system\");\n\t\t\t\t\t\t\tthis._disconnectFromAgent();\n\t\t\t\t\t\t\tdisconnected = true;\n\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\ttype: \"compaction_start\",\n\t\t\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst execution = await this._executeCompaction({\n\t\t\t\t\t\t\t\tcontroller,\n\t\t\t\t\t\t\t\towner: \"compaction\",\n\t\t\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (execution.accepted) {\n\t\t\t\t\t\t\t\toutcome = \"completed\";\n\t\t\t\t\t\t\t\tcompactionCompleted = true;\n\t\t\t\t\t\t\t\toptions?.onComplete?.(execution.result);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutcome = \"failed\";\n\t\t\t\t\t\t\t\toptions?.onError?.(new CompactionRejectedError(execution.rejectionCause));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\toutcome = isCompactionExecutionAborted(error) ? \"aborted\" : \"failed\";\n\t\t\t\t\t\t\tif (!compactionExecutionOwnsTerminalTransition(error)) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\tconst aborted = isCompactionExecutionAborted(error);\n\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\ttype: \"compaction_end\",\n\t\t\t\t\t\t\t\treason: \"extension\",\n\t\t\t\t\t\t\t\tresult: undefined,\n\t\t\t\t\t\t\t\taborted,\n\t\t\t\t\t\t\t\twillRetry: false,\n\t\t\t\t\t\t\t\trequestId,\n\t\t\t\t\t\t\t\terrorMessage: aborted ? undefined : `Compaction failed: ${message}`,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst err = error instanceof Error ? error : new Error(String(error));\n\t\t\t\t\t\t\toptions?.onError?.(err);\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tthis._compactionAbortController === controller &&\n\t\t\t\t\t\t\t\tthis._compactionLifecycle.state.status !== \"running\"\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis._compactionAbortController = undefined;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._releasePendingCompactionAdmission(admission, outcome);\n\t\t\t\t\t\t\tif (disconnected && !this.isCompacting) this._reconnectToAgent();\n\t\t\t\t\t\t\t// A throwing onComplete consumer overwrites outcome in the catch\n\t\t\t\t\t\t\t// block, so recovery keys off whether compaction itself succeeded.\n\t\t\t\t\t\t\tif (compactionCompleted) this._resumeQueuedMessagesAfterCompaction();\n\t\t\t\t\t\t}\n\t\t\t\t\t})();\n\t\t\t\t},\n\t\t\t\tbeginCompaction: (options) => this._beginExtensionCompactionFeedback(options.reason),\n\t\t\t\tupdateCompaction: (options) => this._updateExtensionCompactionFeedback(options),\n\t\t\t\tendCompaction: (options) => this._endExtensionCompactionFeedback(options),\n\t\t\t\tgetMessageRevision: () => this.getMessageRevision(),\n\t\t\t\tapplyCompaction: (precomputed, options) => this.applyCompaction(precomputed, options),\n\t\t\t\tgetSystemPrompt: () => this.systemPrompt,\n\t\t\t\tgetLoadedHookSources: () =>\n\t\t\t\t\tthis._resourceLoader.getLoadedHookSources?.() ?? {\n\t\t\t\t\t\tagentDir: this._cwd,\n\t\t\t\t\t\tcwd: this._cwd,\n\t\t\t\t\t\tglobalHookSourcePaths: [],\n\t\t\t\t\t\tglobalHooksPath: `${this._cwd}/hooks.json`,\n\t\t\t\t\t\tpreSessionHookSourcePaths: [],\n\t\t\t\t\t\tprojectHookSourcePaths: [],\n\t\t\t\t\t\tprojectHooksPath: `${this._cwd}/.senpi/hooks.json`,\n\t\t\t\t\t\truntimeHookSourcePaths: [],\n\t\t\t\t\t},\n\t\t\t\tgetSystemPromptOptions: () => this._baseSystemPromptOptions,\n\t\t\t},\n\t\t\t{\n\t\t\t\tregisterProvider: (name, config) => {\n\t\t\t\t\tthis._modelRuntime.registerProvider(name, config);\n\t\t\t\t\tthis._refreshCurrentModelFromRegistry();\n\t\t\t\t},\n\t\t\t\tregisterNativeProvider: (provider) => {\n\t\t\t\t\tthis._modelRuntime.registerNativeProvider(provider);\n\t\t\t\t\tthis._refreshCurrentModelFromRegistry();\n\t\t\t\t},\n\t\t\t\tunregisterProvider: (name) => {\n\t\t\t\t\tthis._modelRuntime.unregisterProvider(name);\n\t\t\t\t\tthis._refreshCurrentModelFromRegistry();\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t}\n\n\t/** Fallback-chain configuration warnings calculated when this session started. */\n\tget fallbackValidationWarnings(): readonly string[] {\n\t\treturn this._fallbackValidationWarnings;\n\t}\n\n\tprivate _isBuiltinExtensionPath(path: string): boolean {\n\t\treturn path.startsWith(\"<builtin:\") || /[\\\\/]senpi-codemode[\\\\/]/u.test(path);\n\t}\n\n\tprivate _enforceConfiguredDefaultTools(): void {\n\t\tconst defaultToolNames = this._defaultToolNames;\n\t\tif (defaultToolNames === undefined) return;\n\t\tthis.setActiveToolsByName(\n\t\t\tthis.getActiveToolNames().filter((name) => {\n\t\t\t\tif (defaultToolNames.has(name)) return true;\n\t\t\t\tconst entry = this._toolDefinitions.get(name);\n\t\t\t\treturn (\n\t\t\t\t\tentry !== undefined &&\n\t\t\t\t\t!this._isBuiltinExtensionPath(entry.sourceInfo.path) &&\n\t\t\t\t\tentry.sourceInfo.source !== \"builtin\"\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate _refreshToolRegistry(options?: {\n\t\tactiveToolNames?: string[];\n\t\tincludeAllExtensionTools?: boolean;\n\t\tpreviousActiveToolRegistrationIds?: ReadonlyMap<string, string>;\n\t}): void {\n\t\tconst previousRegistryNames = new Set(this._toolRegistry.keys());\n\t\tconst previousActiveToolNames = this.getActiveToolNames();\n\t\tconst allowedToolNames = this._allowedToolNames;\n\t\tconst excludedToolNames = this._excludedToolNames;\n\t\tconst isAllowedTool = (name: string): boolean =>\n\t\t\t(!allowedToolNames || allowedToolNames.has(name)) && !excludedToolNames?.has(name);\n\n\t\tconst registeredTools = this._extensionRunner.getAllRegisteredTools();\n\t\tconst defaultToolNames = this._defaultToolNames;\n\t\tconst isConfiguredBuiltinTool = (tool: (typeof registeredTools)[number]): boolean =>\n\t\t\t(tool.sourceInfo.source !== \"builtin\" && !this._isBuiltinExtensionPath(tool.sourceInfo.path)) ||\n\t\t\tdefaultToolNames === undefined ||\n\t\t\tdefaultToolNames.has(tool.definition.name);\n\t\tconst allCustomTools = [\n\t\t\t...registeredTools.filter(isConfiguredBuiltinTool),\n\t\t\t...this._customTools.map((definition) => ({\n\t\t\t\tdefinition,\n\t\t\t\tsourceInfo: createSyntheticSourceInfo(`<sdk:${definition.name}>`, {\n\t\t\t\t\tsource: \"sdk\",\n\t\t\t\t}),\n\t\t\t})),\n\t\t].filter((tool) => isAllowedTool(tool.definition.name));\n\t\t// Withheld tools stay in _baseToolDefinitions (and therefore in _toolRegistry, which\n\t\t// getRegisteredTool serves to the Cursor exec bridge) but are dropped from the model-facing\n\t\t// definitions so they never reach the prompt. See temporarilyDisabledToolNames.\n\t\tconst definitionRegistry = new Map<string, ToolDefinitionEntry>(\n\t\t\tArray.from(this._baseToolDefinitions.entries())\n\t\t\t\t.filter(([name]) => isAllowedTool(name) && !temporarilyDisabledToolNames.has(name))\n\t\t\t\t.map(([name, definition]) => [\n\t\t\t\t\tname,\n\t\t\t\t\t{\n\t\t\t\t\t\tdefinition,\n\t\t\t\t\t\tsourceInfo: createSyntheticSourceInfo(`<builtin:${name}>`, {\n\t\t\t\t\t\t\tsource: \"builtin\",\n\t\t\t\t\t\t}),\n\t\t\t\t\t},\n\t\t\t\t]),\n\t\t);\n\t\tfor (const tool of allCustomTools) {\n\t\t\tdefinitionRegistry.set(tool.definition.name, {\n\t\t\t\tdefinition: tool.definition,\n\t\t\t\tsourceInfo: tool.sourceInfo,\n\t\t\t});\n\t\t}\n\t\tthis._toolDefinitions = definitionRegistry;\n\t\tthis._toolPromptSnippets = new Map(\n\t\t\tArray.from(definitionRegistry.values())\n\t\t\t\t.map(({ definition }) => {\n\t\t\t\t\tconst snippet = this._normalizePromptSnippet(definition.promptSnippet);\n\t\t\t\t\treturn snippet ? ([definition.name, snippet] as const) : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((entry): entry is readonly [string, string] => entry !== undefined),\n\t\t);\n\t\tthis._toolPromptGuidelines = new Map(\n\t\t\tArray.from(definitionRegistry.values())\n\t\t\t\t.map(({ definition }) => {\n\t\t\t\t\tconst guidelines = this._normalizePromptGuidelines(definition.promptGuidelines);\n\t\t\t\t\treturn guidelines.length > 0 ? ([definition.name, guidelines] as const) : undefined;\n\t\t\t\t})\n\t\t\t\t.filter((entry): entry is readonly [string, string[]] => entry !== undefined),\n\t\t);\n\t\tconst runner = this._extensionRunner;\n\t\tconst wrappedExtensionTools = wrapRegisteredTools(allCustomTools, runner);\n\t\tconst wrappedBuiltInTools = wrapRegisteredTools(\n\t\t\tArray.from(this._baseToolDefinitions.values())\n\t\t\t\t.filter((definition) => isAllowedTool(definition.name))\n\t\t\t\t.map((definition) => ({\n\t\t\t\t\tdefinition,\n\t\t\t\t\tsourceInfo: createSyntheticSourceInfo(`<builtin:${definition.name}>`, { source: \"builtin\" }),\n\t\t\t\t})),\n\t\t\trunner,\n\t\t);\n\n\t\tconst toolRegistry = new Map(wrappedBuiltInTools.map((tool) => [tool.name, tool]));\n\t\tfor (const tool of wrappedExtensionTools as AgentTool[]) {\n\t\t\ttoolRegistry.set(tool.name, tool);\n\t\t}\n\t\tthis._toolRegistry = toolRegistry;\n\t\tthis._publishEvalOnlyToolHints();\n\t\tconst isDirectlyExposed = (name: string): boolean => {\n\t\t\tconst entry = this._toolDefinitions.get(name);\n\t\t\treturn entry !== undefined && normalizeToolExposure(entry.definition).exposure === \"direct\";\n\t\t};\n\n\t\t// A withheld tool is dropped from the DEFAULT selection only. An explicit activeToolNames\n\t\t// request names the tool deliberately, and callers that do so (tests, SDK embedders,\n\t\t// filesystem-policy wiring) still expect it to activate.\n\t\tconst hasExplicitActiveToolNames = options?.activeToolNames !== undefined;\n\t\tconst nextActiveToolNames = (\n\t\t\toptions?.activeToolNames\n\t\t\t\t? [...options.activeToolNames]\n\t\t\t\t: [...(this._requestedActiveToolNames ?? previousActiveToolNames)]\n\t\t).filter((name) => {\n\t\t\tif (!isAllowedTool(name)) return false;\n\t\t\tif (!hasExplicitActiveToolNames && temporarilyDisabledToolNames.has(name)) return false;\n\t\t\tconst previousRegistrationIds = options?.previousActiveToolRegistrationIds;\n\t\t\tif (!previousRegistrationIds) return true;\n\t\t\tconst current = this._toolDefinitions.get(name);\n\t\t\treturn (\n\t\t\t\tcurrent !== undefined &&\n\t\t\t\tpreviousRegistrationIds.get(name) === deriveExtensionRegistrationId(current.sourceInfo, name)\n\t\t\t);\n\t\t});\n\n\t\tif (allowedToolNames) {\n\t\t\tfor (const toolName of this._toolRegistry.keys()) {\n\t\t\t\tif (allowedToolNames.has(toolName)) {\n\t\t\t\t\tnextActiveToolNames.push(toolName);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (options?.includeAllExtensionTools) {\n\t\t\tfor (const tool of wrappedExtensionTools) {\n\t\t\t\tif (isDirectlyExposed(tool.name)) nextActiveToolNames.push(tool.name);\n\t\t\t}\n\t\t} else if (!options?.activeToolNames) {\n\t\t\tfor (const toolName of this._toolRegistry.keys()) {\n\t\t\t\tif (!previousRegistryNames.has(toolName) && isDirectlyExposed(toolName)) {\n\t\t\t\t\tnextActiveToolNames.push(toolName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.setActiveToolsByName([...new Set(nextActiveToolNames)]);\n\t}\n\n\tprivate _buildRuntime(options: {\n\t\tactiveToolNames?: string[];\n\t\tflagValues?: Map<string, boolean | string>;\n\t\tincludeAllExtensionTools?: boolean;\n\t\tpreviousActiveToolRegistrationIds?: ReadonlyMap<string, string>;\n\t}): void {\n\t\tthis._delegatedCompactionKey = undefined;\n\t\tconst autoResizeImages = this.settingsManager.getImageAutoResize();\n\t\tconst shellCommandPrefix = this.settingsManager.getShellCommandPrefix();\n\t\tconst shellPath = this.settingsManager.getShellPath();\n\t\tconst extensionsResult = this._resourceLoader.getExtensions();\n\t\tconst filesystemPolicy = composeFilesystemPolicies(\n\t\t\textensionsResult.extensions.flatMap((extension) => extension.filesystemPolicies ?? []),\n\t\t);\n\t\tconst baseToolDefinitions = this._baseToolsOverride\n\t\t\t? Object.fromEntries(\n\t\t\t\t\tObject.entries(this._baseToolsOverride).map(([name, tool]) => [\n\t\t\t\t\t\tname,\n\t\t\t\t\t\tcreateToolDefinitionFromAgentTool(tool),\n\t\t\t\t\t]),\n\t\t\t\t)\n\t\t\t: createAllToolDefinitions(this._cwd, {\n\t\t\t\t\tread: { autoResizeImages, filesystemPolicy },\n\t\t\t\t\tbash: { commandPrefix: shellCommandPrefix, shellPath },\n\t\t\t\t\twrite: { filesystemPolicy },\n\t\t\t\t\tedit: { filesystemPolicy },\n\t\t\t\t\tgrep: { filesystemPolicy },\n\t\t\t\t\tfind: { filesystemPolicy },\n\t\t\t\t\tls: { filesystemPolicy },\n\t\t\t\t});\n\n\t\tthis._baseToolDefinitions = new Map(\n\t\t\tObject.entries(baseToolDefinitions).map(([name, tool]) => [name, tool as ToolDefinition]),\n\t\t);\n\t\tif (options.flagValues) {\n\t\t\tfor (const [name, value] of options.flagValues) {\n\t\t\t\textensionsResult.runtime.flagValues.set(name, value);\n\t\t\t}\n\t\t}\n\n\t\tthis._extensionRunner = new ExtensionRunner(\n\t\t\textensionsResult.extensions,\n\t\t\textensionsResult.runtime,\n\t\t\tthis._cwd,\n\t\t\tthis.sessionManager,\n\t\t\tthis._modelRegistry,\n\t\t\textensionsResult.eventBus,\n\t\t);\n\t\tif (this._extensionRunnerRef) {\n\t\t\tthis._extensionRunnerRef.current = this._extensionRunner;\n\t\t}\n\t\tthis._bindExtensionCore(this._extensionRunner);\n\t\tthis._applyExtensionBindings(this._extensionRunner);\n\n\t\tconst defaultActiveToolNames = this._baseToolsOverride\n\t\t\t? Object.keys(this._baseToolsOverride)\n\t\t\t: [\"read\", \"bash\", \"edit\", \"write\"];\n\t\tconst baseActiveToolNames = options.activeToolNames ?? defaultActiveToolNames;\n\t\tthis._refreshToolRegistry({\n\t\t\tactiveToolNames: baseActiveToolNames,\n\t\t\tincludeAllExtensionTools: options.includeAllExtensionTools,\n\t\t\tpreviousActiveToolRegistrationIds: options.previousActiveToolRegistrationIds,\n\t\t});\n\t}\n\n\tasync reload(options?: { beforeSessionStart?: () => void | Promise<void> }): Promise<{\n\t\tcancelled: boolean;\n\t\treason?: string;\n\t}> {\n\t\tconst veto = await this.checkReloadVeto();\n\t\tif (veto.cancelled) {\n\t\t\treturn veto;\n\t\t}\n\t\tresetTimings(\"reload\");\n\t\tconst oldExtensionRunner = this._extensionRunner;\n\t\tconst oldExtensionIdentities = oldExtensionRunner.getExtensionIdentities();\n\t\tconst previousFlagValues = oldExtensionRunner.getFlagValues();\n\t\tconst previousActiveToolRegistrationIds = new Map<string, string>();\n\t\t// Cover withheld eval-only tools too: the rebuild drops any seeded name missing from this\n\t\t// map, which would strand eval-only tools when the policy disarms during this reload.\n\t\tfor (const name of this._requestedActiveToolNames ?? this.getActiveToolNames()) {\n\t\t\tconst entry = this._toolDefinitions.get(name);\n\t\t\tif (entry) previousActiveToolRegistrationIds.set(name, deriveExtensionRegistrationId(entry.sourceInfo, name));\n\t\t}\n\t\tawait emitSessionShutdownEvent(oldExtensionRunner, {\n\t\t\ttype: \"session_shutdown\",\n\t\t\treason: \"reload\",\n\t\t});\n\t\ttime(\"shutdown\", \"reload\");\n\t\tawait this.settingsManager.reload();\n\t\tthis._delegatedCompactionKey = undefined;\n\t\t// Capture the unfiltered request BEFORE the rebuild reassigns it, so a policy that\n\t\t// disarms during this reload can still restore its withheld eval-only tools.\n\t\tconst requestedActiveToolNamesBeforeRebuild = [...(this._requestedActiveToolNames ?? this.getActiveToolNames())];\n\t\t// Re-resolve the fixed policy (or SDK override) so reload cannot regress it.\n\t\tthis._evalOnlyToolNames = this._resolveEvalOnlyToolNames();\n\t\tthis.syncQueueModesFromSettings();\n\t\tresetApiProviders();\n\t\ttime(\"settings\", \"reload\");\n\t\tawait this._modelRuntime.reloadConfig();\n\t\t// Resolving both scopes from the completed refresh avoids two extra availability\n\t\t// scans, but only a snapshot from a SUCCESSFUL refresh may be trusted: refresh()\n\t\t// swallows availability errors, so a failed scan must fall back to the runtime and\n\t\t// keep the previous refresh-and-surface-the-error behavior.\n\t\tconst refreshedModels: AvailableModelsSource = this._modelRuntime.hasFreshAvailabilitySnapshot()\n\t\t\t? {\n\t\t\t\t\tgetAvailable: async () => this._modelRuntime.getAvailableSnapshot(),\n\t\t\t\t}\n\t\t\t: this._modelRuntime;\n\t\tthis.setScopedModels(\n\t\t\tawait resolveModelScope(\n\t\t\t\tgetModelNarrowingPatterns({\n\t\t\t\t\tlegacyEnabledPatterns: this.settingsManager.getEnabledModels(),\n\t\t\t\t}),\n\t\t\t\trefreshedModels,\n\t\t\t),\n\t\t);\n\t\tthis.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels() ?? [], refreshedModels));\n\t\ttime(\"models\", \"reload\");\n\t\tawait this._resourceLoader.reload({\n\t\t\tsettingsAlreadyReloadedFor: this.settingsManager,\n\t\t});\n\t\ttime(\"resources\", \"reload\");\n\t\ttry {\n\t\t\tthis._buildRuntime({\n\t\t\t\tactiveToolNames: requestedActiveToolNamesBeforeRebuild,\n\t\t\t\tflagValues: previousFlagValues,\n\t\t\t\tincludeAllExtensionTools: true,\n\t\t\t\tpreviousActiveToolRegistrationIds,\n\t\t\t});\n\t\t} finally {\n\t\t\t// An extension removed by this reload must be told even if the rebuild throws\n\t\t\t// (e.g. _refreshToolRegistry rejecting an extension's tool metadata): the new\n\t\t\t// runner is already installed without it, so nothing else would dispose it.\n\t\t\tconst newExtensionResolvedPaths = new Set(\n\t\t\t\tthis._extensionRunner.getExtensionIdentities().map((extension) => extension.resolvedPath),\n\t\t\t);\n\t\t\tconst removed = oldExtensionIdentities.filter(\n\t\t\t\t(extension) => !newExtensionResolvedPaths.has(extension.resolvedPath),\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tif (removed.length > 0) {\n\t\t\t\t\tawait oldExtensionRunner.emit({\n\t\t\t\t\t\ttype: \"session_extensions_removed\",\n\t\t\t\t\t\treason: \"reload\",\n\t\t\t\t\t\tremoved,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\toldExtensionRunner.invalidate(\"stale extension generation after reload\");\n\t\t\t}\n\t\t\ttime(\"runtime\", \"reload\");\n\t\t}\n\n\t\tconst hasBindings =\n\t\t\tthis._extensionUIContext ||\n\t\t\tthis._extensionCommandContextActions ||\n\t\t\tthis._extensionShutdownHandler ||\n\t\t\tthis._extensionErrorListener;\n\t\tif (hasBindings) {\n\t\t\tawait options?.beforeSessionStart?.();\n\t\t\tthis.syncPromptCacheSafeWaitEnv();\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_start\",\n\t\t\t\treason: \"reload\",\n\t\t\t});\n\t\t\tawait this.extendResourcesFromExtensions(\"reload\");\n\t\t}\n\t\ttime(\"lifecycle\", \"reload\");\n\t\treturn { cancelled: false };\n\t}\n\n\t/**\n\t * Ask extensions whether a full session reload may proceed by emitting the\n\t * cancellable `session_before_reload` event. `reload()` always consults this\n\t * gate itself, so a cancelling extension prevents the teardown on every\n\t * reload path; interactive hosts may additionally pre-check it to warn\n\t * without starting their reload UI.\n\t */\n\tasync checkReloadVeto(): Promise<{ cancelled: boolean; reason?: string }> {\n\t\tif (!this._extensionRunner.hasHandlers(\"session_before_reload\")) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\t\tconst result = await this._extensionRunner.emit({\n\t\t\ttype: \"session_before_reload\",\n\t\t});\n\t\tif (result?.cancel !== true) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\t\treturn result.reason === undefined ? { cancelled: true } : { cancelled: true, reason: result.reason };\n\t}\n\n\t// =========================================================================\n\t// Auto-Retry\n\t// =========================================================================\n\n\t/**\n\t * Check if an error is retryable (overloaded, rate limit, server errors).\n\t * Context overflow errors are NOT retryable (handled by compaction instead).\n\t */\n\tprivate _isRetryableError(message: AssistantMessage): boolean {\n\t\t// Providers mark post-delta failures to prevent replaying visible text/tool calls.\n\t\tif (message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX)) return false;\n\n\t\t// Context overflow is handled by compaction, not retry.\n\t\tif (isContextOverflow(message, this.model?.contextWindow ?? 0)) return false;\n\n\t\tif (isClassifierRefusal(message)) return true;\n\t\tif (!message.errorMessage) return false;\n\n\t\tif (message.stopReason === \"aborted\") {\n\t\t\treturn isProviderTimeoutError(message);\n\t\t}\n\n\t\treturn isRetryableAssistantError(message);\n\t}\n\n\tprivate _isCursorPayloadOverflow(message: AssistantMessage): boolean {\n\t\treturn isCursorPayloadResourceExhausted(message, 0);\n\t}\n\n\tprivate _truncateAgentMessagesToLastUserTurn(): boolean {\n\t\tconst messages = this.agent?.state?.messages;\n\t\tif (!Array.isArray(messages) || messages.length === 0) return false;\n\t\tlet lastUser = -1;\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tif (messages[i]?.role === \"user\") {\n\t\t\t\tlastUser = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (lastUser <= 0) return false;\n\t\tthis.agent.state.messages = messages.slice(lastUser);\n\t\treturn true;\n\t}\n\n\tprivate _isHardErrorFallbackEligible(message: AssistantMessage): boolean {\n\t\treturn (\n\t\t\t!message.errorMessage?.startsWith(TURN_RETRY_SUPPRESSION_PREFIX) &&\n\t\t\tmessage.stopReason === \"error\" &&\n\t\t\t!isContextOverflow(message, this.model?.contextWindow ?? 0) &&\n\t\t\t!this._isCursorPayloadOverflow(message) &&\n\t\t\t!isCursorZeroTokenResourceExhausted(message) &&\n\t\t\t!isClassifierRefusal(message) &&\n\t\t\t!message.content.some((content) => content.type === \"toolCall\") &&\n\t\t\tthis._retryFallback.canTryFallback()\n\t\t);\n\t}\n\n\tprivate _getProviderRetryDelayMs(errorMessage: string): number | undefined {\n\t\tconst markerMs = parseRetryAfterMsMarker(errorMessage);\n\t\tif (markerMs !== undefined) return markerMs;\n\t\tconst hintMs = extract429RetryAfterMs({ bodyText: errorMessage });\n\t\treturn hintMs;\n\t}\n\n\t/**\n\t * Retry policy + callbacks shared by compaction and branch-summary summarization calls.\n\t * Uses the same `settings.retry` budget/backoff as agent-turn retries so a single transient\n\t * stream drop no longer fails the whole operation. `source` carries the context\n\t * the TUI needs to render the retry and recreate the underlying indicator.\n\t */\n\tprivate _summarizationRetryCallbacks(\n\t\tsource: { source: \"branchSummary\" } | { source: \"compaction\"; reason: CompactionReason },\n\t): RetryCallbacks {\n\t\treturn {\n\t\t\tonRetryScheduled: (attempt, maxAttempts, delayMs, errorMessage) => {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"summarization_retry_scheduled\",\n\t\t\t\t\tattempt,\n\t\t\t\t\tmaxAttempts,\n\t\t\t\t\tdelayMs,\n\t\t\t\t\terrorMessage,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonRetryAttemptStart: () => {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"summarization_retry_attempt_start\",\n\t\t\t\t\t...source,\n\t\t\t\t});\n\t\t\t},\n\t\t\tonRetryFinished: () => {\n\t\t\t\tthis._emit({ type: \"summarization_retry_finished\" });\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * A 429-class failure with no usable fallback candidate must not fail the\n\t * turn with zero attempts: a provider answering 429 is asking for a retry.\n\t * No-hint and tier2 waits degrade to same-model in-turn retries under the\n\t * normal retry budget (tier2 clamps the hinted wait to the in-turn cap);\n\t * only tier3 hour-plus waits stay terminal, with the requested wait named\n\t * in the final error. Returns the in-turn retry delay, or undefined after\n\t * emitting the terminal auto_retry_end.\n\t */\n\tprivate _degradeRateLimitedWithoutFallback(\n\t\ttier: HintTier,\n\t\thintMs: number | undefined,\n\t\tmessage: AssistantMessage,\n\t\terrorMessage: string,\n\t): number | undefined {\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\t// Budget checks use the resolved profile (same value as settings.maxRetries\n\t\t// for providers without a declared profile).\n\t\tconst turnMaxRetries = this._resolveRetryProfile().turn.maxRetries;\n\t\tconst hintSettings = this.settingsManager.getHintPolicySettings();\n\t\tconst finishTurn = (attempt: number, finalError: string | undefined) => {\n\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\tif (exhaustedChainKey) {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\tsuccess: false,\n\t\t\t\tattempt,\n\t\t\t\tfinalError,\n\t\t\t});\n\t\t\tthis._retryAttempt = 0;\n\t\t\tthis._resetHintTierState();\n\t\t\tthis._resolveRetry();\n\t\t};\n\t\tconst degraded = degradeWithoutFallback(\n\t\t\ttier,\n\t\t\thintMs,\n\t\t\tthis._retryAttempt + 1,\n\t\t\tsettings.baseDelayMs,\n\t\t\thintSettings.hintedWaitCapMs,\n\t\t);\n\t\tif (degraded.kind === \"fail\") {\n\t\t\tconst waitSeconds = Math.ceil(degraded.hintMs / 1000);\n\t\t\tfinishTurn(\n\t\t\t\tthis._retryAttempt,\n\t\t\t\t`Provider requested a ${waitSeconds}s wait before retrying and no usable fallback model is available. ${message.errorMessage ?? \"\"}`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\t\tthis._retryAttempt++;\n\t\tif (this._retryAttempt > turnMaxRetries) {\n\t\t\tfinishTurn(this._retryAttempt - 1, message.errorMessage);\n\t\t\treturn undefined;\n\t\t}\n\t\treturn degraded.delayMs;\n\t}\n\n\t/**\n\t * Handle retryable errors with exponential backoff.\n\t * @returns whether retry continuation started, was blocked by compaction, or was not handled\n\t */\n\tprivate async _handleRetryableError(\n\t\tmessage: AssistantMessage,\n\t\toptions: { hardErrorFallback?: boolean; sameModelRemint?: boolean } = {},\n\t): Promise<\"continued\" | \"blocked\" | \"not-handled\" | \"cancelled\"> {\n\t\tconst settings = this.settingsManager.getRetrySettings();\n\t\tif (!settings.enabled) {\n\t\t\tthis._resolveRetry();\n\t\t\treturn \"not-handled\";\n\t\t}\n\n\t\t// Resolve the effective retry profile for the current provider.\n\t\t// Profile-driven behaviour only diverges when a provider declares one;\n\t\t// the senpi-default profile preserves today's tier routing exactly.\n\t\tconst retryProfile = this._resolveRetryProfile();\n\n\t\t// Retry promise is created synchronously in _handleAgentEvent for agent_end.\n\t\t// Keep a defensive fallback here in case a future refactor bypasses that path.\n\t\tif (!this._retryPromise) {\n\t\t\tthis._retryPromise = new Promise((resolve) => {\n\t\t\t\tthis._retryResolve = resolve;\n\t\t\t});\n\t\t}\n\n\t\tconst errorMessage = message.errorMessage || \"Unknown error\";\n\t\tconst isRefusal = isClassifierRefusal(message);\n\t\tconst hardErrorFallback = options.hardErrorFallback === true;\n\t\tconst sameModelRemint = options.sameModelRemint === true;\n\t\tlet switchedFallback = false;\n\t\tlet is429TierRouted = false;\n\t\tlet hintTierDelayMs: number | undefined;\n\t\tif (sameModelRemint) {\n\t\t\tthis._retryAttempt++;\n\t\t\tif (this._retryAttempt > retryProfile.turn.maxRetries) {\n\t\t\t\tif (this._retryAttempt > 1) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t} else if (hardErrorFallback) {\n\t\t\t// A non-retryable provider failure must never replay on the same model.\n\t\t\t// Billing-class failures never recover on this account, so the fallback\n\t\t\t// switch pins as the session model instead of reverting after the cooldown.\n\t\t\tconst reason = isBillingErrorMessage(errorMessage) ? \"billing\" : \"hard-error\";\n\t\t\tswitchedFallback = await this._retryFallback.tryFallback(reason, {\n\t\t\t\terrorMessage,\n\t\t\t});\n\t\t\tif (!switchedFallback) {\n\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t\t// The fallback starts fresh; the failed model's transient attempts do not carry over.\n\t\t\tthis._retryAttempt = 1;\n\t\t} else if (isRefusal) {\n\t\t\t// Refusals are only retried through a new chain candidate. They never use\n\t\t\t// same-model retries or the transient over-budget fallback escape hatch.\n\t\t\tif (this._retryAttempt + 1 > retryProfile.turn.maxRetries) {\n\t\t\t\tif (this._retryAttempt > 0) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"refusal\", {});\n\t\t\tif (!switchedFallback) {\n\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif (this._retryAttempt > 0) {\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t\tthis._retryAttempt++;\n\t\t} else {\n\t\t\t// A provider-stream stall is an ordinary transient failure: it consumes\n\t\t\t// the same bounded same-model budget (the resolved profile's turn\n\t\t\t// maxRetries) as every other retryable class and escalates to the fallback chain only when\n\t\t\t// that budget is exhausted. It is excluded from 429-class tier routing\n\t\t\t// because a stall carries no rate-limit markers or retry-after hint.\n\t\t\tconst stallError = isProviderStreamStallError(message);\n\t\t\t// 429-class detection: retryable AND message carries rate-limit markers.\n\t\t\t// Every same-model wait derived below is floored by the exponential schedule\n\t\t\t// inside the pure hint policy, so repeated tiny retry-after hints cannot pin\n\t\t\t// the cadence at a few milliseconds. Do not recompute that floor here.\n\t\t\tconst is429Class =\n\t\t\t\t!stallError &&\n\t\t\t\t/rate.?limit|(?:^429(?=\\s+\\{)|(?:\\bHTTP\\/1\\.[01]\\s+|\\bHTTP\\s+|\\bstatus(?:\\s+code)?\\s+|\\berror\\s+|\\bcode\\s+)429\\b)|too many requests|resource.?exhausted/i.test(\n\t\t\t\t\terrorMessage,\n\t\t\t\t);\n\t\t\t// Profile-driven routing: \"after-turn-budget\" (Kimi) keeps 429s on the\n\t\t\t// ordinary same-model budget; \"tiered\" (senpi default) uses hint tiers.\n\t\t\tif (is429Class && retryProfile.fallback.rateLimited === \"after-turn-budget\") {\n\t\t\t\t// Kimi profile: 429s consume the same-model budget like any transient.\n\t\t\t\t// Mark tier-routed so the generic non-429 path below does not double-count.\n\t\t\t\tis429TierRouted = true;\n\t\t\t\tthis._retryAttempt++;\n\t\t\t\tif (this._retryAttempt > retryProfile.turn.maxRetries) {\n\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\tretryAfterMs: this._getProviderRetryDelayMs(errorMessage),\n\t\t\t\t\t});\n\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t\t\treturn \"not-handled\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (is429Class) {\n\t\t\t\tconst hintMs = this._getProviderRetryDelayMs(errorMessage);\n\t\t\t\tconst hintSettings = this.settingsManager.getHintPolicySettings();\n\t\t\t\tconst tier = classifyRateLimitedWait(hintMs, hintSettings);\n\t\t\t\tis429TierRouted = true;\n\t\t\t\tif (tier === \"no-hint-fast-fallback\") {\n\t\t\t\t\t// Fall back immediately when a candidate exists; otherwise degrade\n\t\t\t\t\t// to same-model in-turn retries instead of failing the turn.\n\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", { errorMessage });\n\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst degradedDelayMs = this._degradeRateLimitedWithoutFallback(tier, hintMs, message, errorMessage);\n\t\t\t\t\t\tif (degradedDelayMs === undefined) return \"not-handled\";\n\t\t\t\t\t\thintTierDelayMs = degradedDelayMs;\n\t\t\t\t\t}\n\t\t\t\t} else if (tier === \"tier1-in-turn\") {\n\t\t\t\t\tthis._retryAttempt++;\n\t\t\t\t\tif (this._retryAttempt > retryProfile.turn.maxRetries) {\n\t\t\t\t\t\t// Budget exhausted within tier1; fall back.\n\t\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\tretryAfterMs: this._getProviderRetryDelayMs(errorMessage),\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t\t\t\treturn \"not-handled\";\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst inTurnResult = nextInTurnDelayMs(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tprobePhase: this._probePhase,\n\t\t\t\t\t\t\t\thintDeadlineMs: this._hintDeadlineMs,\n\t\t\t\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\t\t\t\tcumulativeHintedWaitMs: this._cumulativeHintedWaitMs,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\thintMs,\n\t\t\t\t\t\t\tsettings.baseDelayMs,\n\t\t\t\t\t\t\thintSettings.hintedWaitCapMs,\n\t\t\t\t\t\t\tDate.now(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis._probePhase = inTurnResult.probePhase;\n\t\t\t\t\t\tthis._hintDeadlineMs = inTurnResult.hintDeadlineMs;\n\t\t\t\t\t\tthis._cumulativeHintedWaitMs = inTurnResult.cumulativeHintedWaitMs;\n\t\t\t\t\t\tif (inTurnResult.demoteToProbeBack) {\n\t\t\t\t\t\t\t// Cumulative hinted wait exceeded cap; demote to tier2 fallback path.\n\t\t\t\t\t\t\tconst remainingHintMs = Math.max(0, (this._hintDeadlineMs ?? Date.now()) - Date.now());\n\t\t\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\t\t\tretryAfterMs: remainingHintMs,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\t\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t\t\t\t\treturn \"not-handled\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thintTierDelayMs = inTurnResult.delayMs;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// tier2-fallback-probe-back or tier3-fallback-only: immediate fallback.\n\t\t\t\t\tconst remainingHintMs = hintMs ?? 0;\n\t\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\t\terrorMessage,\n\t\t\t\t\t\tretryAfterMs: remainingHintMs,\n\t\t\t\t\t});\n\t\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t\t\tif (tier === \"tier2-fallback-probe-back\") {\n\t\t\t\t\t\t\tconst selector = this._retryFallback.activeState?.originalSelector ?? \"\";\n\t\t\t\t\t\t\tthis._armProbeBackForDemotedSelector(selector, remainingHintMs);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst degradedDelayMs = this._degradeRateLimitedWithoutFallback(tier, hintMs, message, errorMessage);\n\t\t\t\t\t\tif (degradedDelayMs === undefined) return \"not-handled\";\n\t\t\t\t\t\thintTierDelayMs = degradedDelayMs;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!is429TierRouted) {\n\t\t\t\tthis._retryAttempt++;\n\t\t\t}\n\t\t\tif (!is429TierRouted && this._retryAttempt > retryProfile.turn.maxRetries) {\n\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tretryAfterMs: this._getProviderRetryDelayMs(errorMessage),\n\t\t\t\t});\n\t\t\t\tif (switchedFallback) {\n\t\t\t\t\t// The new model receives a fresh retry budget; the failed model does not.\n\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t} else {\n\t\t\t\t\tconst exhaustedChainKey = this._retryFallback.exhaustedChainKey;\n\t\t\t\t\tif (exhaustedChainKey) {\n\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\ttype: \"retry_fallback_exhausted\",\n\t\t\t\t\t\t\tchainKey: exhaustedChainKey,\n\t\t\t\t\t\t\tlastError: errorMessage,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tthis._emit({\n\t\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tattempt: this._retryAttempt - 1,\n\t\t\t\t\t\tfinalError: message.errorMessage,\n\t\t\t\t\t});\n\t\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\t\tthis._resetHintTierState();\n\t\t\t\t\tthis._resolveRetry();\n\t\t\t\t\treturn \"not-handled\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst providerDelayMs = isRefusal || hardErrorFallback ? undefined : this._getProviderRetryDelayMs(errorMessage);\n\t\tconst maxRetryDelayMs = this.settingsManager.getProviderRetrySettings().maxRetryDelayMs;\n\t\t// Profile ceiling null (Kimi) bypasses the over-ceiling error path entirely.\n\t\tconst profileCeiling =\n\t\t\tretryProfile.turn.serverHint.mode === \"override\"\n\t\t\t\t? retryProfile.turn.serverHint.ceiling.maxDelayMs\n\t\t\t\t: maxRetryDelayMs;\n\t\tconst effectiveMaxRetryDelayMs = profileCeiling ?? Number.MAX_SAFE_INTEGER;\n\t\t// For 429-class failures the tier routing replaces the over-budget gate.\n\t\tif (!is429TierRouted && providerDelayMs !== undefined && providerDelayMs > effectiveMaxRetryDelayMs) {\n\t\t\t// A wait this long means the model is unavailable rather than busy, so the\n\t\t\t// configured chain beats failing the turn. The switch is gated: the over-budget\n\t\t\t// branch above may have already switched on this same error, and hopping again\n\t\t\t// here would skip that candidate's own retry budget.\n\t\t\tif (!switchedFallback) {\n\t\t\t\tswitchedFallback = await this._retryFallback.tryFallback(\"transient\", {\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tretryAfterMs: providerDelayMs,\n\t\t\t\t});\n\t\t\t\tif (switchedFallback) {\n\t\t\t\t\tthis._retryAttempt = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!switchedFallback) {\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tattempt: this._retryAttempt,\n\t\t\t\t\tfinalError: `Provider requested retry delay ${providerDelayMs}ms, exceeding configured maximum ${maxRetryDelayMs}ms`,\n\t\t\t\t});\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"not-handled\";\n\t\t\t}\n\t\t}\n\n\t\t// Transient failures stay on the same model until the retry budget is spent;\n\t\t// only the over-budget branch above switches the chain. Both branches that can\n\t\t// reach this point with a fallback already applied (hard-error, refusal) set\n\t\t// switchedFallback first and force providerDelayMs undefined, so no branch may\n\t\t// be reordered to fall through here expecting an implicit switch.\n\t\t// 429-tier delays already carry the exponential floor from nextInTurnDelayMs /\n\t\t// degradeWithoutFallback; the non-tier branch keeps its own exponential fallback.\n\t\tconst nonTierProviderDelayMs = providerDelayMs === 0 ? undefined : providerDelayMs;\n\t\t// Locally computed exponential goes through the profile's backoff policy\n\t\t// (cap + jitter), sampled through the injectable retryRandom seam so tests\n\t\t// stay deterministic; provider-derived hints on the non-429 path remain\n\t\t// authoritative and fallback switches stay exact.\n\t\tconst localExponentialMs = retryBackoffDelayMs(\n\t\t\tretryProfile.turn.backoff,\n\t\t\tthis._retryAttempt,\n\t\t\tthis._retryRandom(),\n\t\t);\n\t\tconst delayMs = switchedFallback\n\t\t\t? 0\n\t\t\t: is429TierRouted\n\t\t\t\t? (hintTierDelayMs ?? providerDelayMs ?? localExponentialMs)\n\t\t\t\t: (nonTierProviderDelayMs ?? localExponentialMs);\n\t\t// Prepare before auto_retry_start so an immediate Esc can cancel the retry sleep.\n\t\tthis._retryAbortController = new AbortController();\n\n\t\tthis._emit({\n\t\t\ttype: \"auto_retry_start\",\n\t\t\tattempt: this._retryAttempt,\n\t\t\tmaxAttempts: retryProfile.turn.maxRetries,\n\t\t\tdelayMs,\n\t\t\terrorMessage,\n\t\t});\n\n\t\t// Remove error message from agent state (keep in session for history)\n\t\tconst messages = this.agent.state.messages;\n\t\tif (messages.length > 0 && messages[messages.length - 1].role === \"assistant\") {\n\t\t\tthis.agent.state.messages = messages.slice(0, -1);\n\t\t\tthis._incrementMessageRevision();\n\t\t}\n\n\t\t// Wait with exponential backoff (abortable)\n\t\ttry {\n\t\t\tawait sleep(delayMs, this._retryAbortController.signal);\n\t\t} catch {\n\t\t\t// Aborted during sleep - emit end event so UI can clean up\n\t\t\tconst attempt = this._retryAttempt;\n\t\t\tthis._retryAttempt = 0;\n\t\t\tthis._resetHintTierState();\n\t\t\tthis._retryAbortController = undefined;\n\t\t\tawait this._emitAgentSettled();\n\t\t\tthis._emit({\n\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\tsuccess: false,\n\t\t\t\tattempt,\n\t\t\t\tfinalError: \"Retry cancelled\",\n\t\t\t});\n\t\t\tthis._resolveRetry();\n\t\t\treturn \"cancelled\";\n\t\t}\n\t\tthis._retryAbortController = undefined;\n\n\t\t// Turn boundary: a suppression that expired during the backoff sleep lets\n\t\t// the retry continue on the restored primary instead of the fallback model.\n\t\tawait this._maybeRestoreFallbackPrimary();\n\n\t\t// Model fallback (or reversion) can select a smaller context window after\n\t\t// the prior retry checks. Revalidate canonical session context immediately\n\t\t// before the continuation so a rejected compaction never admits that model.\n\t\tconst model = this.model;\n\t\tconst compactionSettings = this.settingsManager.getCompactionSettings();\n\t\tconst contextTokens = estimateContextTokens(\n\t\t\tfilterContextExcludedMessages(this.sessionManager.buildSessionContext().messages),\n\t\t).tokens;\n\t\tif (\n\t\t\tcompactionSettings.enabled &&\n\t\t\tmodel &&\n\t\t\tshouldCompact(contextTokens, model.contextWindow, compactionSettings)\n\t\t) {\n\t\t\tconst preRetryCompaction = await this._runPrePromptCompaction(message, true, \"threshold\", true, true);\n\t\t\tif (\n\t\t\t\t!preRetryCompaction &&\n\t\t\t\t!this._isCompactionOnCooldown() &&\n\t\t\t\t!this._isCompactionDelegated() &&\n\t\t\t\t!this._hasSupersedingCompactionClaim()\n\t\t\t) {\n\t\t\t\tconst attempt = this._retryAttempt;\n\t\t\t\tthis._retryAttempt = 0;\n\t\t\t\tthis._resetHintTierState();\n\t\t\t\tthis._emit({\n\t\t\t\t\ttype: \"auto_retry_end\",\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tattempt,\n\t\t\t\t\tfinalError: new RequiredCompactionError().message,\n\t\t\t\t});\n\t\t\t\tthis._resolveRetry();\n\t\t\t\treturn \"blocked\";\n\t\t\t}\n\t\t\tthis._skipNextPostRetryCompactionCheck = true;\n\t\t}\n\n\t\t// Retry through the barrier-owned scheduled-continuation path after the\n\t\t// event handler chain settles. Lifecycle suppression protects queued work\n\t\t// while admission settles; known provider-timeout retries additionally skip\n\t\t// the first queue poll so user input stays deferred until that request proves\n\t\t// responsive. A concurrent low-level Agent prompt is a benign takeover, not\n\t\t// a terminal continuation failure.\n\t\tconst continuation = createProviderTimeoutRetryPlan({\n\t\t\tmessage,\n\t\t\tstreamRetryTimeoutMs: this.settingsManager.getProviderStreamRetryTimeoutMs(),\n\t\t\ttimeoutMs: this.agent.timeoutMs,\n\t\t\tstreamStartTimeoutMs: this.agent.streamStartTimeoutMs,\n\t\t});\n\t\tif (continuation.options.deferQueuedMessages === true) {\n\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.add(this);\n\t\t} else {\n\t\t\tDEFERRED_RETRY_QUEUE_OWNERS.delete(this);\n\t\t}\n\t\tthis.agent.suppressQueuedMessageDrain();\n\t\tthis._scheduleContinuationAfterCurrentEvent(continuation.options, true, continuation.watchdogTimeoutMs);\n\n\t\treturn \"continued\";\n\t}\n\n\t/**\n\t * Cancel in-progress retry.\n\t */\n\tabortRetry(): void {\n\t\tthis._retryAbortController?.abort();\n\t\t// Note: _retryAttempt is reset in the catch block of _autoRetry\n\t\tthis._resolveRetry();\n\t}\n\n\t/**\n\t * Wait for any in-progress retry to complete.\n\t * Returns immediately if no retry is in progress.\n\t */\n\tprivate async waitForRetry(): Promise<void> {\n\t\tif (!this._retryPromise) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this._retryPromise;\n\t\tawait this.agent.waitForIdle();\n\t}\n\n\t/** Whether auto-retry is currently in progress */\n\tget isRetrying(): boolean {\n\t\treturn this._retryPromise !== undefined;\n\t}\n\n\t/** Whether auto-retry is enabled */\n\tget autoRetryEnabled(): boolean {\n\t\treturn this.settingsManager.getRetryEnabled();\n\t}\n\n\t/**\n\t * Toggle auto-retry setting.\n\t */\n\tsetAutoRetryEnabled(enabled: boolean): void {\n\t\tthis.settingsManager.setRetryEnabled(enabled);\n\t}\n\n\t// =========================================================================\n\t// Bash Execution\n\t// =========================================================================\n\n\t/**\n\t * Execute a bash command.\n\t * Adds result to agent context and session.\n\t * @param command The bash command to execute\n\t * @param onChunk Optional streaming callback for output\n\t * @param options.excludeFromContext If true, command output won't be sent to LLM (!! prefix)\n\t * @param options.id Optional identifier included in bash execution update events\n\t * @param options.operations Custom BashOperations for remote execution\n\t */\n\tasync executeBash(\n\t\tcommand: string,\n\t\tonChunk?: (chunk: string) => void,\n\t\toptions?: {\n\t\t\texcludeFromContext?: boolean;\n\t\t\tid?: string;\n\t\t\toperations?: BashOperations;\n\t\t},\n\t): Promise<BashResult> {\n\t\tconst abortController = new AbortController();\n\t\tthis._bashAbortControllers.add(abortController);\n\n\t\t// Apply command prefix if configured (e.g., \"shopt -s expand_aliases\" for alias support)\n\t\tconst prefix = this.settingsManager.getShellCommandPrefix();\n\t\tconst shellPath = this.settingsManager.getShellPath();\n\t\tconst resolvedCommand = prefix ? `${prefix}\\n${command}` : command;\n\n\t\ttry {\n\t\t\tconst result = await executeBashWithOperations(\n\t\t\t\tresolvedCommand,\n\t\t\t\tthis.sessionManager.getCwd(),\n\t\t\t\toptions?.operations ?? createLocalBashOperations({ shellPath }),\n\t\t\t\t{\n\t\t\t\t\tonChunk: (delta) => {\n\t\t\t\t\t\tconst callbackResult = onChunk?.(delta);\n\t\t\t\t\t\tthis._emit({\n\t\t\t\t\t\t\ttype: \"bash_execution_update\",\n\t\t\t\t\t\t\tid: options?.id,\n\t\t\t\t\t\t\tdelta,\n\t\t\t\t\t\t});\n\t\t\t\t\t\treturn callbackResult;\n\t\t\t\t\t},\n\t\t\t\t\tsignal: abortController.signal,\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tthis.recordBashResult(command, result, options);\n\t\t\treturn result;\n\t\t} finally {\n\t\t\tthis._bashAbortControllers.delete(abortController);\n\t\t}\n\t}\n\n\t/**\n\t * Record a bash execution result in session history.\n\t * Used by executeBash and by extensions that handle bash execution themselves.\n\t */\n\trecordBashResult(command: string, result: BashResult, options?: { excludeFromContext?: boolean }): void {\n\t\tconst bashMessage: BashExecutionMessage = {\n\t\t\trole: \"bashExecution\",\n\t\t\tcommand,\n\t\t\toutput: result.output,\n\t\t\texitCode: result.exitCode,\n\t\t\tcancelled: result.cancelled,\n\t\t\ttruncated: result.truncated,\n\t\t\tfullOutputPath: result.fullOutputPath,\n\t\t\ttimestamp: Date.now(),\n\t\t\texcludeFromContext: options?.excludeFromContext,\n\t\t};\n\n\t\t// If agent is streaming, defer adding to avoid breaking tool_use/tool_result ordering\n\t\tif (this.isStreaming) {\n\t\t\t// Queue for later - will be flushed on agent_end\n\t\t\tthis._pendingBashMessages.push(bashMessage);\n\t\t} else {\n\t\t\t// Add to agent state immediately\n\t\t\tthis.agent.state.messages.push(bashMessage);\n\n\t\t\t// Save to session\n\t\t\tthis.sessionManager.appendMessage(bashMessage);\n\t\t\tthis._incrementMessageRevision();\n\t\t}\n\t}\n\n\t/**\n\t * Cancel running bash command.\n\t */\n\tabortBash(): void {\n\t\tfor (const abortController of [...this._bashAbortControllers]) {\n\t\t\tabortController.abort();\n\t\t}\n\t}\n\n\t/** Remove a host-owned full-output spill after a remote observer failed. */\n\tasync cleanupBashOutput(path: string): Promise<void> {\n\t\tawait rm(path, { force: true });\n\t}\n\n\t/** Whether a bash command is currently running */\n\tget isBashRunning(): boolean {\n\t\treturn this._bashAbortControllers.size > 0;\n\t}\n\n\t/** Whether there are pending bash messages waiting to be flushed */\n\tget hasPendingBashMessages(): boolean {\n\t\treturn this._pendingBashMessages.length > 0;\n\t}\n\n\t/**\n\t * Flush pending bash messages to agent state and session.\n\t * Called after agent turn completes to maintain proper message ordering.\n\t */\n\tprivate _flushPendingBashMessages(): void {\n\t\tif (this._pendingBashMessages.length === 0) return;\n\n\t\tfor (const bashMessage of this._pendingBashMessages) {\n\t\t\t// Add to agent state\n\t\t\tthis.agent.state.messages.push(bashMessage);\n\n\t\t\t// Save to session\n\t\t\tthis.sessionManager.appendMessage(bashMessage);\n\t\t\tthis._incrementMessageRevision();\n\t\t}\n\n\t\tthis._pendingBashMessages = [];\n\t}\n\n\t// =========================================================================\n\t// Session Management\n\t// =========================================================================\n\n\t/**\n\t * Set a display name for the current session.\n\t */\n\tsetSessionName(name: string): void {\n\t\tthis.sessionManager.appendSessionInfo(name);\n\t\tconst event = {\n\t\t\ttype: \"session_info_changed\",\n\t\t\tname: this.sessionManager.getSessionName(),\n\t\t} as const;\n\t\tthis._emit(event);\n\t\tvoid this._extensionRunner.emit(event);\n\t}\n\n\t// =========================================================================\n\t// Tree Navigation\n\t// =========================================================================\n\n\t/**\n\t * Navigate to a different node in the session tree.\n\t * Unlike fork() which creates a new session file, this stays in the same file.\n\t *\n\t * @param targetId The entry ID to navigate to\n\t * @param options.summarize Whether user wants to summarize abandoned branch\n\t * @param options.customInstructions Custom instructions for summarizer\n\t * @param options.replaceInstructions If true, customInstructions replaces the default prompt\n\t * @param options.label Label to attach to the branch summary entry\n\t * @returns Result with editorText (if user message) and cancelled status\n\t */\n\tasync navigateTree(\n\t\ttargetId: string,\n\t\toptions: {\n\t\t\tsummarize?: boolean;\n\t\t\tcustomInstructions?: string;\n\t\t\treplaceInstructions?: boolean;\n\t\t\tlabel?: string;\n\t\t} = {},\n\t): Promise<{\n\t\teditorText?: string;\n\t\tcancelled: boolean;\n\t\taborted?: boolean;\n\t\tsummaryEntry?: BranchSummaryEntry;\n\t}> {\n\t\tif (this.isStreaming) {\n\t\t\tthrow new Error(\"Wait for the current response to finish before navigating the session tree.\");\n\t\t}\n\n\t\tconst oldLeafId = this.sessionManager.getLeafId();\n\n\t\t// No-op if already at target\n\t\tif (targetId === oldLeafId) {\n\t\t\treturn { cancelled: false };\n\t\t}\n\n\t\t// Model required for summarization\n\t\tif (options.summarize && !this.model) {\n\t\t\tthrow new Error(\"No model available for summarization\");\n\t\t}\n\n\t\tconst targetEntry = this.sessionManager.getEntry(targetId);\n\t\tif (!targetEntry) {\n\t\t\tthrow new Error(`Entry ${targetId} not found`);\n\t\t}\n\n\t\t// Collect entries to summarize (from old leaf to common ancestor)\n\t\tconst { entries: entriesToSummarize, commonAncestorId } = collectEntriesForBranchSummary(\n\t\t\tthis.sessionManager,\n\t\t\toldLeafId,\n\t\t\ttargetId,\n\t\t);\n\n\t\t// Prepare event data - mutable so extensions can override\n\t\tlet customInstructions = options.customInstructions;\n\t\tlet replaceInstructions = options.replaceInstructions;\n\t\tlet label = options.label;\n\n\t\tconst preparation: TreePreparation = {\n\t\t\ttargetId,\n\t\t\toldLeafId,\n\t\t\tcommonAncestorId,\n\t\t\tentriesToSummarize,\n\t\t\tuserWantsSummary: options.summarize ?? false,\n\t\t\tcustomInstructions,\n\t\t\treplaceInstructions,\n\t\t\tlabel,\n\t\t};\n\n\t\t// Set up abort controller for summarization\n\t\tthis._branchSummaryAbortController = new AbortController();\n\n\t\ttry {\n\t\t\tlet extensionSummary: { summary: string; details?: unknown; usage?: Usage } | undefined;\n\t\t\tlet fromExtension = false;\n\n\t\t\t// Emit session_before_tree event\n\t\t\tif (this._extensionRunner.hasHandlers(\"session_before_tree\")) {\n\t\t\t\tconst result = (await this._extensionRunner.emit({\n\t\t\t\t\ttype: \"session_before_tree\",\n\t\t\t\t\tpreparation,\n\t\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\t})) as SessionBeforeTreeResult | undefined;\n\n\t\t\t\tif (result?.cancel) {\n\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t}\n\n\t\t\t\tif (result?.summary && options.summarize) {\n\t\t\t\t\textensionSummary = result.summary;\n\t\t\t\t\tfromExtension = true;\n\t\t\t\t}\n\n\t\t\t\t// Allow extensions to override instructions and label\n\t\t\t\tif (result?.customInstructions !== undefined) {\n\t\t\t\t\tcustomInstructions = result.customInstructions;\n\t\t\t\t}\n\t\t\t\tif (result?.replaceInstructions !== undefined) {\n\t\t\t\t\treplaceInstructions = result.replaceInstructions;\n\t\t\t\t}\n\t\t\t\tif (result?.label !== undefined) {\n\t\t\t\t\tlabel = result.label;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Run default summarizer if needed\n\t\t\tlet summaryText: string | undefined;\n\t\t\tlet summaryDetails: unknown;\n\t\t\tlet summaryUsage: Usage | undefined;\n\t\t\tif (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {\n\t\t\t\tconst model = this.model!;\n\t\t\t\tconst {\n\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\theaders,\n\t\t\t\t\textraBody,\n\t\t\t\t\tenv,\n\t\t\t\t} = await this._getCompactionRequestAuth(model);\n\t\t\t\tconst branchSummarySettings = this.settingsManager.getBranchSummarySettings();\n\t\t\t\tconst result = await generateBranchSummary(entriesToSummarize, {\n\t\t\t\t\tmodel: requestModel,\n\t\t\t\t\tapiKey,\n\t\t\t\t\theaders,\n\t\t\t\t\textraBody,\n\t\t\t\t\tenv,\n\t\t\t\t\tsignal: this._branchSummaryAbortController.signal,\n\t\t\t\t\tcustomInstructions,\n\t\t\t\t\treplaceInstructions,\n\t\t\t\t\treserveTokens: branchSummarySettings.reserveTokens,\n\t\t\t\t\tstreamFn: this.agent.streamFunction,\n\t\t\t\t\tretry: this.settingsManager.getRetrySettings(),\n\t\t\t\t\tcallbacks: this._summarizationRetryCallbacks({\n\t\t\t\t\t\tsource: \"branchSummary\",\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t\tif (result.aborted) {\n\t\t\t\t\treturn { cancelled: true, aborted: true };\n\t\t\t\t}\n\t\t\t\tif (result.error) {\n\t\t\t\t\tthrow new Error(result.error);\n\t\t\t\t}\n\t\t\t\tsummaryText = result.summary;\n\t\t\t\tsummaryUsage = result.usage;\n\t\t\t\tsummaryDetails = {\n\t\t\t\t\treadFiles: result.readFiles || [],\n\t\t\t\t\tmodifiedFiles: result.modifiedFiles || [],\n\t\t\t\t};\n\t\t\t} else if (extensionSummary) {\n\t\t\t\tsummaryText = extensionSummary.summary;\n\t\t\t\tsummaryDetails = extensionSummary.details;\n\t\t\t\tsummaryUsage = extensionSummary.usage;\n\t\t\t}\n\n\t\t\t// Determine the new leaf position based on target type\n\t\t\tlet newLeafId: string | null;\n\t\t\tlet editorText: string | undefined;\n\n\t\t\tif (targetEntry.type === \"message\" && targetEntry.message.role === \"user\") {\n\t\t\t\t// User message: leaf = parent (null if root), text goes to editor\n\t\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\t\teditorText = contentText(targetEntry.message.content, \"\");\n\t\t\t} else if (targetEntry.type === \"custom_message\") {\n\t\t\t\t// Custom message: leaf = parent (null if root), text goes to editor\n\t\t\t\tnewLeafId = targetEntry.parentId;\n\t\t\t\teditorText = contentText(targetEntry.content, \"\");\n\t\t\t} else {\n\t\t\t\t// Non-user message: leaf = selected node\n\t\t\t\tnewLeafId = targetId;\n\t\t\t}\n\n\t\t\t// Switch leaf (with or without summary)\n\t\t\t// Summary is attached at the navigation target position (newLeafId), not the old branch\n\t\t\tlet summaryEntry: BranchSummaryEntry | undefined;\n\t\t\tif (summaryText) {\n\t\t\t\t// Create summary at target position (can be null for root)\n\t\t\t\tconst summaryId = this.sessionManager.branchWithSummary(\n\t\t\t\t\tnewLeafId,\n\t\t\t\t\tsummaryText,\n\t\t\t\t\tsummaryDetails,\n\t\t\t\t\tfromExtension,\n\t\t\t\t\tsummaryUsage,\n\t\t\t\t);\n\t\t\t\tsummaryEntry = this.sessionManager.getEntry(summaryId) as BranchSummaryEntry;\n\n\t\t\t\t// Attach label to the summary entry\n\t\t\t\tif (label) {\n\t\t\t\t\tthis.sessionManager.appendLabelChange(summaryId, label);\n\t\t\t\t}\n\t\t\t} else if (newLeafId === null) {\n\t\t\t\t// No summary, navigating to root - reset leaf\n\t\t\t\tthis.sessionManager.resetLeaf();\n\t\t\t} else {\n\t\t\t\t// No summary, navigating to non-root\n\t\t\t\tthis.sessionManager.branch(newLeafId);\n\t\t\t}\n\n\t\t\t// Attach label to target entry when not summarizing (no summary entry to label)\n\t\t\tif (label && !summaryText) {\n\t\t\t\tthis.sessionManager.appendLabelChange(targetId, label);\n\t\t\t}\n\n\t\t\t// Update agent state (preserving exact messages still awaiting persistence)\n\t\t\tthis._restoreAgentMessagesFromSession();\n\t\t\tthis._delegatedCompactionKey = undefined;\n\t\t\tthis._incrementMessageRevision();\n\n\t\t\t// Emit session_tree event\n\t\t\tawait this._extensionRunner.emit({\n\t\t\t\ttype: \"session_tree\",\n\t\t\t\tnewLeafId: this.sessionManager.getLeafId(),\n\t\t\t\toldLeafId,\n\t\t\t\tsummaryEntry,\n\t\t\t\tfromExtension: summaryText ? fromExtension : undefined,\n\t\t\t});\n\n\t\t\t// Emit to custom tools\n\n\t\t\treturn { editorText, cancelled: false, summaryEntry };\n\t\t} finally {\n\t\t\tthis._branchSummaryAbortController = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Get all user messages from session for fork selector.\n\t */\n\tgetUserMessagesForForking(): Array<{ entryId: string; text: string }> {\n\t\tconst entries = this.sessionManager.getEntries();\n\t\tconst result: Array<{ entryId: string; text: string }> = [];\n\n\t\tfor (const entry of entries) {\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\tif (entry.message.role !== \"user\") continue;\n\n\t\t\tconst text = contentText(entry.message.content, \"\");\n\t\t\tif (text) {\n\t\t\t\tresult.push({ entryId: entry.id, text });\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Get session statistics. Aggregates over ALL session entries (including\n\t * history that was compacted away), so token/cost totals reflect what was\n\t * actually billed across the session.\n\t */\n\tgetSessionStats(): SessionStats {\n\t\tlet userMessages = 0;\n\t\tlet assistantMessages = 0;\n\t\tlet toolResults = 0;\n\t\tlet totalMessages = 0;\n\t\tlet toolCalls = 0;\n\t\tconst usageTotals = createUsageTotals();\n\n\t\tfor (const entry of this.sessionManager.getEntries()) {\n\t\t\tif ((entry.type === \"branch_summary\" || entry.type === \"compaction\") && entry.usage) {\n\t\t\t\taddUsageToTotals(usageTotals, entry.usage);\n\t\t\t}\n\t\t\tif (entry.type !== \"message\") continue;\n\t\t\ttotalMessages++;\n\t\t\tconst message = entry.message;\n\t\t\tif (message.role === \"user\") {\n\t\t\t\tuserMessages++;\n\t\t\t} else if (message.role === \"toolResult\") {\n\t\t\t\ttoolResults++;\n\t\t\t\tif (message.usage) {\n\t\t\t\t\taddUsageToTotals(usageTotals, message.usage);\n\t\t\t\t}\n\t\t\t} else if (message.role === \"assistant\") {\n\t\t\t\tassistantMessages++;\n\t\t\t\tconst assistantMsg = message as AssistantMessage;\n\t\t\t\tif (Array.isArray(assistantMsg.content)) {\n\t\t\t\t\ttoolCalls += assistantMsg.content.filter((c) => c.type === \"toolCall\").length;\n\t\t\t\t}\n\t\t\t\taddUsageToTotals(usageTotals, assistantMsg.usage);\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsessionFile: this.sessionFile,\n\t\t\tsessionId: this.sessionId,\n\t\t\tuserMessages,\n\t\t\tassistantMessages,\n\t\t\ttoolCalls,\n\t\t\ttoolResults,\n\t\t\ttotalMessages,\n\t\t\ttokens: {\n\t\t\t\tinput: usageTotals.input,\n\t\t\t\toutput: usageTotals.output,\n\t\t\t\tcacheRead: usageTotals.cacheRead,\n\t\t\t\tcacheWrite: usageTotals.cacheWrite,\n\t\t\t\ttotal: usageTotals.input + usageTotals.output + usageTotals.cacheRead + usageTotals.cacheWrite,\n\t\t\t},\n\t\t\tcost: usageTotals.cost,\n\t\t\tcontextUsage: this.getContextUsage(),\n\t\t};\n\t}\n\n\t/**\n\t * Cache-safe foreground wait budget for the LIVE current model. Recomputed on\n\t * every call so a model switch takes effect immediately.\n\t */\n\tresolvePromptCacheSafeWaitSeconds(): number | undefined {\n\t\tconst global = this.settingsManager.getGlobalSettings().promptCache;\n\t\tconst project = this.settingsManager.getProjectSettings().promptCache;\n\t\tconst merged = global || project ? { ...global, ...project } : undefined;\n\t\treturn resolvePromptCacheSafeWaitSeconds(this.model, merged, process.env);\n\t}\n\n\t/**\n\t * Mirror the budget into the advisory env var read by out-of-process tools.\n\t * Last writer wins across in-process sessions; consumers treat it as a hint.\n\t */\n\tsyncPromptCacheSafeWaitEnv(): void {\n\t\tconst budget = this.resolvePromptCacheSafeWaitSeconds();\n\t\tif (budget === undefined) delete process.env[PROMPT_CACHE_SAFE_WAIT_ENV];\n\t\telse process.env[PROMPT_CACHE_SAFE_WAIT_ENV] = String(budget);\n\t}\n\n\tgetContextUsage(): ContextUsage | undefined {\n\t\tconst model = this.model;\n\t\tif (!model) return undefined;\n\n\t\tconst contextWindow = model.contextWindow ?? 0;\n\t\tif (contextWindow <= 0) return undefined;\n\n\t\tconst messages = filterContextExcludedMessages(this.messages);\n\n\t\t// After compaction, kept assistant usage reflects pre-compaction context size.\n\t\t// If no assistant has responded after the boundary yet, fall back to content\n\t\t// estimates so auto-compaction can still see current context pressure.\n\t\tconst branchEntries = this.sessionManager.getBranch();\n\t\tconst latestCompaction = getLatestCompactionEntry(branchEntries);\n\n\t\tif (latestCompaction) {\n\t\t\t// Check if there's a valid assistant usage after the compaction boundary\n\t\t\tconst compactionIndex = branchEntries.lastIndexOf(latestCompaction);\n\t\t\tlet hasPostCompactionUsage = false;\n\t\t\tfor (let i = branchEntries.length - 1; i > compactionIndex; i--) {\n\t\t\t\tconst entry = branchEntries[i];\n\t\t\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\t\t\tconst assistant = entry.message;\n\t\t\t\t\tif (assistant.stopReason !== \"aborted\" && assistant.stopReason !== \"error\") {\n\t\t\t\t\t\tconst contextTokens = calculateContextTokens(assistant.usage);\n\t\t\t\t\t\tif (contextTokens > 0) {\n\t\t\t\t\t\t\thasPostCompactionUsage = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!hasPostCompactionUsage) {\n\t\t\t\tconst tokens = messages.reduce((sum, message) => sum + estimateTokens(message), 0);\n\t\t\t\treturn {\n\t\t\t\t\ttokens,\n\t\t\t\t\tcontextWindow,\n\t\t\t\t\tpercent: (tokens / contextWindow) * 100,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst estimate = estimateContextTokens(messages);\n\t\tconst percent = (estimate.tokens / contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokens: estimate.tokens,\n\t\t\tcontextWindow,\n\t\t\tpercent,\n\t\t};\n\t}\n\n\t/**\n\t * Export session to HTML.\n\t * @param outputPath Optional output path (defaults to session directory)\n\t * @param options Optional export presentation settings\n\t * @returns Path to exported file\n\t */\n\tasync exportToHtml(outputPath?: string, options: { themeName?: string } = {}): Promise<string> {\n\t\tconst themeName = [options.themeName, this.settingsManager.getTheme()].find(\n\t\t\t(candidate) => candidate !== undefined && getThemeByName(candidate) !== undefined,\n\t\t);\n\n\t\t// Create tool renderer if we have an extension runner (for custom tool HTML rendering)\n\t\tconst toolRenderer: ToolHtmlRenderer = createToolHtmlRenderer({\n\t\t\tgetToolDefinition: (name) => this.getToolDefinition(name),\n\t\t\ttheme,\n\t\t\tcwd: this.sessionManager.getCwd(),\n\t\t});\n\n\t\treturn await exportSessionToHtml(this.sessionManager, this.state, {\n\t\t\toutputPath,\n\t\t\tthemeName,\n\t\t\ttoolRenderer,\n\t\t});\n\t}\n\n\t/**\n\t * Export the current session branch to a JSONL file.\n\t * Writes the session header followed by all entries on the current branch path.\n\t * @param outputPath Target file path. If omitted, generates a timestamped file in cwd.\n\t * @returns The resolved output file path.\n\t */\n\texportToJsonl(outputPath?: string): string {\n\t\tconst filePath = resolvePath(\n\t\t\toutputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, \"-\")}.jsonl`,\n\t\t\tprocess.cwd(),\n\t\t);\n\t\tconst dir = dirname(filePath);\n\t\tif (!existsSync(dir)) {\n\t\t\tmkdirSync(dir, { recursive: true });\n\t\t}\n\n\t\tconst header: SessionHeader = {\n\t\t\ttype: \"session\",\n\t\t\tversion: CURRENT_SESSION_VERSION,\n\t\t\tid: this.sessionManager.getSessionId(),\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t\tcwd: this.sessionManager.getCwd(),\n\t\t};\n\n\t\tconst branchEntries = this.sessionManager.getBranch();\n\t\tconst lines = [JSON.stringify(header)];\n\n\t\t// Re-chain parentIds to form a linear sequence\n\t\tlet prevId: string | null = null;\n\t\tfor (const entry of branchEntries) {\n\t\t\tconst linear = { ...entry, parentId: prevId };\n\t\t\tlines.push(JSON.stringify(linear));\n\t\t\tprevId = entry.id;\n\t\t}\n\n\t\twriteFileSync(filePath, `${lines.join(\"\\n\")}\\n`);\n\t\treturn filePath;\n\t}\n\n\t// =========================================================================\n\t// Utilities\n\t// =========================================================================\n\n\t/**\n\t * Get text content of last assistant message.\n\t * Useful for /copy command.\n\t * @returns Text content, or undefined if no assistant message exists\n\t */\n\tgetLastAssistantText(): string | undefined {\n\t\tconst lastAssistant = this.messages\n\t\t\t.slice()\n\t\t\t.reverse()\n\t\t\t.find((m) => {\n\t\t\t\tif (m.role !== \"assistant\") return false;\n\t\t\t\tconst msg = m as AssistantMessage;\n\t\t\t\t// Skip aborted messages with no content\n\t\t\t\tif (msg.stopReason === \"aborted\" && msg.content.length === 0) return false;\n\t\t\t\treturn true;\n\t\t\t});\n\n\t\tif (!lastAssistant) return undefined;\n\n\t\tlet text = \"\";\n\t\tfor (const content of (lastAssistant as AssistantMessage).content) {\n\t\t\tif (content.type === \"text\") {\n\t\t\t\ttext += content.text;\n\t\t\t}\n\t\t}\n\n\t\treturn text.trim() || undefined;\n\t}\n\n\t// =========================================================================\n\t// Extension System\n\t// =========================================================================\n\n\tcreateReplacedSessionContext(): ReplacedSessionContext {\n\t\tconst context = Object.defineProperties(\n\t\t\t{},\n\t\t\tObject.getOwnPropertyDescriptors(this._extensionRunner.createCommandContext()),\n\t\t) as ReplacedSessionContext;\n\t\tcontext.sendMessage = (message, options) => this.sendCustomMessage(message, options);\n\t\tcontext.sendUserMessage = (content, options) => this.sendUserMessage(content, options);\n\t\treturn context;\n\t}\n\n\t/**\n\t * Check if extensions have handlers for a specific event type.\n\t */\n\thasExtensionHandlers(eventType: string): boolean {\n\t\treturn this._extensionRunner.hasHandlers(eventType);\n\t}\n\n\t/**\n\t * Get the extension runner (for setting UI context and error handlers).\n\t */\n\tget extensionRunner(): ExtensionRunner {\n\t\treturn this._extensionRunner;\n\t}\n}\n"]}