@code-yeongyu/senpi 2026.8.30 → 2026.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/CHANGELOG.md +174 -2
  2. package/README.md +3 -0
  3. package/dist/core/agent-session.d.ts +28 -0
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +161 -14
  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/session-registry.d.ts +9 -1
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.d.ts.map +1 -1
  33. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js +10 -3
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry.js.map +1 -1
  35. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +24 -0
  36. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
  37. package/dist/core/extensions/builtin/compaction/context-pipeline.js +43 -0
  38. package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
  39. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +1 -1
  40. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +8 -2
  42. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  43. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts +17 -0
  44. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts.map +1 -0
  45. package/dist/core/extensions/builtin/compaction/emergency-prune.js +64 -0
  46. package/dist/core/extensions/builtin/compaction/emergency-prune.js.map +1 -0
  47. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts +27 -0
  48. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts.map +1 -0
  49. package/dist/core/extensions/builtin/compaction/extension-wiring.js +84 -0
  50. package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -0
  51. package/dist/core/extensions/builtin/compaction/idle-retry.d.ts +1 -1
  52. package/dist/core/extensions/builtin/compaction/idle-retry.d.ts.map +1 -1
  53. package/dist/core/extensions/builtin/compaction/idle-retry.js +1 -1
  54. package/dist/core/extensions/builtin/compaction/idle-retry.js.map +1 -1
  55. package/dist/core/extensions/builtin/compaction/idle.d.ts +1 -0
  56. package/dist/core/extensions/builtin/compaction/idle.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/compaction/idle.js +13 -2
  58. package/dist/core/extensions/builtin/compaction/idle.js.map +1 -1
  59. package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
  60. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/compaction/index.js +152 -154
  62. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  63. package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
  64. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/compaction/log.js +2 -0
  66. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  67. package/dist/core/extensions/builtin/compaction/model-selection.d.ts +14 -0
  68. package/dist/core/extensions/builtin/compaction/model-selection.d.ts.map +1 -0
  69. package/dist/core/extensions/builtin/compaction/model-selection.js +37 -0
  70. package/dist/core/extensions/builtin/compaction/model-selection.js.map +1 -0
  71. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts +30 -0
  72. package/dist/core/extensions/builtin/compaction/model-usability-budget.d.ts.map +1 -0
  73. package/dist/core/extensions/builtin/compaction/model-usability-budget.js +74 -0
  74. package/dist/core/extensions/builtin/compaction/model-usability-budget.js.map +1 -0
  75. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts +9 -0
  76. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts.map +1 -0
  77. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js +2 -0
  78. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js.map +1 -0
  79. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -6
  80. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  81. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  82. package/dist/core/extensions/builtin/compaction/orchestration.d.ts +46 -0
  83. package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
  84. package/dist/core/extensions/builtin/compaction/orchestration.js +103 -0
  85. package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
  86. package/dist/core/extensions/builtin/compaction/policy.d.ts +12 -2
  87. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/compaction/policy.js +52 -26
  89. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  90. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts +8 -0
  91. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts.map +1 -0
  92. package/dist/core/extensions/builtin/compaction/speculation-lead.js +17 -0
  93. package/dist/core/extensions/builtin/compaction/speculation-lead.js.map +1 -0
  94. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts +22 -0
  95. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts.map +1 -0
  96. package/dist/core/extensions/builtin/compaction/speculative-job.js +16 -0
  97. package/dist/core/extensions/builtin/compaction/speculative-job.js.map +1 -0
  98. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +23 -0
  99. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
  100. package/dist/core/extensions/builtin/compaction/speculative-summary.js +132 -0
  101. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -0
  102. package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -13
  103. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  104. package/dist/core/extensions/builtin/compaction/speculative.js +21 -197
  105. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  106. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +24 -0
  107. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -0
  108. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +25 -0
  109. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
  110. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +27 -0
  111. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
  112. package/dist/core/extensions/builtin/compaction/tool-admission.js +56 -0
  113. package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
  114. package/dist/core/extensions/builtin/hooks/trust-state-json.d.ts +5 -0
  115. package/dist/core/extensions/builtin/hooks/trust-state-json.d.ts.map +1 -0
  116. package/dist/core/extensions/builtin/hooks/trust-state-json.js +76 -0
  117. package/dist/core/extensions/builtin/hooks/trust-state-json.js.map +1 -0
  118. package/dist/core/extensions/builtin/hooks/trust-storage.d.ts +7 -1
  119. package/dist/core/extensions/builtin/hooks/trust-storage.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/hooks/trust-storage.js +60 -8
  121. package/dist/core/extensions/builtin/hooks/trust-storage.js.map +1 -1
  122. package/dist/core/extensions/builtin/hooks/trust.d.ts +1 -2
  123. package/dist/core/extensions/builtin/hooks/trust.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/hooks/trust.js +1 -72
  125. package/dist/core/extensions/builtin/hooks/trust.js.map +1 -1
  126. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.d.ts +3 -0
  127. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.d.ts.map +1 -0
  128. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js +108 -0
  129. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5-1.js.map +1 -0
  130. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/prompt-preset/presets.js +11 -0
  132. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  133. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  134. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  136. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  137. package/dist/core/extensions/builtin/recommended-models/index.d.ts +1 -1
  138. package/dist/core/extensions/builtin/recommended-models/index.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/recommended-models/index.js +1 -1
  140. package/dist/core/extensions/builtin/recommended-models/index.js.map +1 -1
  141. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +11 -0
  142. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/terminal/runtime-session.js +18 -2
  144. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  145. package/dist/core/extensions/builtin/ttsr/index.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/ttsr/index.js +4 -0
  147. package/dist/core/extensions/builtin/ttsr/index.js.map +1 -1
  148. package/dist/core/extensions/builtin/ttsr/manager.d.ts +2 -0
  149. package/dist/core/extensions/builtin/ttsr/manager.d.ts.map +1 -1
  150. package/dist/core/extensions/builtin/ttsr/manager.js +28 -1
  151. package/dist/core/extensions/builtin/ttsr/manager.js.map +1 -1
  152. package/dist/core/extensions/runner.d.ts +5 -0
  153. package/dist/core/extensions/runner.d.ts.map +1 -1
  154. package/dist/core/extensions/runner.js +7 -0
  155. package/dist/core/extensions/runner.js.map +1 -1
  156. package/dist/core/retry-fallback/controller.d.ts +14 -0
  157. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  158. package/dist/core/retry-fallback/controller.js +33 -3
  159. package/dist/core/retry-fallback/controller.js.map +1 -1
  160. package/dist/core/retry-fallback/log.js +1 -1
  161. package/dist/core/retry-fallback/log.js.map +1 -1
  162. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  163. package/dist/core/retry-fallback/settings.js +1 -0
  164. package/dist/core/retry-fallback/settings.js.map +1 -1
  165. package/dist/core/sdk.d.ts.map +1 -1
  166. package/dist/core/sdk.js +5 -0
  167. package/dist/core/sdk.js.map +1 -1
  168. package/dist/core/session-activity.d.ts +47 -0
  169. package/dist/core/session-activity.d.ts.map +1 -0
  170. package/dist/core/session-activity.js +58 -0
  171. package/dist/core/session-activity.js.map +1 -0
  172. package/dist/core/session-manager.d.ts +8 -12
  173. package/dist/core/session-manager.d.ts.map +1 -1
  174. package/dist/core/session-manager.js +118 -7
  175. package/dist/core/session-manager.js.map +1 -1
  176. package/dist/core/session-resident-store.d.ts +8 -1
  177. package/dist/core/session-resident-store.d.ts.map +1 -1
  178. package/dist/core/session-resident-store.js +12 -5
  179. package/dist/core/session-resident-store.js.map +1 -1
  180. package/dist/core/settings-manager.d.ts +8 -85
  181. package/dist/core/settings-manager.d.ts.map +1 -1
  182. package/dist/core/settings-manager.js +9 -17
  183. package/dist/core/settings-manager.js.map +1 -1
  184. package/dist/core/settings-public-types.d.ts +11 -0
  185. package/dist/core/settings-public-types.d.ts.map +1 -0
  186. package/dist/core/settings-public-types.js +2 -0
  187. package/dist/core/settings-public-types.js.map +1 -0
  188. package/dist/core/settings-shapes.d.ts +36 -0
  189. package/dist/core/settings-shapes.d.ts.map +1 -0
  190. package/dist/core/settings-shapes.js +2 -0
  191. package/dist/core/settings-shapes.js.map +1 -0
  192. package/dist/core/shared-host-policy.d.ts +6 -0
  193. package/dist/core/shared-host-policy.d.ts.map +1 -0
  194. package/dist/core/shared-host-policy.js +7 -0
  195. package/dist/core/shared-host-policy.js.map +1 -0
  196. package/dist/core/terminal-settings.d.ts +22 -0
  197. package/dist/core/terminal-settings.d.ts.map +1 -0
  198. package/dist/core/terminal-settings.js +2 -0
  199. package/dist/core/terminal-settings.js.map +1 -0
  200. package/dist/index.d.ts +1 -1
  201. package/dist/index.d.ts.map +1 -1
  202. package/dist/index.js +1 -1
  203. package/dist/index.js.map +1 -1
  204. package/dist/main.d.ts +4 -4
  205. package/dist/main.d.ts.map +1 -1
  206. package/dist/main.js +27 -11
  207. package/dist/main.js.map +1 -1
  208. package/dist/modes/app-server/daemon/process.d.ts +13 -2
  209. package/dist/modes/app-server/daemon/process.d.ts.map +1 -1
  210. package/dist/modes/app-server/daemon/process.js +58 -12
  211. package/dist/modes/app-server/daemon/process.js.map +1 -1
  212. package/dist/modes/app-server/daemon.js +65 -7
  213. package/dist/modes/app-server/daemon.js.map +1 -1
  214. package/dist/modes/index.d.ts +1 -1
  215. package/dist/modes/index.d.ts.map +1 -1
  216. package/dist/modes/index.js +1 -1
  217. package/dist/modes/index.js.map +1 -1
  218. package/dist/modes/interactive/interactive-host-runtime.d.ts +84 -1
  219. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  220. package/dist/modes/interactive/interactive-host-runtime.js +435 -112
  221. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  222. package/dist/modes/interactive/interactive-mode.d.ts +11 -1
  223. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  224. package/dist/modes/interactive/interactive-mode.js +59 -6
  225. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  226. package/dist/modes/interactive/tips/catalog/ethos-tips.js +1 -1
  227. package/dist/modes/interactive/tips/catalog/ethos-tips.js.map +1 -1
  228. package/dist/modes/rpc/connection-handler.d.ts +12 -5
  229. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  230. package/dist/modes/rpc/connection-handler.js +180 -25
  231. package/dist/modes/rpc/connection-handler.js.map +1 -1
  232. package/dist/modes/rpc/custom-capability.d.ts +2 -0
  233. package/dist/modes/rpc/custom-capability.d.ts.map +1 -1
  234. package/dist/modes/rpc/custom-capability.js +2 -0
  235. package/dist/modes/rpc/custom-capability.js.map +1 -1
  236. package/dist/modes/rpc/host-ensure.d.ts +17 -0
  237. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  238. package/dist/modes/rpc/host-ensure.js +150 -23
  239. package/dist/modes/rpc/host-ensure.js.map +1 -1
  240. package/dist/modes/rpc/host-lifecycle.d.ts +54 -0
  241. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  242. package/dist/modes/rpc/host-lifecycle.js +259 -69
  243. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  244. package/dist/modes/rpc/host-watchdog.d.ts +2 -2
  245. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  246. package/dist/modes/rpc/host-watchdog.js +89 -21
  247. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  248. package/dist/modes/rpc/multi-session-host.d.ts +38 -0
  249. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -1
  250. package/dist/modes/rpc/multi-session-host.js +149 -61
  251. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  252. package/dist/modes/rpc/ownership-safe-lock.d.ts +14 -0
  253. package/dist/modes/rpc/ownership-safe-lock.d.ts.map +1 -0
  254. package/dist/modes/rpc/ownership-safe-lock.js +87 -0
  255. package/dist/modes/rpc/ownership-safe-lock.js.map +1 -0
  256. package/dist/modes/rpc/rpc-client.d.ts +13 -2
  257. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  258. package/dist/modes/rpc/rpc-client.js +46 -12
  259. package/dist/modes/rpc/rpc-client.js.map +1 -1
  260. package/dist/modes/rpc/rpc-types.d.ts +21 -3
  261. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  262. package/dist/modes/rpc/rpc-types.js +1 -0
  263. package/dist/modes/rpc/rpc-types.js.map +1 -1
  264. package/dist/modes/rpc/session-binding.d.ts +2 -1
  265. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  266. package/dist/modes/rpc/session-binding.js +1 -0
  267. package/dist/modes/rpc/session-binding.js.map +1 -1
  268. package/dist/modes/rpc/session-command-router.d.ts +54 -1
  269. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  270. package/dist/modes/rpc/session-command-router.js +180 -3
  271. package/dist/modes/rpc/session-command-router.js.map +1 -1
  272. package/dist/modes/rpc/session-event-writer.d.ts +18 -0
  273. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  274. package/dist/modes/rpc/session-event-writer.js +88 -8
  275. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  276. package/dist/modes/rpc/session-registry.d.ts +11 -1
  277. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  278. package/dist/modes/rpc/session-registry.js +25 -0
  279. package/dist/modes/rpc/session-registry.js.map +1 -1
  280. package/dist/modes/rpc/socket-transport.d.ts +13 -0
  281. package/dist/modes/rpc/socket-transport.d.ts.map +1 -0
  282. package/dist/modes/rpc/socket-transport.js +92 -0
  283. package/dist/modes/rpc/socket-transport.js.map +1 -0
  284. package/dist/modes/rpc/widget-line-renderer.d.ts +17 -0
  285. package/dist/modes/rpc/widget-line-renderer.d.ts.map +1 -0
  286. package/dist/modes/rpc/widget-line-renderer.js +73 -0
  287. package/dist/modes/rpc/widget-line-renderer.js.map +1 -0
  288. package/dist/utils/fs-watch.d.ts.map +1 -1
  289. package/dist/utils/fs-watch.js +11 -2
  290. package/dist/utils/fs-watch.js.map +1 -1
  291. package/docs/app-server.md +2 -2
  292. package/docs/containerization.md +2 -2
  293. package/docs/development.md +7 -7
  294. package/docs/extensions.md +5 -5
  295. package/docs/grok-neo.md +1 -1
  296. package/docs/index.md +1 -1
  297. package/docs/packages.md +2 -2
  298. package/docs/quickstart.md +4 -4
  299. package/docs/release-guide.md +21 -21
  300. package/docs/rpc.md +83 -6
  301. package/docs/sdk.md +1 -1
  302. package/docs/settings.md +4 -4
  303. package/docs/skills.md +2 -2
  304. package/docs/terminal-tools.md +1 -1
  305. package/docs/termux.md +1 -1
  306. package/docs/tui.md +1 -1
  307. package/examples/AGENTS.md +1 -1
  308. package/examples/sdk/README.md +1 -1
  309. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +52 -0
  310. package/node_modules/@code-yeongyu/senpi-codemode/README.md +2 -2
  311. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  312. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/skill-contribution.ts +71 -0
  313. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +3 -1
  314. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/SKILL.md +44 -0
  315. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/breaking-changes.md +75 -0
  316. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/build.md +114 -0
  317. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/dev-tooling.md +34 -0
  318. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/http-networking.md +113 -0
  319. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/install.md +93 -0
  320. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/node-compat-platforms.md +36 -0
  321. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/performance.md +33 -0
  322. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/runtime-apis.md +156 -0
  323. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/security.md +52 -0
  324. package/node_modules/@code-yeongyu/senpi-codemode/src/skill/bun-1-4/references/test.md +103 -0
  325. package/node_modules/@earendil-works/pi-agent-core/README.md +3 -0
  326. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  327. package/node_modules/@earendil-works/pi-ai/README.md +6 -3
  328. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  329. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +24 -7
  330. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  331. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +7 -0
  332. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  333. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +316 -2
  334. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  335. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts +4 -0
  336. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts.map +1 -1
  337. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js +23 -0
  338. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js.map +1 -1
  339. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +24 -0
  340. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  341. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +20 -2
  342. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  343. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  344. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  345. package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
  346. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  347. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  348. package/node_modules/@earendil-works/pi-ai/dist/providers/data/groq.json +1 -1
  349. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  350. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  351. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  352. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  353. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  354. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts +42 -0
  355. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.d.ts.map +1 -0
  356. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js +34 -0
  357. package/node_modules/@earendil-works/pi-pty/dist/screen-operations.js.map +1 -0
  358. package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts +8 -0
  359. package/node_modules/@earendil-works/pi-pty/dist/screen-text.d.ts.map +1 -0
  360. package/node_modules/@earendil-works/pi-pty/dist/screen-text.js +51 -0
  361. package/node_modules/@earendil-works/pi-pty/dist/screen-text.js.map +1 -0
  362. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts +45 -0
  363. package/node_modules/@earendil-works/pi-pty/dist/screen.d.ts.map +1 -1
  364. package/node_modules/@earendil-works/pi-pty/dist/screen.js +178 -55
  365. package/node_modules/@earendil-works/pi-pty/dist/screen.js.map +1 -1
  366. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  367. package/node_modules/@earendil-works/pi-telemetry/README.md +6 -3
  368. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  369. package/node_modules/@earendil-works/pi-tui/README.md +5 -4
  370. package/node_modules/@earendil-works/pi-tui/native/darwin/README.md +2 -2
  371. package/node_modules/@earendil-works/pi-tui/native/win32/README.md +2 -2
  372. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  373. package/package.json +7 -7
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-wiring.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/extension-wiring.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { ContextUsage, ExtensionContext, MessageEndEvent, SessionBeforeCompactEvent } from \"../../types.ts\";\nimport * as checkpointState from \"./checkpoint-state.ts\";\nimport type { SpeculativeCompactionResult, SpeculativeCompactionSnapshot } from \"./speculative.ts\";\n\nconst IMAGE_PROMPT_TOKEN_ESTIMATE = 1_200;\nconst MAX_OUTPUT_RESERVE_RATIO = 0.5;\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\nexport function estimatePendingPromptTokens(event: { prompt?: string; images?: readonly unknown[] }): number {\n\treturn approxTokens(event.prompt ?? \"\") + (event.images?.length ?? 0) * IMAGE_PROMPT_TOKEN_ESTIMATE;\n}\n\nexport function getPromptContextWindow(contextWindow: number, maxTokens: number | undefined): number {\n\tif (typeof maxTokens !== \"number\" || !Number.isFinite(maxTokens) || maxTokens <= 0 || contextWindow <= 0) {\n\t\treturn contextWindow;\n\t}\n\tconst outputReserve = Math.min(maxTokens, Math.floor(contextWindow * MAX_OUTPUT_RESERVE_RATIO));\n\treturn contextWindow - outputReserve;\n}\n\nexport function withAdditionalTokens(usage: ContextUsage, additionalTokens: number): ContextUsage {\n\tif (usage.tokens === null || additionalTokens <= 0) return usage;\n\tconst tokens = usage.tokens + additionalTokens;\n\treturn {\n\t\t...usage,\n\t\ttokens,\n\t\tpercent: usage.contextWindow > 0 ? (tokens / usage.contextWindow) * 100 : usage.percent,\n\t};\n}\n\nexport function isMonitorableMessageEvent(event: MessageEndEvent): event is MessageEndEvent & {\n\tmessage: AgentMessage & { content: Array<{ type: string; text?: string }> };\n} {\n\treturn \"content\" in event.message && Array.isArray(event.message.content);\n}\n\nexport function isAbortedAssistantMessage(event: { message: AgentMessage }): boolean {\n\treturn event.message.role === \"assistant\" && \"stopReason\" in event.message && event.message.stopReason === \"aborted\";\n}\n\nexport function isRequiredCompactionFallbackReason(reason: SessionBeforeCompactEvent[\"reason\"]): boolean {\n\treturn reason === \"threshold\" || reason === \"overflow\";\n}\n\nexport function recentCheckpoint(ctx: ExtensionContext): checkpointState.AgentCheckpoint | null {\n\tconst checkpoint = checkpointState.getLatestCheckpoint(ctx);\n\tif (!checkpoint?.timestamp) return null;\n\treturn Date.now() - checkpoint.timestamp <= 60_000 ? checkpoint : null;\n}\n\nfunction shouldEndFeedback(result: SpeculativeCompactionResult): boolean {\n\treturn !result.applied && result.reason !== \"rejected\";\n}\n\nexport function endCompactionFeedback(\n\tctx: ExtensionContext,\n\tsignal: AbortSignal | undefined,\n\tresult: SpeculativeCompactionResult,\n\tremoteFallbackReason?: string,\n): void {\n\tif (shouldEndFeedback(result)) {\n\t\t// Surface the concrete failure instead of the generic \"Compaction did not\n\t\t// apply\": the remote stage's reason (e.g. remote-compaction-timeout) and the\n\t\t// terminal local reason (unavailable / stale), so the decision log and TUI\n\t\t// show what actually happened. An aborted compaction renders \"Compaction\n\t\t// cancelled\" downstream and must not carry a failure message.\n\t\tconst localReason = result.applied ? undefined : result.reason;\n\t\tconst parts = [remoteFallbackReason, localReason].filter((part): part is string => Boolean(part));\n\t\tconst errorMessage =\n\t\t\tsignal?.aborted || parts.length === 0\n\t\t\t\t? undefined\n\t\t\t\t: `Compaction did not apply: ${parts.join(\"; local fallback \")}`;\n\t\tctx.endCompaction?.({ reason: \"extension\", signal, aborted: signal?.aborted, errorMessage });\n\t}\n}\n\nexport function linkAbortSignal(source: AbortSignal | undefined, target: AbortController): () => void {\n\tif (!source) return () => {};\n\tif (source.aborted) {\n\t\ttarget.abort();\n\t\treturn () => {};\n\t}\n\tconst abort = () => target.abort();\n\tsource.addEventListener(\"abort\", abort, { once: true });\n\treturn () => source.removeEventListener(\"abort\", abort);\n}\n\nexport function createBlockingRemoteCompactionEvent(\n\tctx: ExtensionContext,\n\tsnapshot: SpeculativeCompactionSnapshot,\n\tcustomInstructions: string,\n\tsignal: AbortSignal,\n): SessionBeforeCompactEvent {\n\treturn {\n\t\ttype: \"session_before_compact\",\n\t\treason: \"extension\",\n\t\twillRetry: false,\n\t\trequestId: randomUUID(),\n\t\tpreparation: snapshot.preparation,\n\t\tbranchEntries: ctx.sessionManager.getBranch(),\n\t\tcustomInstructions,\n\t\tsignal,\n\t};\n}\n"]}
@@ -15,7 +15,7 @@ export interface IdleWarmupRetryDecision {
15
15
  readonly transient: boolean;
16
16
  readonly isIdle: boolean;
17
17
  readonly breakerTripped: boolean;
18
- readonly stillOverThreshold: boolean;
18
+ readonly stillWarmEligible: boolean;
19
19
  }
