@code-yeongyu/senpi 2026.8.29 → 2026.8.30-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 (311) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/core/agent-session.d.ts +45 -1
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +329 -29
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/bash-executor.d.ts.map +1 -1
  7. package/dist/core/bash-executor.js +155 -37
  8. package/dist/core/bash-executor.js.map +1 -1
  9. package/dist/core/compaction/compaction-execution.d.ts +14 -0
  10. package/dist/core/compaction/compaction-execution.d.ts.map +1 -0
  11. package/dist/core/compaction/compaction-execution.js +121 -0
  12. package/dist/core/compaction/compaction-execution.js.map +1 -0
  13. package/dist/core/compaction/compaction-settings.d.ts +17 -0
  14. package/dist/core/compaction/compaction-settings.d.ts.map +1 -0
  15. package/dist/core/compaction/compaction-settings.js +17 -0
  16. package/dist/core/compaction/compaction-settings.js.map +1 -0
  17. package/dist/core/compaction/compaction.d.ts +13 -26
  18. package/dist/core/compaction/compaction.d.ts.map +1 -1
  19. package/dist/core/compaction/compaction.js +7 -136
  20. package/dist/core/compaction/compaction.js.map +1 -1
  21. package/dist/core/compaction/ideal-compaction-settings.d.ts +9 -0
  22. package/dist/core/compaction/ideal-compaction-settings.d.ts.map +1 -0
  23. package/dist/core/compaction/ideal-compaction-settings.js +7 -0
  24. package/dist/core/compaction/ideal-compaction-settings.js.map +1 -0
  25. package/dist/core/compaction-settings-access.d.ts +19 -0
  26. package/dist/core/compaction-settings-access.d.ts.map +1 -0
  27. package/dist/core/compaction-settings-access.js +10 -0
  28. package/dist/core/compaction-settings-access.js.map +1 -0
  29. package/dist/core/compaction-settings-resolver.d.ts +22 -0
  30. package/dist/core/compaction-settings-resolver.d.ts.map +1 -0
  31. package/dist/core/compaction-settings-resolver.js +46 -0
  32. package/dist/core/compaction-settings-resolver.js.map +1 -0
  33. package/dist/core/credential-accounts.d.ts.map +1 -1
  34. package/dist/core/credential-accounts.js +23 -9
  35. package/dist/core/credential-accounts.js.map +1 -1
  36. package/dist/core/credential-pool/env-slots.d.ts.map +1 -1
  37. package/dist/core/credential-pool/env-slots.js +2 -0
  38. package/dist/core/credential-pool/env-slots.js.map +1 -1
  39. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts +17 -0
  40. package/dist/core/extensions/builtin/compaction/context-pipeline.d.ts.map +1 -0
  41. package/dist/core/extensions/builtin/compaction/context-pipeline.js +28 -0
  42. package/dist/core/extensions/builtin/compaction/context-pipeline.js.map +1 -0
  43. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +8 -2
  44. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +163 -48
  46. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  47. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts +17 -0
  48. package/dist/core/extensions/builtin/compaction/emergency-prune.d.ts.map +1 -0
  49. package/dist/core/extensions/builtin/compaction/emergency-prune.js +64 -0
  50. package/dist/core/extensions/builtin/compaction/emergency-prune.js.map +1 -0
  51. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts +27 -0
  52. package/dist/core/extensions/builtin/compaction/extension-wiring.d.ts.map +1 -0
  53. package/dist/core/extensions/builtin/compaction/extension-wiring.js +84 -0
  54. package/dist/core/extensions/builtin/compaction/extension-wiring.js.map +1 -0
  55. package/dist/core/extensions/builtin/compaction/idle.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 +121 -147
  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/openai-remote-dependencies.d.ts +9 -0
  72. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.d.ts.map +1 -0
  73. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js +2 -0
  74. package/dist/core/extensions/builtin/compaction/openai-remote-dependencies.js.map +1 -0
  75. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +3 -6
  76. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  77. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  78. package/dist/core/extensions/builtin/compaction/orchestration.d.ts +56 -0
  79. package/dist/core/extensions/builtin/compaction/orchestration.d.ts.map +1 -0
  80. package/dist/core/extensions/builtin/compaction/orchestration.js +136 -0
  81. package/dist/core/extensions/builtin/compaction/orchestration.js.map +1 -0
  82. package/dist/core/extensions/builtin/compaction/policy.d.ts +5 -2
  83. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/compaction/policy.js +43 -26
  85. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  86. package/dist/core/extensions/builtin/compaction/retained-message-safety.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/compaction/retained-message-safety.js +31 -8
  88. package/dist/core/extensions/builtin/compaction/retained-message-safety.js.map +1 -1
  89. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts +8 -0
  90. package/dist/core/extensions/builtin/compaction/speculation-lead.d.ts.map +1 -0
  91. package/dist/core/extensions/builtin/compaction/speculation-lead.js +17 -0
  92. package/dist/core/extensions/builtin/compaction/speculation-lead.js.map +1 -0
  93. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts +22 -0
  94. package/dist/core/extensions/builtin/compaction/speculative-job.d.ts.map +1 -0
  95. package/dist/core/extensions/builtin/compaction/speculative-job.js +16 -0
  96. package/dist/core/extensions/builtin/compaction/speculative-job.js.map +1 -0
  97. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts +22 -0
  98. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -0
  99. package/dist/core/extensions/builtin/compaction/speculative-summary.js +131 -0
  100. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -0
  101. package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -13
  102. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/compaction/speculative.js +7 -196
  104. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  105. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts +18 -0
  106. package/dist/core/extensions/builtin/compaction/token-budget-reminder.d.ts.map +1 -0
  107. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js +18 -0
  108. package/dist/core/extensions/builtin/compaction/token-budget-reminder.js.map +1 -0
  109. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts +36 -0
  110. package/dist/core/extensions/builtin/compaction/tool-admission.d.ts.map +1 -0
  111. package/dist/core/extensions/builtin/compaction/tool-admission.js +92 -0
  112. package/dist/core/extensions/builtin/compaction/tool-admission.js.map +1 -0
  113. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js +8 -28
  115. package/dist/core/extensions/builtin/cursor-cli-oauth/stream.js.map +1 -1
  116. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/permission-system/external-dir.js +15 -5
  118. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  119. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/permission-system/parsers.js +16 -1
  121. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  122. package/dist/core/extensions/builtin/terminal/manager.d.ts +5 -0
  123. package/dist/core/extensions/builtin/terminal/manager.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/terminal/manager.js +31 -3
  125. package/dist/core/extensions/builtin/terminal/manager.js.map +1 -1
  126. package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts +8 -0
  127. package/dist/core/extensions/builtin/terminal/monitor-permission.d.ts.map +1 -0
  128. package/dist/core/extensions/builtin/terminal/monitor-permission.js +16 -0
  129. package/dist/core/extensions/builtin/terminal/monitor-permission.js.map +1 -0
  130. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts +13 -0
  131. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/terminal/monitor-registry.js +403 -3
  133. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  134. package/dist/core/extensions/builtin/terminal/session-bundle.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/terminal/session-bundle.js +1 -0
  136. package/dist/core/extensions/builtin/terminal/session-bundle.js.map +1 -1
  137. package/dist/core/extensions/builtin/terminal/tools/kill-bash.d.ts.map +1 -1
  138. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js +5 -2
  139. package/dist/core/extensions/builtin/terminal/tools/kill-bash.js.map +1 -1
  140. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts +4 -0
  141. package/dist/core/extensions/builtin/terminal/tools/monitor.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/terminal/tools/monitor.js +40 -2
  143. package/dist/core/extensions/builtin/terminal/tools/monitor.js.map +1 -1
  144. package/dist/core/model-resolver.js +2 -2
  145. package/dist/core/model-resolver.js.map +1 -1
  146. package/dist/core/session-manager.d.ts.map +1 -1
  147. package/dist/core/session-manager.js +10 -1
  148. package/dist/core/session-manager.js.map +1 -1
  149. package/dist/core/settings-manager.d.ts +15 -85
  150. package/dist/core/settings-manager.d.ts.map +1 -1
  151. package/dist/core/settings-manager.js +15 -17
  152. package/dist/core/settings-manager.js.map +1 -1
  153. package/dist/core/settings-public-types.d.ts +11 -0
  154. package/dist/core/settings-public-types.d.ts.map +1 -0
  155. package/dist/core/settings-public-types.js +2 -0
  156. package/dist/core/settings-public-types.js.map +1 -0
  157. package/dist/core/settings-shapes.d.ts +36 -0
  158. package/dist/core/settings-shapes.d.ts.map +1 -0
  159. package/dist/core/settings-shapes.js +2 -0
  160. package/dist/core/settings-shapes.js.map +1 -0
  161. package/dist/core/shared-host-policy.d.ts +6 -0
  162. package/dist/core/shared-host-policy.d.ts.map +1 -0
  163. package/dist/core/shared-host-policy.js +7 -0
  164. package/dist/core/shared-host-policy.js.map +1 -0
  165. package/dist/core/terminal-settings.d.ts +22 -0
  166. package/dist/core/terminal-settings.d.ts.map +1 -0
  167. package/dist/core/terminal-settings.js +2 -0
  168. package/dist/core/terminal-settings.js.map +1 -0
  169. package/dist/core/tools/bash.d.ts.map +1 -1
  170. package/dist/core/tools/bash.js +97 -15
  171. package/dist/core/tools/bash.js.map +1 -1
  172. package/dist/core/tools/index.d.ts +1 -0
  173. package/dist/core/tools/index.d.ts.map +1 -1
  174. package/dist/core/tools/index.js +8 -0
  175. package/dist/core/tools/index.js.map +1 -1
  176. package/dist/core/tools/output-accumulator.d.ts +1 -1
  177. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  178. package/dist/core/tools/output-accumulator.js +76 -34
  179. package/dist/core/tools/output-accumulator.js.map +1 -1
  180. package/dist/main.d.ts.map +1 -1
  181. package/dist/main.js +17 -5
  182. package/dist/main.js.map +1 -1
  183. package/dist/modes/interactive/components/footer.d.ts +7 -0
  184. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  185. package/dist/modes/interactive/components/footer.js +34 -8
  186. package/dist/modes/interactive/components/footer.js.map +1 -1
  187. package/dist/modes/interactive/grok/chrome.d.ts +2 -0
  188. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
  189. package/dist/modes/interactive/grok/chrome.js.map +1 -1
  190. package/dist/modes/interactive/interactive-host-runtime.d.ts +121 -1
  191. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  192. package/dist/modes/interactive/interactive-host-runtime.js +336 -65
  193. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  194. package/dist/modes/interactive/interactive-mode.d.ts +7 -0
  195. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  196. package/dist/modes/interactive/interactive-mode.js +114 -2
  197. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  198. package/dist/modes/rpc/connection-handler.d.ts +8 -1
  199. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  200. package/dist/modes/rpc/connection-handler.js +145 -49
  201. package/dist/modes/rpc/connection-handler.js.map +1 -1
  202. package/dist/modes/rpc/host-ensure.d.ts +19 -0
  203. package/dist/modes/rpc/host-ensure.d.ts.map +1 -1
  204. package/dist/modes/rpc/host-ensure.js +79 -15
  205. package/dist/modes/rpc/host-ensure.js.map +1 -1
  206. package/dist/modes/rpc/host-lifecycle.d.ts +29 -0
  207. package/dist/modes/rpc/host-lifecycle.d.ts.map +1 -1
  208. package/dist/modes/rpc/host-lifecycle.js +96 -25
  209. package/dist/modes/rpc/host-lifecycle.js.map +1 -1
  210. package/dist/modes/rpc/host-watchdog.d.ts +2 -0
  211. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  212. package/dist/modes/rpc/host-watchdog.js +23 -12
  213. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  214. package/dist/modes/rpc/multi-session-host.js +6 -4
  215. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  216. package/dist/modes/rpc/rpc-client.d.ts +10 -4
  217. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  218. package/dist/modes/rpc/rpc-client.js +47 -10
  219. package/dist/modes/rpc/rpc-client.js.map +1 -1
  220. package/dist/modes/rpc/rpc-input-validation.d.ts +1 -0
  221. package/dist/modes/rpc/rpc-input-validation.d.ts.map +1 -1
  222. package/dist/modes/rpc/rpc-input-validation.js +66 -0
  223. package/dist/modes/rpc/rpc-input-validation.js.map +1 -1
  224. package/dist/modes/rpc/rpc-types.d.ts +86 -1
  225. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  226. package/dist/modes/rpc/rpc-types.js.map +1 -1
  227. package/dist/modes/rpc/session-binding.d.ts +1 -0
  228. package/dist/modes/rpc/session-binding.d.ts.map +1 -1
  229. package/dist/modes/rpc/session-binding.js +21 -1
  230. package/dist/modes/rpc/session-binding.js.map +1 -1
  231. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  232. package/dist/modes/rpc/session-command-router.js +1 -0
  233. package/dist/modes/rpc/session-command-router.js.map +1 -1
  234. package/dist/modes/rpc/session-event-writer.d.ts +2 -0
  235. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  236. package/dist/modes/rpc/session-event-writer.js +54 -7
  237. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  238. package/dist/modes/rpc/session-extension-ui-requests.d.ts +1 -0
  239. package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -1
  240. package/dist/modes/rpc/session-extension-ui-requests.js +5 -0
  241. package/dist/modes/rpc/session-extension-ui-requests.js.map +1 -1
  242. package/dist/modes/rpc/session-registry.d.ts +10 -2
  243. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  244. package/dist/modes/rpc/session-registry.js +58 -4
  245. package/dist/modes/rpc/session-registry.js.map +1 -1
  246. package/dist/modes/rpc/socket-event-fanout.d.ts +22 -0
  247. package/dist/modes/rpc/socket-event-fanout.d.ts.map +1 -0
  248. package/dist/modes/rpc/socket-event-fanout.js +84 -0
  249. package/dist/modes/rpc/socket-event-fanout.js.map +1 -0
  250. package/docs/rpc.md +18 -2
  251. package/docs/settings.md +34 -0
  252. package/docs/windows.md +2 -0
  253. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +50 -0
  254. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  255. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-indirect-eval.js +139 -90
  256. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +4 -4
  257. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  258. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +40 -20
  259. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  260. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +3 -3
  261. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  262. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  263. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts +1 -1
  264. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
  265. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +28 -9
  266. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
  267. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  268. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  269. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +67 -38
  270. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  271. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts +20 -0
  272. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts.map +1 -0
  273. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js +443 -0
  274. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -0
  275. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +2 -0
  276. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  277. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +2 -0
  278. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  279. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1 -1
  280. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  281. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  282. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  283. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  284. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  285. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  286. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  287. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  288. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  289. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  290. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  291. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  292. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  293. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  294. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  295. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  296. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  297. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  298. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +7 -0
  299. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  300. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +5 -0
  301. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  302. package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts +1 -1
  303. package/node_modules/@earendil-works/pi-tui/dist/mux.d.ts.map +1 -1
  304. package/node_modules/@earendil-works/pi-tui/dist/mux.js +2 -2
  305. package/node_modules/@earendil-works/pi-tui/dist/mux.js.map +1 -1
  306. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +1 -0
  307. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  308. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +19 -0
  309. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  310. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  311. package/package.json +7 -7
