@code-yeongyu/senpi 2026.9.7 → 2026.9.9-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/CHANGELOG.md +122 -3
  2. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  3. package/dist/core/agent-session-runtime.js +2 -0
  4. package/dist/core/agent-session-runtime.js.map +1 -1
  5. package/dist/core/agent-session.d.ts +48 -4
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +192 -40
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/compaction/compaction-execution.d.ts.map +1 -1
  10. package/dist/core/compaction/compaction-execution.js +5 -5
  11. package/dist/core/compaction/compaction-execution.js.map +1 -1
  12. package/dist/core/compaction/compaction-settings.d.ts +2 -0
  13. package/dist/core/compaction/compaction-settings.d.ts.map +1 -1
  14. package/dist/core/compaction/compaction-settings.js.map +1 -1
  15. package/dist/core/compaction/compaction.d.ts +3 -3
  16. package/dist/core/compaction/compaction.d.ts.map +1 -1
  17. package/dist/core/compaction/compaction.js +14 -8
  18. package/dist/core/compaction/compaction.js.map +1 -1
  19. package/dist/core/compaction/stream-watchdog.d.ts +29 -0
  20. package/dist/core/compaction/stream-watchdog.d.ts.map +1 -1
  21. package/dist/core/compaction/stream-watchdog.js +35 -0
  22. package/dist/core/compaction/stream-watchdog.js.map +1 -1
  23. package/dist/core/compaction-settings-access.d.ts +6 -0
  24. package/dist/core/compaction-settings-access.d.ts.map +1 -1
  25. package/dist/core/compaction-settings-access.js.map +1 -1
  26. package/dist/core/compaction-settings-resolver.d.ts +2 -0
  27. package/dist/core/compaction-settings-resolver.d.ts.map +1 -1
  28. package/dist/core/compaction-settings-resolver.js +5 -0
  29. package/dist/core/compaction-settings-resolver.js.map +1 -1
  30. package/dist/core/dynamic-prompt/working-task.js +1 -1
  31. package/dist/core/dynamic-prompt/working-task.js.map +1 -1
  32. package/dist/core/extensions/builtin/cache-keepalive/index.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/cache-keepalive/index.js +4 -21
  34. package/dist/core/extensions/builtin/cache-keepalive/index.js.map +1 -1
  35. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts +2 -0
  36. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.d.ts.map +1 -1
  37. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js +10 -25
  38. package/dist/core/extensions/builtin/claude-sdk-oauth/account-command.js.map +1 -1
  39. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +36 -19
  41. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
  42. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
  43. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js +21 -10
  44. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js.map +1 -1
  45. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +4 -17
  46. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +23 -33
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +5 -1
  51. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
  52. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +5 -3
  54. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
  55. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
  56. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js +8 -3
  57. package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js.map +1 -1
  58. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts +6 -5
  59. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.d.ts.map +1 -1
  60. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js +6 -5
  61. package/dist/core/extensions/builtin/claude-sdk-oauth/tools.js.map +1 -1
  62. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts +8 -0
  63. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
  64. package/dist/core/extensions/builtin/compaction/circuit-breaker.js +8 -0
  65. package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
  66. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -0
  67. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  68. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +125 -20
  69. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  70. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.d.ts +18 -0
  71. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.d.ts.map +1 -0
  72. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.js +20 -0
  73. package/dist/core/extensions/builtin/compaction/fallback-failed-turn-normalization.js.map +1 -0
  74. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  75. package/dist/core/extensions/builtin/compaction/index.js +54 -11
  76. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  77. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +3 -0
  78. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
  79. package/dist/core/extensions/builtin/compaction/lane-policy.js +47 -23
  80. package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
  81. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts +1 -1
  82. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -1
  83. package/dist/core/extensions/builtin/compaction/model-usability-budget.js +23 -3
  84. package/dist/core/extensions/builtin/compaction/model-usability-budget.js.map +1 -1
  85. package/dist/core/extensions/builtin/compaction/resume-admission.d.ts +7 -0
  86. package/dist/core/extensions/builtin/compaction/resume-admission.d.ts.map +1 -0
  87. package/dist/core/extensions/builtin/compaction/resume-admission.js +7 -0
  88. package/dist/core/extensions/builtin/compaction/resume-admission.js.map +1 -0
  89. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +2 -0
  90. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -1
  91. package/dist/core/extensions/builtin/compaction/speculative-summary.js +5 -2
  92. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -1
  93. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  94. package/dist/core/extensions/builtin/compaction/speculative.js +9 -3
  95. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  96. package/dist/core/extensions/builtin/compaction/summarization-retry.d.ts +10 -4
  97. package/dist/core/extensions/builtin/compaction/summarization-retry.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/compaction/summarization-retry.js +14 -5
  99. package/dist/core/extensions/builtin/compaction/summarization-retry.js.map +1 -1
  100. package/dist/core/extensions/builtin/goal/agent-end-continuation.d.ts.map +1 -1
  101. package/dist/core/extensions/builtin/goal/agent-end-continuation.js +11 -0
  102. package/dist/core/extensions/builtin/goal/agent-end-continuation.js.map +1 -1
  103. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js +6 -4
  104. package/dist/core/extensions/builtin/goal/cache-warm-renderer.js.map +1 -1
  105. package/dist/core/extensions/builtin/goal/cache-warm.d.ts +25 -1
  106. package/dist/core/extensions/builtin/goal/cache-warm.d.ts.map +1 -1
  107. package/dist/core/extensions/builtin/goal/cache-warm.js +29 -10
  108. package/dist/core/extensions/builtin/goal/cache-warm.js.map +1 -1
  109. package/dist/core/extensions/builtin/goal/continuation.d.ts +3 -1
  110. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  111. package/dist/core/extensions/builtin/goal/continuation.js +17 -2
  112. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  113. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +1 -0
  115. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  116. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts +1 -1
  117. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  118. package/dist/core/extensions/builtin/goal/monitor-continuation.js +8 -3
  119. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  120. package/dist/core/extensions/builtin/gpt-account.d.ts +5 -1
  121. package/dist/core/extensions/builtin/gpt-account.d.ts.map +1 -1
  122. package/dist/core/extensions/builtin/gpt-account.js +9 -26
  123. package/dist/core/extensions/builtin/gpt-account.js.map +1 -1
  124. package/dist/core/extensions/builtin/hooks/plugin-manifest.js +2 -2
  125. package/dist/core/extensions/builtin/hooks/plugin-manifest.js.map +1 -1
  126. package/dist/core/extensions/builtin/hooks/safety.js +2 -2
  127. package/dist/core/extensions/builtin/hooks/safety.js.map +1 -1
  128. package/dist/core/extensions/builtin/imagegen/params.d.ts +36 -0
  129. package/dist/core/extensions/builtin/imagegen/params.d.ts.map +1 -0
  130. package/dist/core/extensions/builtin/imagegen/params.js +55 -0
  131. package/dist/core/extensions/builtin/imagegen/params.js.map +1 -0
  132. package/dist/core/extensions/builtin/imagegen/reference-images.d.ts +11 -0
  133. package/dist/core/extensions/builtin/imagegen/reference-images.d.ts.map +1 -0
  134. package/dist/core/extensions/builtin/imagegen/reference-images.js +55 -0
  135. package/dist/core/extensions/builtin/imagegen/reference-images.js.map +1 -0
  136. package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +47 -4
  137. package/dist/core/extensions/builtin/imagegen/tool.d.ts +10 -19
  138. package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/imagegen/tool.js +21 -45
  140. package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -1
  141. package/dist/core/extensions/builtin/monitor-state-event.d.ts +18 -0
  142. package/dist/core/extensions/builtin/monitor-state-event.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/monitor-state-event.js +23 -0
  144. package/dist/core/extensions/builtin/monitor-state-event.js.map +1 -1
  145. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts +24 -0
  146. package/dist/core/extensions/builtin/oauth-login-interaction.d.ts.map +1 -0
  147. package/dist/core/extensions/builtin/oauth-login-interaction.js +77 -0
  148. package/dist/core/extensions/builtin/oauth-login-interaction.js.map +1 -0
  149. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  150. package/dist/core/extensions/builtin/permission-system/external-dir.js +5 -51
  151. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  152. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/permission-system/parsers.js +5 -7
  154. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  155. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +1 -1
  156. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -1
  157. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +1 -1
  158. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  159. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts +14 -7
  160. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js +34 -13
  162. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js.map +1 -1
  163. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +6 -10
  164. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  165. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +14 -9
  166. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  167. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts +15 -15
  168. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js +49 -21
  170. package/dist/core/extensions/builtin/prompt-preset/gpt-6-astra.js.map +1 -1
  171. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +1 -1
  172. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  173. package/dist/core/extensions/builtin/service-tier.d.ts +2 -0
  174. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  175. package/dist/core/extensions/builtin/service-tier.js +17 -1
  176. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  177. package/dist/core/extensions/builtin/terminal/durable-command.d.ts.map +1 -1
  178. package/dist/core/extensions/builtin/terminal/durable-command.js +3 -0
  179. package/dist/core/extensions/builtin/terminal/durable-command.js.map +1 -1
  180. package/dist/core/extensions/builtin/terminal/durable-file.d.ts.map +1 -1
  181. package/dist/core/extensions/builtin/terminal/durable-file.js +2 -0
  182. package/dist/core/extensions/builtin/terminal/durable-file.js.map +1 -1
  183. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  184. package/dist/core/extensions/builtin/terminal/extension.js +14 -2
  185. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  186. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/terminal/monitor-notify.js +27 -5
  188. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  189. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +17 -0
  190. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  191. package/dist/core/extensions/builtin/terminal/monitor-registry.js +76 -14
  192. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  193. package/dist/core/extensions/builtin/terminal/notify.d.ts +2 -0
  194. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  195. package/dist/core/extensions/builtin/terminal/notify.js +6 -1
  196. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  197. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts +3 -1
  198. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
  199. package/dist/core/extensions/builtin/terminal/session-bundle.js +13 -0
  200. package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
  201. package/dist/core/extensions/builtin/terminal/shared.d.ts +13 -2
  202. package/dist/core/extensions/builtin/terminal/shared.d.ts.map +1 -1
  203. package/dist/core/extensions/builtin/terminal/shared.js +15 -2
  204. package/dist/core/extensions/builtin/terminal/shared.js.map +1 -1
  205. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
  206. package/dist/core/extensions/builtin/terminal/tools/monitor.js +8 -1
  207. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  208. package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -1
  209. package/dist/core/extensions/builtin/tool-search/index.js +1 -0
  210. package/dist/core/extensions/builtin/tool-search/index.js.map +1 -1
  211. package/dist/core/extensions/builtin/tool-search/service.d.ts +4 -0
  212. package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -1
  213. package/dist/core/extensions/builtin/tool-search/service.js +11 -0
  214. package/dist/core/extensions/builtin/tool-search/service.js.map +1 -1
  215. package/dist/core/extensions/loader.d.ts +2 -1
  216. package/dist/core/extensions/loader.d.ts.map +1 -1
  217. package/dist/core/extensions/loader.js +17 -8
  218. package/dist/core/extensions/loader.js.map +1 -1
  219. package/dist/core/extensions/runner.d.ts +1 -0
  220. package/dist/core/extensions/runner.d.ts.map +1 -1
  221. package/dist/core/extensions/runner.js +8 -1
  222. package/dist/core/extensions/runner.js.map +1 -1
  223. package/dist/core/extensions/types.d.ts +14 -0
  224. package/dist/core/extensions/types.d.ts.map +1 -1
  225. package/dist/core/extensions/types.js.map +1 -1
  226. package/dist/core/high-reasoning-warning.d.ts.map +1 -1
  227. package/dist/core/high-reasoning-warning.js +4 -6
  228. package/dist/core/high-reasoning-warning.js.map +1 -1
  229. package/dist/core/resource-loader.d.ts +2 -0
  230. package/dist/core/resource-loader.d.ts.map +1 -1
  231. package/dist/core/resource-loader.js +11 -7
  232. package/dist/core/resource-loader.js.map +1 -1
  233. package/dist/core/sdk.d.ts +1 -1
  234. package/dist/core/sdk.d.ts.map +1 -1
  235. package/dist/core/sdk.js +38 -7
  236. package/dist/core/sdk.js.map +1 -1
  237. package/dist/core/session-manager.d.ts.map +1 -1
  238. package/dist/core/session-manager.js +11 -1
  239. package/dist/core/session-manager.js.map +1 -1
  240. package/dist/core/session-write-reservation.d.ts +4 -0
  241. package/dist/core/session-write-reservation.d.ts.map +1 -0
  242. package/dist/core/session-write-reservation.js +12 -0
  243. package/dist/core/session-write-reservation.js.map +1 -0
  244. package/dist/core/settings-manager.js +1 -1
  245. package/dist/core/settings-manager.js.map +1 -1
  246. package/dist/core/settings-shapes.js.map +1 -1
  247. package/dist/core/tools/bounded-realpath.d.ts +28 -0
  248. package/dist/core/tools/bounded-realpath.d.ts.map +1 -0
  249. package/dist/core/tools/bounded-realpath.js +53 -0
  250. package/dist/core/tools/bounded-realpath.js.map +1 -0
  251. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  252. package/dist/core/tools/file-mutation-queue.js +15 -13
  253. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  254. package/dist/core/tools/filesystem-policy.d.ts +7 -0
  255. package/dist/core/tools/filesystem-policy.d.ts.map +1 -1
  256. package/dist/core/tools/filesystem-policy.js +25 -15
  257. package/dist/core/tools/filesystem-policy.js.map +1 -1
  258. package/dist/core/tools/read-classifiers.d.ts +17 -0
  259. package/dist/core/tools/read-classifiers.d.ts.map +1 -0
  260. package/dist/core/tools/read-classifiers.js +26 -0
  261. package/dist/core/tools/read-classifiers.js.map +1 -0
  262. package/dist/core/tools/read.d.ts +5 -1
  263. package/dist/core/tools/read.d.ts.map +1 -1
  264. package/dist/core/tools/read.js +21 -1
  265. package/dist/core/tools/read.js.map +1 -1
  266. package/dist/core/trust-manager.d.ts.map +1 -1
  267. package/dist/core/trust-manager.js +13 -2
  268. package/dist/core/trust-manager.js.map +1 -1
  269. package/dist/index.d.ts +1 -0
  270. package/dist/index.d.ts.map +1 -1
  271. package/dist/index.js +1 -0
  272. package/dist/index.js.map +1 -1
  273. package/dist/main.d.ts +14 -0
  274. package/dist/main.d.ts.map +1 -1
  275. package/dist/main.js +166 -147
  276. package/dist/main.js.map +1 -1
  277. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  278. package/dist/modes/interactive/interactive-mode.js +4 -0
  279. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  280. package/dist/modes/interactive/tips/catalog/memory-tips.d.ts.map +1 -1
  281. package/dist/modes/interactive/tips/catalog/memory-tips.js +6 -0
  282. package/dist/modes/interactive/tips/catalog/memory-tips.js.map +1 -1
  283. package/dist/modes/interactive/tips/catalog/subagent-tips.d.ts.map +1 -1
  284. package/dist/modes/interactive/tips/catalog/subagent-tips.js +6 -0
  285. package/dist/modes/interactive/tips/catalog/subagent-tips.js.map +1 -1
  286. package/dist/modes/rpc/connection-handler.d.ts +2 -0
  287. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  288. package/dist/modes/rpc/connection-handler.js +1 -1
  289. package/dist/modes/rpc/connection-handler.js.map +1 -1
  290. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  291. package/dist/modes/rpc/host-lifecycle.js +31 -5
  292. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  293. package/dist/modes/rpc/host-watchdog.d.ts +11 -0
  294. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  295. package/dist/modes/rpc/host-watchdog.js +16 -2
  296. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  297. package/dist/modes/rpc/multi-session-host.d.ts +2 -0
  298. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
  299. package/dist/modes/rpc/multi-session-host.js +72 -24
  300. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  301. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  302. package/dist/modes/rpc/session-binding.js +3 -0
  303. package/dist/modes/rpc/session-binding.js.map +1 -1
  304. package/dist/modes/rpc/session-command-router.d.ts +1 -1
  305. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  306. package/dist/modes/rpc/session-command-router.js +57 -25
  307. package/dist/modes/rpc/session-command-router.js.map +1 -1
  308. package/dist/modes/rpc/session-event-writer.d.ts +23 -1
  309. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  310. package/dist/modes/rpc/session-event-writer.js +108 -1
  311. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  312. package/dist/modes/rpc/session-registry.d.ts +4 -2
  313. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  314. package/dist/modes/rpc/session-registry.js +1 -1
  315. package/dist/modes/rpc/session-registry.js.map +1 -1
  316. package/dist/modes/rpc/session-worker-client.d.ts +47 -0
  317. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -0
  318. package/dist/modes/rpc/session-worker-client.js +226 -0
  319. package/dist/modes/rpc/session-worker-client.js.map +1 -0
  320. package/dist/modes/rpc/session-worker-protocol.d.ts +103 -0
  321. package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -0
  322. package/dist/modes/rpc/session-worker-protocol.js +12 -0
  323. package/dist/modes/rpc/session-worker-protocol.js.map +1 -0
  324. package/dist/modes/rpc/session-worker-requests.d.ts +24 -0
  325. package/dist/modes/rpc/session-worker-requests.d.ts.map +1 -0
  326. package/dist/modes/rpc/session-worker-requests.js +71 -0
  327. package/dist/modes/rpc/session-worker-requests.js.map +1 -0
  328. package/dist/modes/rpc/session-worker.d.ts +2 -0
  329. package/dist/modes/rpc/session-worker.d.ts.map +1 -0
  330. package/dist/modes/rpc/session-worker.js +229 -0
  331. package/dist/modes/rpc/session-worker.js.map +1 -0
  332. package/dist/modes/rpc/socket-ownership.d.ts +46 -0
  333. package/dist/modes/rpc/socket-ownership.d.ts.map +1 -0
  334. package/dist/modes/rpc/socket-ownership.js +178 -0
  335. package/dist/modes/rpc/socket-ownership.js.map +1 -0
  336. package/dist/modes/rpc/worker-session-registry.d.ts +37 -0
  337. package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -0
  338. package/dist/modes/rpc/worker-session-registry.js +207 -0
  339. package/dist/modes/rpc/worker-session-registry.js.map +1 -0
  340. package/dist/utils/fs-watch.d.ts +17 -0
  341. package/dist/utils/fs-watch.d.ts.map +1 -1
  342. package/dist/utils/fs-watch.js +38 -10
  343. package/dist/utils/fs-watch.js.map +1 -1
  344. package/dist/utils/paths.d.ts +33 -0
  345. package/dist/utils/paths.d.ts.map +1 -1
  346. package/dist/utils/paths.js +109 -3
  347. package/dist/utils/paths.js.map +1 -1
  348. package/docs/development.md +3 -2
  349. package/docs/providers.md +5 -1
  350. package/docs/rpc.md +70 -9
  351. package/docs/settings.md +2 -0
  352. package/docs/skills.md +1 -1
  353. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +55 -0
  354. package/node_modules/@code-yeongyu/senpi-codemode/README.md +14 -1
  355. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  356. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +1 -0
  357. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/runtime-factory.ts +3 -0
  358. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +7 -0
  359. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/AGENTS.md +7 -0
  360. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/kernel.ts +4 -0
  361. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +3 -0
  362. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +29 -0
  363. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +10 -6
  364. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.d.ts +16 -0
  365. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-shell-capture.js +44 -8
  366. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +1 -0
  367. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel-contract.ts +3 -0
  368. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +9 -1
  369. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/kernel.ts +4 -0
  370. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/session-env.ts +56 -0
  371. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-contract.ts +3 -0
  372. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +9 -1
  373. package/node_modules/@code-yeongyu/senpi-codemode/src/output/output-meta.ts +26 -2
  374. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +17 -24
  375. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +12 -3
  376. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  377. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -2
  378. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  379. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +7 -0
  380. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -1
  381. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +19 -0
  382. package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -1
  383. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
  384. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +24 -16
  385. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
  386. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +1 -1
  387. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  388. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +1 -1
  389. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  390. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  391. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  392. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +70 -183
  393. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  394. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.d.ts +3 -0
  395. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.d.ts.map +1 -0
  396. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.js +260 -0
  397. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-tool-references.js.map +1 -0
  398. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  399. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +1 -0
  400. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  401. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts +4 -0
  402. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.d.ts.map +1 -0
  403. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js +11 -0
  404. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-edit.js.map +1 -0
  405. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts +25 -0
  406. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.d.ts.map +1 -0
  407. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js +58 -0
  408. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images-params.js.map +1 -0
  409. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +3 -6
  410. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -1
  411. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +15 -33
  412. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -1
  413. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  414. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -0
  415. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  416. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.d.ts +40 -0
  417. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.d.ts.map +1 -0
  418. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.js +138 -0
  419. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic-callback-listener.js.map +1 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts +2 -3
  421. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts.map +1 -1
  422. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js +42 -139
  423. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js.map +1 -1
  424. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.d.ts +6 -0
  425. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.d.ts.map +1 -0
  426. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.js +29 -0
  427. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/authorization-input.js.map +1 -0
  428. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.d.ts +3 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.d.ts.map +1 -0
  430. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.js +20 -0
  431. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/error-details.js.map +1 -0
  432. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +61 -1
  433. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +61 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  436. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts +1 -0
  437. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
  438. package/node_modules/@earendil-works/pi-ai/dist/images.js +1 -0
  439. package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  442. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  443. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  446. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  447. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  448. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  449. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  450. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  451. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  452. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.d.ts.map +1 -1
  453. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js +16 -1
  454. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/recovery-stream-terminal.js.map +1 -1
  455. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +7 -0
  456. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  457. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  458. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +1 -1
  459. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  460. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +14 -3
  461. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  462. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +2 -1
  463. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -1
  464. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +16 -0
  465. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -1
  466. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  467. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  468. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  469. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  470. package/package.json +7 -7
