@code-yeongyu/senpi 2026.8.29 → 2026.8.30-3

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 (346) hide show
  1. package/CHANGELOG.md +172 -0
  2. package/dist/core/agent-session.d.ts +47 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +406 -39
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/bash-executor.d.ts.map +1 -1
  7. package/dist/core/bash-executor.js +155 -37
  8. package/dist/core/bash-executor.js.map +1 -1
  9. package/dist/core/compaction/compaction-execution.d.ts +14 -0
  10. package/dist/core/compaction/compaction-execution.d.ts.map +1 -0
  11. package/dist/core/compaction/compaction-execution.js +121 -0
  12. package/dist/core/compaction/compaction-execution.js.map +1 -0
  13. package/dist/core/compaction/compaction-settings.d.ts +17 -0
  14. package/dist/core/compaction/compaction-settings.d.ts.map +1 -0
  15. package/dist/core/compaction/compaction-settings.js +17 -0
  16. package/dist/core/compaction/compaction-settings.js.map +1 -0
  17. package/dist/core/compaction/compaction.d.ts +13 -26
  18. package/dist/core/compaction/compaction.d.ts.map +1 -1
  19. package/dist/core/compaction/compaction.js +7 -136
  20. package/dist/core/compaction/compaction.js.map +1 -1
  21. package/dist/core/compaction/ideal-compaction-settings.d.ts +9 -0
  22. package/dist/core/compaction/ideal-compaction-settings.d.ts.map +1 -0
  23. package/dist/core/compaction/ideal-compaction-settings.js +7 -0
  24. package/dist/core/compaction/ideal-compaction-settings.js.map +1 -0
  25. package/dist/core/compaction-settings-access.d.ts +19 -0
  26. package/dist/core/compaction-settings-access.d.ts.map +1 -0
  27. package/dist/core/compaction-settings-access.js +10 -0
  28. package/dist/core/compaction-settings-access.js.map +1 -0
  29. package/dist/core/compaction-settings-resolver.d.ts +22 -0
  30. package/dist/core/compaction-settings-resolver.d.ts.map +1 -0
  31. package/dist/core/compaction-settings-resolver.js +46 -0
  32. package/dist/core/compaction-settings-resolver.js.map +1 -0
  33. package/dist/core/credential-accounts.d.ts.map +1 -1
  34. package/dist/core/credential-accounts.js +23 -9
  35. package/dist/core/credential-accounts.js.map +1 -1
  36. package/dist/core/credential-pool/env-slots.d.ts.map +1 -1
  37. package/dist/core/credential-pool/env-slots.js +2 -0
  38. package/dist/core/credential-pool/env-slots.js.map +1 -1
  39. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +18 -0
  40. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
  41. package/dist/core/extensions/builtin/compaction/context-pipeline.js +32 -0
  42. package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
  43. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -2
  44. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +164 -48
  46. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  47. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts +17 -0
  48. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts.map +1 -0
  49. package/dist/core/extensions/builtin/compaction/emergency-prune.js +64 -0
  50. package/dist/core/extensions/builtin/compaction/emergency-prune.js.map +1 -0
  51. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts +27 -0
  52. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts.map +1 -0
  53. package/dist/core/extensions/builtin/compaction/extension-wiring.js +84 -0
  54. package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -0
  55. package/dist/core/extensions/builtin/compaction/idle-retry.d.ts +1 -1
  56. package/dist/core/extensions/builtin/compaction/idle-retry.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/compaction/idle-retry.js +1 -1
  58. package/dist/core/extensions/builtin/compaction/idle-retry.js.map +1 -1
  59. package/dist/core/extensions/builtin/compaction/idle.d.ts +1 -0
  60. package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/compaction/idle.js +13 -2
  62. package/dist/core/extensions/builtin/compaction/idle.js.map +1 -1
  63. package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
  64. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/compaction/index.js +148 -150
  66. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  67. package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
  68. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/compaction/log.js +2 -0
  70. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  71. package/dist/core/extensions/builtin/compaction/model-selection.d.ts +14 -0
  72. package/dist/core/extensions/builtin/compaction/model-selection.d.ts.map +1 -0
  73. package/dist/core/extensions/builtin/compaction/model-selection.js +37 -0
  74. package/dist/core/extensions/builtin/compaction/model-selection.js.map +1 -0
  75. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts +30 -0
  76. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -0
  77. package/dist/core/extensions/builtin/compaction/model-usability-budget.js +74 -0
  78. package/dist/core/extensions/builtin/compaction/model-usability-budget.js.map +1 -0
  79. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts +9 -0
  80. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts.map +1 -0
  81. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js +2 -0
  82. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js.map +1 -0
  83. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -6
  84. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  85. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  86. package/dist/core/extensions/builtin/compaction/orchestration.d.ts +46 -0
  87. package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
  88. package/dist/core/extensions/builtin/compaction/orchestration.js +103 -0
  89. package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
  90. package/dist/core/extensions/builtin/compaction/policy.d.ts +12 -2
  91. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  92. package/dist/core/extensions/builtin/compaction/policy.js +52 -26
  93. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  94. package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts.map +1 -1
  95. package/dist/core/extensions/builtin/compaction/retained-message-safety.js +31 -8
  96. package/dist/core/extensions/builtin/compaction/retained-message-safety.js.map +1 -1
  97. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts +8 -0
  98. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts.map +1 -0
  99. package/dist/core/extensions/builtin/compaction/speculation-lead.js +17 -0
  100. package/dist/core/extensions/builtin/compaction/speculation-lead.js.map +1 -0
  101. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts +22 -0
  102. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts.map +1 -0
  103. package/dist/core/extensions/builtin/compaction/speculative-job.js +16 -0
  104. package/dist/core/extensions/builtin/compaction/speculative-job.js.map +1 -0
  105. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +22 -0
  106. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
  107. package/dist/core/extensions/builtin/compaction/speculative-summary.js +131 -0
  108. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -0
  109. package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -13
  110. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  111. package/dist/core/extensions/builtin/compaction/speculative.js +7 -196
  112. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  113. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +24 -0
  114. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -0
  115. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +25 -0
  116. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
  117. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +27 -0
  118. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
  119. package/dist/core/extensions/builtin/compaction/tool-admission.js +56 -0
  120. package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
  121. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts.map +1 -1
  122. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js +8 -28
  123. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
  124. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  125. package/dist/core/extensions/builtin/permission-system/external-dir.js +15 -5
  126. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  127. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/permission-system/parsers.js +16 -1
  129. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  130. package/dist/core/extensions/builtin/terminal/manager.d.ts +5 -0
  131. package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/terminal/manager.js +31 -3
  133. package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
  134. package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts +8 -0
  135. package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts.map +1 -0
  136. package/dist/core/extensions/builtin/terminal/monitor-permission.js +16 -0
  137. package/dist/core/extensions/builtin/terminal/monitor-permission.js.map +1 -0
  138. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +13 -0
  139. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  140. package/dist/core/extensions/builtin/terminal/monitor-registry.js +403 -3
  141. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  142. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +11 -0
  143. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  144. package/dist/core/extensions/builtin/terminal/runtime-session.js +18 -2
  145. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  146. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
  147. package/dist/core/extensions/builtin/terminal/session-bundle.js +1 -0
  148. package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
  149. package/dist/core/extensions/builtin/terminal/tools/kill-bash.d.ts.map +1 -1
  150. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js +5 -2
  151. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js.map +1 -1
  152. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +4 -0
  153. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
  154. package/dist/core/extensions/builtin/terminal/tools/monitor.js +40 -2
  155. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  156. package/dist/core/model-resolver.js +2 -2
  157. package/dist/core/model-resolver.js.map +1 -1
  158. package/dist/core/sdk.d.ts.map +1 -1
  159. package/dist/core/sdk.js +5 -0
  160. package/dist/core/sdk.js.map +1 -1
  161. package/dist/core/session-manager.d.ts.map +1 -1
  162. package/dist/core/session-manager.js +10 -1
  163. package/dist/core/session-manager.js.map +1 -1
  164. package/dist/core/settings-manager.d.ts +15 -85
  165. package/dist/core/settings-manager.d.ts.map +1 -1
  166. package/dist/core/settings-manager.js +15 -17
  167. package/dist/core/settings-manager.js.map +1 -1
  168. package/dist/core/settings-public-types.d.ts +11 -0
  169. package/dist/core/settings-public-types.d.ts.map +1 -0
  170. package/dist/core/settings-public-types.js +2 -0
  171. package/dist/core/settings-public-types.js.map +1 -0
  172. package/dist/core/settings-shapes.d.ts +36 -0
  173. package/dist/core/settings-shapes.d.ts.map +1 -0
  174. package/dist/core/settings-shapes.js +2 -0
  175. package/dist/core/settings-shapes.js.map +1 -0
  176. package/dist/core/shared-host-policy.d.ts +6 -0
  177. package/dist/core/shared-host-policy.d.ts.map +1 -0
  178. package/dist/core/shared-host-policy.js +7 -0
  179. package/dist/core/shared-host-policy.js.map +1 -0
  180. package/dist/core/terminal-settings.d.ts +22 -0
  181. package/dist/core/terminal-settings.d.ts.map +1 -0
  182. package/dist/core/terminal-settings.js +2 -0
  183. package/dist/core/terminal-settings.js.map +1 -0
  184. package/dist/core/tools/bash.d.ts.map +1 -1
  185. package/dist/core/tools/bash.js +97 -15
  186. package/dist/core/tools/bash.js.map +1 -1
  187. package/dist/core/tools/index.d.ts +1 -0
  188. package/dist/core/tools/index.d.ts.map +1 -1
  189. package/dist/core/tools/index.js +8 -0
  190. package/dist/core/tools/index.js.map +1 -1
  191. package/dist/core/tools/output-accumulator.d.ts +1 -1
  192. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  193. package/dist/core/tools/output-accumulator.js +76 -34
  194. package/dist/core/tools/output-accumulator.js.map +1 -1
  195. package/dist/index.d.ts +1 -1
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +1 -1
  198. package/dist/index.js.map +1 -1
  199. package/dist/main.d.ts.map +1 -1
  200. package/dist/main.js +17 -5
  201. package/dist/main.js.map +1 -1
  202. package/dist/modes/index.d.ts +1 -1
  203. package/dist/modes/index.d.ts.map +1 -1
  204. package/dist/modes/index.js +1 -1
  205. package/dist/modes/index.js.map +1 -1
  206. package/dist/modes/interactive/components/footer.d.ts +7 -0
  207. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  208. package/dist/modes/interactive/components/footer.js +34 -8
  209. package/dist/modes/interactive/components/footer.js.map +1 -1
  210. package/dist/modes/interactive/grok/chrome.d.ts +2 -0
  211. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
  212. package/dist/modes/interactive/grok/chrome.js.map +1 -1
  213. package/dist/modes/interactive/interactive-host-runtime.d.ts +132 -1
  214. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  215. package/dist/modes/interactive/interactive-host-runtime.js +633 -117
  216. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  217. package/dist/modes/interactive/interactive-mode.d.ts +7 -0
  218. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  219. package/dist/modes/interactive/interactive-mode.js +114 -2
  220. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  221. package/dist/modes/rpc/connection-handler.d.ts +8 -1
  222. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  223. package/dist/modes/rpc/connection-handler.js +158 -49
  224. package/dist/modes/rpc/connection-handler.js.map +1 -1
  225. package/dist/modes/rpc/host-ensure.d.ts +19 -0
  226. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  227. package/dist/modes/rpc/host-ensure.js +79 -15
  228. package/dist/modes/rpc/host-ensure.js.map +1 -1
  229. package/dist/modes/rpc/host-lifecycle.d.ts +29 -0
  230. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  231. package/dist/modes/rpc/host-lifecycle.js +96 -25
  232. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  233. package/dist/modes/rpc/host-watchdog.d.ts +2 -0
  234. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  235. package/dist/modes/rpc/host-watchdog.js +23 -12
  236. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  237. package/dist/modes/rpc/multi-session-host.js +6 -4
  238. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  239. package/dist/modes/rpc/rpc-client.d.ts +20 -4
  240. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  241. package/dist/modes/rpc/rpc-client.js +76 -17
  242. package/dist/modes/rpc/rpc-client.js.map +1 -1
  243. package/dist/modes/rpc/rpc-input-validation.d.ts +1 -0
  244. package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
  245. package/dist/modes/rpc/rpc-input-validation.js +66 -0
  246. package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
  247. package/dist/modes/rpc/rpc-types.d.ts +86 -1
  248. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  249. package/dist/modes/rpc/rpc-types.js.map +1 -1
  250. package/dist/modes/rpc/session-binding.d.ts +1 -0
  251. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  252. package/dist/modes/rpc/session-binding.js +21 -1
  253. package/dist/modes/rpc/session-binding.js.map +1 -1
  254. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  255. package/dist/modes/rpc/session-command-router.js +1 -0
  256. package/dist/modes/rpc/session-command-router.js.map +1 -1
  257. package/dist/modes/rpc/session-event-writer.d.ts +2 -0
  258. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  259. package/dist/modes/rpc/session-event-writer.js +54 -7
  260. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  261. package/dist/modes/rpc/session-extension-ui-requests.d.ts +1 -0
  262. package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
  263. package/dist/modes/rpc/session-extension-ui-requests.js +5 -0
  264. package/dist/modes/rpc/session-extension-ui-requests.js.map +1 -1
  265. package/dist/modes/rpc/session-registry.d.ts +10 -2
  266. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  267. package/dist/modes/rpc/session-registry.js +58 -4
  268. package/dist/modes/rpc/session-registry.js.map +1 -1
  269. package/dist/modes/rpc/socket-event-fanout.d.ts +22 -0
  270. package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -0
  271. package/dist/modes/rpc/socket-event-fanout.js +84 -0
  272. package/dist/modes/rpc/socket-event-fanout.js.map +1 -0
  273. package/docs/rpc.md +22 -2
  274. package/docs/settings.md +34 -0
  275. package/docs/windows.md +2 -0
  276. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +62 -0
  277. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  278. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +139 -90
  279. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +4 -4
  280. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  281. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +40 -20
  282. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  283. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +3 -3
  284. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  285. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  286. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts +1 -1
  287. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
  288. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +28 -9
  289. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
  290. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  291. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  292. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +67 -38
  293. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  294. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts +20 -0
  295. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts.map +1 -0
  296. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js +443 -0
  297. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -0
  298. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +2 -0
  299. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  300. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +2 -0
  301. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  302. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1 -1
  303. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  304. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  305. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  306. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  307. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  308. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  309. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  310. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  311. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  312. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  313. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  314. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  315. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  316. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  317. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  318. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  319. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts +42 -0
  320. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts.map +1 -0
  321. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js +34 -0
  322. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js.map +1 -0
  323. package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts +8 -0
  324. package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts.map +1 -0
  325. package/node_modules/@earendil-works/pi-pty/dist/screen-text.js +51 -0
  326. package/node_modules/@earendil-works/pi-pty/dist/screen-text.js.map +1 -0
  327. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts +45 -0
  328. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
  329. package/node_modules/@earendil-works/pi-pty/dist/screen.js +178 -55
  330. package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
  331. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  332. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  333. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +7 -0
  334. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  335. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +5 -0
  336. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  337. package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts +1 -1
  338. package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts.map +1 -1
  339. package/node_modules/@earendil-works/pi-tui/dist/mux.js +2 -2
  340. package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
  341. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +1 -0
  342. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  343. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +19 -0
  344. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  345. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  346. package/package.json +7 -7