@@ -1,112 +1,34 @@
1
- import { randomUUID } from "node:crypto";
2
1
  import { createWarmAnchorSnapshot, isWarmSummaryAnchorValid } from "../../../compaction/warm-anchor.js";
3
- import { convertToLlm } from "../../../messages.js";
4
2
  import * as checkpointState from "./checkpoint-state.js";
5
3
  import * as breaker from "./circuit-breaker.js";
6
- import { BUILTIN_CONTEXT_REDUCTION_OPTIONS, reduceContextMessages, shouldApplyContextReduction, } from "./context-reduction.js";
4
+ import { buildCompactionContext } from "./context-pipeline.js";
7
5
  import { createDegradationMonitorState, handleMessageEnd, handleTurnEnd, RECOVERY_INSTRUCTIONS, resetOnSessionCompact, } from "./degradation-monitor.js";
8
6
  import { classifyRequiredCompactionFallbackFailure, createRequiredCompactionFallback, } from "./deterministic-fallback.js";
9
7
  import * as idle from "./idle.js";
10
8
  import * as idleRetry from "./idle-retry.js";
11
9
  import { CLAUDE_SDK_OAUTH_COMPACT_ENTRY_TYPE, collectCompactBoundaryEntries, createCompactionLanePolicy, SDK_NATIVE_LANE_REJECTION_REASON, } from "./lane-policy.js";