@@ -43,7 +43,8 @@ import { areExperimentalFeaturesEnabled } from "./experimental.js";
43
43
  import { exportSessionToHtml } from "./export-html/index.js";
44
44
  import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
45
45
  import { ModelUsabilityBudgetError, projectModelUsabilityBudget, } from "./extensions/builtin/compaction/model-usability-budget.js";
46
- import { resolveReserveTokens } from "./extensions/builtin/compaction/policy.js";
46
+ import { resolveEffectiveReserveTokens, resolveReserveTokens, shouldTriggerCompaction, } from "./extensions/builtin/compaction/policy.js";
47
+ import { createResumeCompactionRequirement, } from "./extensions/builtin/compaction/resume-admission.js";
47
48
  import { WAKE_SOURCE_STATE_EVENT } from "./extensions/builtin/monitor-state-event.js";
48
49
  import { CODEX_RESPONSES_API } from "./extensions/builtin/service-tier.js";
49
50
  import { deriveExtensionRegistrationId } from "./extensions/builtin/tool-search/engine/marker.js";
@@ -1137,6 +1138,31 @@ export class AgentSession {
1137
1138
  }
1138
1139
  _incrementMessageRevision() {
1139
1140
  this._messageRevision++;
1141
+ // A revision bump alone is not evidence that the rejected context changed:
1142
+ // releasing here let a synthetic bump retry the unchanged oversized context
1143
+ // (#7921 case 6). Release only once the context actually shrank.
1144
+ this._releaseBlockedPostCompactionAdmissionIfReduced();
1145
+ }
1146
+ /** Byte-derived size of the context an admission decision would carry. */
1147
+ _blockedAdmissionContentTokens() {
1148
+ return estimateMessagesTokens(filterContextExcludedMessages(this.agent.state.messages));
1149
+ }
1150
+ /** A compaction that genuinely reduced the context clears the blocked state. */
1151
+ _releaseBlockedPostCompactionAdmissionIfReduced() {
1152
+ const blocked = this._blockedPostCompactionAssistant;
1153
+ if (blocked === undefined)
1154
+ return;
1155
+ if (this._blockedAdmissionContentTokens() < blocked.contentTokens) {
1156
+ this._blockedPostCompactionAssistant = undefined;
1157
+ }
1158
+ }
1159
+ /**
1160
+ * Unconditional release for manual `/compact`, the user's explicit remedy. An
1161
+ * ordinary user prompt is deliberately not a release: it only adds context, so
1162
+ * it cannot make the rejected context admissible, and the pre-prompt gate
1163
+ * already owns its own fail-closed rejection for that route.
1164
+ */
1165
+ _releaseBlockedPostCompactionAdmission() {
1140
1166
  this._blockedPostCompactionAssistant = undefined;
1141
1167
  }