@@ -1,112 +1,34 @@
1
- import { randomUUID } from "node:crypto";
2
1
  import { createWarmAnchorSnapshot, isWarmSummaryAnchorValid } from "../../../compaction/warm-anchor.js";
3
- import { convertToLlm } from "../../../messages.js";
4
2
  import * as checkpointState from "./checkpoint-state.js";
5
3
  import * as breaker from "./circuit-breaker.js";
6
- import { BUILTIN_CONTEXT_REDUCTION_OPTIONS, reduceContextMessages, shouldApplyContextReduction, } from "./context-reduction.js";
4
+ import { buildCompactionContext } from "./context-pipeline.js";
7
5
  import { createDegradationMonitorState, handleMessageEnd, handleTurnEnd, RECOVERY_INSTRUCTIONS, resetOnSessionCompact, } from "./degradation-monitor.js";
8
6
  import { classifyRequiredCompactionFallbackFailure, createRequiredCompactionFallback, } from "./deterministic-fallback.js";
9
7
  import * as idle from "./idle.js";
10
8
  import * as idleRetry from "./idle-retry.js";
11
9
  import { CLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE, collectCompactBoundaryEntries, createCompactionLanePolicy, SDK_NATIVE_LANE_REJECTION_REASON, } from "./lane-policy.js";