20
20
  export declare function shouldRetryIdleWarmup(decision: IdleWarmupRetryDecision): boolean;
21
21
  //# sourceMappingURL=idle-retry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"idle-retry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACrC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAMhF"}
1
+ {"version":3,"file":"idle-retry.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,0BAA0B,QAAS,CAAC;AAEjD,MAAM,WAAW,uBAAuB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACpC;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAMhF"}
@@ -17,7 +17,7 @@ export function shouldRetryIdleWarmup(decision) {
17
17
  return false;
18
18
  if (decision.breakerTripped)
19
19
  return false;
20
- if (!decision.stillOverThreshold)
20
+ if (!decision.stillWarmEligible)
21
21
  return false;
22
22
  return decision.attempt < MAX_IDLE_WARMUP_RETRIES;
23
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"idle-retry.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAUjD,MAAM,UAAU,qBAAqB,CAAC,QAAiC;IACtE,IAAI,CAAC,QAAQ,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,kBAAkB;QAAE,OAAO,KAAK,CAAC;IAC/C,OAAO,QAAQ,CAAC,OAAO,GAAG,uBAAuB,CAAC;AACnD,CAAC","sourcesContent":["/**\n * Retry policy for the idle compaction warm-up.\n *\n * The `agent_end` idle trigger only warms a speculative summary (#561 forbids\n * committing a durable boundary at idle). A transient summarization failure\n * used to leave a dead warm job for the whole idle period, forcing a fresh\n * blocking summarization onto the user's critical path at the next prompt.\n * While the session stays idle, a transient failure is retried a bounded\n * number of times with a fresh snapshot instead.\n */\n\nexport const MAX_IDLE_WARMUP_RETRIES = 2;\nexport const IDLE_WARMUP_RETRY_DELAY_MS = 15_000;\n\nexport interface IdleWarmupRetryDecision {\n\treadonly attempt: number;\n\treadonly transient: boolean;\n\treadonly isIdle: boolean;\n\treadonly breakerTripped: boolean;\n\treadonly stillOverThreshold: boolean;\n}\n\nexport function shouldRetryIdleWarmup(decision: IdleWarmupRetryDecision): boolean {\n\tif (!decision.transient) return false;\n\tif (!decision.isIdle) return false;\n\tif (decision.breakerTripped) return false;\n\tif (!decision.stillOverThreshold) return false;\n\treturn decision.attempt < MAX_IDLE_WARMUP_RETRIES;\n}\n"]}
1
+ {"version":3,"file":"idle-retry.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAUjD,MAAM,UAAU,qBAAqB,CAAC,QAAiC;IACtE,IAAI,CAAC,QAAQ,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAC9C,OAAO,QAAQ,CAAC,OAAO,GAAG,uBAAuB,CAAC;AACnD,CAAC","sourcesContent":["/**\n * Retry policy for the idle compaction warm-up.\n *\n * The `agent_end` idle trigger only warms a speculative summary (#561 forbids\n * committing a durable boundary at idle). A transient summarization failure\n * used to leave a dead warm job for the whole idle period, forcing a fresh\n * blocking summarization onto the user's critical path at the next prompt.\n * While the session stays idle, a transient failure is retried a bounded\n * number of times with a fresh snapshot instead.\n */\n\nexport const MAX_IDLE_WARMUP_RETRIES = 2;\nexport const IDLE_WARMUP_RETRY_DELAY_MS = 15_000;\n\nexport interface IdleWarmupRetryDecision {\n\treadonly attempt: number;\n\treadonly transient: boolean;\n\treadonly isIdle: boolean;\n\treadonly breakerTripped: boolean;\n\treadonly stillWarmEligible: boolean;\n}\n\nexport function shouldRetryIdleWarmup(decision: IdleWarmupRetryDecision): boolean {\n\tif (!decision.transient) return false;\n\tif (!decision.isIdle) return false;\n\tif (decision.breakerTripped) return false;\n\tif (!decision.stillWarmEligible) return false;\n\treturn decision.attempt < MAX_IDLE_WARMUP_RETRIES;\n}\n"]}
@@ -13,4 +13,5 @@ export interface IdleCompactionDecision {
13
13
  mode: ExtensionMode;
14
14
  }