12
10
  import { createCompactionLogger } from "./log.js";
13
- import { markOpenAiRemoteReplayBoundary, rewriteOpenAiPayloadWithRemoteCompaction, runOpenAiRemoteCompaction, SENPI_COMPACTION_EVENT, } from "./openai-remote.js";
11
+ import { handleCompactionModelSelect } from "./model-selection.js";
12
+ import { rewriteOpenAiPayloadWithRemoteCompaction, runOpenAiRemoteCompaction, SENPI_COMPACTION_EVENT, } from "./openai-remote.js";
14
13
  import { createOpenAiRemoteCompactionHeaders, isOpenAiRemoteCompactionModel, openAiRemoteCompactionOrigin, } from "./openai-remote-model.js";
14
+ import { resolveBeforeAgentStartMessage, resolveCompactionGeometry, resolveIdleWarmAction, resolveReminderSystemPrompt, shouldDeferGraceBand, } from "./orchestration.js";
15
15
  import * as cap from "./per-turn-cap.js";
16
16
  import * as policy from "./policy.js";
17
- import { repairOrphanedToolResults } from "./repair-tool-pairs.js";
18
17
  import * as restoration from "./restoration-tracker.js";
19
- import { applyGeneratedCompaction, createEmergencyPruneLatch, createSpeculativeCompactionSnapshot, getPromptVariant, hardLimitEmergencyPrune, runExtensionCompaction, SummaryGenerationError, } from "./speculative.js";
18
+ import { applyGeneratedCompaction, createEmergencyPruneLatch, createSpeculativeCompactionSnapshot, getPromptVariant, runExtensionCompaction, SummaryGenerationError, } from "./speculative.js";
19
+ import { trackSpeculativeJob } from "./speculative-job.js";
20
20
  import { createInitialState, resetTurnCounter } from "./state.js";