12
10
  import { createCompactionLogger } from "./log.js";
13
- import { markOpenAiRemoteReplayBoundary, rewriteOpenAiPayloadWithRemoteCompaction, runOpenAiRemoteCompaction, SENPI_COMPACTION_EVENT, } from "./openai-remote.js";
11
+ import { handleCompactionModelSelect } from "./model-selection.js";
12
+ import { rewriteOpenAiPayloadWithRemoteCompaction, runOpenAiRemoteCompaction, SENPI_COMPACTION_EVENT, } from "./openai-remote.js";
14
13
  import { createOpenAiRemoteCompactionHeaders, isOpenAiRemoteCompactionModel, openAiRemoteCompactionOrigin, } from "./openai-remote-model.js";
14
+ import { resolveBeforeAgentStartMessage, resolveCompactionGeometry, resolveIdleWarmAction, resolveReminderSystemPrompt, shouldDeferGraceBand, } from "./orchestration.js";
15
15
  import * as cap from "./per-turn-cap.js";
16
16
  import * as policy from "./policy.js";
17
- import { repairOrphanedToolResults } from "./repair-tool-pairs.js";
18
17
  import * as restoration from "./restoration-tracker.js";
19
- import { applyGeneratedCompaction, createEmergencyPruneLatch, createSpeculativeCompactionSnapshot, getPromptVariant, hardLimitEmergencyPrune, runExtensionCompaction, SummaryGenerationError, } from "./speculative.js";
18
+ import { applyGeneratedCompaction, createEmergencyPruneLatch, createSpeculativeCompactionSnapshot, getPromptVariant, runExtensionCompaction, SummaryGenerationError, } from "./speculative.js";
19
+ import { trackSpeculativeJob } from "./speculative-job.js";
20
20
  import { createInitialState, resetTurnCounter } from "./state.js";