15
15
  export declare function shouldRunIdleCompaction(decision: IdleCompactionDecision): boolean;
16
+ export declare function shouldWarmAtIdle(decision: IdleCompactionDecision): boolean;
16
17
  //# sourceMappingURL=idle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"idle.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,eAAe,EAA2B,MAAM,aAAa,CAAC;AAE5E,eAAO,MAAM,4BAA4B,2FACgD,CAAC;AAI1F,MAAM,WAAW,sBAAsB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,YAAY,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,IAAI,EAAE,aAAa,CAAC;CACpB;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CASjF"}
1
+ {"version":3,"file":"idle.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,eAAe,EAA2B,MAAM,aAAa,CAAC;AAG5E,eAAO,MAAM,4BAA4B,2FACgD,CAAC;AAI1F,MAAM,WAAW,sBAAsB;IACtC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,YAAY,GAAG,SAAS,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,IAAI,EAAE,aAAa,CAAC;CACpB;AAaD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAGjF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAG1E"}
@@ -1,21 +1,32 @@
1
1
  import { shouldTriggerCompaction } from "./policy.js";
2
+ import { WARM_GENERATION_FLOOR_RATIO } from "./speculation-lead.js";
2
3
  export const IDLE_COMPACTION_INSTRUCTIONS = "Proactively compact at idle before the next agent turn, while the user is not waiting.";