1142
1168
  getMessageRevision() {
@@ -1386,7 +1412,11 @@ export class AgentSession {
1386
1412
  return undefined;
1387
1413
  }
1388
1414
  const model = this.model;
1389
- if (!model || this._isAssistantFromBeforeLatestCompaction(message)) {
1415
+ // Narrowed to the stale usage number itself: pre-boundary provenance does
1416
+ // not exempt a context whose own content already exceeds the policy.
1417
+ if (!model)
1418
+ return undefined;
1419
+ if (this._isAssistantFromBeforeLatestCompaction(message) && !this._exceedsPolicyByContentEstimate()) {
1390
1420
  return undefined;
1391
1421
  }
1392
1422
  const sameModel = isSameOverflowSource(message, model, this._modelRuntime.getCompatibilityRequestConfig(model).upstreamModelId);
@@ -1422,13 +1452,31 @@ export class AgentSession {
1422
1452
  if (compactionEntry &&
1423
1453
  usageMessage?.role === "assistant" &&
1424
1454
  this._isAssistantFromBeforeLatestCompaction(usageMessage)) {
1425
- return undefined;
1455
+ // Drop only the stale usage number; the messages themselves still count.
1456
+ const contentTokens = estimateMessagesTokens(messages);
1457
+ return shouldCompact(contentTokens, model.contextWindow, settings) ? "threshold" : undefined;
1426
1458
  }
1427
1459
  }
1428
1460
  contextTokens = estimate.tokens;
1429
1461
  }
1430
1462
  return shouldCompact(contextTokens, model.contextWindow, settings) ? "threshold" : undefined;
1431
1463
  }