21
21
  import { resolveInheritedTaskIntent } from "./task-intent.js";
22
22
  import * as todoBridge from "./todo-bridge.js";
23
+ import { computeTokenBudgetReminder, createInitialReminderState, } from "./token-budget-reminder.js";
23
24
  import { isTransientSummarizationFailure } from "./transient-failure.js";
25
+ export { getPromptContextWindow } from "./extension-wiring.js";
26
+ import { createBlockingRemoteCompactionEvent, endCompactionFeedback, estimatePendingPromptTokens, getPromptContextWindow, isAbortedAssistantMessage, isMonitorableMessageEvent, isRequiredCompactionFallbackReason, linkAbortSignal, recentCheckpoint, withAdditionalTokens, } from "./extension-wiring.js";
24
27
  import { isIneffectiveCompaction } from "./yield.js";
25
28
  const DEFAULT_CONTEXT_WINDOW = 200_000;
26
29
  const EMERGENCY_COMPACTION_INSTRUCTIONS = "EMERGENCY: hard context limit reached. Produce an aggressive recovery summary that preserves current goal, constraints, files touched, tool outcomes, and exact next steps. Prefer concise factual state over transcript detail.";
27
30
  const PROACTIVE_COMPACTION_INSTRUCTIONS = "Proactively compact before the next agent turn.";