3
4
  const PERSISTENT_MODES = new Set(["tui", "rpc", "app-server"]);
4
- export function shouldRunIdleCompaction(decision) {
5
+ function isIdleEligible(decision) {
5
6
  if (decision.willRetry)
6
7
  return false;
7
8
  if (decision.aborted)
8
9
  return false;
9
10
  if (!PERSISTENT_MODES.has(decision.mode))
10
11
  return false;
12
+ if (!decision.settings.enabled)
13
+ return false;
11
14
  if (decision.settings.idleCompactionEnabled === false)
12
15
  return false;
13
16
  if (decision.breakerTripped)
14
17
  return false;
15
18
  if (!decision.usage)
16
19
  return false;
17
- if (decision.usage.tokens === null)
20
+ return decision.usage.tokens !== null;
21
+ }
22
+ export function shouldRunIdleCompaction(decision) {
23
+ if (!isIdleEligible(decision) || !decision.usage)
18
24
  return false;
19
25
  return shouldTriggerCompaction(decision.usage, decision.contextWindow, decision.settings, decision.lastYield);
20
26
  }
27
+ export function shouldWarmAtIdle(decision) {
28
+ if (!isIdleEligible(decision) || !decision.usage || decision.usage.tokens === null)
29
+ return false;
30
+ return decision.usage.tokens >= decision.contextWindow * WARM_GENERATION_FLOOR_RATIO;
31
+ }
21
32
  //# sourceMappingURL=idle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"idle.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAE5E,MAAM,CAAC,MAAM,4BAA4B,GACxC,wFAAwF,CAAC;AAE1F,MAAM,gBAAgB,GAA+B,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;AAa3F,MAAM,UAAU,uBAAuB,CAAC,QAAgC;IACvE,IAAI,QAAQ,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,QAAQ,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACjD,OAAO,uBAAuB,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC/G,CAAC","sourcesContent":["import type { CompactionSettings } from \"../../../compaction/index.ts\";\nimport type { ContextUsage, ExtensionMode } from \"../../types.ts\";\nimport { type CompactionYield, shouldTriggerCompaction } from \"./policy.ts\";\n\nexport const IDLE_COMPACTION_INSTRUCTIONS =\n\t\"Proactively compact at idle before the next agent turn, while the user is not waiting.\";\n\nconst PERSISTENT_MODES: ReadonlySet<ExtensionMode> = new Set([\"tui\", \"rpc\", \"app-server\"]);\n\nexport interface IdleCompactionDecision {\n\twillRetry: boolean;\n\taborted: boolean;\n\tsettings: CompactionSettings;\n\tusage: ContextUsage | undefined;\n\tcontextWindow: number;\n\tbreakerTripped: boolean;\n\tlastYield?: CompactionYield;\n\tmode: ExtensionMode;\n}\n\nexport function shouldRunIdleCompaction(decision: IdleCompactionDecision): boolean {\n\tif (decision.willRetry) return false;\n\tif (decision.aborted) return false;\n\tif (!PERSISTENT_MODES.has(decision.mode)) return false;\n\tif (decision.settings.idleCompactionEnabled === false) return false;\n\tif (decision.breakerTripped) return false;\n\tif (!decision.usage) return false;\n\tif (decision.usage.tokens === null) return false;\n\treturn shouldTriggerCompaction(decision.usage, decision.contextWindow, decision.settings, decision.lastYield);\n}\n"]}
1
+ {"version":3,"file":"idle.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/idle.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAEpE,MAAM,CAAC,MAAM,4BAA4B,GACxC,wFAAwF,CAAC;AAE1F,MAAM,gBAAgB,GAA+B,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;AAa3F,SAAS,cAAc,CAAC,QAAgC;IACvD,IAAI,QAAQ,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,QAAQ,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,qBAAqB,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACpE,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAgC;IACvE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAC/D,OAAO,uBAAuB,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;AAC/G,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgC;IAChE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACjG,OAAO,QAAQ,CAAC,KAAK,CAAC,MAAM,IAAI,QAAQ,CAAC,aAAa,GAAG,2BAA2B,CAAC;AACtF,CAAC","sourcesContent":["import type { CompactionSettings } from \"../../../compaction/index.ts\";\nimport type { ContextUsage, ExtensionMode } from \"../../types.ts\";\nimport { type CompactionYield, shouldTriggerCompaction } from \"./policy.ts\";\nimport { WARM_GENERATION_FLOOR_RATIO } from \"./speculation-lead.ts\";\n\nexport const IDLE_COMPACTION_INSTRUCTIONS =\n\t\"Proactively compact at idle before the next agent turn, while the user is not waiting.\";\n\nconst PERSISTENT_MODES: ReadonlySet<ExtensionMode> = new Set([\"tui\", \"rpc\", \"app-server\"]);\n\nexport interface IdleCompactionDecision {\n\twillRetry: boolean;\n\taborted: boolean;\n\tsettings: CompactionSettings;\n\tusage: ContextUsage | undefined;\n\tcontextWindow: number;\n\tbreakerTripped: boolean;\n\tlastYield?: CompactionYield;\n\tmode: ExtensionMode;\n}\n\nfunction isIdleEligible(decision: IdleCompactionDecision): boolean {\n\tif (decision.willRetry) return false;\n\tif (decision.aborted) return false;\n\tif (!PERSISTENT_MODES.has(decision.mode)) return false;\n\tif (!decision.settings.enabled) return false;\n\tif (decision.settings.idleCompactionEnabled === false) return false;\n\tif (decision.breakerTripped) return false;\n\tif (!decision.usage) return false;\n\treturn decision.usage.tokens !== null;\n}\n\nexport function shouldRunIdleCompaction(decision: IdleCompactionDecision): boolean {\n\tif (!isIdleEligible(decision) || !decision.usage) return false;\n\treturn shouldTriggerCompaction(decision.usage, decision.contextWindow, decision.settings, decision.lastYield);\n}\n\nexport function shouldWarmAtIdle(decision: IdleCompactionDecision): boolean {\n\tif (!isIdleEligible(decision) || !decision.usage || decision.usage.tokens === null) return false;\n\treturn decision.usage.tokens >= decision.contextWindow * WARM_GENERATION_FLOOR_RATIO;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { ExtensionAPI } from "../../types.ts";
2
2
  import { type OpenAiRemoteCompactionDependencies } from "./openai-remote.ts";
3
- export declare function getPromptContextWindow(contextWindow: number, maxTokens: number | undefined): number;
3
+ export { getPromptContextWindow } from "./extension-wiring.ts";
4
4
  export default function compactionExtension(pi: ExtensionAPI, remoteCompactionDependencies?: OpenAiRemoteCompactionDependencies): void;
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEX,YAAY,EAIZ,MAAM,gBAAgB,CAAC;AA4BxB,OAAO,EAEN,KAAK,kCAAkC,EAIvC,MAAM,oBAAoB,CAAC;AAgD5B,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMnG;AAuFD,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAC1C,EAAE,EAAE,YAAY,EAChB,4BAA4B,GAAE,kCAAuC,GACnE,IAAI,CA+1BN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAoE,MAAM,gBAAgB,CAAC;AAyBrH,OAAO,EACN,KAAK,kCAAkC,EAIvC,MAAM,oBAAoB,CAAC;AAqC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AA2B/D,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAC1C,EAAE,EAAE,YAAY,EAChB,4BAA4B,GAAE,kCAAuC,GACnE,IAAI,CAo6BN"}
@@ -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)) {
762
- getLogger(ctx).debug("emergency_prune", {
763
- route: "context-event",
764
- tokens: usageWithPendingPrompt.tokens ?? 0,
765
- });
705
+ policy.shouldStartSpeculativeCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined, leadTokens)) {
706
+ // The speculative start below logs "speculative_started" itself; logging
707
+ // "emergency_prune" here mislabeled proactive speculation as pruning and
708
+ // corrupted the counter the incident analysis relies on.
766
709
  startSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
767
710
  }