1464
+ /**
1465
+ * Content measured by bytes, ignoring every provider usage number. The
1466
+ * stale-usage exemptions below only claim that a usage figure measured before
1467
+ * the accepted compaction boundary is not evidence of current pressure; they
1468
+ * must not exempt the messages themselves, because fresh post-boundary content
1469
+ * (a large tool result, late steering) is measurable without any usage report
1470
+ * (#7921 case 5).
1471
+ */
1472
+ _exceedsPolicyByContentEstimate() {
1473
+ const model = this.model;
1474
+ if (!model)
1475
+ return false;
1476
+ const settings = this._getCompactionSettings();
1477
+ const contextTokens = estimateMessagesTokens(filterContextExcludedMessages(this.agent.state.messages));
1478
+ return shouldCompact(contextTokens, model.contextWindow, settings);
1479
+ }
1432
1480
  _hasPendingPostCompactionUsageExemption(message) {
1433
1481
  return (this._skipNextPostCompactionAssistantCheck &&
1434
1482
  !this._assistantsPendingAtCompaction.has(message) &&
@@ -2025,6 +2073,13 @@ export class AgentSession {
2025
2073
  */
2026
2074
  subscribe(listener) {
2027
2075
  this._eventListeners.push(listener);
2076
+ if (this._resumeCompactionRequirement !== undefined) {
2077
+ listener({
2078
+ type: "resume_compaction_required",
2079
+ projection: this._resumeCompactionRequirement.projection,
2080
+ notice: this._resumeCompactionRequirement.notice,
2081
+ });
2082
+ }
2028
2083
  for (const source of this.settingsManager.getSelectedSettingsSources()) {
2029
2084
  listener({ type: "settings_source_selected", ...source });
2030
2085
  }
@@ -3659,6 +3714,10 @@ export class AgentSession {
3659
3714
  if (!projection.usable)
3660
3715
  throw new ModelUsabilityBudgetError(projection);
3661
3716
  }
3717
+ /** Admit an oversized restored transcript so the normal pre-provider compaction can run. */
3718
+ admitResumeCompactionRequired(projection) {
3719
+ this._resumeCompactionRequirement = createResumeCompactionRequirement(projection);
3720
+ }
3662
3721
  _getDownswitchLiveContextTokens(model) {
3663
3722
  const currentModel = this.model;
3664
3723
  if (!currentModel)
@@ -4285,6 +4344,9 @@ export class AgentSession {
4285
4344
  const model = this.model;
4286
4345
  if (!model)
4287
4346
  throw new Error(formatNoModelSelectedMessage());
4347
+ // Manual compaction is the user's explicit remedy for a blocked admission
4348
+ // (#7921 case 6).
4349
+ this._releaseBlockedPostCompactionAdmission();
4288
4350
  const pathEntries = this.sessionManager.getBranch();
4289
4351
  const settings = cursorOverflowCompactionSettings(this._getCompactionSettings(), model.provider, "manual");
4290
4352
  if (!prepareCompaction(pathEntries, settings)) {
@@ -4842,14 +4904,34 @@ export class AgentSession {
4842
4904
  * @returns Whether the post-run loop should call `agent.continue()` for overflow recovery or queued messages
4843
4905
  */
4844
4906
  async _enforceCompactionBeforeProvider(assistantMessage, skipAbortedCheck, inlineReason, retryAfterCompaction = false) {
4907
+ this._releaseBlockedPostCompactionAdmissionIfReduced();
4845
4908
  const blockedAdmission = this._blockedPostCompactionAssistant;
4846
- if (blockedAdmission !== undefined &&
4847
- blockedAdmission.assistant === assistantMessage &&
4848
- blockedAdmission.revision === this._messageRevision) {
4909
+ if (blockedAdmission !== undefined && blockedAdmission.assistant === assistantMessage) {
4849
4910
  throw new RequiredCompactionError();
4850
4911
  }
4851
4912
  const settings = this._getCompactionSettings();
4852
4913
  const model = this.model;
4914
+ if (this._resumeCompactionRequirement !== undefined) {
4915
+ if (!model)
4916
+ throw new RequiredCompactionError();
4917
+ const compacted = await this._runPrePromptCompaction(assistantMessage, skipAbortedCheck, inlineReason);
4918
+ if (!compacted)
4919
+ throw new RequiredCompactionError();
4920
+ const currentContext = estimateContextTokens(filterContextExcludedMessages(this.sessionManager.buildSessionContext().messages)).tokens;
4921
+ const remainingProjection = projectModelUsabilityBudget({
4922
+ model,
4923
+ systemPrompt: this.agent.state.systemPrompt,
4924
+ tools: this.agent.state.tools,
4925
+ liveContextTokens: currentContext,
4926
+ compaction: settings,
4927
+ includeSpeculationLead: false,
4928
+ admission: "resume",
4929
+ });
4930
+ if (!remainingProjection.usable)
4931
+ throw new RequiredCompactionError();
4932
+ this._resumeCompactionRequirement = undefined;
4933
+ return true;
4934
+ }
4853
4935
  const contextTokens = estimateContextTokens(filterContextExcludedMessages(this.sessionManager.buildSessionContext().messages)).tokens;
4854
4936
  const compacted = assistantMessage
4855
4937
  ? await this._checkCompaction(assistantMessage, skipAbortedCheck, inlineReason, retryAfterCompaction)
@@ -4877,12 +4959,28 @@ export class AgentSession {
4877
4959
  }
4878
4960
  throw new RequiredCompactionError();
4879
4961
  }
4962
+ /**
4963
+ * Pending queued input the provider will also carry on this turn. Steering and
4964
+ * follow-up text enqueued after the admission projection was assembled - by a
4965
+ * `before_agent_start` handler, an extension action, or the user racing the
4966
+ * gate - is drained into the same run, so the final gate must measure it
4967
+ * (#7921 case 5).
4968
+ */
4969
+ _pendingQueuedInputMessages() {
4970
+ const timestamp = Date.now();
4971
+ return [...this._steeringMessages, ...this._followUpMessages].map((text) => ({
4972
+ role: "user",
4973
+ content: [{ type: "text", text }],
4974
+ timestamp,
4975
+ }));
4976
+ }
4880
4977
  /**
4881
4978
  * The normal pre-prompt check only estimates persisted session context. This
4882
4979
  * final gate also includes turn-local messages which the provider will see:
4883
- * the current prompt, next-turn custom messages, and before_agent_start
4884
- * additions. Compaction rewrites only session context, so callers retain and
4885
- * reapply their already-assembled one-shot additions after it succeeds.
4980
+ * the current prompt, next-turn custom messages, before_agent_start additions,
4981
+ * and steering or follow-up input queued after that projection was assembled.
4982
+ * Compaction rewrites only session context, so callers retain and reapply
4983
+ * their already-assembled one-shot additions after it succeeds.
4886
4984
  */
4887
4985
  async _enforceFinalProviderAdmission(messages) {
4888
4986
  // User-only prompts are deliberately admitted without this gate: prompt
@@ -4890,18 +4988,24 @@ export class AgentSession {
4890
4988
  // (issues #531/#886), so oversized user prompts rely on threshold
4891
4989
  // compaction — which also samples the local transcript estimate — and on
4892
4990
  // provider-overflow recovery. This gate closes the separate gap opened by
4893
- // turn-local custom additions, which the pre-prompt check cannot observe.
4894
- if (!messages.some((message) => message.role === "custom"))
4991
+ // turn-local custom additions and by late queued input, neither of which the
4992
+ // pre-prompt check can observe.
4993
+ const lateQueuedMessages = this._pendingQueuedInputMessages();
4994
+ if (!messages.some((message) => message.role === "custom") && lateQueuedMessages.length === 0)
4895
4995
  return;
4896
4996
  const model = this.model;
4897
4997
  if (!model)
4898
4998
  return;
4899
4999
  const settings = this._getCompactionSettings();
4900
- const reserveTokens = settings.reserveScalingEnabled === false
4901
- ? settings.reserveTokens
4902
- : resolveReserveTokens(model.contextWindow, settings.reserveTokens);
5000
+ const reserveTokens = resolveEffectiveReserveTokens(model.contextWindow, settings);
4903
5001
  const isOversized = () => {
4904
- const providerMessages = filterContextExcludedMessages([...this.agent.state.messages, ...messages]);
5002
+ const providerMessages = filterContextExcludedMessages([
5003
+ ...this.agent.state.messages,
5004
+ ...messages,
5005
+ // Re-read the queues on every sample: this closure is evaluated again
5006
+ // after compaction, when more input may have arrived.
5007
+ ...this._pendingQueuedInputMessages(),
5008
+ ]);
4905
5009
  const estimate = estimateContextTokens(providerMessages);
4906
5010
  const usageMessage = estimate.lastUsageIndex === null ? undefined : providerMessages[estimate.lastUsageIndex];
4907
5011
  // Kept assistant usage can describe the pre-compaction request. Once a
@@ -4945,7 +5049,12 @@ export class AgentSession {
4945
5049
  // compaction boundary. This prevents a stale pre-compaction usage/error
4946
5050
  // from retriggering compaction on the first prompt after compaction.
4947
5051
  const compactionEntry = getLatestCompactionEntry(this.sessionManager.getBranch());
4948
- if (this._isAssistantFromBeforeLatestCompaction(assistantMessage)) {
5052
+ // The inline (pre-prompt) caller re-samples the current context itself and
5053
+ // owns the fail-closed rejection, so only the automatic route needs the
5054
+ // narrowed exemption here: fresh post-boundary content still counts even
5055
+ // though this message's own usage predates the boundary (#7921 case 5).
5056
+ if (this._isAssistantFromBeforeLatestCompaction(assistantMessage) &&
5057
+ (inlineReason !== undefined || !this._exceedsPolicyByContentEstimate())) {
4949
5058
  return false;
4950
5059
  }
4951
5060
  // Case 1: Overflow - LLM returned context overflow error.
@@ -4980,7 +5089,7 @@ export class AgentSession {
4980
5089
  getLatestCompactionEntry(this.sessionManager.getBranch()) !== null) {
4981
5090
  this._blockedPostCompactionAssistant = {
4982
5091
  assistant: assistantMessage,
4983
- revision: this._messageRevision,
5092
+ contentTokens: this._blockedAdmissionContentTokens(),
4984
5093
  };
4985
5094
  }
4986
5095
  return compacted;
@@ -5046,6 +5155,7 @@ export class AgentSession {
5046
5155
  // This ensures sessions that hit persistent API errors (e.g. 529) or malformed zero-usage
5047
5156
  // responses can still compact and do not reset context accounting.
5048
5157
  let contextTokens;
5158
+ let staleUsageContentTokens;
5049
5159
  if (inlineReason) {
5050
5160
  const messages = filterContextExcludedMessages(this.sessionManager.buildSessionContext().messages);
5051
5161
  contextTokens = estimateContextTokens(messages).tokens;
@@ -5066,10 +5176,13 @@ export class AgentSession {
5066
5176
  if (compactionEntry &&
5067
5177
  usageMsg.role === "assistant" &&
5068
5178
  this._isAssistantFromBeforeLatestCompaction(usageMsg)) {
5069
- return false;
5179
+ // Drop only the stale usage number; the messages themselves still count.
5180
+ staleUsageContentTokens = estimateMessagesTokens(messages);
5181
+ if (!shouldCompact(staleUsageContentTokens, contextWindow, settings))
5182
+ return false;
5070
5183
  }
5071
5184
  }
5072
- contextTokens = estimate.tokens;
5185
+ contextTokens = staleUsageContentTokens ?? estimate.tokens;
5073
5186
  }
5074
5187
  }
5075
5188
  if (shouldCompact(contextTokens, contextWindow, settings)) {
@@ -5084,7 +5197,7 @@ export class AgentSession {
5084
5197
  getLatestCompactionEntry(this.sessionManager.getBranch()) !== null) {
5085
5198
  this._blockedPostCompactionAssistant = {
5086
5199
  assistant: assistantMessage,
5087
- revision: this._messageRevision,
5200
+ contentTokens: this._blockedAdmissionContentTokens(),
5088
5201
  };
5089
5202
  }
5090
5203
  return compacted;
@@ -5177,11 +5290,27 @@ export class AgentSession {
5177
5290
  const contextTokens = usageMessage?.role === "assistant" && this._isAssistantFromBeforeLatestCompaction(usageMessage)
5178
5291
  ? estimateMessagesTokens(canonicalMessages)
5179
5292
  : estimate.tokens;
5180
- if (!shouldCompact(contextTokens, model.contextWindow, settings))
5293
+ // An explicit user prompt passes the proactive policy in the compaction
5294
+ // extension's before_agent_start, which automatic continuations never emit.
5295
+ // Sampling the same predicate here makes both routes compact at the same
5296
+ // usage instead of letting a continuation ride past the threshold up to the
5297
+ // hard valve (#7921 case 4).
5298
+ const atHardLimit = shouldCompact(contextTokens, model.contextWindow, settings);
5299
+ const overProactiveThreshold = shouldTriggerCompaction({
5300
+ tokens: contextTokens,
5301
+ contextWindow: model.contextWindow,
5302
+ percent: model.contextWindow > 0 ? (contextTokens / model.contextWindow) * 100 : 0,
5303
+ }, model.contextWindow, settings);
5304
+ if (!atHardLimit && !overProactiveThreshold)
5181
5305
  return;
5182
5306
  const compacted = await this._runPrePromptCompaction(this._findLastAssistantMessage(), true, "pre_prompt");
5183
5307
  if (!compacted) {
5184
- if (this._isCompactionOnCooldown() || this._isCompactionDelegated() || this._hasSupersedingCompactionClaim()) {
5308
+ // Proactive pressure alone must never brick an automatic continuation:
5309
+ // only the hard reserve valve stays fail-closed (#531/#886).
5310
+ if (!atHardLimit ||
5311
+ this._isCompactionOnCooldown() ||
5312
+ this._isCompactionDelegated() ||
5313
+ this._hasSupersedingCompactionClaim()) {
5185
5314
  return;
5186
5315
  }
5187
5316
  throw new RequiredCompactionError();
@@ -5675,6 +5804,7 @@ export class AgentSession {
5675
5804
  }, {
5676
5805
  getModel: () => this.model,
5677
5806
  getServiceTier: () => this.serviceTier,
5807
+ getEffectiveServiceTier: () => this.effectiveServiceTier,
5678
5808
  getScopedModels: () => this._scopedModels,
5679
5809
  isIdle: () => this.isIdle,
5680
5810
  getAgentDir: () => this._agentDir,
@@ -6182,6 +6312,14 @@ export class AgentSession {
6182
6312
  !message.content.some((content) => content.type === "toolCall") &&
6183
6313
  this._retryFallback.canTryFallback());
6184
6314
  }
6315
+ _takeNativeToolSearchInjectionFailure() {
6316
+ try {
6317
+ return getToolSearchService().takeNativeInjectionFailure();
6318
+ }
6319
+ catch {
6320
+ return null;
6321
+ }
6322
+ }
6185
6323
  _getProviderRetryDelayMs(errorMessage) {
6186
6324
  const markerMs = parseRetryAfterMsMarker(errorMessage);
6187
6325
  if (markerMs !== undefined)
@@ -6290,6 +6428,7 @@ export class AgentSession {
6290
6428
  const hardErrorFallback = options.hardErrorFallback === true;
6291
6429
  const sameModelRemint = options.sameModelRemint === true;
6292
6430
  let switchedFallback = false;
6431
+ let sameModelNativeRecovery = false;
6293
6432
  let is429TierRouted = false;
6294
6433
  let hintTierDelayMs;
6295
6434
  const tryFallback = async (reason, failure) => {
@@ -6322,25 +6461,38 @@ export class AgentSession {
6322
6461
  }
6323
6462
  }
6324
6463
  else if (hardErrorFallback) {
6325
- // A non-retryable provider failure must never replay on the same model.
6326
- // Billing-class failures never recover on this account, so the fallback
6327
- // switch pins as the session model instead of reverting after the cooldown.
6328
- const reason = isBillingErrorMessage(errorMessage) ? "billing" : "hard-error";
6329
- switchedFallback = await tryFallback(reason, { errorMessage });
6330
- if (!switchedFallback) {
6331
- const exhaustedChainKey = this._retryFallback.exhaustedChainKey;
6332
- if (exhaustedChainKey) {
6333
- this._emit({
6334
- type: "retry_fallback_exhausted",
6335
- chainKey: exhaustedChainKey,
6336
- lastError: errorMessage,
6337
- });
6464
+ // A rejected native tool-search request is recoverable in place: the
6465
+ // adapter is disabled for the session on the 400, so the SAME model can
6466
+ // succeed on the immediate next attempt and the fallback chain must not
6467
+ // demote the user to a weaker model. The pending flag is consumed once,
6468
+ // so a second rejection takes the ordinary hard-error path below.
6469
+ const nativeSearchFailure = this._takeNativeToolSearchInjectionFailure();
6470
+ if (nativeSearchFailure !== null) {
6471
+ sameModelNativeRecovery = true;
6472
+ // The recovery starts fresh, mirroring the fallback branch's attempt bookkeeping.
6473
+ this._retryAttempt = 1;
6474
+ }
6475
+ else {
6476
+ // A non-retryable provider failure must never replay on the same model.
6477
+ // Billing-class failures never recover on this account, so the fallback
6478
+ // switch pins as the session model instead of reverting after the cooldown.
6479
+ const reason = isBillingErrorMessage(errorMessage) ? "billing" : "hard-error";
6480
+ switchedFallback = await tryFallback(reason, { errorMessage });
6481
+ if (!switchedFallback) {
6482
+ const exhaustedChainKey = this._retryFallback.exhaustedChainKey;
6483
+ if (exhaustedChainKey) {
6484
+ this._emit({
6485
+ type: "retry_fallback_exhausted",
6486
+ chainKey: exhaustedChainKey,
6487
+ lastError: errorMessage,
6488
+ });
6489
+ }
6490
+ this._resolveRetry();
6491
+ return "not-handled";
6338
6492
  }
6339
- this._resolveRetry();
6340
- return "not-handled";
6493
+ // The fallback starts fresh; the failed model's transient attempts do not carry over.
6494
+ this._retryAttempt = 1;
6341
6495
  }
6342
- // The fallback starts fresh; the failed model's transient attempts do not carry over.
6343
- this._retryAttempt = 1;
6344
6496
  }
6345
6497
  else if (isRefusal) {
6346
6498
  // Refusals are only retried through a new chain candidate. They never use
@@ -6635,7 +6787,7 @@ export class AgentSession {
6635
6787
  // stay deterministic; provider-derived hints on the non-429 path remain
6636
6788
  // authoritative and fallback switches stay exact.
6637
6789
  const localExponentialMs = retryBackoffDelayMs(retryProfile.turn.backoff, this._retryAttempt, this._retryRandom());
6638
- const delayMs = switchedFallback
6790
+ const delayMs = switchedFallback || sameModelNativeRecovery
6639
6791
  ? 0
6640
6792
  : is429TierRouted
6641
6793
  ? (hintTierDelayMs ?? providerDelayMs ?? localExponentialMs)