28
31
  const MAX_PENDING_METADATA = 8;
29
- const IMAGE_PROMPT_TOKEN_ESTIMATE = 1_200;
30
- const MAX_OUTPUT_RESERVE_RATIO = 0.5;
31
- function approxTokens(text) {
32
- return Math.ceil(text.length / 4);
33
- }
34
- function estimatePendingPromptTokens(event) {
35
- return approxTokens(event.prompt ?? "") + (event.images?.length ?? 0) * IMAGE_PROMPT_TOKEN_ESTIMATE;
36
- }
37
- export function getPromptContextWindow(contextWindow, maxTokens) {
38
- if (typeof maxTokens !== "number" || !Number.isFinite(maxTokens) || maxTokens <= 0 || contextWindow <= 0) {
39
- return contextWindow;
40
- }
41
- const outputReserve = Math.min(maxTokens, Math.floor(contextWindow * MAX_OUTPUT_RESERVE_RATIO));
42
- return contextWindow - outputReserve;
43
- }
44
- function withAdditionalTokens(usage, additionalTokens) {
45
- if (usage.tokens === null || additionalTokens <= 0)
46
- return usage;
47
- const tokens = usage.tokens + additionalTokens;
48
- return {
49
- ...usage,
50
- tokens,
51
- percent: usage.contextWindow > 0 ? (tokens / usage.contextWindow) * 100 : usage.percent,
52
- };
53
- }
54
- function isMonitorableMessageEvent(event) {
55
- return "content" in event.message && Array.isArray(event.message.content);
56
- }
57
- function isAbortedAssistantMessage(event) {
58
- return event.message.role === "assistant" && "stopReason" in event.message && event.message.stopReason === "aborted";
59
- }
60
- function isRequiredCompactionFallbackReason(reason) {
61
- return reason === "threshold" || reason === "overflow";
62
- }
63
- function recentCheckpoint(ctx) {
64
- const checkpoint = checkpointState.getLatestCheckpoint(ctx);
65
- if (!checkpoint?.timestamp)
66
- return null;
67
- return Date.now() - checkpoint.timestamp <= 60_000 ? checkpoint : null;
68
- }
69
- function shouldEndFeedback(result) {
70
- return !result.applied && result.reason !== "rejected";
71
- }
72
- function endCompactionFeedback(ctx, signal, result, remoteFallbackReason) {
73
- if (shouldEndFeedback(result)) {
74
- // Surface the concrete failure instead of the generic "Compaction did not
75
- // apply": the remote stage's reason (e.g. remote-compaction-timeout) and the
76
- // terminal local reason (unavailable / stale), so the decision log and TUI
77
- // show what actually happened. An aborted compaction renders "Compaction
78
- // cancelled" downstream and must not carry a failure message.
79
- const localReason = result.applied ? undefined : result.reason;
80
- const parts = [remoteFallbackReason, localReason].filter((part) => Boolean(part));
81
- const errorMessage = signal?.aborted || parts.length === 0
82
- ? undefined
83
- : `Compaction did not apply: ${parts.join("; local fallback ")}`;
84
- ctx.endCompaction?.({ reason: "extension", signal, aborted: signal?.aborted, errorMessage });
85
- }
86
- }
87
- function linkAbortSignal(source, target) {
88
- if (!source)
89
- return () => { };
90
- if (source.aborted) {
91
- target.abort();
92
- return () => { };
93
- }
94
- const abort = () => target.abort();
95
- source.addEventListener("abort", abort, { once: true });
96
- return () => source.removeEventListener("abort", abort);
97
- }
98
- function createBlockingRemoteCompactionEvent(ctx, snapshot, customInstructions, signal) {
99
- return {
100
- type: "session_before_compact",
101
- reason: "extension",
102
- willRetry: false,
103
- requestId: randomUUID(),
104
- preparation: snapshot.preparation,
105
- branchEntries: ctx.sessionManager.getBranch(),
106
- customInstructions,
107
- signal,
108
- };
109
- }
110
32
  export default function compactionExtension(pi, remoteCompactionDependencies = {}) {
111
33
  let state = createInitialState();
112
34
  const lanePolicy = createCompactionLanePolicy();
@@ -116,6 +38,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
116
38
  const restorationState = state.restoration ?? restoration.createRestorationTrackerState();
117
39
  state = { ...state, restoration: restorationState };
118
40
  let speculativeGeneration = 0;
41
+ let reminderState = createInitialReminderState();
119
42
  let speculativeJob;
120
43
  const pendingMetadata = new Map();
121
44
  let logger;
@@ -188,13 +111,23 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
188
111
  }