21
21
  import { resolveInheritedTaskIntent } from "./task-intent.js";
22
22
  import * as todoBridge from "./todo-bridge.js";
23
+ import { computeTokenBudgetReminder, createInitialReminderState, } from "./token-budget-reminder.js";
23
24
  import { isTransientSummarizationFailure } from "./transient-failure.js";
25
+ export { getPromptContextWindow } from "./extension-wiring.js";
26
+ import { createBlockingRemoteCompactionEvent, endCompactionFeedback, estimatePendingPromptTokens, 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;
@@ -333,9 +256,14 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
333
256
  getLogger(ctx).debug("speculative_started", { generation, origin: "speculative" });
334
257
  const controller = new AbortController();
335
258
  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 };
259
+ speculativeJob = trackSpeculativeJob({
260
+ generation,
261
+ snapshot,
262
+ controller,
263
+ settled,
264
+ armedAtTokens: ctx.getContextUsage()?.tokens ?? 0,
265
+ });
266
+ void settled.then(() => remoteCompactionDependencies.onSpeculativeJobSettled?.());
339
267
  }
340
268
  function capturePendingMetadata(requestId, ctx) {
341
269
  pendingMetadata.set(requestId, {
@@ -638,37 +566,16 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
638
566
  claimedWarmJob?.controller.abort();
639
567
  }
640
568
  });
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
- });
569
+ pi.on("model_select", (event, ctx) => handleCompactionModelSelect({
570
+ event,
571
+ ctx,
572
+ state,
573
+ speculativeSnapshot: speculativeJob?.snapshot,
574
+ laneOwnsCompaction: lanePolicy.disablesSenpiCompaction(ctx),
575
+ breakerTripped: breaker.isTripped(state, Date.now()),
576
+ invalidate: () => invalidateSpeculativeCompaction(ctx),
577
+ start: () => startSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS),
578
+ }));
672
579
  pi.on("session_compact", async (event, ctx) => {
673
580
  const compactEvent = event;
674
581
  invalidateSpeculativeCompaction(ctx);
@@ -679,6 +586,7 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
679
586
  const keptEntries = firstKeptIndex === -1 ? [] : branchEntries.slice(firstKeptIndex);
680
587
  state = cap.incrementAccepted(state);
681
588
  state = breaker.recordSuccess(state);
589
+ reminderState = createInitialReminderState();
682
590
  const details = compactEvent.compactionEntry.details;
683
591
  const sy = details?.structuralYield;
684
592
  if (sy && typeof sy.savedTokens === "number" && typeof sy.savingsRatio === "number") {
@@ -710,7 +618,9 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
710
618
  compactionEntryId: compactEvent.compactionEntry.id,
711
619
  contextWindow: usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
712
620
  usageTokens: usage?.tokens ?? null,
713
- reserveTokens: settings.reserveTokens,
621
+ reserveTokens: settings.reserveScalingEnabled === false
622
+ ? settings.reserveTokens
623
+ : policy.resolveReserveTokens(usage?.contextWindow ?? ctx.model?.contextWindow ?? DEFAULT_CONTEXT_WINDOW, settings.reserveTokens),
714
624
  settings,
715
625
  keptMessages: keptEntries.flatMap((entry) => {
716
626
  if (entry.type !== "message")
@@ -721,7 +631,9 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
721
631
  }
722
632
  return;
723
633
  }
724
- state = breaker.recordFailure(state, Date.now(), { route: compactEvent.reason });
634
+ if (!lanePolicy.disablesSenpiCompaction(ctx)) {
635
+ state = breaker.recordFailure(state, Date.now(), { route: compactEvent.reason });
636
+ }
725
637
  });
726
638
  pi.on("before_agent_start", async (event, ctx) => {
727
639
  sessionIdleSinceAgentEnd = false;
@@ -736,9 +648,14 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
736
648
  // the circuit breaker never blocks that valve for senpi-owned lanes.
737
649
  const laneOwnsCompaction = lanePolicy.disablesSenpiCompaction(ctx);
738
650
  const breakerCoolingDown = breaker.isTripped(state, Date.now()) || laneOwnsCompaction;
651
+ const { reserveTokens, thresholdTokens, leadTokens } = resolveCompactionGeometry({
652
+ contextWindow,
653
+ settings,
654
+ lastYield: state.lastYield ?? undefined,
655
+ });
739
656
  if (!laneOwnsCompaction &&
740
657
  usage &&
741
- policy.isAtHardLimit(usage, contextWindow, settings.reserveTokens, pendingPromptTokens)) {
658
+ policy.isAtHardLimit(usage, contextWindow, reserveTokens, pendingPromptTokens)) {
742
659
  getLogger(ctx).debug("hard_limit_trigger", {
743
660
  contextWindow,
744
661
  tokens: usage.tokens ?? 0,
@@ -754,42 +671,83 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
754
671
  tokens: usageWithPendingPrompt.tokens ?? 0,
755
672
  threshold: settings.reserveTokens,
756
673
  });
757
- await applyBlockingCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
674
+ if (!shouldDeferGraceBand({
675
+ tokens: usageWithPendingPrompt.tokens ?? 0,
676
+ thresholdTokens,
677
+ leadTokens,
678
+ contextWindow,
679
+ reserveTokens,
680
+ compactionInFlight: speculativeJob !== undefined && !speculativeJob.completed,
681
+ graceBandEnabled: settings.graceBandEnabled,
682
+ })) {
683
+ await applyBlockingCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
684
+ }
685
+ else {
686
+ getLogger(ctx).debug("grace_deferred", {
687
+ tokens: usageWithPendingPrompt.tokens ?? 0,
688
+ threshold: thresholdTokens,
689
+ });
690
+ }
758
691
  }
759
692
  else if (!breakerCoolingDown &&
760
693
  usageWithPendingPrompt &&
761
- policy.shouldStartSpeculativeCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined)) {
694
+ policy.shouldStartSpeculativeCompaction(usageWithPendingPrompt, contextWindow, settings, state.lastYield ?? undefined, leadTokens)) {
762
695
  getLogger(ctx).debug("emergency_prune", {
763
696
  route: "context-event",
764
697
  tokens: usageWithPendingPrompt.tokens ?? 0,
765
698
  });
766
699
  startSpeculativeCompaction(ctx, PROACTIVE_COMPACTION_INSTRUCTIONS);
767
700
  }
768
- return message ? { message } : undefined;
701
+ const reminder = computeTokenBudgetReminder({
702
+ contextTokens: usageWithPendingPrompt?.tokens ?? 0,
703
+ contextWindow,
704
+ thresholdTokens,
705
+ leadTokens,
706
+ compactionGeneration: speculativeGeneration,
707
+ state: reminderState,
708
+ });
709
+ reminderState = reminder.nextState;
710
+ const deliveredMessage = resolveBeforeAgentStartMessage({
711
+ message,
712
+ reminder: reminder.message,
713
+ reminderEnabled: settings.reminderEnabled,
714
+ });
715
+ const reminderSystemPrompt = resolveReminderSystemPrompt({
716
+ systemPrompt: event.systemPrompt,
717
+ reminder: !message ? reminder.message : undefined,
718
+ reminderEnabled: settings.reminderEnabled,
719
+ });
720
+ if (!deliveredMessage && !reminderSystemPrompt)
721
+ return undefined;
722
+ return {
723
+ ...(deliveredMessage ? { message: deliveredMessage } : {}),
724
+ ...(reminderSystemPrompt ? { systemPrompt: reminderSystemPrompt } : {}),
725
+ };
769
726
  });