768
- return message ? { message } : undefined;
711
+ const reminder = computeTokenBudgetReminder({
712
+ contextTokens: usageWithPendingPrompt?.tokens ?? 0,
713
+ contextWindow,
714
+ thresholdTokens,
715
+ leadTokens,
716
+ compactionEpoch: speculativeGeneration,
717
+ state: reminderState,
718
+ });
719
+ reminderState = reminder.nextState;
720
+ const deliveredMessage = resolveBeforeAgentStartMessage({
721
+ message,
722
+ reminder: reminder.message,
723
+ reminderEnabled: settings.reminderEnabled,
724
+ });
725
+ const reminderSystemPrompt = resolveReminderSystemPrompt({
726
+ systemPrompt: event.systemPrompt,
727
+ reminder: !message ? reminder.message : undefined,
728
+ reminderEnabled: settings.reminderEnabled,
729
+ });
730
+ if (!deliveredMessage && !reminderSystemPrompt)
731
+ return undefined;
732
+ return {
733
+ ...(deliveredMessage ? { message: deliveredMessage } : {}),
734
+ ...(reminderSystemPrompt ? { systemPrompt: reminderSystemPrompt } : {}),
735
+ };
769
736
  });
770
737
  pi.on("context", (event, ctx) => {
771
738
  const usage = ctx.getContextUsage();
739
+ const settings = ctx.getCompactionSettings();
772
740
  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)) };
741
+ const laneOwnsCompaction = lanePolicy.disablesSenpiCompaction(ctx);
742
+ const breakerFallback = !laneOwnsCompaction &&
743
+ breaker.isTripped(state, Date.now()) &&
744
+ usage?.tokens !== null &&
745
+ usage !== undefined &&
746
+ usage.tokens >= contextWindow * policy.computeEffectiveThreshold(contextWindow, state.lastYield ?? undefined);
747
+ if (breakerFallback)
748
+ getLogger(ctx).debug("breaker_deterministic_fallback", { route: "context-event", tokens: usage.tokens ?? 0 });
749
+ return {
750
+ messages: buildCompactionContext({
751
+ event,
752
+ ctx,
753
+ contextWindow,
754
+ promptContextWindow: getPromptContextWindow(contextWindow, ctx.model?.maxTokens),
755
+ toolAdmissionEnabled: settings.toolAdmissionEnabled !== false,
756
+ breakerFallback,
757
+ laneOwnsCompaction,
758
+ emergencyPruneLatch,
759
+ logEmergencyPrune: (fields) => getLogger(ctx).debug("emergency_prune", fields),
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)) {