189
112
  const usage = ctx.getContextUsage();
190
113
  const contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
114
+ const settings = ctx.getCompactionSettings();
115
+ const breakerTripped = breaker.isTripped(state, Date.now());
191
116
  const retryDecision = {
192
117
  attempt: idleWarmupAttempt,
193
118
  transient: isTransientSummarizationFailure(failure, failure.message),
194
119
  isIdle: ctx.isIdle(),
195
- breakerTripped: breaker.isTripped(state, Date.now()),
196
- stillOverThreshold: usage !== undefined &&
197
- policy.shouldTriggerCompaction(usage, contextWindow, ctx.getCompactionSettings(), state.lastYield ?? undefined),
120
+ breakerTripped,
121
+ stillWarmEligible: idle.shouldWarmAtIdle({
122
+ willRetry: false,
123
+ aborted: false,
124
+ settings,
125
+ usage,
126
+ contextWindow,
127
+ breakerTripped,
128
+ lastYield: state.lastYield ?? undefined,
129
+ mode: ctx.mode,
130
+ }),
198
131
  };
199
132
  if (!idleRetry.shouldRetryIdleWarmup(retryDecision))
200
133
  return;
@@ -333,9 +266,14 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
333
266
  getLogger(ctx).debug("speculative_started", { generation, origin: "speculative" });
334
267
  const controller = new AbortController();
335
268
  const settled = runExtensionCompaction(ctx, snapshot, controller.signal).then((result) => ({ result, error: undefined }), (error) => ({ result: undefined, error: error instanceof Error ? error : new Error(String(error)) }));
336
- const promise = settled.then(({ result }) => result);
337
- const failure = settled.then(({ error }) => error);
338
- speculativeJob = { generation, snapshot, controller, promise, failure };
269
+ speculativeJob = trackSpeculativeJob({
270
+ generation,
271
+ snapshot,
272
+ controller,
273
+ settled,
274
+ armedAtTokens: ctx.getContextUsage()?.tokens ?? 0,
275
+ });
276
+ void settled.then(() => remoteCompactionDependencies.onSpeculativeJobSettled?.());
339
277
  }
340
278
  function capturePendingMetadata(requestId, ctx) {
341
279
  pendingMetadata.set(requestId, {
@@ -638,37 +576,16 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
638
576
  claimedWarmJob?.controller.abort();
639
577
  }
640
578
  });