770
727
  pi.on("context", (event, ctx) => {
771
728
  const usage = ctx.getContextUsage();
729
+ const settings = ctx.getCompactionSettings();
772
730
  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)) };
731
+ const laneOwnsCompaction = lanePolicy.disablesSenpiCompaction(ctx);
732
+ const breakerFallback = !laneOwnsCompaction &&
733
+ breaker.isTripped(state, Date.now()) &&
734
+ usage?.tokens !== null &&
735
+ usage !== undefined &&
736
+ usage.tokens >= contextWindow * policy.computeEffectiveThreshold(contextWindow, state.lastYield ?? undefined);
737
+ if (breakerFallback)
738
+ getLogger(ctx).debug("breaker_deterministic_fallback", { route: "context-event", tokens: usage.tokens ?? 0 });
739
+ return {
740
+ messages: buildCompactionContext({
741
+ event,
742
+ ctx,
743
+ contextWindow,
744
+ promptContextWindow: contextWindow,
745
+ toolAdmissionEnabled: settings.toolAdmissionEnabled !== false,
746
+ breakerFallback,
747
+ laneOwnsCompaction,
748
+ emergencyPruneLatch,
749
+ }),
750
+ };
793
751
  });
794
752
  pi.on("before_provider_request", async (event, ctx) => {
795
753
  const model = event.model ?? ctx.model;
@@ -850,6 +808,22 @@ export default function compactionExtension(pi, remoteCompactionDependencies = {
850
808
  armIdleWarmupRetry(ctx);
851
809
  armIdleApply(ctx);
852
810
  }
811
+ else {
812
+ const warmAction = resolveIdleWarmAction({
813
+ willRetry: event.willRetry ?? false,
814
+ aborted: event.aborted === true,
815
+ settings,
816
+ usage,
817
+ contextWindow,
818
+ breakerTripped: breaker.isTripped(state, Date.now()),
819
+ lastYield: state.lastYield ?? undefined,
820
+ mode: ctx.mode,
821
+ }, speculativeJob);
822
+ if (warmAction === "replace")
823
+ invalidateSpeculativeCompaction(ctx);
824
+ if (warmAction !== "none")
825
+ startSpeculativeCompaction(ctx, idle.IDLE_COMPACTION_INSTRUCTIONS);
826
+ }
853
827
  });
854
828
  pi.on("message_end", async (event, ctx) => {
855
829
  for (const entry of collectCompactBoundaryEntries(event.message)) {