@code-yeongyu/senpi 2026.8.30 → 2026.9.2-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 (430) hide show
  1. package/CHANGELOG.md +234 -4
  2. package/README.md +3 -0
  3. package/dist/core/agent-session.d.ts +29 -0
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +168 -18
  6. package/dist/core/agent-session.js.map +1 -1
  7. package/dist/core/compaction/compaction-execution.d.ts +14 -0
  8. package/dist/core/compaction/compaction-execution.d.ts.map +1 -0
  9. package/dist/core/compaction/compaction-execution.js +121 -0
  10. package/dist/core/compaction/compaction-execution.js.map +1 -0
  11. package/dist/core/compaction/compaction-settings.d.ts +17 -0
  12. package/dist/core/compaction/compaction-settings.d.ts.map +1 -0
  13. package/dist/core/compaction/compaction-settings.js +17 -0
  14. package/dist/core/compaction/compaction-settings.js.map +1 -0
  15. package/dist/core/compaction/compaction.d.ts +13 -26
  16. package/dist/core/compaction/compaction.d.ts.map +1 -1
  17. package/dist/core/compaction/compaction.js +7 -136
  18. package/dist/core/compaction/compaction.js.map +1 -1
  19. package/dist/core/compaction/ideal-compaction-settings.d.ts +9 -0
  20. package/dist/core/compaction/ideal-compaction-settings.d.ts.map +1 -0
  21. package/dist/core/compaction/ideal-compaction-settings.js +7 -0
  22. package/dist/core/compaction/ideal-compaction-settings.js.map +1 -0
  23. package/dist/core/compaction-settings-access.d.ts +19 -0
  24. package/dist/core/compaction-settings-access.d.ts.map +1 -0
  25. package/dist/core/compaction-settings-access.js +10 -0
  26. package/dist/core/compaction-settings-access.js.map +1 -0
  27. package/dist/core/compaction-settings-resolver.d.ts +22 -0
  28. package/dist/core/compaction-settings-resolver.d.ts.map +1 -0
  29. package/dist/core/compaction-settings-resolver.js +46 -0
  30. package/dist/core/compaction-settings-resolver.js.map +1 -0
  31. package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts.map +1 -1
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/options.js +6 -2
  33. package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -1
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts +9 -1
  35. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
  36. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +10 -3
  37. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -1
  38. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
  39. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +2 -1
  40. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
  41. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +24 -0
  42. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
  43. package/dist/core/extensions/builtin/compaction/context-pipeline.js +43 -0
  44. package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
  45. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +1 -1
  46. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +8 -2
  48. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  49. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts +17 -0
  50. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts.map +1 -0
  51. package/dist/core/extensions/builtin/compaction/emergency-prune.js +64 -0
  52. package/dist/core/extensions/builtin/compaction/emergency-prune.js.map +1 -0
  53. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts +27 -0
  54. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts.map +1 -0
  55. package/dist/core/extensions/builtin/compaction/extension-wiring.js +84 -0
  56. package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -0
  57. package/dist/core/extensions/builtin/compaction/idle-retry.d.ts +1 -1
  58. package/dist/core/extensions/builtin/compaction/idle-retry.d.ts.map +1 -1
  59. package/dist/core/extensions/builtin/compaction/idle-retry.js +1 -1
  60. package/dist/core/extensions/builtin/compaction/idle-retry.js.map +1 -1
  61. package/dist/core/extensions/builtin/compaction/idle.d.ts +1 -0
  62. package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -1
  63. package/dist/core/extensions/builtin/compaction/idle.js +13 -2
  64. package/dist/core/extensions/builtin/compaction/idle.js.map +1 -1
  65. package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
  66. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  67. package/dist/core/extensions/builtin/compaction/index.js +152 -154
  68. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  69. package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
  70. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  71. package/dist/core/extensions/builtin/compaction/log.js +2 -0
  72. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  73. package/dist/core/extensions/builtin/compaction/model-selection.d.ts +14 -0
  74. package/dist/core/extensions/builtin/compaction/model-selection.d.ts.map +1 -0
  75. package/dist/core/extensions/builtin/compaction/model-selection.js +37 -0
  76. package/dist/core/extensions/builtin/compaction/model-selection.js.map +1 -0
  77. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts +30 -0
  78. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -0
  79. package/dist/core/extensions/builtin/compaction/model-usability-budget.js +74 -0
  80. package/dist/core/extensions/builtin/compaction/model-usability-budget.js.map +1 -0
  81. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts +9 -0
  82. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts.map +1 -0
  83. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js +2 -0
  84. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js.map +1 -0
  85. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -6
  86. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  88. package/dist/core/extensions/builtin/compaction/orchestration.d.ts +46 -0
  89. package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
  90. package/dist/core/extensions/builtin/compaction/orchestration.js +103 -0
  91. package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
  92. package/dist/core/extensions/builtin/compaction/policy.d.ts +12 -2
  93. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  94. package/dist/core/extensions/builtin/compaction/policy.js +52 -26
  95. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  96. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts +8 -0
  97. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts.map +1 -0
  98. package/dist/core/extensions/builtin/compaction/speculation-lead.js +17 -0
  99. package/dist/core/extensions/builtin/compaction/speculation-lead.js.map +1 -0
  100. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts +22 -0
  101. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts.map +1 -0
  102. package/dist/core/extensions/builtin/compaction/speculative-job.js +16 -0
  103. package/dist/core/extensions/builtin/compaction/speculative-job.js.map +1 -0
  104. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +23 -0
  105. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
  106. package/dist/core/extensions/builtin/compaction/speculative-summary.js +132 -0
  107. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -0
  108. package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -13
  109. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  110. package/dist/core/extensions/builtin/compaction/speculative.js +21 -197
  111. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  112. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +24 -0
  113. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -0
  114. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +25 -0
  115. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
  116. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +27 -0
  117. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
  118. package/dist/core/extensions/builtin/compaction/tool-admission.js +56 -0
  119. package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
  120. package/dist/core/extensions/builtin/hooks/trust-state-json.d.ts +5 -0
  121. package/dist/core/extensions/builtin/hooks/trust-state-json.d.ts.map +1 -0
  122. package/dist/core/extensions/builtin/hooks/trust-state-json.js +76 -0
  123. package/dist/core/extensions/builtin/hooks/trust-state-json.js.map +1 -0
  124. package/dist/core/extensions/builtin/hooks/trust-storage.d.ts +7 -1
  125. package/dist/core/extensions/builtin/hooks/trust-storage.d.ts.map +1 -1
  126. package/dist/core/extensions/builtin/hooks/trust-storage.js +60 -8
  127. package/dist/core/extensions/builtin/hooks/trust-storage.js.map +1 -1
  128. package/dist/core/extensions/builtin/hooks/trust.d.ts +1 -2
  129. package/dist/core/extensions/builtin/hooks/trust.d.ts.map +1 -1
  130. package/dist/core/extensions/builtin/hooks/trust.js +1 -72
  131. package/dist/core/extensions/builtin/hooks/trust.js.map +1 -1
  132. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.d.ts +3 -0
  133. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.d.ts.map +1 -0
  134. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +110 -0
  135. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -0
  136. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
  137. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +2 -1
  138. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  139. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
  140. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js +7 -1
  141. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
  142. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js +7 -1
  144. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
  145. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js +7 -1
  147. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
  148. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.d.ts.map +1 -1
  149. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js +7 -1
  150. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js.map +1 -1
  151. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts.map +1 -1
  152. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +2 -1
  153. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
  154. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts +50 -0
  155. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.d.ts.map +1 -0
  156. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js +66 -0
  157. package/dist/core/extensions/builtin/prompt-preset/execution-tooling.js.map +1 -0
  158. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +5 -1
  159. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +6 -1
  161. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  162. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts.map +1 -1
  163. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js +11 -1
  164. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
  165. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.d.ts.map +1 -1
  166. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js +11 -1
  167. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js.map +1 -1
  168. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +2 -1
  170. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  171. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  172. package/dist/core/extensions/builtin/prompt-preset/presets.js +18 -1
  173. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  174. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  175. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  176. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  177. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  178. package/dist/core/extensions/builtin/recommended-models/index.d.ts +1 -1
  179. package/dist/core/extensions/builtin/recommended-models/index.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/recommended-models/index.js +1 -1
  181. package/dist/core/extensions/builtin/recommended-models/index.js.map +1 -1
  182. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +11 -0
  183. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  184. package/dist/core/extensions/builtin/terminal/runtime-session.js +18 -2
  185. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  186. package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/ttsr/index.js +4 -0
  188. package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
  189. package/dist/core/extensions/builtin/ttsr/manager.d.ts +2 -0
  190. package/dist/core/extensions/builtin/ttsr/manager.d.ts.map +1 -1
  191. package/dist/core/extensions/builtin/ttsr/manager.js +28 -1
  192. package/dist/core/extensions/builtin/ttsr/manager.js.map +1 -1
  193. package/dist/core/extensions/runner.d.ts +5 -0
  194. package/dist/core/extensions/runner.d.ts.map +1 -1
  195. package/dist/core/extensions/runner.js +7 -0
  196. package/dist/core/extensions/runner.js.map +1 -1
  197. package/dist/core/provider-composer.d.ts.map +1 -1
  198. package/dist/core/provider-composer.js +17 -8
  199. package/dist/core/provider-composer.js.map +1 -1
  200. package/dist/core/retry-fallback/controller.d.ts +14 -0
  201. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  202. package/dist/core/retry-fallback/controller.js +33 -3
  203. package/dist/core/retry-fallback/controller.js.map +1 -1
  204. package/dist/core/retry-fallback/log.js +1 -1
  205. package/dist/core/retry-fallback/log.js.map +1 -1
  206. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  207. package/dist/core/retry-fallback/settings.js +1 -0
  208. package/dist/core/retry-fallback/settings.js.map +1 -1
  209. package/dist/core/sdk.d.ts.map +1 -1
  210. package/dist/core/sdk.js +5 -0
  211. package/dist/core/sdk.js.map +1 -1
  212. package/dist/core/session-activity.d.ts +47 -0
  213. package/dist/core/session-activity.d.ts.map +1 -0
  214. package/dist/core/session-activity.js +58 -0
  215. package/dist/core/session-activity.js.map +1 -0
  216. package/dist/core/session-manager.d.ts +8 -12
  217. package/dist/core/session-manager.d.ts.map +1 -1
  218. package/dist/core/session-manager.js +118 -7
  219. package/dist/core/session-manager.js.map +1 -1
  220. package/dist/core/session-resident-store.d.ts +8 -1
  221. package/dist/core/session-resident-store.d.ts.map +1 -1
  222. package/dist/core/session-resident-store.js +12 -5
  223. package/dist/core/session-resident-store.js.map +1 -1
  224. package/dist/core/settings-manager.d.ts +10 -87
  225. package/dist/core/settings-manager.d.ts.map +1 -1
  226. package/dist/core/settings-manager.js +14 -20
  227. package/dist/core/settings-manager.js.map +1 -1
  228. package/dist/core/settings-public-types.d.ts +11 -0
  229. package/dist/core/settings-public-types.d.ts.map +1 -0
  230. package/dist/core/settings-public-types.js +2 -0
  231. package/dist/core/settings-public-types.js.map +1 -0
  232. package/dist/core/settings-shapes.d.ts +36 -0
  233. package/dist/core/settings-shapes.d.ts.map +1 -0
  234. package/dist/core/settings-shapes.js +2 -0
  235. package/dist/core/settings-shapes.js.map +1 -0
  236. package/dist/core/shared-host-policy.d.ts +6 -0
  237. package/dist/core/shared-host-policy.d.ts.map +1 -0
  238. package/dist/core/shared-host-policy.js +7 -0
  239. package/dist/core/shared-host-policy.js.map +1 -0
  240. package/dist/core/terminal-settings.d.ts +22 -0
  241. package/dist/core/terminal-settings.d.ts.map +1 -0
  242. package/dist/core/terminal-settings.js +2 -0
  243. package/dist/core/terminal-settings.js.map +1 -0
  244. package/dist/index.d.ts +1 -1
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +1 -1
  247. package/dist/index.js.map +1 -1
  248. package/dist/main.d.ts +4 -4
  249. package/dist/main.d.ts.map +1 -1
  250. package/dist/main.js +27 -11
  251. package/dist/main.js.map +1 -1
  252. package/dist/modes/app-server/daemon/process.d.ts +13 -2
  253. package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
  254. package/dist/modes/app-server/daemon/process.js +58 -12
  255. package/dist/modes/app-server/daemon/process.js.map +1 -1
  256. package/dist/modes/app-server/daemon.js +65 -7
  257. package/dist/modes/app-server/daemon.js.map +1 -1
  258. package/dist/modes/index.d.ts +1 -1
  259. package/dist/modes/index.d.ts.map +1 -1
  260. package/dist/modes/index.js +1 -1
  261. package/dist/modes/index.js.map +1 -1
  262. package/dist/modes/interactive/interactive-host-runtime.d.ts +84 -1
  263. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  264. package/dist/modes/interactive/interactive-host-runtime.js +435 -112
  265. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  266. package/dist/modes/interactive/interactive-mode.d.ts +11 -1
  267. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  268. package/dist/modes/interactive/interactive-mode.js +59 -6
  269. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  270. package/dist/modes/interactive/tips/catalog/ethos-tips.js +1 -1
  271. package/dist/modes/interactive/tips/catalog/ethos-tips.js.map +1 -1
  272. package/dist/modes/rpc/connection-handler.d.ts +12 -5
  273. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  274. package/dist/modes/rpc/connection-handler.js +180 -25
  275. package/dist/modes/rpc/connection-handler.js.map +1 -1
  276. package/dist/modes/rpc/custom-capability.d.ts +2 -0
  277. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  278. package/dist/modes/rpc/custom-capability.js +2 -0
  279. package/dist/modes/rpc/custom-capability.js.map +1 -1
  280. package/dist/modes/rpc/host-ensure.d.ts +17 -0
  281. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  282. package/dist/modes/rpc/host-ensure.js +150 -23
  283. package/dist/modes/rpc/host-ensure.js.map +1 -1
  284. package/dist/modes/rpc/host-lifecycle.d.ts +54 -0
  285. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  286. package/dist/modes/rpc/host-lifecycle.js +259 -69
  287. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  288. package/dist/modes/rpc/host-watchdog.d.ts +2 -2
  289. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  290. package/dist/modes/rpc/host-watchdog.js +89 -21
  291. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  292. package/dist/modes/rpc/multi-session-host.d.ts +38 -0
  293. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
  294. package/dist/modes/rpc/multi-session-host.js +149 -61
  295. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  296. package/dist/modes/rpc/ownership-safe-lock.d.ts +14 -0
  297. package/dist/modes/rpc/ownership-safe-lock.d.ts.map +1 -0
  298. package/dist/modes/rpc/ownership-safe-lock.js +87 -0
  299. package/dist/modes/rpc/ownership-safe-lock.js.map +1 -0
  300. package/dist/modes/rpc/rpc-client.d.ts +13 -2
  301. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  302. package/dist/modes/rpc/rpc-client.js +46 -12
  303. package/dist/modes/rpc/rpc-client.js.map +1 -1
  304. package/dist/modes/rpc/rpc-types.d.ts +21 -3
  305. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  306. package/dist/modes/rpc/rpc-types.js +1 -0
  307. package/dist/modes/rpc/rpc-types.js.map +1 -1
  308. package/dist/modes/rpc/session-binding.d.ts +2 -1
  309. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  310. package/dist/modes/rpc/session-binding.js +1 -0
  311. package/dist/modes/rpc/session-binding.js.map +1 -1
  312. package/dist/modes/rpc/session-command-router.d.ts +54 -1
  313. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  314. package/dist/modes/rpc/session-command-router.js +180 -3
  315. package/dist/modes/rpc/session-command-router.js.map +1 -1
  316. package/dist/modes/rpc/session-event-writer.d.ts +18 -0
  317. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  318. package/dist/modes/rpc/session-event-writer.js +88 -8
  319. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  320. package/dist/modes/rpc/session-registry.d.ts +11 -1
  321. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  322. package/dist/modes/rpc/session-registry.js +25 -0
  323. package/dist/modes/rpc/session-registry.js.map +1 -1
  324. package/dist/modes/rpc/socket-transport.d.ts +13 -0
  325. package/dist/modes/rpc/socket-transport.d.ts.map +1 -0
  326. package/dist/modes/rpc/socket-transport.js +92 -0
  327. package/dist/modes/rpc/socket-transport.js.map +1 -0
  328. package/dist/modes/rpc/widget-line-renderer.d.ts +17 -0
  329. package/dist/modes/rpc/widget-line-renderer.d.ts.map +1 -0
  330. package/dist/modes/rpc/widget-line-renderer.js +73 -0
  331. package/dist/modes/rpc/widget-line-renderer.js.map +1 -0
  332. package/dist/utils/fs-watch.d.ts.map +1 -1
  333. package/dist/utils/fs-watch.js +11 -2
  334. package/dist/utils/fs-watch.js.map +1 -1
  335. package/docs/app-server.md +2 -2
  336. package/docs/containerization.md +2 -2
  337. package/docs/development.md +7 -7
  338. package/docs/extensions.md +5 -5
  339. package/docs/grok-neo.md +1 -1
  340. package/docs/index.md +1 -1
  341. package/docs/packages.md +2 -2
  342. package/docs/quickstart.md +4 -4
  343. package/docs/release-guide.md +21 -21
  344. package/docs/rpc.md +83 -6
  345. package/docs/sdk.md +1 -1
  346. package/docs/settings.md +8 -8
  347. package/docs/skills.md +2 -2
  348. package/docs/terminal-tools.md +1 -1
  349. package/docs/termux.md +1 -1
  350. package/docs/tui.md +1 -1
  351. package/examples/AGENTS.md +1 -1
  352. package/examples/sdk/README.md +1 -1
  353. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +85 -0
  354. package/node_modules/@code-yeongyu/senpi-codemode/README.md +6 -4
  355. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  356. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/skill-contribution.ts +105 -0
  357. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +6 -1
  358. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +10 -1
  359. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/SKILL.md +44 -0
  360. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/breaking-changes.md +75 -0
  361. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/build.md +114 -0
  362. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/dev-tooling.md +34 -0
  363. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/http-networking.md +113 -0
  364. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/install.md +93 -0
  365. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/node-compat-platforms.md +36 -0
  366. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/performance.md +33 -0
  367. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/runtime-apis.md +156 -0
  368. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/security.md +52 -0
  369. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/test.md +103 -0
  370. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +3 -1
  371. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +2 -0
  372. package/node_modules/@earendil-works/pi-agent-core/README.md +3 -0
  373. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts +3 -0
  374. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  375. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -2
  376. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  377. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  378. package/node_modules/@earendil-works/pi-ai/README.md +6 -3
  379. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  380. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +24 -7
  381. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  382. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +7 -0
  383. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  384. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +316 -2
  385. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  386. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts +4 -0
  387. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts.map +1 -1
  388. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js +23 -0
  389. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js.map +1 -1
  390. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +24 -0
  391. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  392. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +20 -2
  393. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  394. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  395. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  396. package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
  397. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  398. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  399. package/node_modules/@earendil-works/pi-ai/dist/providers/data/groq.json +1 -1
  400. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  401. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  402. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  403. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  404. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/utils/retry-profile/profiles.d.ts.map +1 -1
  406. package/node_modules/@earendil-works/pi-ai/dist/utils/retry-profile/profiles.js +3 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/utils/retry-profile/profiles.js.map +1 -1
  408. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -1
  409. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  410. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  411. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts +42 -0
  412. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts.map +1 -0
  413. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js +34 -0
  414. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js.map +1 -0
  415. package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts +8 -0
  416. package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts.map +1 -0
  417. package/node_modules/@earendil-works/pi-pty/dist/screen-text.js +51 -0
  418. package/node_modules/@earendil-works/pi-pty/dist/screen-text.js.map +1 -0
  419. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts +45 -0
  420. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
  421. package/node_modules/@earendil-works/pi-pty/dist/screen.js +178 -55
  422. package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
  423. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  424. package/node_modules/@earendil-works/pi-telemetry/README.md +6 -3
  425. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  426. package/node_modules/@earendil-works/pi-tui/README.md +5 -4
  427. package/node_modules/@earendil-works/pi-tui/native/darwin/README.md +2 -2
  428. package/node_modules/@earendil-works/pi-tui/native/win32/README.md +2 -2
  429. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  430. package/package.json +7 -7