641
- pi.on("model_select", (event, ctx) => {
642
- if (lanePolicy.disablesSenpiCompaction(ctx)) {
643
- invalidateSpeculativeCompaction(ctx);
644
- return;
645
- }
646
- const jobModel = speculativeJob?.snapshot.model;
647
- const selectedModel = ctx.model;
648
- const alreadySpeculatingForSelectedModel = jobModel !== undefined &&
649
- selectedModel !== undefined &&
650
- jobModel.api === selectedModel.api &&
651
- jobModel.provider === selectedModel.provider &&
652
- jobModel.id === selectedModel.id &&
653
- jobModel.baseUrl === selectedModel.baseUrl &&
654
- jobModel.contextWindow === selectedModel.contextWindow;
655
- if (!alreadySpeculatingForSelectedModel) {
656
- invalidateSpeculativeCompaction(ctx);
657
- }
658
- const previousWindow = event.previousModel?.contextWindow ?? 0;
659
- const contextWindow = ctx.model?.contextWindow ?? 0;
660
- if (previousWindow <= contextWindow)
661
- return;
662
- const usage = ctx.getContextUsage();
663
- if (!usage)
664
- return;
665
- if (breaker.isTripped(state, Date.now()))
666
- return;
667
- const settings = ctx.getCompactionSettings();
668
- if (policy.shouldStartSpeculativeCompaction(usage, contextWindow, settings, state.lastYield ?? undefined)) {
669
- startSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
670
- }
671
- });
579
+ pi.on("model_select", (event, ctx) => handleCompactionModelSelect({
580
+ event,
581
+ ctx,
582
+ state,
583
+ speculativeSnapshot: speculativeJob?.snapshot,
584
+ laneOwnsCompaction: lanePolicy.disablesSenpiCompaction(ctx),
585
+ breakerTripped: breaker.isTripped(state, Date.now()),
586
+ invalidate: () => invalidateSpeculativeCompaction(ctx),
587
+ start: () => startSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS),
588
+ }));
672
589
  pi.on("session_compact", async (event, ctx) => {
673
590
  const compactEvent = event;
674
591
  invalidateSpeculativeCompaction(ctx);
@@ -679,6 +596,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
679
596
  const keptEntries = firstKeptIndex === -1 ? [] : branchEntries.slice(firstKeptIndex);
680
597
  state = cap.incrementAccepted(state);
681
598
  state = breaker.recordSuccess(state);
599
+ reminderState = createInitialReminderState();
682
600
  const details = compactEvent.compactionEntry.details;
683
601
  const sy = details?.structuralYield;
684
602
  if (sy && typeof sy.savedTokens === "number" && typeof sy.savingsRatio === "number") {
@@ -710,7 +628,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
710
628
  compactionEntryId: compactEvent.compactionEntry.id,
711
629
  contextWindow: usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
712
630
  usageTokens: usage?.tokens ?? null,
713
- reserveTokens: settings.reserveTokens,
631
+ reserveTokens: policy.resolveEffectiveReserveTokens(usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW, settings),
714
632
  settings,
715
633
  keptMessages: keptEntries.flatMap((entry) => {
716
634
  if (entry.type !== "message")
@@ -721,7 +639,11 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
721
639
  }
722
640
  return;
723
641
  }
724
- state = breaker.recordFailure(state, Date.now(), { route: compactEvent.reason });
642
+ if (compactEvent.rejectionCause === "external-owner")
643
+ return;
644
+ if (!lanePolicy.disablesSenpiCompaction(ctx)) {
645
+ state = breaker.recordFailure(state, Date.now(), { route: compactEvent.reason });
646
+ }
725
647
  });
726
648
  pi.on("before_agent_start", async (event, ctx) => {
727
649
  sessionIdleSinceAgentEnd = false;
@@ -736,9 +658,14 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
736
658
  // the circuit breaker never blocks that valve for senpi-owned lanes.
737
659
  const laneOwnsCompaction = lanePolicy.disablesSenpiCompaction(ctx);
738
660
  const breakerCoolingDown = breaker.isTripped(state, Date.now()) || laneOwnsCompaction;
661
+ const { reserveTokens, thresholdTokens, leadTokens } = resolveCompactionGeometry({
662
+ contextWindow,
663
+ settings,
664
+ lastYield: state.lastYield ?? undefined,
665
+ });
739
666
  if (!laneOwnsCompaction &&
740
667
  usage &&
741
- policy.isAtHardLimit(usage, contextWindow, settings.reserveTokens, pendingPromptTokens)) {
668
+ policy.isAtHardLimit(usage, contextWindow, reserveTokens, pendingPromptTokens)) {
742
669
  getLogger(ctx).debug("hard_limit_trigger", {
743
670
  contextWindow,
744
671
  tokens: usage.tokens ?? 0,
@@ -754,42 +681,84 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
754
681
  tokens: usageWithPendingPrompt.tokens ?? 0,
755
682
  threshold: settings.reserveTokens,
756
683
  });
757
- await applyBlockingCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
684
+ if (!shouldDeferGraceBand({
685
+ tokens: usageWithPendingPrompt.tokens ?? 0,
686
+ thresholdTokens,
687
+ leadTokens,
688
+ contextWindow,
689
+ reserveTokens,
690
+ compactionInFlight: speculativeJob !== undefined && !speculativeJob.completed,
691
+ graceBandEnabled: settings.graceBandEnabled,
692
+ })) {
693
+ await applyBlockingCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
694
+ }
695
+ else {
696
+ getLogger(ctx).debug("grace_deferred", {
697
+ tokens: usageWithPendingPrompt.tokens ?? 0,
698
+ threshold: thresholdTokens,
699
+ });
700
+ }
758
701
  }
759
702
  else if (!breakerCoolingDown &&
703
+ !isOpenAiRemoteCompactionModel(ctx.model) &&
760
704
  usageWithPendingPrompt &&
761
- policy.shouldStartSpeculativeCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined)) {
705
+ policy.shouldStartSpeculativeCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined, leadTokens)) {
762
706
  getLogger(ctx).debug("emergency_prune", {
763
707
  route: "context-event",
764
708
  tokens: usageWithPendingPrompt.tokens ?? 0,
765
709
  });
766
710
  startSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
767
711
  }
768
- return message ? { message } : undefined;
712
+ const reminder = computeTokenBudgetReminder({
713
+ contextTokens: usageWithPendingPrompt?.tokens ?? 0,
714
+ contextWindow,
715
+ thresholdTokens,
716
+ leadTokens,
717
+ compactionEpoch: speculativeGeneration,
718
+ state: reminderState,
719
+ });
720
+ reminderState = reminder.nextState;
721
+ const deliveredMessage = resolveBeforeAgentStartMessage({
722
+ message,
723
+ reminder: reminder.message,
724
+ reminderEnabled: settings.reminderEnabled,
725
+ });
726
+ const reminderSystemPrompt = resolveReminderSystemPrompt({
727
+ systemPrompt: event.systemPrompt,
728
+ reminder: !message ? reminder.message : undefined,
729
+ reminderEnabled: settings.reminderEnabled,
730
+ });
731
+ if (!deliveredMessage && !reminderSystemPrompt)
732
+ return undefined;
733
+ return {
734
+ ...(deliveredMessage ? { message: deliveredMessage } : {}),
735
+ ...(reminderSystemPrompt ? { systemPrompt: reminderSystemPrompt } : {}),
736
+ };
769
737
  });
770
738
  pi.on("context", (event, ctx) => {
771
739
  const usage = ctx.getContextUsage();
740
+ const settings = ctx.getCompactionSettings();
772
741
  const contextWindow = usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
773
- const promptContextWindow = getPromptContextWindow(contextWindow, ctx.model?.maxTokens);
774
- const sourceMessages = shouldApplyContextReduction({
775
- usageTokens: usage?.tokens ?? null,
776
- contextWindow,
777
- isProviderNativeCompactionPath: isOpenAiRemoteCompactionModel(ctx.model) || lanePolicy.disablesSenpiCompaction(ctx),
778
- })
779
- ? reduceContextMessages(event.messages, BUILTIN_CONTEXT_REDUCTION_OPTIONS).messages
780
- : event.messages;
781
- // The claude-sdk-oauth lane stands down from senpi compaction entirely:
782
- // destructively pruning the provider context near the hard limit would
783
- // break the resident SDK session's continuity the same way the gated
784
- // reduction lane would.
785
- const emergency = lanePolicy.disablesSenpiCompaction(ctx)
786
- ? { messages: sourceMessages, needsAggressiveCompaction: false }
787
- : hardLimitEmergencyPrune(sourceMessages, promptContextWindow, emergencyPruneLatch);
788
- const marked = markOpenAiRemoteReplayBoundary(emergency.messages, {
789
- model: ctx.model,
790
- branchEntries: ctx.sessionManager.getBranch(),
791
- });
792
- return { messages: repairOrphanedToolResults(convertToLlm(marked)) };
742
+ const laneOwnsCompaction = lanePolicy.disablesSenpiCompaction(ctx);
743
+ const breakerFallback = !laneOwnsCompaction &&
744
+ breaker.isTripped(state, Date.now()) &&
745
+ usage?.tokens !== null &&
746
+ usage !== undefined &&
747
+ usage.tokens >= contextWindow * policy.computeEffectiveThreshold(contextWindow, state.lastYield ?? undefined);
748
+ if (breakerFallback)
749
+ getLogger(ctx).debug("breaker_deterministic_fallback", { route: "context-event", tokens: usage.tokens ?? 0 });
750
+ return {
751
+ messages: buildCompactionContext({
752
+ event,
753
+ ctx,
754
+ contextWindow,
755
+ promptContextWindow: getPromptContextWindow(contextWindow, ctx.model?.maxTokens),
756
+ toolAdmissionEnabled: settings.toolAdmissionEnabled !== false,
757
+ breakerFallback,
758
+ laneOwnsCompaction,
759
+ emergencyPruneLatch,
760
+ }),
761
+ };
793
762
  });
794
763
  pi.on("before_provider_request", async (event, ctx) => {
795
764
  const model = event.model ?? ctx.model;
@@ -850,6 +819,35 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
850
819
  armIdleWarmupRetry(ctx);
851
820
  armIdleApply(ctx);
852
821
  }
822
+ else {
823
+ // A sub-threshold OpenAI warm-up cannot be consumed by the remote
824
+ // compaction route. Once threshold admission succeeds remotely, it would
825
+ // only abort and discard this paid local summary. Above threshold we keep
826
+ // the existing local idle apply, which can finish before the next prompt;
827
+ // if remote compaction later falls back, blocking local generation remains
828
+ // unchanged.
829
+ if (isOpenAiRemoteCompactionModel(ctx.model))
830
+ return;
831
+ const warmAction = resolveIdleWarmAction({
832
+ willRetry: event.willRetry ?? false,
833
+ aborted: event.aborted === true,
834
+ settings,
835
+ usage,
836
+ contextWindow,
837
+ breakerTripped: breaker.isTripped(state, Date.now()),
838
+ lastYield: state.lastYield ?? undefined,
839
+ mode: ctx.mode,
840
+ }, speculativeJob);
841
+ if (warmAction === "replace")
842
+ invalidateSpeculativeCompaction(ctx);
843
+ if (warmAction !== "none") {
844
+ idleWarmupAttempt = 0;
845
+ sessionIdleSinceAgentEnd = true;
846
+ startSpeculativeCompaction(ctx, idle.IDLE_COMPACTION_INSTRUCTIONS);
847
+ armIdleWarmupRetry(ctx);
848
+ armIdleApply(ctx);
849
+ }
850
+ }
853
851
  });
854
852
  pi.on("message_end", async (event, ctx) => {
855
853
  for (const entry of collectCompactBoundaryEntries(event.message)) {