@@ -41,6 +41,9 @@ import { buildDynamicSystemPrompt } from "./dynamic-prompt/index.js";
41
41
  import { areExperimentalFeaturesEnabled } from "./experimental.js";
42
42
  import { exportSessionToHtml } from "./export-html/index.js";
43
43
  import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
44
+ import { ModelUsabilityBudgetError, projectModelUsabilityBudget, } from "./extensions/builtin/compaction/model-usability-budget.js";
45
+ import { resolveReserveTokens } from "./extensions/builtin/compaction/policy.js";
46
+ import { WAKE_SOURCE_STATE_EVENT } from "./extensions/builtin/monitor-state-event.js";
44
47
  import { CODEX_RESPONSES_API } from "./extensions/builtin/service-tier.js";
45
48
  import { deriveExtensionRegistrationId } from "./extensions/builtin/tool-search/engine/marker.js";
46
49
  import { getToolSearchService } from "./extensions/builtin/tool-search/service.js";
@@ -62,6 +65,7 @@ import { classifyRateLimitedWait, degradeWithoutFallback, nextInTurnDelayMs, pro
62
65
  import { createFallbackLogger } from "./retry-fallback/log.js";
63
66
  import { ProbeBackScheduler } from "./retry-fallback/probe-scheduler.js";
64
67
  import { validateFallbackChains } from "./retry-fallback/validate.js";
68
+ import { isSessionBusySnapshot, WakeSourceTracker } from "./session-activity.js";
65
69
  import { createSessionLogger } from "./session-log.js";
66
70
  import { buildSessionContext, CURRENT_SESSION_VERSION, getLatestCompactionEntry, } from "./session-manager.js";
67
71
  import { generateSessionTitle, sessionTitleRetryPolicy, shouldSkipSessionTitle } from "./session-title-generator.js";
@@ -441,6 +445,12 @@ export function truncateToolResultBodies(messages, maxChars = CURSOR_TOOL_RESULT
441
445
  // ============================================================================
442
446
  // AgentSession Class
443
447
  // ============================================================================
448
+ export function providerRetryWatchdogAbortMessage(retryTimeoutMs, streamStartTimeoutMs) {
449
+ return (`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms` +
450
+ (streamStartTimeoutMs === undefined
451
+ ? " (stream-start guard disabled; raise retry.provider.streamStartTimeoutMs, 0 disables)"
452
+ : ` (stream-start guard: ${streamStartTimeoutMs}ms; raise retry.provider.streamStartTimeoutMs, 0 disables)`));
453
+ }
444
454
  export class AgentSession {
445
455
  /**
446
456
  * Resolve the effective retry profile for the current model's provider.
@@ -488,6 +498,13 @@ export class AgentSession {
488
498
  this._pendingCompactionAdmission = undefined;
489
499
  this._compactionLifecycle = new CompactionLifecycleCoordinator();
490
500
  this._sessionWorkBarrier = new SessionWorkBarrier();
501
+ /**
502
+ * Extension-published activity that outlives a turn (background terminal
503
+ * jobs, terminal monitors, loop-guard holds). Counts persist across extension
504
+ * reloads on purpose: a stale "busy" only delays reclamation, while a lost
505
+ * one would let the host evict a session still doing work.
506
+ */
507
+ this._wakeSources = new WakeSourceTracker();
491
508
  this._overflowRecoveryAttempted = false;
492
509
  this._compactionSkippedTooSmall = false;
493
510
  // A retry continuation immediately follows an accepted compaction. Its first
@@ -2014,9 +2031,31 @@ export class AgentSession {
2014
2031
  this._disconnectFromAgent();
2015
2032
  this._unsubscribeSettingsSource?.();
2016
2033
  this._unsubscribeSettingsSource = undefined;
2034
+ this._unsubscribeWakeSources?.();
2035
+ this._unsubscribeWakeSources = undefined;
2017
2036
  this._eventListeners = [];
2018
2037
  cleanupSessionResources(this.sessionId);
2019
2038
  }
2039
+ /** Live in-session activity signals; see `session-activity.ts` for the contract. */
2040
+ get activitySnapshot() {
2041
+ return {
2042
+ isStreaming: this._isAgentRunActive,
2043
+ isBashRunning: this.isBashRunning,
2044
+ isCompacting: this.isCompacting,
2045
+ hasSessionWork: this._sessionWorkBarrier.hasActiveWork,
2046
+ hasActiveWakeSource: this._wakeSources.hasActive,
2047
+ };
2048
+ }
2049
+ /**
2050
+ * Whether this session owns work that must outlive a teardown decision: an
2051
+ * agent run, bash, compaction, barrier-held session work, or an
2052
+ * extension-published wake source. Occupancy sweeps (the shared RPC host's
2053
+ * idle eviction) MUST consult this rather than individual flags, so a new
2054
+ * activity source is picked up by every call site at once.
2055
+ */
2056
+ get isSessionBusy() {
2057
+ return isSessionBusySnapshot(this.activitySnapshot);
2058
+ }
2020
2059
  // =========================================================================
2021
2060
  // Read-only State Access
2022
2061
  // =========================================================================
@@ -2331,8 +2370,14 @@ export class AgentSession {
2331
2370
  this._baseSystemPrompt = this._rebuildSystemPrompt(validToolNames);
2332
2371
  this.agent.state.systemPrompt = this._systemPromptOverride ?? this._baseSystemPrompt;
2333
2372
  if (activeToolNamesChanged) {
2334
- this.abortCompaction();
2335
- this._incrementMessageRevision();
2373
+ // A tool change emitted while extensions are still binding belongs to the
2374
+ // binding itself, not to a mid-session change. The session was already
2375
+ // committed to the client, so cancelling or invalidating work it started
2376
+ // against that session would be spurious.
2377
+ if (this._extensionBindingPromptReadiness === undefined) {
2378
+ this.abortCompaction();
2379
+ this._incrementMessageRevision();
2380
+ }
2336
2381
  }
2337
2382
  }
2338
2383
  /** Whether compaction or branch summarization is currently running */
@@ -3530,6 +3575,43 @@ export class AgentSession {
3530
3575
  async setModel(model) {
3531
3576
  return this._setModel(model, true);
3532
3577
  }
3578
+ assertModelUsable(model = this.model, liveContextTokens = 0) {
3579
+ if (!model || model.contextWindow <= 0)
3580
+ return;
3581
+ const projection = projectModelUsabilityBudget({
3582
+ model,
3583
+ systemPrompt: this.agent.state.systemPrompt,
3584
+ tools: this.agent.state.tools,
3585
+ liveContextTokens,
3586
+ compaction: this.settingsManager.getCompactionSettings(),
3587
+ });
3588
+ if (!projection.usable)
3589
+ throw new ModelUsabilityBudgetError(projection);
3590
+ }
3591
+ _getDownswitchLiveContextTokens(model) {
3592
+ const currentModel = this.model;
3593
+ if (!currentModel)
3594
+ return 0;
3595
+ const compaction = this.settingsManager.getCompactionSettings();
3596
+ const currentBudget = projectModelUsabilityBudget({
3597
+ model: currentModel,
3598
+ systemPrompt: this.agent.state.systemPrompt,
3599
+ tools: this.agent.state.tools,
3600
+ compaction,
3601
+ });
3602
+ const targetBudget = projectModelUsabilityBudget({
3603
+ model,
3604
+ systemPrompt: this.agent.state.systemPrompt,
3605
+ tools: this.agent.state.tools,
3606
+ compaction,
3607
+ });
3608
+ const currentUsableContext = currentBudget.contextWindow - currentBudget.requiredTokens;
3609
+ const targetUsableContext = targetBudget.contextWindow - targetBudget.requiredTokens;
3610
+ if (targetUsableContext >= currentUsableContext)
3611
+ return 0;
3612
+ const fixedPrefixTokens = currentBudget.systemPromptTokens + currentBudget.activeToolSchemaTokens;
3613
+ return Math.max(0, (this.getContextUsage()?.tokens ?? 0) - fixedPrefixTokens);
3614
+ }
3533
3615
  /**
3534
3616
  * Set the model for this session without changing the global model defaults.
3535
3617
  * The selection is still persisted in this session's history.
@@ -3538,6 +3620,7 @@ export class AgentSession {
3538
3620
  return this._setModel(model, false);
3539
3621
  }
3540
3622
  async _setModel(model, updateGlobalDefaults) {
3623
+ this.assertModelUsable(model, this._getDownswitchLiveContextTokens(model));
3541
3624
  if (!(await this._modelRuntime.checkAuth(model.provider))) {
3542
3625
  throw new Error(`No API key for ${model.provider}/${model.id}`);
3543
3626
  }
@@ -3566,6 +3649,17 @@ export class AgentSession {
3566
3649
  console.error("fallback revert failed; cleared fallback state", error);
3567
3650
  }
3568
3651
  }
3652
+ /**
3653
+ * A senpi-owned compaction just rewrote the conversation context: release any
3654
+ * refusal-caused fallback pin (the "same context refuses again" assumption no
3655
+ * longer holds) and, while no run is active, eagerly re-attempt the original
3656
+ * model through the existing revert gate. Billing-caused pins never release.
3657
+ */
3658
+ async _onCompactionContextChanged() {
3659
+ const released = this._retryFallback.notifyCompactionApplied();
3660
+ if (released && !this.isStreaming)
3661
+ await this._maybeRestoreFallbackPrimary();
3662
+ }
3569
3663
  async _switchActiveModel(model, opts) {
3570
3664
  const previousModel = this.model;
3571
3665
  if (opts.invalidateCompaction &&
@@ -3575,6 +3669,7 @@ export class AgentSession {
3575
3669
  this._invalidateCompactionForModelSelection();
3576
3670
  }
3577
3671
  const thinking = this._getThinkingForModelSwitch(model, opts.ephemeralThinkingLevel);
3672
+ const liveContextTokens = this._getDownswitchLiveContextTokens(model);
3578
3673
  this.agent.state.model = model;
3579
3674
  this.agent.abortServerSideFallback =
3580
3675
  this.settingsManager.getAbortServerSideFallback() && this._retryFallback.hasConfiguredChain();
@@ -3606,7 +3701,20 @@ export class AgentSession {
3606
3701
  this._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);
3607
3702
  if (!opts.emitModelSelect)
3608
3703
  return undefined;
3609
- return await this._emitModelSelect(model, previousModel, opts.modelSelectSource);
3704
+ const previousSystemPrompt = this.agent.state.systemPrompt;
3705
+ try {
3706
+ const systemPromptChange = await this._emitModelSelect(model, previousModel, opts.modelSelectSource);
3707
+ this.assertModelUsable(model, liveContextTokens);
3708
+ return systemPromptChange;
3709
+ }
3710
+ catch (error) {
3711
+ if (previousModel)
3712
+ this.agent.state.model = previousModel;
3713
+ else
3714
+ delete this.agent.state.model;
3715
+ this.agent.state.systemPrompt = previousSystemPrompt;
3716
+ throw error;
3717
+ }
3610
3718
  }
3611
3719
  _applyEphemeralThinkingLevel(level) {
3612
3720
  const previousLevel = this.agent.state.thinkingLevel;
@@ -3643,6 +3751,8 @@ export class AgentSession {
3643
3751
  nextIndex = direction === "forward" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;
3644
3752
  }
3645
3753
  const next = favoriteModels[nextIndex];
3754
+ const liveContextTokens = this._getDownswitchLiveContextTokens(next.model);
3755
+ this.assertModelUsable(next.model, liveContextTokens);
3646
3756
  const invalidatesCompaction = this._modelSelectionChangesContext(currentModel, next.model) ||
3647
3757
  currentModel?.provider !== next.model.provider ||
3648
3758
  currentModel?.id !== next.model.id;
@@ -3668,16 +3778,28 @@ export class AgentSession {
3668
3778
  source: "cycle",
3669
3779
  });
3670
3780
  this._emitServiceTierChangeIfNeeded(previousTier, previousFastMode);
3671
- const systemPromptChange = await this._emitModelSelect(next.model, currentModel, "cycle");
3672
- const cycleResult = {
3673
- model: next.model,
3674
- thinkingLevel: this.thinkingLevel,
3675
- isScoped: true,
3676
- };
3677
- if (systemPromptChange) {
3678
- cycleResult.systemPromptChange = systemPromptChange;
3781
+ const previousSystemPrompt = this.agent.state.systemPrompt;
3782
+ try {
3783
+ const systemPromptChange = await this._emitModelSelect(next.model, currentModel, "cycle");
3784
+ this.assertModelUsable(next.model, liveContextTokens);
3785
+ const cycleResult = {
3786
+ model: next.model,
3787
+ thinkingLevel: this.thinkingLevel,
3788
+ isScoped: true,
3789
+ };
3790
+ if (systemPromptChange) {
3791
+ cycleResult.systemPromptChange = systemPromptChange;
3792
+ }
3793
+ return cycleResult;
3794
+ }
3795
+ catch (error) {
3796
+ if (currentModel)
3797
+ this.agent.state.model = currentModel;
3798
+ else
3799
+ delete this.agent.state.model;
3800
+ this.agent.state.systemPrompt = previousSystemPrompt;
3801
+ throw error;
3679
3802
  }
3680
- return cycleResult;
3681
3803
  }
3682
3804
  // =========================================================================
3683
3805
  // Thinking Level Management
@@ -4402,6 +4524,10 @@ export class AgentSession {
4402
4524
  fromExtension,
4403
4525
  willRetry: request.willRetry,
4404
4526
  });
4527
+ // Shared success seam: every senpi-owned compaction apply (manual /compact,
4528
+ // extension applyCompaction, pre-prompt and auto compaction) funnels through
4529
+ // here after the compaction entry is appended and the success event emitted.
4530
+ await this._onCompactionContextChanged();
4405
4531
  return {
4406
4532
  accepted: true,
4407
4533
  requestId,
@@ -4454,7 +4580,10 @@ export class AgentSession {
4454
4580
  }
4455
4581
  const contextTokens = estimateMessagesTokens(filterContextExcludedMessages(simulatedMessages));
4456
4582
  const settings = this.settingsManager.getCompactionSettings();
4457
- return contextTokens > model.contextWindow - settings.reserveTokens;
4583
+ const reserveTokens = settings.reserveScalingEnabled === false
4584
+ ? settings.reserveTokens
4585
+ : resolveReserveTokens(model.contextWindow, settings.reserveTokens);
4586
+ return contextTokens > model.contextWindow - reserveTokens;
4458
4587
  }
4459
4588
  /**
4460
4589
  * Replaces agent state with the canonical session context while keeping exact
@@ -4618,6 +4747,9 @@ export class AgentSession {
4618
4747
  if (!model)
4619
4748
  return;
4620
4749
  const settings = this.settingsManager.getCompactionSettings();
4750
+ const reserveTokens = settings.reserveScalingEnabled === false
4751
+ ? settings.reserveTokens
4752
+ : resolveReserveTokens(model.contextWindow, settings.reserveTokens);
4621
4753
  const isOversized = () => {
4622
4754
  const providerMessages = filterContextExcludedMessages([...this.agent.state.messages, ...messages]);
4623
4755
  const estimate = estimateContextTokens(providerMessages);
@@ -4628,7 +4760,7 @@ export class AgentSession {
4628
4760
  const contextTokens = usageMessage?.role === "assistant" && this._isAssistantFromBeforeLatestCompaction(usageMessage)
4629
4761
  ? estimateMessagesTokens(providerMessages)
4630
4762
  : estimate.tokens;
4631
- return contextTokens > model.contextWindow - settings.reserveTokens;
4763
+ return contextTokens > model.contextWindow - reserveTokens;
4632
4764
  };
4633
4765
  if (!settings.enabled || !isOversized())
4634
4766
  return;
@@ -4906,6 +5038,21 @@ export class AgentSession {
4906
5038
  try {
4907
5039
  if (this.agent.state.isStreaming)
4908
5040
  return "taken-over";
5041
+ // Pre-admission restore point. A senpi-owned compaction that succeeds
5042
+ // while a run is still active releases its refusal pin through
5043
+ // _onCompactionContextChanged() but cannot restore there: model-select
5044
+ // work must stay ordered behind the session-work barrier while the run
5045
+ // owns it. Every post-compaction continuation admission - auto/overflow
5046
+ // compaction recovery, _resumeQueuedMessagesAfterCompaction(), the
5047
+ // agent_end queued continuation and the retry continuation - is scheduled
5048
+ // through _scheduleContinuationAfterCurrentEvent() and funnels here, so
5049
+ // this is the single choke point every such request passes before
5050
+ // reaching the provider. Restoring here (a no-op when nothing is pending)
5051
+ // keeps the guarantee that the very next request after a compaction runs
5052
+ // on the primary, and precedes the admission revalidation below so that
5053
+ // check samples the restored model's context window - the same ordering
5054
+ // the retry-continuation restore uses.
5055
+ await this._maybeRestoreFallbackPrimary();
4909
5056
  await this._revalidateScheduledContinuationAdmission();
4910
5057
  if (this.agent.state.isStreaming)
4911
5058
  return "taken-over";
@@ -4927,10 +5074,7 @@ export class AgentSession {
4927
5074
  }
4928
5075
  },
4929
5076
  getActiveSignal: () => this.agent.signal,
4930
- abortActive: () => this.agent.abort(new ProviderRetryWatchdogAbortError(`Provider retry continuation watchdog timed out after ${retryTimeoutMs}ms` +
4931
- (this.agent.streamStartTimeoutMs === undefined
4932
- ? " (stream-start guard disabled)"
4933
- : ` (stream-start guard: ${this.agent.streamStartTimeoutMs}ms)`))),
5077
+ abortActive: () => this.agent.abort(new ProviderRetryWatchdogAbortError(providerRetryWatchdogAbortMessage(retryTimeoutMs, this.agent.streamStartTimeoutMs))),
4934
5078
  timeoutMs: retryTimeoutMs,
4935
5079
  });
4936
5080
  return "continued";
@@ -5255,6 +5399,12 @@ export class AgentSession {
5255
5399
  this.agent.state.model = refreshedModel;
5256
5400
  }
5257
5401
  _bindExtensionCore(runner) {
5402
+ // Activity extensions publish about work outliving a turn (background
5403
+ // terminal jobs, monitors, holds) feeds the session-busy contract. Re-bound
5404
+ // per runner; counts survive the swap so a reload cannot make live work
5405
+ // look idle to an occupancy sweep.
5406
+ this._unsubscribeWakeSources?.();
5407
+ this._unsubscribeWakeSources = runner.onBusEvent(WAKE_SOURCE_STATE_EVENT, (data) => this._wakeSources.observe(data));
5258
5408
  const getCommands = () => {
5259
5409
  const extensionCommands = runner.getRegisteredCommands().map((command) => ({
5260
5410
  name: command.invocationName,