@code-yeongyu/senpi 2026.7.23 → 2026.7.25-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 (900) hide show
  1. package/CHANGELOG.md +162 -6
  2. package/README.md +14 -1
  3. package/dist/beta/omo-local-update.d.ts +207 -0
  4. package/dist/beta/omo-local-update.d.ts.map +1 -0
  5. package/dist/beta/omo-local-update.js +708 -0
  6. package/dist/beta/omo-local-update.js.map +1 -0
  7. package/dist/cli/args.d.ts +2 -0
  8. package/dist/cli/args.d.ts.map +1 -1
  9. package/dist/cli/args.js +6 -0
  10. package/dist/cli/args.js.map +1 -1
  11. package/dist/cli/config-selector.js +1 -1
  12. package/dist/cli/config-selector.js.map +1 -1
  13. package/dist/core/agent-session-runtime.d.ts +15 -1
  14. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  15. package/dist/core/agent-session-runtime.js +12 -2
  16. package/dist/core/agent-session-runtime.js.map +1 -1
  17. package/dist/core/agent-session.d.ts +115 -4
  18. package/dist/core/agent-session.d.ts.map +1 -1
  19. package/dist/core/agent-session.js +1317 -320
  20. package/dist/core/agent-session.js.map +1 -1
  21. package/dist/core/compaction/branch-summarization.d.ts +7 -1
  22. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  23. package/dist/core/compaction/branch-summarization.js +8 -12
  24. package/dist/core/compaction/branch-summarization.js.map +1 -1
  25. package/dist/core/compaction/compaction.d.ts +22 -4
  26. package/dist/core/compaction/compaction.d.ts.map +1 -1
  27. package/dist/core/compaction/compaction.js +114 -51
  28. package/dist/core/compaction/compaction.js.map +1 -1
  29. package/dist/core/compaction/lifecycle.d.ts +69 -0
  30. package/dist/core/compaction/lifecycle.d.ts.map +1 -0
  31. package/dist/core/compaction/lifecycle.js +104 -0
  32. package/dist/core/compaction/lifecycle.js.map +1 -0
  33. package/dist/core/compaction/utils.d.ts +12 -1
  34. package/dist/core/compaction/utils.d.ts.map +1 -1
  35. package/dist/core/compaction/utils.js +22 -17
  36. package/dist/core/compaction/utils.js.map +1 -1
  37. package/dist/core/event-bus.d.ts.map +1 -1
  38. package/dist/core/event-bus.js +11 -1
  39. package/dist/core/event-bus.js.map +1 -1
  40. package/dist/core/extensions/builtin/compaction/index.d.ts +2 -1
  41. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  42. package/dist/core/extensions/builtin/compaction/index.js +42 -30
  43. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  44. package/dist/core/extensions/builtin/compaction/openai-remote-model.d.ts +9 -2
  45. package/dist/core/extensions/builtin/compaction/openai-remote-model.d.ts.map +1 -1
  46. package/dist/core/extensions/builtin/compaction/openai-remote-model.js +78 -28
  47. package/dist/core/extensions/builtin/compaction/openai-remote-model.js.map +1 -1
  48. package/dist/core/extensions/builtin/compaction/openai-remote-schema.d.ts +3 -1
  49. package/dist/core/extensions/builtin/compaction/openai-remote-schema.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/compaction/openai-remote-schema.js +19 -1
  51. package/dist/core/extensions/builtin/compaction/openai-remote-schema.js.map +1 -1
  52. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +20 -6
  53. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/compaction/openai-remote.js +207 -22
  55. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  56. package/dist/core/extensions/builtin/compaction/speculative.d.ts +4 -2
  57. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/compaction/speculative.js +25 -13
  59. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  60. package/dist/core/extensions/builtin/config-reload/index.d.ts +7 -0
  61. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
  62. package/dist/core/extensions/builtin/config-reload/index.js +69 -34
  63. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  64. package/dist/core/extensions/builtin/config-reload/log.d.ts +4 -1
  65. package/dist/core/extensions/builtin/config-reload/log.d.ts.map +1 -1
  66. package/dist/core/extensions/builtin/config-reload/log.js +3 -0
  67. package/dist/core/extensions/builtin/config-reload/log.js.map +1 -1
  68. package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts +15 -0
  69. package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -0
  70. package/dist/core/extensions/builtin/config-reload/routine-settings.js +102 -0
  71. package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -0
  72. package/dist/core/extensions/builtin/hooks/index.js +1 -1
  73. package/dist/core/extensions/builtin/hooks/index.js.map +1 -1
  74. package/dist/core/extensions/builtin/hooks/lifecycle-adapter.d.ts +3 -1
  75. package/dist/core/extensions/builtin/hooks/lifecycle-adapter.d.ts.map +1 -1
  76. package/dist/core/extensions/builtin/hooks/lifecycle-adapter.js +2 -1
  77. package/dist/core/extensions/builtin/hooks/lifecycle-adapter.js.map +1 -1
  78. package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.d.ts +2 -1
  79. package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.d.ts.map +1 -1
  80. package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.js +5 -3
  81. package/dist/core/extensions/builtin/mcp/auth/commands-auth-dispatch.js.map +1 -1
  82. package/dist/core/extensions/builtin/mcp/auth/commands-auth.d.ts +5 -0
  83. package/dist/core/extensions/builtin/mcp/auth/commands-auth.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/mcp/auth/commands-auth.js +8 -3
  85. package/dist/core/extensions/builtin/mcp/auth/commands-auth.js.map +1 -1
  86. package/dist/core/extensions/builtin/mcp/catalog.d.ts +3 -1
  87. package/dist/core/extensions/builtin/mcp/catalog.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/mcp/catalog.js +2 -0
  89. package/dist/core/extensions/builtin/mcp/catalog.js.map +1 -1
  90. package/dist/core/extensions/builtin/mcp/commands.d.ts +1 -1
  91. package/dist/core/extensions/builtin/mcp/commands.d.ts.map +1 -1
  92. package/dist/core/extensions/builtin/mcp/commands.js +34 -39
  93. package/dist/core/extensions/builtin/mcp/commands.js.map +1 -1
  94. package/dist/core/extensions/builtin/mcp/connection-types.d.ts +2 -0
  95. package/dist/core/extensions/builtin/mcp/connection-types.d.ts.map +1 -1
  96. package/dist/core/extensions/builtin/mcp/connection-types.js.map +1 -1
  97. package/dist/core/extensions/builtin/mcp/connection.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/mcp/connection.js +3 -0
  99. package/dist/core/extensions/builtin/mcp/connection.js.map +1 -1
  100. package/dist/core/extensions/builtin/mcp/elicitation.d.ts +7 -3
  101. package/dist/core/extensions/builtin/mcp/elicitation.d.ts.map +1 -1
  102. package/dist/core/extensions/builtin/mcp/elicitation.js +5 -5
  103. package/dist/core/extensions/builtin/mcp/elicitation.js.map +1 -1
  104. package/dist/core/extensions/builtin/mcp/expose/register.d.ts.map +1 -1
  105. package/dist/core/extensions/builtin/mcp/expose/register.js +1 -0
  106. package/dist/core/extensions/builtin/mcp/expose/register.js.map +1 -1
  107. package/dist/core/extensions/builtin/mcp/expose/session.d.ts +2 -0
  108. package/dist/core/extensions/builtin/mcp/expose/session.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/mcp/expose/session.js +3 -0
  110. package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
  111. package/dist/core/extensions/builtin/mcp/guard/output-guard.d.ts +9 -1
  112. package/dist/core/extensions/builtin/mcp/guard/output-guard.d.ts.map +1 -1
  113. package/dist/core/extensions/builtin/mcp/guard/output-guard.js +18 -6
  114. package/dist/core/extensions/builtin/mcp/guard/output-guard.js.map +1 -1
  115. package/dist/core/extensions/builtin/mcp/index.d.ts +4 -2
  116. package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/mcp/index.js +150 -127
  118. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  119. package/dist/core/extensions/builtin/mcp/instructions.d.ts +1 -1
  120. package/dist/core/extensions/builtin/mcp/instructions.d.ts.map +1 -1
  121. package/dist/core/extensions/builtin/mcp/instructions.js +6 -6
  122. package/dist/core/extensions/builtin/mcp/instructions.js.map +1 -1
  123. package/dist/core/extensions/builtin/mcp/prompts.d.ts +2 -0
  124. package/dist/core/extensions/builtin/mcp/prompts.d.ts.map +1 -1
  125. package/dist/core/extensions/builtin/mcp/prompts.js +9 -3
  126. package/dist/core/extensions/builtin/mcp/prompts.js.map +1 -1
  127. package/dist/core/extensions/builtin/mcp/resources.d.ts +2 -0
  128. package/dist/core/extensions/builtin/mcp/resources.d.ts.map +1 -1
  129. package/dist/core/extensions/builtin/mcp/resources.js +1 -0
  130. package/dist/core/extensions/builtin/mcp/resources.js.map +1 -1
  131. package/dist/core/extensions/builtin/mcp/service-register.d.ts.map +1 -1
  132. package/dist/core/extensions/builtin/mcp/service-register.js +1 -0
  133. package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
  134. package/dist/core/extensions/builtin/mcp/service-types.d.ts +2 -0
  135. package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
  136. package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
  137. package/dist/core/extensions/builtin/mcp/service.d.ts +12 -1
  138. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/mcp/service.js +44 -2
  140. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  141. package/dist/core/extensions/builtin/mcp/transport.d.ts +2 -0
  142. package/dist/core/extensions/builtin/mcp/transport.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/mcp/transport.js +7 -7
  144. package/dist/core/extensions/builtin/mcp/transport.js.map +1 -1
  145. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
  146. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +86 -7
  147. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  148. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts +3 -0
  149. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts.map +1 -0
  150. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +102 -0
  151. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -0
  152. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts +48 -0
  153. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  154. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +88 -64
  155. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  156. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +96 -6
  158. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  159. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin/prompt-preset/presets.js +9 -0
  161. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  162. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  163. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  164. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  165. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  166. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/terminal/extension.js +1 -0
  168. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  169. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts +15 -3
  170. package/dist/core/extensions/builtin/terminal/tools/bash.d.ts.map +1 -1
  171. package/dist/core/extensions/builtin/terminal/tools/bash.js +30 -6
  172. package/dist/core/extensions/builtin/terminal/tools/bash.js.map +1 -1
  173. package/dist/core/extensions/builtin/terminal/tools/context.d.ts +5 -0
  174. package/dist/core/extensions/builtin/terminal/tools/context.d.ts.map +1 -1
  175. package/dist/core/extensions/builtin/terminal/tools/context.js.map +1 -1
  176. package/dist/core/extensions/builtin/websearch/index.d.ts.map +1 -1
  177. package/dist/core/extensions/builtin/websearch/index.js +2 -4
  178. package/dist/core/extensions/builtin/websearch/index.js.map +1 -1
  179. package/dist/core/extensions/builtin/websearch/websearch/config.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/websearch/websearch/config.js +4 -1
  181. package/dist/core/extensions/builtin/websearch/websearch/config.js.map +1 -1
  182. package/dist/core/extensions/builtin/websearch/websearch/native.d.ts.map +1 -1
  183. package/dist/core/extensions/builtin/websearch/websearch/native.js +2 -4
  184. package/dist/core/extensions/builtin/websearch/websearch/native.js.map +1 -1
  185. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  186. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +20 -8
  187. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  188. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +6 -1
  189. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  190. package/dist/core/extensions/builtin/websearch/websearch/search.js +15 -11
  191. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  192. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
  193. package/dist/core/extensions/builtin/websearch/websearch/tool.js +5 -10
  194. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  195. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +1 -0
  196. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  197. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  198. package/dist/core/extensions/runner.d.ts +14 -7
  199. package/dist/core/extensions/runner.d.ts.map +1 -1
  200. package/dist/core/extensions/runner.js +64 -37
  201. package/dist/core/extensions/runner.js.map +1 -1
  202. package/dist/core/extensions/types.d.ts +32 -3
  203. package/dist/core/extensions/types.d.ts.map +1 -1
  204. package/dist/core/extensions/types.js.map +1 -1
  205. package/dist/core/http-dispatcher.d.ts.map +1 -1
  206. package/dist/core/http-dispatcher.js +16 -0
  207. package/dist/core/http-dispatcher.js.map +1 -1
  208. package/dist/core/messages.d.ts +1 -1
  209. package/dist/core/messages.d.ts.map +1 -1
  210. package/dist/core/messages.js +10 -8
  211. package/dist/core/messages.js.map +1 -1
  212. package/dist/core/model-registry.d.ts +1 -0
  213. package/dist/core/model-registry.d.ts.map +1 -1
  214. package/dist/core/model-registry.js +3 -2
  215. package/dist/core/model-registry.js.map +1 -1
  216. package/dist/core/model-resolver.d.ts +1 -0
  217. package/dist/core/model-resolver.d.ts.map +1 -1
  218. package/dist/core/model-resolver.js +22 -3
  219. package/dist/core/model-resolver.js.map +1 -1
  220. package/dist/core/model-runtime.d.ts +4 -2
  221. package/dist/core/model-runtime.d.ts.map +1 -1
  222. package/dist/core/model-runtime.js +34 -18
  223. package/dist/core/model-runtime.js.map +1 -1
  224. package/dist/core/remote-catalog-provider.d.ts +1 -1
  225. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  226. package/dist/core/remote-catalog-provider.js +39 -7
  227. package/dist/core/remote-catalog-provider.js.map +1 -1
  228. package/dist/core/resolve-config-value.d.ts.map +1 -1
  229. package/dist/core/resolve-config-value.js +12 -8
  230. package/dist/core/resolve-config-value.js.map +1 -1
  231. package/dist/core/resource-loader.d.ts.map +1 -1
  232. package/dist/core/resource-loader.js +3 -0
  233. package/dist/core/resource-loader.js.map +1 -1
  234. package/dist/core/retry-fallback/controller.d.ts +7 -0
  235. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  236. package/dist/core/retry-fallback/controller.js +13 -0
  237. package/dist/core/retry-fallback/controller.js.map +1 -1
  238. package/dist/core/sdk.d.ts +1 -1
  239. package/dist/core/sdk.d.ts.map +1 -1
  240. package/dist/core/sdk.js +8 -3
  241. package/dist/core/sdk.js.map +1 -1
  242. package/dist/core/session-manager.d.ts +22 -3
  243. package/dist/core/session-manager.d.ts.map +1 -1
  244. package/dist/core/session-manager.js +155 -58
  245. package/dist/core/session-manager.js.map +1 -1
  246. package/dist/core/settings-manager.d.ts +8 -1
  247. package/dist/core/settings-manager.d.ts.map +1 -1
  248. package/dist/core/settings-manager.js +10 -0
  249. package/dist/core/settings-manager.js.map +1 -1
  250. package/dist/core/system-prompt.js +1 -1
  251. package/dist/core/system-prompt.js.map +1 -1
  252. package/dist/core/thinking-levels.d.ts.map +1 -1
  253. package/dist/core/thinking-levels.js +9 -2
  254. package/dist/core/thinking-levels.js.map +1 -1
  255. package/dist/core/tools/bash.d.ts +2 -0
  256. package/dist/core/tools/bash.d.ts.map +1 -1
  257. package/dist/core/tools/bash.js +34 -5
  258. package/dist/core/tools/bash.js.map +1 -1
  259. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  260. package/dist/core/tools/tool-definition-wrapper.js +3 -1
  261. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  262. package/dist/core/usage-totals.d.ts +19 -0
  263. package/dist/core/usage-totals.d.ts.map +1 -0
  264. package/dist/core/usage-totals.js +52 -0
  265. package/dist/core/usage-totals.js.map +1 -0
  266. package/dist/extensions/llama/client.d.ts.map +1 -1
  267. package/dist/extensions/llama/client.js +3 -1
  268. package/dist/extensions/llama/client.js.map +1 -1
  269. package/dist/extensions/llama/index.js +3 -3
  270. package/dist/extensions/llama/index.js.map +1 -1
  271. package/dist/extensions/llama/provider.d.ts.map +1 -1
  272. package/dist/extensions/llama/provider.js +7 -2
  273. package/dist/extensions/llama/provider.js.map +1 -1
  274. package/dist/index.d.ts +2 -2
  275. package/dist/index.d.ts.map +1 -1
  276. package/dist/index.js +1 -1
  277. package/dist/index.js.map +1 -1
  278. package/dist/main.d.ts.map +1 -1
  279. package/dist/main.js +37 -5
  280. package/dist/main.js.map +1 -1
  281. package/dist/modes/app-server/daemon/occupancy.d.ts +22 -0
  282. package/dist/modes/app-server/daemon/occupancy.d.ts.map +1 -0
  283. package/dist/modes/app-server/daemon/occupancy.js +67 -0
  284. package/dist/modes/app-server/daemon/occupancy.js.map +1 -0
  285. package/dist/modes/app-server/daemon/probe.d.ts +3 -3
  286. package/dist/modes/app-server/daemon/probe.d.ts.map +1 -1
  287. package/dist/modes/app-server/daemon/probe.js +33 -10
  288. package/dist/modes/app-server/daemon/probe.js.map +1 -1
  289. package/dist/modes/app-server/daemon.d.ts.map +1 -1
  290. package/dist/modes/app-server/daemon.js +58 -18
  291. package/dist/modes/app-server/daemon.js.map +1 -1
  292. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  293. package/dist/modes/interactive/components/compaction-summary-message.js +8 -1
  294. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  295. package/dist/modes/interactive/components/custom-message.d.ts +3 -1
  296. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  297. package/dist/modes/interactive/components/custom-message.js +9 -2
  298. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  299. package/dist/modes/interactive/components/extension-editor.d.ts +1 -2
  300. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  301. package/dist/modes/interactive/components/extension-editor.js +16 -46
  302. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  303. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  304. package/dist/modes/interactive/components/footer.js.map +1 -1
  305. package/dist/modes/interactive/components/status-indicator.d.ts +4 -0
  306. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  307. package/dist/modes/interactive/components/status-indicator.js +13 -0
  308. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  309. package/dist/modes/interactive/external-editor.d.ts +12 -0
  310. package/dist/modes/interactive/external-editor.d.ts.map +1 -0
  311. package/dist/modes/interactive/external-editor.js +37 -0
  312. package/dist/modes/interactive/external-editor.js.map +1 -0
  313. package/dist/modes/interactive/interactive-mode.d.ts +3 -1
  314. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  315. package/dist/modes/interactive/interactive-mode.js +105 -80
  316. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  317. package/dist/modes/rpc/connection-handler.d.ts +6 -0
  318. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  319. package/dist/modes/rpc/connection-handler.js +34 -9
  320. package/dist/modes/rpc/connection-handler.js.map +1 -1
  321. package/dist/modes/rpc/multi-session-host.d.ts +15 -0
  322. package/dist/modes/rpc/multi-session-host.d.ts.map +1 -0
  323. package/dist/modes/rpc/multi-session-host.js +60 -0
  324. package/dist/modes/rpc/multi-session-host.js.map +1 -0
  325. package/dist/modes/rpc/neo-runtime-options.d.ts.map +1 -1
  326. package/dist/modes/rpc/neo-runtime-options.js +1 -0
  327. package/dist/modes/rpc/neo-runtime-options.js.map +1 -1
  328. package/dist/modes/rpc/rpc-client.d.ts +4 -0
  329. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  330. package/dist/modes/rpc/rpc-client.js +7 -0
  331. package/dist/modes/rpc/rpc-client.js.map +1 -1
  332. package/dist/modes/rpc/rpc-mode.d.ts +49 -0
  333. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  334. package/dist/modes/rpc/rpc-mode.js +49 -0
  335. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  336. package/dist/modes/rpc/rpc-types.d.ts +85 -1
  337. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  338. package/dist/modes/rpc/rpc-types.js +8 -1
  339. package/dist/modes/rpc/rpc-types.js.map +1 -1
  340. package/dist/modes/rpc/session-binding.d.ts +13 -0
  341. package/dist/modes/rpc/session-binding.d.ts.map +1 -0
  342. package/dist/modes/rpc/session-binding.js +33 -0
  343. package/dist/modes/rpc/session-binding.js.map +1 -0
  344. package/dist/modes/rpc/session-command-router.d.ts +19 -0
  345. package/dist/modes/rpc/session-command-router.d.ts.map +1 -0
  346. package/dist/modes/rpc/session-command-router.js +159 -0
  347. package/dist/modes/rpc/session-command-router.js.map +1 -0
  348. package/dist/modes/rpc/session-event-writer.d.ts +34 -0
  349. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -0
  350. package/dist/modes/rpc/session-event-writer.js +92 -0
  351. package/dist/modes/rpc/session-event-writer.js.map +1 -0
  352. package/dist/modes/rpc/session-extension-ui-requests.d.ts +15 -0
  353. package/dist/modes/rpc/session-extension-ui-requests.d.ts.map +1 -0
  354. package/dist/modes/rpc/session-extension-ui-requests.js +27 -0
  355. package/dist/modes/rpc/session-extension-ui-requests.js.map +1 -0
  356. package/dist/modes/rpc/session-registry.d.ts +58 -0
  357. package/dist/modes/rpc/session-registry.d.ts.map +1 -0
  358. package/dist/modes/rpc/session-registry.js +162 -0
  359. package/dist/modes/rpc/session-registry.js.map +1 -0
  360. package/dist/package-manager-cli.d.ts.map +1 -1
  361. package/dist/package-manager-cli.js +11 -0
  362. package/dist/package-manager-cli.js.map +1 -1
  363. package/dist/utils/clipboard.d.ts.map +1 -1
  364. package/dist/utils/clipboard.js +19 -8
  365. package/dist/utils/clipboard.js.map +1 -1
  366. package/dist/utils/version-check.d.ts.map +1 -1
  367. package/dist/utils/version-check.js +3 -1
  368. package/dist/utils/version-check.js.map +1 -1
  369. package/docs/app-server-daemon.md +3 -2
  370. package/docs/compaction.md +9 -4
  371. package/docs/custom-provider.md +5 -2
  372. package/docs/environment-variables.md +88 -0
  373. package/docs/extensions.md +27 -9
  374. package/docs/index.md +1 -0
  375. package/docs/json.md +5 -1
  376. package/docs/models.md +6 -2
  377. package/docs/providers.md +12 -1
  378. package/docs/rpc.md +154 -8
  379. package/docs/sdk.md +3 -0
  380. package/docs/session-format.md +17 -3
  381. package/docs/settings.md +13 -2
  382. package/docs/usage.md +1 -14
  383. package/examples/extensions/custom-compaction.ts +4 -0
  384. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  385. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  386. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  387. package/examples/extensions/gondolin/package-lock.json +2 -2
  388. package/examples/extensions/gondolin/package.json +1 -1
  389. package/examples/extensions/handoff.ts +9 -1
  390. package/examples/extensions/message-renderer.ts +2 -2
  391. package/examples/extensions/sandbox/package-lock.json +2 -2
  392. package/examples/extensions/sandbox/package.json +1 -1
  393. package/examples/extensions/summarize.ts +3 -0
  394. package/examples/extensions/with-deps/package-lock.json +2 -2
  395. package/examples/extensions/with-deps/package.json +1 -1
  396. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +36 -0
  397. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  398. package/node_modules/@earendil-works/pi-agent-core/README.md +31 -12
  399. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts +4 -4
  400. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  401. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +8 -7
  402. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  403. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +13 -3
  404. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  405. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +63 -27
  406. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  407. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts +11 -12
  408. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  409. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +47 -22
  410. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  411. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts +5 -1
  412. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  413. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js +6 -8
  414. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
  415. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts +17 -5
  416. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
  417. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +82 -27
  418. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  419. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.d.ts +12 -1
  420. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.d.ts.map +1 -1
  421. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.js +22 -17
  422. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.js.map +1 -1
  423. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts +3 -9
  424. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  425. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +118 -11
  426. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  427. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts +11 -3
  428. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -1
  429. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js +56 -4
  430. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js.map +1 -1
  431. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.d.ts +11 -3
  432. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.d.ts.map +1 -1
  433. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js +56 -4
  434. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js.map +1 -1
  435. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.d.ts.map +1 -1
  436. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.js +2 -2
  437. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.js.map +1 -1
  438. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +6 -4
  439. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  440. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +30 -14
  441. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  442. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/bash.d.ts +27 -0
  443. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/bash.d.ts.map +1 -0
  444. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/bash.js +132 -0
  445. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/bash.js.map +1 -0
  446. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit-diff.d.ts +89 -0
  447. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit-diff.d.ts.map +1 -0
  448. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit-diff.js +386 -0
  449. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit-diff.js.map +1 -0
  450. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.d.ts +19 -0
  451. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.d.ts.map +1 -0
  452. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js +95 -0
  453. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js.map +1 -0
  454. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/file-mutation-queue.d.ts +4 -0
  455. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/file-mutation-queue.d.ts.map +1 -0
  456. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/file-mutation-queue.js +46 -0
  457. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/file-mutation-queue.js.map +1 -0
  458. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/image.d.ts +3 -0
  459. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/image.d.ts.map +1 -0
  460. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/image.js +106 -0
  461. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/image.js.map +1 -0
  462. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts +6 -0
  463. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts.map +1 -0
  464. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.js +5 -0
  465. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.js.map +1 -0
  466. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/path-utils.d.ts +4 -0
  467. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/path-utils.d.ts.map +1 -0
  468. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/path-utils.js +26 -0
  469. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/path-utils.js.map +1 -0
  470. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts +34 -0
  471. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts.map +1 -0
  472. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js +110 -0
  473. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js.map +1 -0
  474. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts +6 -0
  475. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts.map +1 -0
  476. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.js +2 -0
  477. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.js.map +1 -0
  478. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.d.ts +11 -0
  479. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.d.ts.map +1 -0
  480. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js +31 -0
  481. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js.map +1 -0
  482. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +80 -18
  483. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  484. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  485. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts +12 -4
  486. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
  487. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +90 -35
  488. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
  489. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.d.ts.map +1 -1
  490. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js +10 -4
  491. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js.map +1 -1
  492. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +4 -2
  493. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  494. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +5 -2
  495. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  496. package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.d.ts +10 -0
  497. package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.d.ts.map +1 -0
  498. package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.js +17 -0
  499. package/node_modules/@earendil-works/pi-agent-core/dist/stream-fn.js.map +1 -0
  500. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +8 -2
  501. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  502. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  503. package/node_modules/@earendil-works/pi-agent-core/package.json +4 -3
  504. package/node_modules/@earendil-works/pi-ai/README.md +44 -4
  505. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  506. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +130 -47
  507. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  508. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -1
  509. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +36 -15
  510. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -1
  511. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  512. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +55 -26
  513. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  514. package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts +17 -0
  515. package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts.map +1 -0
  516. package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js +104 -0
  517. package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js.map +1 -0
  518. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.d.ts.map +1 -1
  519. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +16 -13
  520. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
  521. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts +4 -3
  522. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
  523. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +17 -3
  524. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
  525. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.d.ts.map +1 -1
  526. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +19 -13
  527. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
  528. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts.map +1 -1
  529. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js +13 -9
  530. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js.map +1 -1
  531. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  532. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +92 -58
  533. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  534. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +7 -9
  535. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  536. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +263 -56
  537. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  538. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +7 -0
  539. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  540. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +180 -80
  541. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  542. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  543. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +48 -21
  544. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  545. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.d.ts.map +1 -1
  546. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.js +8 -3
  547. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.js.map +1 -1
  548. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -1
  549. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js +2 -4
  550. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -1
  551. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -1
  552. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js +1 -0
  553. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -1
  554. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts +15 -0
  555. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -1
  556. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js +52 -6
  557. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -1
  558. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.d.ts.map +1 -1
  559. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js +3 -2
  560. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js.map +1 -1
  561. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts +10 -0
  562. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.d.ts.map +1 -0
  563. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js +249 -0
  564. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/kimi-coding.js.map +1 -0
  565. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +4 -0
  566. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
  567. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +10 -0
  568. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
  569. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  570. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js +2 -18
  571. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -1
  572. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openrouter.d.ts +13 -0
  573. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openrouter.d.ts.map +1 -0
  574. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openrouter.js +222 -0
  575. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openrouter.js.map +1 -0
  576. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts +3 -2
  577. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts.map +1 -1
  578. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js +37 -35
  579. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js.map +1 -1
  580. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
  581. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +11 -1
  582. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  583. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -1
  584. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +4 -0
  585. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -1
  586. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  587. package/node_modules/@earendil-works/pi-ai/dist/compat.js +2 -1
  588. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  589. package/node_modules/@earendil-works/pi-ai/dist/context-provenance.d.ts +16 -0
  590. package/node_modules/@earendil-works/pi-ai/dist/context-provenance.d.ts.map +1 -0
  591. package/node_modules/@earendil-works/pi-ai/dist/context-provenance.js +32 -0
  592. package/node_modules/@earendil-works/pi-ai/dist/context-provenance.js.map +1 -0
  593. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts +3 -0
  594. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  595. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +11 -3
  596. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  597. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +15 -0
  598. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  599. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +15 -0
  600. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  601. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.d.ts +19 -2
  602. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.d.ts.map +1 -1
  603. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js +68 -3
  604. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js.map +1 -1
  605. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +6 -0
  606. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  607. package/node_modules/@earendil-works/pi-ai/dist/index.js +6 -0
  608. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  609. package/node_modules/@earendil-works/pi-ai/dist/model-catalog.d.ts +17 -0
  610. package/node_modules/@earendil-works/pi-ai/dist/model-catalog.d.ts.map +1 -0
  611. package/node_modules/@earendil-works/pi-ai/dist/model-catalog.js +4 -0
  612. package/node_modules/@earendil-works/pi-ai/dist/model-catalog.js.map +1 -0
  613. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +2 -2
  614. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
  615. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
  616. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts +7 -0
  617. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -1
  618. package/node_modules/@earendil-works/pi-ai/dist/models-store.js.map +1 -1
  619. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +0 -6
  620. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  621. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +76 -4448
  622. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  623. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +4 -0
  624. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  625. package/node_modules/@earendil-works/pi-ai/dist/models.js +5 -54
  626. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  627. package/node_modules/@earendil-works/pi-ai/dist/node/provider-scope.d.ts +12 -0
  628. package/node_modules/@earendil-works/pi-ai/dist/node/provider-scope.d.ts.map +1 -0
  629. package/node_modules/@earendil-works/pi-ai/dist/node/provider-scope.js +34 -0
  630. package/node_modules/@earendil-works/pi-ai/dist/node/provider-scope.js.map +1 -0
  631. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts +3 -63
  632. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.d.ts.map +1 -1
  633. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js +2 -1
  634. package/node_modules/@earendil-works/pi-ai/dist/providers/alibaba-token-plan.models.js.map +1 -1
  635. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts +2 -0
  636. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  637. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +10 -0
  638. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  639. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  640. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +3 -2
  641. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  642. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts +3 -439
  643. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts.map +1 -1
  644. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js +2 -1
  645. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js.map +1 -1
  646. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.d.ts +3 -15
  647. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.d.ts.map +1 -1
  648. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.js +2 -1
  649. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.js.map +1 -1
  650. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  651. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +30 -3
  652. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  653. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts +3 -59
  654. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts.map +1 -1
  655. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js +2 -1
  656. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js.map +1 -1
  657. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +3 -187
  658. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -1
  659. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +2 -1
  660. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -1
  661. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.d.ts +3 -15
  662. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.d.ts.map +1 -1
  663. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js +2 -1
  664. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js.map +1 -1
  665. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts +3 -171
  666. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -1
  667. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js +2 -1
  668. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js.map +1 -1
  669. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.d.ts +3 -55
  670. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -1
  671. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.js +2 -1
  672. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.js.map +1 -1
  673. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -0
  674. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  675. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  676. package/node_modules/@earendil-works/pi-ai/dist/providers/data/ant-ling.json +1 -1
  677. package/node_modules/@earendil-works/pi-ai/dist/providers/data/anthropic.json +1 -1
  678. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  679. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cerebras.json +1 -1
  680. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  681. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  682. package/node_modules/@earendil-works/pi-ai/dist/providers/data/deepseek.json +1 -1
  683. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  684. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  685. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google-vertex.json +1 -1
  686. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  687. package/node_modules/@earendil-works/pi-ai/dist/providers/data/groq.json +1 -1
  688. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  689. package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
  690. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax-cn.json +1 -1
  691. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax.json +1 -1
  692. package/node_modules/@earendil-works/pi-ai/dist/providers/data/mistral.json +1 -1
  693. package/node_modules/@earendil-works/pi-ai/dist/providers/data/moonshotai-cn.json +1 -1
  694. package/node_modules/@earendil-works/pi-ai/dist/providers/data/moonshotai.json +1 -1
  695. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  696. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  697. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  698. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  699. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  700. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  701. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -0
  702. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -0
  703. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  704. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  705. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xai.json +1 -1
  706. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-ams.json +1 -1
  707. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-cn.json +1 -1
  708. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi-token-plan-sgp.json +1 -1
  709. package/node_modules/@earendil-works/pi-ai/dist/providers/data/xiaomi.json +1 -1
  710. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  711. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  712. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts +3 -11
  713. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts.map +1 -1
  714. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js +2 -1
  715. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js.map +1 -1
  716. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts +3 -67
  717. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts.map +1 -1
  718. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js +2 -1
  719. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js.map +1 -1
  720. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +3 -115
  721. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
  722. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +2 -1
  723. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  724. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.d.ts +3 -51
  725. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.d.ts.map +1 -1
  726. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.js +2 -1
  727. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.js.map +1 -1
  728. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts +3 -75
  729. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts.map +1 -1
  730. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js +2 -1
  731. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js.map +1 -1
  732. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.d.ts +3 -31
  733. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.d.ts.map +1 -1
  734. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.js +2 -1
  735. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.js.map +1 -1
  736. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.d.ts +3 -203
  737. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.d.ts.map +1 -1
  738. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.js +2 -1
  739. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.js.map +1 -1
  740. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js +2 -2
  741. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
  742. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.d.ts.map +1 -1
  743. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.js +10 -2
  744. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.js.map +1 -1
  745. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +3 -19
  746. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  747. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js +2 -1
  748. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  749. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.d.ts +3 -15
  750. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.d.ts.map +1 -1
  751. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.js +2 -1
  752. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.js.map +1 -1
  753. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.d.ts +3 -15
  754. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.d.ts.map +1 -1
  755. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.js +2 -1
  756. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.js.map +1 -1
  757. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.d.ts +3 -123
  758. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.d.ts.map +1 -1
  759. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.js +2 -1
  760. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.js.map +1 -1
  761. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts +3 -43
  762. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  763. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js +2 -1
  764. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js.map +1 -1
  765. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts +3 -43
  766. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts.map +1 -1
  767. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js +2 -1
  768. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js.map +1 -1
  769. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.d.ts +3 -79
  770. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.d.ts.map +1 -1
  771. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.js +2 -1
  772. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.js.map +1 -1
  773. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +3 -31
  774. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -1
  775. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +2 -1
  776. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -1
  777. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +3 -187
  778. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -1
  779. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +2 -1
  780. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -1
  781. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts +3 -67
  782. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts.map +1 -1
  783. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +2 -1
  784. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
  785. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +3 -227
  786. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  787. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +2 -1
  788. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  789. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter-images.d.ts.map +1 -1
  790. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter-images.js +10 -2
  791. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter-images.js.map +1 -1
  792. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.d.ts.map +1 -1
  793. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.js +10 -2
  794. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.js.map +1 -1
  795. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +3 -1095
  796. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  797. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +2 -1
  798. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  799. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan-cn.d.ts +3 -0
  800. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan-cn.d.ts.map +1 -0
  801. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan-cn.js +15 -0
  802. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan-cn.js.map +1 -0
  803. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan-cn.models.d.ts +4 -0
  804. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan-cn.models.d.ts.map +1 -0
  805. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan-cn.models.js +6 -0
  806. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan-cn.models.js.map +1 -0
  807. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan.d.ts +3 -0
  808. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan.d.ts.map +1 -0
  809. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan.js +15 -0
  810. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan.js.map +1 -0
  811. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan.models.d.ts +4 -0
  812. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan.models.d.ts.map +1 -0
  813. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan.models.js +6 -0
  814. package/node_modules/@earendil-works/pi-ai/dist/providers/qwen-token-plan.models.js.map +1 -0
  815. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.d.ts.map +1 -1
  816. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.js +18 -14
  817. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.js.map +1 -1
  818. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts +3 -67
  819. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts.map +1 -1
  820. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js +2 -1
  821. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js.map +1 -1
  822. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +3 -775
  823. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  824. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +2 -1
  825. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  826. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts +3 -15
  827. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts.map +1 -1
  828. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js +2 -1
  829. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js.map +1 -1
  830. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts +3 -15
  831. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -1
  832. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js +2 -1
  833. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -1
  834. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts +3 -15
  835. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -1
  836. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js +2 -1
  837. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -1
  838. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts +3 -15
  839. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -1
  840. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js +2 -1
  841. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -1
  842. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.d.ts +3 -27
  843. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.d.ts.map +1 -1
  844. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.js +2 -1
  845. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.js.map +1 -1
  846. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts +3 -27
  847. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts.map +1 -1
  848. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js +2 -1
  849. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js.map +1 -1
  850. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts +3 -27
  851. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts.map +1 -1
  852. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js +2 -1
  853. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js.map +1 -1
  854. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +52 -3
  855. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  856. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  857. package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.d.ts.map +1 -1
  858. package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js +8 -3
  859. package/node_modules/@earendil-works/pi-ai/dist/utils/error-body.js.map +1 -1
  860. package/node_modules/@earendil-works/pi-ai/dist/utils/openai-codex-auth.d.ts +11 -0
  861. package/node_modules/@earendil-works/pi-ai/dist/utils/openai-codex-auth.d.ts.map +1 -0
  862. package/node_modules/@earendil-works/pi-ai/dist/utils/openai-codex-auth.js +30 -0
  863. package/node_modules/@earendil-works/pi-ai/dist/utils/openai-codex-auth.js.map +1 -0
  864. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +1 -0
  865. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  866. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +3 -0
  867. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  868. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.d.ts +16 -0
  869. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.d.ts.map +1 -0
  870. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.js +94 -0
  871. package/node_modules/@earendil-works/pi-ai/dist/utils/provider-retry.js.map +1 -0
  872. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts +41 -0
  873. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  874. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +82 -0
  875. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  876. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts +30 -0
  877. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.d.ts.map +1 -0
  878. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js +70 -0
  879. package/node_modules/@earendil-works/pi-ai/dist/utils/server-fallback-receipt.js.map +1 -0
  880. package/node_modules/@earendil-works/pi-ai/dist/utils/text.d.ts +6 -0
  881. package/node_modules/@earendil-works/pi-ai/dist/utils/text.d.ts.map +1 -0
  882. package/node_modules/@earendil-works/pi-ai/dist/utils/text.js +10 -0
  883. package/node_modules/@earendil-works/pi-ai/dist/utils/text.js.map +1 -0
  884. package/node_modules/@earendil-works/pi-ai/dist/utils/uuid.d.ts +3 -0
  885. package/node_modules/@earendil-works/pi-ai/dist/utils/uuid.d.ts.map +1 -0
  886. package/node_modules/@earendil-works/{pi-agent-core/dist/harness/session → pi-ai/dist/utils}/uuid.js +2 -2
  887. package/node_modules/@earendil-works/pi-ai/dist/utils/uuid.js.map +1 -0
  888. package/node_modules/@earendil-works/pi-ai/package.json +11 -4
  889. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  890. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  891. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +31 -22
  892. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  893. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  894. package/node_modules/@earendil-works/pi-tui/dist/tui.js +2 -0
  895. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  896. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  897. package/package.json +7 -10
  898. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.d.ts +0 -2
  899. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.d.ts.map +0 -1
  900. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.js.map +0 -1
@@ -3,7 +3,7 @@ import { type Model, type Tool } from "@earendil-works/pi-ai";
3
3
  import { type CompactionPreparation, type CompactionResult } from "../../../compaction/index.ts";
4
4
  import type { ModelRegistry } from "../../../model-registry.ts";
5
5
  import type { ReadonlySessionManager } from "../../../session-manager.ts";
6
- import type { ApplyCompactionResult, ContextUsage } from "../../types.ts";
6
+ import type { ApplyCompactionResult, ContextUsage, ProviderRequestPreparation } from "../../types.ts";
7
7
  import { type MergedCompactionPromptVariant } from "./prompts.ts";
8
8
  type CompactionProgressCallback = (delta: string) => void;
9
9
  export interface SpeculativeCompactionContext {
@@ -14,9 +14,11 @@ export interface SpeculativeCompactionContext {
14
14
  getCompactionSettings?(): CompactionPreparation["settings"];
15
15
  getMessageRevision(): number;
16
16
  getSystemPrompt?(): string;
17
+ prepareProviderRequest?(messages: AgentMessage[]): Promise<ProviderRequestPreparation>;
17
18
  applyCompaction(precomputed: CompactionResult, options: {
18
19
  reason: "extension";
19
20
  expectedRevision: number;
21
+ signal?: AbortSignal;
20
22
  }): Promise<ApplyCompactionResult>;
21
23
  }
22
24
  export interface SpeculativeCompactionSnapshot {
@@ -71,7 +73,7 @@ export declare function createSpeculativeCompactionSnapshot(context: Speculative
71
73
  * misreports as an auth failure.
72
74
  */
73
75
  export declare function runExtensionCompaction(context: SpeculativeCompactionContext, snapshot: SpeculativeCompactionSnapshot, signal?: AbortSignal, onProgress?: CompactionProgressCallback): Promise<CompactionResult | undefined>;
74
- export declare function applyGeneratedCompaction(context: SpeculativeCompactionContext, snapshot: SpeculativeCompactionSnapshot | undefined, getCurrentGeneration: () => number, compaction: CompactionResult | undefined): Promise<SpeculativeCompactionResult>;
76
+ export declare function applyGeneratedCompaction(context: SpeculativeCompactionContext, snapshot: SpeculativeCompactionSnapshot | undefined, getCurrentGeneration: () => number, compaction: CompactionResult | undefined, signal?: AbortSignal): Promise<SpeculativeCompactionResult>;
75
77
  export declare function applySpeculativeCompaction(context: SpeculativeCompactionContext, snapshot: SpeculativeCompactionSnapshot | undefined, getCurrentGeneration: () => number, generate: () => Promise<CompactionResult | undefined>): Promise<SpeculativeCompactionResult>;
76
78
  export {};
77
79
  //# sourceMappingURL=speculative.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"speculative.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/speculative.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"speculative.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/speculative.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { stream } from "@earendil-works/pi-ai/compat";
3
3
  import { DEFAULT_COMPACTION_SETTINGS, estimateContextTokens, estimateTokens, prepareCompaction, } from "../../../compaction/index.js";
4
4
  import { consumeStreamWithIdleTimeout, DEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS, } from "../../../compaction/stream-watchdog.js";
5
5
  import { convertToLlm } from "../../../messages.js";
6
+ import { sanitizeAnthropicPayload } from "../tool-pair-guard/sanitize-anthropic-payload.js";
6
7
  import { computeEffectiveKeepRecentTokens, computeEffectiveThreshold } from "./policy.js";
7
8
  import { buildPrompt } from "./prompts.js";
8
9
  import { repairOrphanedToolResults } from "./repair-tool-pairs.js";
@@ -64,7 +65,6 @@ async function generateSummaryMessage(options) {
64
65
  // deterministically refused by Anthropic's anti-distillation classifier
65
66
  // ("reverse engineering or duplicating model outputs"), while the same
66
67
  // content as native blocks with the agent's system prompt and tools passes.
67
- const conversationMessages = repairOrphanedToolResults(convertToLlm(options.messages));
68
68
  // Request-local controller: the idle watchdog must be able to tear down a
69
69
  // stalled summarization request without aborting the caller's own signal.
70
70
  const requestController = new AbortController();
@@ -76,21 +76,31 @@ async function generateSummaryMessage(options) {
76
76
  options.signal.addEventListener("abort", onCallerAbort, { once: true });
77
77
  }
78
78
  try {
79
- const responseStream = stream(options.snapshot.model, {
79
+ const requestMessages = [
80
+ ...options.messages,
81
+ {
82
+ role: "user",
83
+ content: [{ type: "text", text: options.prompt.user }],
84
+ timestamp: Date.now(),
85
+ },
86
+ ];
87
+ const providerRequest = await options.context.prepareProviderRequest?.(requestMessages);
88
+ const requestContext = {
80
89
  systemPrompt: options.snapshot.systemPrompt ?? options.prompt.system,
81
- messages: [
82
- ...conversationMessages,
83
- {
84
- role: "user",
85
- content: [{ type: "text", text: options.prompt.user }],
86
- timestamp: Date.now(),
87
- },
88
- ],
90
+ messages: repairOrphanedToolResults(convertToLlm(providerRequest?.messages ?? requestMessages)),
89
91
  ...(options.snapshot.tools && options.snapshot.tools.length > 0 ? { tools: options.snapshot.tools } : {}),
90
- }, {
92
+ };
93
+ const headers = providerRequest
94
+ ? await providerRequest.transformHeaders(options.auth.headers ?? {})
95
+ : options.auth.headers;
96
+ const responseStream = stream(options.snapshot.model, requestContext, {
91
97
  apiKey: options.auth.apiKey,
92
- headers: options.auth.headers,
98
+ headers,
93
99
  extraBody: options.auth.extraBody,
100
+ onPayload: async (payload, model) => {
101
+ const sanitized = model.api === "anthropic-messages" ? sanitizeAnthropicPayload(payload) : payload;
102
+ return providerRequest ? await providerRequest.transformPayload(sanitized) : sanitized;
103
+ },
94
104
  maxTokens: summaryMaxTokens(options.snapshot.model, options.snapshot.contextWindow),
95
105
  signal: requestController.signal,
96
106
  });
@@ -307,6 +317,7 @@ export async function runExtensionCompaction(context, snapshot, signal, onProgre
307
317
  if (signal?.aborted)
308
318
  return undefined;
309
319
  const response = await generateSummaryMessage({
320
+ context,
310
321
  messages,
311
322
  onProgress,
312
323
  prompt,
@@ -355,7 +366,7 @@ export async function runExtensionCompaction(context, snapshot, signal, onProgre
355
366
  }
356
367
  throw new Error("Compaction summary request exceeded the context window after retrying with a smaller input");
357
368
  }
358
- export async function applyGeneratedCompaction(context, snapshot, getCurrentGeneration, compaction) {
369
+ export async function applyGeneratedCompaction(context, snapshot, getCurrentGeneration, compaction, signal) {
359
370
  if (!snapshot || !compaction)
360
371
  return { applied: false, reason: "unavailable" };
361
372
  if (snapshot.generation !== getCurrentGeneration() || snapshot.expectedRevision !== context.getMessageRevision()) {
@@ -364,6 +375,7 @@ export async function applyGeneratedCompaction(context, snapshot, getCurrentGene
364
375
  return await context.applyCompaction(compaction, {
365
376
  reason: "extension",
366
377
  expectedRevision: snapshot.expectedRevision,
378
+ signal,
367
379
  });
368
380
  }
369
381
  export async function applySpeculativeCompaction(context, snapshot, getCurrentGeneration, generate) {
@@ -1 +1 @@
1
- {"version":3,"file":"speculative.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/speculative.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype AssistantMessage,\n\tisContextOverflow,\n\ttype Message,\n\ttype Model,\n\ttype TextContent,\n\ttype Tool,\n} from \"@earendil-works/pi-ai\";\nimport { stream } from \"@earendil-works/pi-ai/compat\";\nimport {\n\ttype CompactionPreparation,\n\ttype CompactionResult,\n\tDEFAULT_COMPACTION_SETTINGS,\n\testimateContextTokens,\n\testimateTokens,\n\tprepareCompaction,\n} from \"../../../compaction/index.ts\";\nimport {\n\tconsumeStreamWithIdleTimeout,\n\tDEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS,\n} from \"../../../compaction/stream-watchdog.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type { ModelRegistry } from \"../../../model-registry.ts\";\nimport type { ReadonlySessionManager } from \"../../../session-manager.ts\";\nimport type { ApplyCompactionResult, ContextUsage } from \"../../types.ts\";\nimport { computeEffectiveKeepRecentTokens, computeEffectiveThreshold } from \"./policy.ts\";\nimport { buildPrompt, type MergedCompactionPromptVariant } from \"./prompts.ts\";\nimport { repairOrphanedToolResults } from \"./repair-tool-pairs.ts\";\nimport * as truncation from \"./tool-truncation.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst COMPACTION_BUDGET_RATIO = 0.6;\nconst EMERGENCY_CONTEXT_TARGET_RATIO = 0.95;\nconst SUMMARY_TOKEN_HEADROOM = 32_768;\nconst SUMMARY_CONTEXT_WINDOW_RESERVE_RATIO = 0.5;\nconst SUMMARY_SCHEMA = \"senpi.compaction.summary.v1\";\ntype CompactionProgressCallback = (delta: string) => void;\ntype PruneStep = { messages: AgentMessage[]; removedTokens: number };\n\nexport interface SpeculativeCompactionContext {\n\tmodel: Model<any> | undefined;\n\tsessionManager: ReadonlySessionManager;\n\tmodelRegistry?: ModelRegistry;\n\tgetContextUsage(): ContextUsage | undefined;\n\tgetCompactionSettings?(): CompactionPreparation[\"settings\"];\n\tgetMessageRevision(): number;\n\tgetSystemPrompt?(): string;\n\tapplyCompaction(\n\t\tprecomputed: CompactionResult,\n\t\toptions: { reason: \"extension\"; expectedRevision: number },\n\t): Promise<ApplyCompactionResult>;\n}\n\nexport interface SpeculativeCompactionSnapshot {\n\tgeneration: number;\n\texpectedRevision: number;\n\tmodel: Model<any>;\n\tcontextWindow: number;\n\tpreparation: CompactionPreparation;\n\tpromptVariant: MergedCompactionPromptVariant;\n\tcustomInstructions?: string;\n\t/** Agent system prompt; used to make the summarization request look like normal agent traffic. */\n\tsystemPrompt?: string;\n\t/** Agent tool definitions; forwarded so the request shape matches normal agent traffic. */\n\ttools?: Tool[];\n}\n\nexport type SpeculativeCompactionResult = ApplyCompactionResult | { applied: false; reason: \"unavailable\" };\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\n/**\n * Summary-generation failure with a user-facing diagnosis. Distinct from a\n * user abort (which resolves `undefined`): callers surface `message` on the\n * manual route and degrade to \"unavailable\" on automatic routes.\n */\nexport class SummaryGenerationError extends Error {\n\treadonly kind: \"auth\" | \"empty-summary\";\n\n\tconstructor(kind: \"auth\" | \"empty-summary\", message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SummaryGenerationError\";\n\t\tthis.kind = kind;\n\t}\n}\n\n/**\n * Output budget for one summarization request. Adaptive-thinking models emit\n * reasoning tokens before the summary text, so the legacy flat 8192 cap could\n * be consumed entirely by thinking, ending the stream with zero text blocks.\n * Grant generous headroom, clamped to what the model can actually emit and to\n * half the context window: providers that enforce input + output <= window\n * would otherwise reject the request for models advertising contextWindow ==\n * maxTokens (every summarization request also carries conversation input).\n */\nfunction summaryMaxTokens(model: Model<any>, contextWindow: number): number {\n\tconst headroom = model.maxTokens > 0 ? Math.min(SUMMARY_TOKEN_HEADROOM, model.maxTokens) : SUMMARY_TOKEN_HEADROOM;\n\tif (contextWindow > 0) {\n\t\treturn Math.min(headroom, Math.floor(contextWindow * SUMMARY_CONTEXT_WINDOW_RESERVE_RATIO));\n\t}\n\treturn headroom;\n}\n\nfunction getSummaryText(message: Message): string {\n\tconst content = Array.isArray(message.content)\n\t\t? message.content\n\t\t: [{ type: \"text\" as const, text: message.content }];\n\treturn content\n\t\t.filter((content): content is TextContent => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isAssistantMessage(message: Message): message is AssistantMessage {\n\treturn message.role === \"assistant\" && \"stopReason\" in message;\n}\n\nasync function generateSummaryMessage(options: {\n\tmessages: AgentMessage[];\n\tonProgress?: CompactionProgressCallback;\n\tprompt: ReturnType<typeof buildPrompt>;\n\tsignal?: AbortSignal;\n\tsnapshot: SpeculativeCompactionSnapshot;\n\tauth: {\n\t\tapiKey: string;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t};\n}): Promise<Message | undefined> {\n\t// Send the conversation as native LLM messages with the summarization\n\t// instruction as a trailing user message, mirroring normal agent traffic.\n\t// A single serialized `<conversation>` text dump of a large session is\n\t// deterministically refused by Anthropic's anti-distillation classifier\n\t// (\"reverse engineering or duplicating model outputs\"), while the same\n\t// content as native blocks with the agent's system prompt and tools passes.\n\tconst conversationMessages = repairOrphanedToolResults(convertToLlm(options.messages));\n\t// Request-local controller: the idle watchdog must be able to tear down a\n\t// stalled summarization request without aborting the caller's own signal.\n\tconst requestController = new AbortController();\n\tconst onCallerAbort = () => requestController.abort(options.signal?.reason);\n\tif (options.signal) {\n\t\tif (options.signal.aborted) onCallerAbort();\n\t\telse options.signal.addEventListener(\"abort\", onCallerAbort, { once: true });\n\t}\n\ttry {\n\t\tconst responseStream = stream(\n\t\t\toptions.snapshot.model,\n\t\t\t{\n\t\t\t\tsystemPrompt: options.snapshot.systemPrompt ?? options.prompt.system,\n\t\t\t\tmessages: [\n\t\t\t\t\t...conversationMessages,\n\t\t\t\t\t{\n\t\t\t\t\t\trole: \"user\",\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: options.prompt.user }],\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t...(options.snapshot.tools && options.snapshot.tools.length > 0 ? { tools: options.snapshot.tools } : {}),\n\t\t\t},\n\t\t\t{\n\t\t\t\tapiKey: options.auth.apiKey,\n\t\t\t\theaders: options.auth.headers,\n\t\t\t\textraBody: options.auth.extraBody,\n\t\t\t\tmaxTokens: summaryMaxTokens(options.snapshot.model, options.snapshot.contextWindow),\n\t\t\t\tsignal: requestController.signal,\n\t\t\t},\n\t\t);\n\t\tawait consumeStreamWithIdleTimeout(responseStream, {\n\t\t\tidleTimeoutMs: DEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS,\n\t\t\tabort: () => requestController.abort(),\n\t\t\tsignal: options.signal,\n\t\t\tonEvent: (event) => {\n\t\t\t\tif (event.type === \"text_delta\" && event.delta) {\n\t\t\t\t\toptions.onProgress?.(event.delta);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\treturn await responseStream.result();\n\t} finally {\n\t\tif (options.signal) options.signal.removeEventListener(\"abort\", onCallerAbort);\n\t}\n}\n\nfunction pruneToolResults(messages: AgentMessage[], contextWindow: number): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst prunedResults = truncation.prePruneToolOutputsToBudget(toolResults, contextWindow * COMPACTION_BUDGET_RATIO);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst pruned = prunedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn pruned ? { ...message, content: pruned.content } : message;\n\t});\n}\n\nexport function truncateContextMessages(messages: AgentMessage[]): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst truncatedResults = truncation.truncateOversizedToolResults(toolResults);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst truncated = truncatedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn truncated ? { ...message, content: truncated.content } : message;\n\t});\n}\n\nfunction getToolCallIds(message: AgentMessage): Set<string> {\n\tconst ids = new Set<string>();\n\tif (message.role !== \"assistant\") return ids;\n\tfor (const block of message.content) {\n\t\tif (block.type === \"toolCall\") ids.add(block.id);\n\t}\n\treturn ids;\n}\n\nfunction findLastUserLikeIndex(messages: AgentMessage[]): number {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst role = messages[index]?.role;\n\t\tif (role === \"user\" || role === \"bashExecution\") return index;\n\t}\n\treturn messages.length;\n}\n\nfunction removeAssistantToolPair(messages: AgentMessage[], assistantIndex: number): PruneStep {\n\tconst ids = getToolCallIds(messages[assistantIndex]);\n\tlet removedTokens = 0;\n\tconst pruned = messages.filter((message, index) => {\n\t\tconst remove = index === assistantIndex || (message.role === \"toolResult\" && ids.has(message.toolCallId));\n\t\tif (remove) removedTokens += estimateTokens(message);\n\t\treturn !remove;\n\t});\n\treturn { messages: pruned, removedTokens };\n}\n\nfunction removeFirstOldToolPair(messages: AgentMessage[], boundaryIndex: number): PruneStep | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message) continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\tif (message.role === \"toolResult\") {\n\t\t\treturn {\n\t\t\t\tmessages: messages.filter((_message, candidateIndex) => candidateIndex !== index),\n\t\t\t\tremovedTokens: estimateTokens(message),\n\t\t\t};\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction removeFirstOldMessage(messages: AgentMessage[], boundaryIndex: number): PruneStep | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message || message.role === \"toolResult\") continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\treturn {\n\t\t\tmessages: messages.filter((_candidate, candidateIndex) => candidateIndex !== index),\n\t\t\tremovedTokens: estimateTokens(message),\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction pruneOldMessagesToBudget(messages: AgentMessage[], targetTokens: number): AgentMessage[] {\n\tlet pruned = messages;\n\tlet total = estimateTotalTokens(pruned);\n\twhile (total > targetTokens) {\n\t\tconst boundaryIndex = findLastUserLikeIndex(pruned);\n\t\tconst next = removeFirstOldToolPair(pruned, boundaryIndex) ?? removeFirstOldMessage(pruned, boundaryIndex);\n\t\tif (!next || next.messages.length === pruned.length) break;\n\t\tpruned = next.messages;\n\t\ttotal -= next.removedTokens;\n\t}\n\treturn pruned;\n}\n\nfunction removeOldestHistoryItemForOverflowRetry(messages: AgentMessage[]): AgentMessage[] | undefined {\n\tif (messages.length <= 1) return undefined;\n\tconst boundaryIndex = findLastUserLikeIndex(messages);\n\treturn (\n\t\tremoveFirstOldToolPair(messages, boundaryIndex)?.messages ??\n\t\tremoveFirstOldMessage(messages, boundaryIndex)?.messages ??\n\t\t(messages.length > 1 ? messages.slice(1) : undefined)\n\t);\n}\n\nfunction estimateTotalTokens(messages: AgentMessage[]): number {\n\tlet total = 0;\n\tfor (const message of messages) total += estimateTokens(message);\n\treturn total;\n}\n\nexport function hardLimitEmergencyPrune(\n\tmessages: AgentMessage[],\n\tcontextWindow: number,\n): {\n\tmessages: AgentMessage[];\n\tneedsAggressiveCompaction: boolean;\n} {\n\tconst targetTokens = Math.floor(contextWindow * EMERGENCY_CONTEXT_TARGET_RATIO);\n\tif (estimateTotalTokens(messages) <= targetTokens) {\n\t\treturn { messages, needsAggressiveCompaction: false };\n\t}\n\tconst noLlmPruned = truncateContextMessages(pruneToolResults(messages, contextWindow));\n\tif (estimateTotalTokens(noLlmPruned) <= targetTokens) {\n\t\treturn { messages: noLlmPruned, needsAggressiveCompaction: false };\n\t}\n\treturn {\n\t\tmessages: pruneOldMessagesToBudget(noLlmPruned, targetTokens),\n\t\tneedsAggressiveCompaction: true,\n\t};\n}\n\nexport function getPromptVariant(options: {\n\treason: string;\n\tpreparation: { previousSummary?: string; isSplitTurn: boolean };\n}): MergedCompactionPromptVariant {\n\tif (options.reason === \"branch\") return \"branch\";\n\tif (options.preparation.previousSummary) return \"update\";\n\tif (options.preparation.isSplitTurn) return \"turn_prefix\";\n\treturn \"default\";\n}\n\nexport function createSpeculativeCompactionSnapshot(\n\tcontext: SpeculativeCompactionContext,\n\toptions: { customInstructions?: string; generation: number; tools?: Tool[] },\n): SpeculativeCompactionSnapshot | undefined {\n\tconst model = context.model;\n\tif (!model) return undefined;\n\n\tconst expectedRevision = context.getMessageRevision();\n\tconst branchEntries = context.sessionManager.getBranch();\n\tconst contextWindow = context.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\tconst settings = context.getCompactionSettings?.() ?? DEFAULT_COMPACTION_SETTINGS;\n\tconst thresholdRatio = computeEffectiveThreshold(contextWindow);\n\tconst preparation = prepareCompaction(branchEntries, {\n\t\t...settings,\n\t\tkeepRecentTokens: computeEffectiveKeepRecentTokens(settings.keepRecentTokens, contextWindow, thresholdRatio),\n\t});\n\tif (!preparation) return undefined;\n\n\treturn {\n\t\tgeneration: options.generation,\n\t\texpectedRevision,\n\t\tmodel,\n\t\tcontextWindow,\n\t\tpreparation,\n\t\tpromptVariant: getPromptVariant({ reason: \"extension\", preparation }),\n\t\tcustomInstructions: options.customInstructions,\n\t\tsystemPrompt: context.getSystemPrompt?.(),\n\t\ttools: options.tools,\n\t};\n}\n\n/**\n * Generate a compaction summary for the snapshot. Resolves `undefined` only\n * when the request was aborted (caller signal or an aborted stream); every\n * other failure throws — {@link SummaryGenerationError} for diagnosable\n * generation failures, the raw provider error otherwise. Abort is checked\n * before and after credential resolution so a cancelled request never\n * misreports as an auth failure.\n */\nexport async function runExtensionCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot,\n\tsignal?: AbortSignal,\n\tonProgress?: CompactionProgressCallback,\n): Promise<CompactionResult | undefined> {\n\tif (signal?.aborted) return undefined;\n\tconst auth = await context.modelRegistry?.getApiKeyAndHeaders(snapshot.model);\n\tif (signal?.aborted) return undefined;\n\tif (!auth?.ok || !auth.apiKey) {\n\t\tconst detail = auth && !auth.ok ? auth.error : `no API key resolved for provider \"${snapshot.model.provider}\"`;\n\t\tthrow new SummaryGenerationError(\"auth\", `summarization credentials unavailable: ${detail}`);\n\t}\n\n\tlet messages = pruneToolResults(\n\t\t[...snapshot.preparation.messagesToSummarize, ...snapshot.preparation.turnPrefixMessages],\n\t\tsnapshot.contextWindow,\n\t);\n\tconst prompt = buildPrompt({\n\t\tvariant: snapshot.promptVariant,\n\t\tpreviousSummary: snapshot.preparation.previousSummary,\n\t\tcustomInstructions: snapshot.customInstructions,\n\t});\n\n\twhile (true) {\n\t\tif (signal?.aborted) return undefined;\n\t\tconst response = await generateSummaryMessage({\n\t\t\tmessages,\n\t\t\tonProgress,\n\t\t\tprompt,\n\t\t\tsignal,\n\t\t\tsnapshot,\n\t\t\tauth: {\n\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\theaders: auth.headers,\n\t\t\t\textraBody: auth.extraBody,\n\t\t\t},\n\t\t});\n\t\tif (!response) return undefined;\n\n\t\tif (isAssistantMessage(response) && isContextOverflow(response, snapshot.contextWindow)) {\n\t\t\tconst retryMessages = removeOldestHistoryItemForOverflowRetry(messages);\n\t\t\tif (!retryMessages || retryMessages.length === messages.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmessages = retryMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isAssistantMessage(response) && response.stopReason === \"aborted\") {\n\t\t\t// A partial summary from an aborted stream must never be applied.\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (isAssistantMessage(response) && response.stopReason === \"error\") {\n\t\t\t// Surface the real provider failure instead of silently degrading\n\t\t\t// into a generic \"Compaction cancelled\".\n\t\t\tthrow new Error(response.errorMessage || \"Compaction summary request failed\");\n\t\t}\n\n\t\tconst summary = getSummaryText(response);\n\t\tif (!summary) {\n\t\t\tconst stopReason = isAssistantMessage(response) ? response.stopReason : \"unknown\";\n\t\t\tthrow new SummaryGenerationError(\n\t\t\t\t\"empty-summary\",\n\t\t\t\t`summarization response contained no text (stopReason: ${stopReason})`,\n\t\t\t);\n\t\t}\n\n\t\t// Informational only: the core rejects an applied compaction that would\n\t\t// still overflow (_wouldCompactionOverflow). Rejecting here based on the\n\t\t// size of the *discarded* input made large sessions uncompactable.\n\t\tconst tokenEstimate = estimateContextTokens(convertToLlm(messages)).tokens + approxTokens(summary);\n\n\t\treturn {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId: snapshot.preparation.firstKeptEntryId,\n\t\t\ttokensBefore: snapshot.preparation.tokensBefore,\n\t\t\tdetails: { schema: SUMMARY_SCHEMA, promptVariant: snapshot.promptVariant, tokenEstimate },\n\t\t};\n\t}\n\n\tthrow new Error(\"Compaction summary request exceeded the context window after retrying with a smaller input\");\n}\n\nexport async function applyGeneratedCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tcompaction: CompactionResult | undefined,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot || !compaction) return { applied: false, reason: \"unavailable\" };\n\n\tif (snapshot.generation !== getCurrentGeneration() || snapshot.expectedRevision !== context.getMessageRevision()) {\n\t\treturn { applied: false, reason: \"stale\" };\n\t}\n\n\treturn await context.applyCompaction(compaction, {\n\t\treason: \"extension\",\n\t\texpectedRevision: snapshot.expectedRevision,\n\t});\n}\n\nexport async function applySpeculativeCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tgenerate: () => Promise<CompactionResult | undefined>,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot) return { applied: false, reason: \"unavailable\" };\n\n\tconst compaction = await generate();\n\treturn await applyGeneratedCompaction(context, snapshot, getCurrentGeneration, compaction);\n}\n"]}
1
+ {"version":3,"file":"speculative.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/compaction/speculative.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype AssistantMessage,\n\tisContextOverflow,\n\ttype Message,\n\ttype Model,\n\ttype TextContent,\n\ttype Tool,\n} from \"@earendil-works/pi-ai\";\nimport { stream } from \"@earendil-works/pi-ai/compat\";\nimport {\n\ttype CompactionPreparation,\n\ttype CompactionResult,\n\tDEFAULT_COMPACTION_SETTINGS,\n\testimateContextTokens,\n\testimateTokens,\n\tprepareCompaction,\n} from \"../../../compaction/index.ts\";\nimport {\n\tconsumeStreamWithIdleTimeout,\n\tDEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS,\n} from \"../../../compaction/stream-watchdog.ts\";\nimport { convertToLlm } from \"../../../messages.ts\";\nimport type { ModelRegistry } from \"../../../model-registry.ts\";\nimport type { ReadonlySessionManager } from \"../../../session-manager.ts\";\nimport type { ApplyCompactionResult, ContextUsage, ProviderRequestPreparation } from \"../../types.ts\";\nimport { sanitizeAnthropicPayload } from \"../tool-pair-guard/sanitize-anthropic-payload.ts\";\nimport { computeEffectiveKeepRecentTokens, computeEffectiveThreshold } from \"./policy.ts\";\nimport { buildPrompt, type MergedCompactionPromptVariant } from \"./prompts.ts\";\nimport { repairOrphanedToolResults } from \"./repair-tool-pairs.ts\";\nimport * as truncation from \"./tool-truncation.ts\";\n\nconst DEFAULT_CONTEXT_WINDOW = 200_000;\nconst COMPACTION_BUDGET_RATIO = 0.6;\nconst EMERGENCY_CONTEXT_TARGET_RATIO = 0.95;\nconst SUMMARY_TOKEN_HEADROOM = 32_768;\nconst SUMMARY_CONTEXT_WINDOW_RESERVE_RATIO = 0.5;\nconst SUMMARY_SCHEMA = \"senpi.compaction.summary.v1\";\ntype CompactionProgressCallback = (delta: string) => void;\ntype PruneStep = { messages: AgentMessage[]; removedTokens: number };\n\nexport interface SpeculativeCompactionContext {\n\tmodel: Model<any> | undefined;\n\tsessionManager: ReadonlySessionManager;\n\tmodelRegistry?: ModelRegistry;\n\tgetContextUsage(): ContextUsage | undefined;\n\tgetCompactionSettings?(): CompactionPreparation[\"settings\"];\n\tgetMessageRevision(): number;\n\tgetSystemPrompt?(): string;\n\tprepareProviderRequest?(messages: AgentMessage[]): Promise<ProviderRequestPreparation>;\n\tapplyCompaction(\n\t\tprecomputed: CompactionResult,\n\t\toptions: { reason: \"extension\"; expectedRevision: number; signal?: AbortSignal },\n\t): Promise<ApplyCompactionResult>;\n}\n\nexport interface SpeculativeCompactionSnapshot {\n\tgeneration: number;\n\texpectedRevision: number;\n\tmodel: Model<any>;\n\tcontextWindow: number;\n\tpreparation: CompactionPreparation;\n\tpromptVariant: MergedCompactionPromptVariant;\n\tcustomInstructions?: string;\n\t/** Agent system prompt; used to make the summarization request look like normal agent traffic. */\n\tsystemPrompt?: string;\n\t/** Agent tool definitions; forwarded so the request shape matches normal agent traffic. */\n\ttools?: Tool[];\n}\n\nexport type SpeculativeCompactionResult = ApplyCompactionResult | { applied: false; reason: \"unavailable\" };\n\nfunction approxTokens(text: string): number {\n\treturn Math.ceil(text.length / 4);\n}\n\n/**\n * Summary-generation failure with a user-facing diagnosis. Distinct from a\n * user abort (which resolves `undefined`): callers surface `message` on the\n * manual route and degrade to \"unavailable\" on automatic routes.\n */\nexport class SummaryGenerationError extends Error {\n\treadonly kind: \"auth\" | \"empty-summary\";\n\n\tconstructor(kind: \"auth\" | \"empty-summary\", message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SummaryGenerationError\";\n\t\tthis.kind = kind;\n\t}\n}\n\n/**\n * Output budget for one summarization request. Adaptive-thinking models emit\n * reasoning tokens before the summary text, so the legacy flat 8192 cap could\n * be consumed entirely by thinking, ending the stream with zero text blocks.\n * Grant generous headroom, clamped to what the model can actually emit and to\n * half the context window: providers that enforce input + output <= window\n * would otherwise reject the request for models advertising contextWindow ==\n * maxTokens (every summarization request also carries conversation input).\n */\nfunction summaryMaxTokens(model: Model<any>, contextWindow: number): number {\n\tconst headroom = model.maxTokens > 0 ? Math.min(SUMMARY_TOKEN_HEADROOM, model.maxTokens) : SUMMARY_TOKEN_HEADROOM;\n\tif (contextWindow > 0) {\n\t\treturn Math.min(headroom, Math.floor(contextWindow * SUMMARY_CONTEXT_WINDOW_RESERVE_RATIO));\n\t}\n\treturn headroom;\n}\n\nfunction getSummaryText(message: Message): string {\n\tconst content = Array.isArray(message.content)\n\t\t? message.content\n\t\t: [{ type: \"text\" as const, text: message.content }];\n\treturn content\n\t\t.filter((content): content is TextContent => content.type === \"text\")\n\t\t.map((content) => content.text)\n\t\t.join(\"\\n\")\n\t\t.trim();\n}\n\nfunction isAssistantMessage(message: Message): message is AssistantMessage {\n\treturn message.role === \"assistant\" && \"stopReason\" in message;\n}\n\nasync function generateSummaryMessage(options: {\n\tcontext: SpeculativeCompactionContext;\n\tmessages: AgentMessage[];\n\tonProgress?: CompactionProgressCallback;\n\tprompt: ReturnType<typeof buildPrompt>;\n\tsignal?: AbortSignal;\n\tsnapshot: SpeculativeCompactionSnapshot;\n\tauth: {\n\t\tapiKey: string;\n\t\theaders?: Record<string, string>;\n\t\textraBody?: Record<string, unknown>;\n\t};\n}): Promise<Message | undefined> {\n\t// Send the conversation as native LLM messages with the summarization\n\t// instruction as a trailing user message, mirroring normal agent traffic.\n\t// A single serialized `<conversation>` text dump of a large session is\n\t// deterministically refused by Anthropic's anti-distillation classifier\n\t// (\"reverse engineering or duplicating model outputs\"), while the same\n\t// content as native blocks with the agent's system prompt and tools passes.\n\t// Request-local controller: the idle watchdog must be able to tear down a\n\t// stalled summarization request without aborting the caller's own signal.\n\tconst requestController = new AbortController();\n\tconst onCallerAbort = () => requestController.abort(options.signal?.reason);\n\tif (options.signal) {\n\t\tif (options.signal.aborted) onCallerAbort();\n\t\telse options.signal.addEventListener(\"abort\", onCallerAbort, { once: true });\n\t}\n\ttry {\n\t\tconst requestMessages: AgentMessage[] = [\n\t\t\t...options.messages,\n\t\t\t{\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: [{ type: \"text\", text: options.prompt.user }],\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t},\n\t\t];\n\t\tconst providerRequest = await options.context.prepareProviderRequest?.(requestMessages);\n\t\tconst requestContext = {\n\t\t\tsystemPrompt: options.snapshot.systemPrompt ?? options.prompt.system,\n\t\t\tmessages: repairOrphanedToolResults(convertToLlm(providerRequest?.messages ?? requestMessages)),\n\t\t\t...(options.snapshot.tools && options.snapshot.tools.length > 0 ? { tools: options.snapshot.tools } : {}),\n\t\t};\n\t\tconst headers = providerRequest\n\t\t\t? await providerRequest.transformHeaders(options.auth.headers ?? {})\n\t\t\t: options.auth.headers;\n\t\tconst responseStream = stream(options.snapshot.model, requestContext, {\n\t\t\tapiKey: options.auth.apiKey,\n\t\t\theaders,\n\t\t\textraBody: options.auth.extraBody,\n\t\t\tonPayload: async (payload, model) => {\n\t\t\t\tconst sanitized = model.api === \"anthropic-messages\" ? sanitizeAnthropicPayload(payload) : payload;\n\t\t\t\treturn providerRequest ? await providerRequest.transformPayload(sanitized) : sanitized;\n\t\t\t},\n\t\t\tmaxTokens: summaryMaxTokens(options.snapshot.model, options.snapshot.contextWindow),\n\t\t\tsignal: requestController.signal,\n\t\t});\n\t\tawait consumeStreamWithIdleTimeout(responseStream, {\n\t\t\tidleTimeoutMs: DEFAULT_SUMMARIZATION_IDLE_TIMEOUT_MS,\n\t\t\tabort: () => requestController.abort(),\n\t\t\tsignal: options.signal,\n\t\t\tonEvent: (event) => {\n\t\t\t\tif (event.type === \"text_delta\" && event.delta) {\n\t\t\t\t\toptions.onProgress?.(event.delta);\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\treturn await responseStream.result();\n\t} finally {\n\t\tif (options.signal) options.signal.removeEventListener(\"abort\", onCallerAbort);\n\t}\n}\n\nfunction pruneToolResults(messages: AgentMessage[], contextWindow: number): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst prunedResults = truncation.prePruneToolOutputsToBudget(toolResults, contextWindow * COMPACTION_BUDGET_RATIO);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst pruned = prunedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn pruned ? { ...message, content: pruned.content } : message;\n\t});\n}\n\nexport function truncateContextMessages(messages: AgentMessage[]): AgentMessage[] {\n\tconst toolResults = messages\n\t\t.filter((message) => message.role === \"toolResult\")\n\t\t.map((message) => ({ content: message.content, details: undefined }));\n\tif (toolResults.length === 0) return messages;\n\n\tconst truncatedResults = truncation.truncateOversizedToolResults(toolResults);\n\tlet resultIndex = 0;\n\treturn messages.map((message) => {\n\t\tif (message.role !== \"toolResult\") return message;\n\t\tconst truncated = truncatedResults[resultIndex];\n\t\tresultIndex++;\n\t\treturn truncated ? { ...message, content: truncated.content } : message;\n\t});\n}\n\nfunction getToolCallIds(message: AgentMessage): Set<string> {\n\tconst ids = new Set<string>();\n\tif (message.role !== \"assistant\") return ids;\n\tfor (const block of message.content) {\n\t\tif (block.type === \"toolCall\") ids.add(block.id);\n\t}\n\treturn ids;\n}\n\nfunction findLastUserLikeIndex(messages: AgentMessage[]): number {\n\tfor (let index = messages.length - 1; index >= 0; index--) {\n\t\tconst role = messages[index]?.role;\n\t\tif (role === \"user\" || role === \"bashExecution\") return index;\n\t}\n\treturn messages.length;\n}\n\nfunction removeAssistantToolPair(messages: AgentMessage[], assistantIndex: number): PruneStep {\n\tconst ids = getToolCallIds(messages[assistantIndex]);\n\tlet removedTokens = 0;\n\tconst pruned = messages.filter((message, index) => {\n\t\tconst remove = index === assistantIndex || (message.role === \"toolResult\" && ids.has(message.toolCallId));\n\t\tif (remove) removedTokens += estimateTokens(message);\n\t\treturn !remove;\n\t});\n\treturn { messages: pruned, removedTokens };\n}\n\nfunction removeFirstOldToolPair(messages: AgentMessage[], boundaryIndex: number): PruneStep | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message) continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\tif (message.role === \"toolResult\") {\n\t\t\treturn {\n\t\t\t\tmessages: messages.filter((_message, candidateIndex) => candidateIndex !== index),\n\t\t\t\tremovedTokens: estimateTokens(message),\n\t\t\t};\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction removeFirstOldMessage(messages: AgentMessage[], boundaryIndex: number): PruneStep | undefined {\n\tfor (let index = 0; index < boundaryIndex; index++) {\n\t\tconst message = messages[index];\n\t\tif (!message || message.role === \"toolResult\") continue;\n\t\tif (message.role === \"assistant\" && getToolCallIds(message).size > 0)\n\t\t\treturn removeAssistantToolPair(messages, index);\n\t\treturn {\n\t\t\tmessages: messages.filter((_candidate, candidateIndex) => candidateIndex !== index),\n\t\t\tremovedTokens: estimateTokens(message),\n\t\t};\n\t}\n\treturn undefined;\n}\n\nfunction pruneOldMessagesToBudget(messages: AgentMessage[], targetTokens: number): AgentMessage[] {\n\tlet pruned = messages;\n\tlet total = estimateTotalTokens(pruned);\n\twhile (total > targetTokens) {\n\t\tconst boundaryIndex = findLastUserLikeIndex(pruned);\n\t\tconst next = removeFirstOldToolPair(pruned, boundaryIndex) ?? removeFirstOldMessage(pruned, boundaryIndex);\n\t\tif (!next || next.messages.length === pruned.length) break;\n\t\tpruned = next.messages;\n\t\ttotal -= next.removedTokens;\n\t}\n\treturn pruned;\n}\n\nfunction removeOldestHistoryItemForOverflowRetry(messages: AgentMessage[]): AgentMessage[] | undefined {\n\tif (messages.length <= 1) return undefined;\n\tconst boundaryIndex = findLastUserLikeIndex(messages);\n\treturn (\n\t\tremoveFirstOldToolPair(messages, boundaryIndex)?.messages ??\n\t\tremoveFirstOldMessage(messages, boundaryIndex)?.messages ??\n\t\t(messages.length > 1 ? messages.slice(1) : undefined)\n\t);\n}\n\nfunction estimateTotalTokens(messages: AgentMessage[]): number {\n\tlet total = 0;\n\tfor (const message of messages) total += estimateTokens(message);\n\treturn total;\n}\n\nexport function hardLimitEmergencyPrune(\n\tmessages: AgentMessage[],\n\tcontextWindow: number,\n): {\n\tmessages: AgentMessage[];\n\tneedsAggressiveCompaction: boolean;\n} {\n\tconst targetTokens = Math.floor(contextWindow * EMERGENCY_CONTEXT_TARGET_RATIO);\n\tif (estimateTotalTokens(messages) <= targetTokens) {\n\t\treturn { messages, needsAggressiveCompaction: false };\n\t}\n\tconst noLlmPruned = truncateContextMessages(pruneToolResults(messages, contextWindow));\n\tif (estimateTotalTokens(noLlmPruned) <= targetTokens) {\n\t\treturn { messages: noLlmPruned, needsAggressiveCompaction: false };\n\t}\n\treturn {\n\t\tmessages: pruneOldMessagesToBudget(noLlmPruned, targetTokens),\n\t\tneedsAggressiveCompaction: true,\n\t};\n}\n\nexport function getPromptVariant(options: {\n\treason: string;\n\tpreparation: { previousSummary?: string; isSplitTurn: boolean };\n}): MergedCompactionPromptVariant {\n\tif (options.reason === \"branch\") return \"branch\";\n\tif (options.preparation.previousSummary) return \"update\";\n\tif (options.preparation.isSplitTurn) return \"turn_prefix\";\n\treturn \"default\";\n}\n\nexport function createSpeculativeCompactionSnapshot(\n\tcontext: SpeculativeCompactionContext,\n\toptions: { customInstructions?: string; generation: number; tools?: Tool[] },\n): SpeculativeCompactionSnapshot | undefined {\n\tconst model = context.model;\n\tif (!model) return undefined;\n\n\tconst expectedRevision = context.getMessageRevision();\n\tconst branchEntries = context.sessionManager.getBranch();\n\tconst contextWindow = context.getContextUsage()?.contextWindow ?? model.contextWindow ?? DEFAULT_CONTEXT_WINDOW;\n\tconst settings = context.getCompactionSettings?.() ?? DEFAULT_COMPACTION_SETTINGS;\n\tconst thresholdRatio = computeEffectiveThreshold(contextWindow);\n\tconst preparation = prepareCompaction(branchEntries, {\n\t\t...settings,\n\t\tkeepRecentTokens: computeEffectiveKeepRecentTokens(settings.keepRecentTokens, contextWindow, thresholdRatio),\n\t});\n\tif (!preparation) return undefined;\n\n\treturn {\n\t\tgeneration: options.generation,\n\t\texpectedRevision,\n\t\tmodel,\n\t\tcontextWindow,\n\t\tpreparation,\n\t\tpromptVariant: getPromptVariant({ reason: \"extension\", preparation }),\n\t\tcustomInstructions: options.customInstructions,\n\t\tsystemPrompt: context.getSystemPrompt?.(),\n\t\ttools: options.tools,\n\t};\n}\n\n/**\n * Generate a compaction summary for the snapshot. Resolves `undefined` only\n * when the request was aborted (caller signal or an aborted stream); every\n * other failure throws — {@link SummaryGenerationError} for diagnosable\n * generation failures, the raw provider error otherwise. Abort is checked\n * before and after credential resolution so a cancelled request never\n * misreports as an auth failure.\n */\nexport async function runExtensionCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot,\n\tsignal?: AbortSignal,\n\tonProgress?: CompactionProgressCallback,\n): Promise<CompactionResult | undefined> {\n\tif (signal?.aborted) return undefined;\n\tconst auth = await context.modelRegistry?.getApiKeyAndHeaders(snapshot.model);\n\tif (signal?.aborted) return undefined;\n\tif (!auth?.ok || !auth.apiKey) {\n\t\tconst detail = auth && !auth.ok ? auth.error : `no API key resolved for provider \"${snapshot.model.provider}\"`;\n\t\tthrow new SummaryGenerationError(\"auth\", `summarization credentials unavailable: ${detail}`);\n\t}\n\n\tlet messages = pruneToolResults(\n\t\t[...snapshot.preparation.messagesToSummarize, ...snapshot.preparation.turnPrefixMessages],\n\t\tsnapshot.contextWindow,\n\t);\n\tconst prompt = buildPrompt({\n\t\tvariant: snapshot.promptVariant,\n\t\tpreviousSummary: snapshot.preparation.previousSummary,\n\t\tcustomInstructions: snapshot.customInstructions,\n\t});\n\n\twhile (true) {\n\t\tif (signal?.aborted) return undefined;\n\t\tconst response = await generateSummaryMessage({\n\t\t\tcontext,\n\t\t\tmessages,\n\t\t\tonProgress,\n\t\t\tprompt,\n\t\t\tsignal,\n\t\t\tsnapshot,\n\t\t\tauth: {\n\t\t\t\tapiKey: auth.apiKey,\n\t\t\t\theaders: auth.headers,\n\t\t\t\textraBody: auth.extraBody,\n\t\t\t},\n\t\t});\n\t\tif (!response) return undefined;\n\n\t\tif (isAssistantMessage(response) && isContextOverflow(response, snapshot.contextWindow)) {\n\t\t\tconst retryMessages = removeOldestHistoryItemForOverflowRetry(messages);\n\t\t\tif (!retryMessages || retryMessages.length === messages.length) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmessages = retryMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isAssistantMessage(response) && response.stopReason === \"aborted\") {\n\t\t\t// A partial summary from an aborted stream must never be applied.\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (isAssistantMessage(response) && response.stopReason === \"error\") {\n\t\t\t// Surface the real provider failure instead of silently degrading\n\t\t\t// into a generic \"Compaction cancelled\".\n\t\t\tthrow new Error(response.errorMessage || \"Compaction summary request failed\");\n\t\t}\n\n\t\tconst summary = getSummaryText(response);\n\t\tif (!summary) {\n\t\t\tconst stopReason = isAssistantMessage(response) ? response.stopReason : \"unknown\";\n\t\t\tthrow new SummaryGenerationError(\n\t\t\t\t\"empty-summary\",\n\t\t\t\t`summarization response contained no text (stopReason: ${stopReason})`,\n\t\t\t);\n\t\t}\n\n\t\t// Informational only: the core rejects an applied compaction that would\n\t\t// still overflow (_wouldCompactionOverflow). Rejecting here based on the\n\t\t// size of the *discarded* input made large sessions uncompactable.\n\t\tconst tokenEstimate = estimateContextTokens(convertToLlm(messages)).tokens + approxTokens(summary);\n\n\t\treturn {\n\t\t\tsummary,\n\t\t\tfirstKeptEntryId: snapshot.preparation.firstKeptEntryId,\n\t\t\ttokensBefore: snapshot.preparation.tokensBefore,\n\t\t\tdetails: { schema: SUMMARY_SCHEMA, promptVariant: snapshot.promptVariant, tokenEstimate },\n\t\t};\n\t}\n\n\tthrow new Error(\"Compaction summary request exceeded the context window after retrying with a smaller input\");\n}\n\nexport async function applyGeneratedCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tcompaction: CompactionResult | undefined,\n\tsignal?: AbortSignal,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot || !compaction) return { applied: false, reason: \"unavailable\" };\n\n\tif (snapshot.generation !== getCurrentGeneration() || snapshot.expectedRevision !== context.getMessageRevision()) {\n\t\treturn { applied: false, reason: \"stale\" };\n\t}\n\n\treturn await context.applyCompaction(compaction, {\n\t\treason: \"extension\",\n\t\texpectedRevision: snapshot.expectedRevision,\n\t\tsignal,\n\t});\n}\n\nexport async function applySpeculativeCompaction(\n\tcontext: SpeculativeCompactionContext,\n\tsnapshot: SpeculativeCompactionSnapshot | undefined,\n\tgetCurrentGeneration: () => number,\n\tgenerate: () => Promise<CompactionResult | undefined>,\n): Promise<SpeculativeCompactionResult> {\n\tif (!snapshot) return { applied: false, reason: \"unavailable\" };\n\n\tconst compaction = await generate();\n\treturn await applyGeneratedCompaction(context, snapshot, getCurrentGeneration, compaction);\n}\n"]}
@@ -20,6 +20,13 @@ declare module "../../../settings-manager.ts" {
20
20
  configReload?: ConfigReloadSettingsPatch;
21
21
  }
22
22
  }
23
+ /** Session-keyed handoffs survive replacement extension factories during reload. */
24
+ export declare class ConfigReloadHandoffRegistry<T> {
25
+ #private;
26
+ set(sessionHandle: string, handoff: T): void;
27
+ take(sessionHandle: string): T | undefined;
28
+ delete(sessionHandle: string): void;
29
+ }
23
30
  export interface ConfigReloadExtensionOptions {
24
31
  readonly agentDir?: string;
25
32
  readonly subscribe?: WatchEventSource;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,KAAK,kBAAkB,EAA4B,MAAM,UAAU,CAAC;AAc7E,OAAO,EAIN,KAAK,UAAU,EACf,KAAK,gBAAgB,EAErB,MAAM,mBAAmB,CAAC;AAO3B,KAAK,yBAAyB,GAAG;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,yBAAyB,CAAC;CAC3C,CAAC;AAEF,+FAA+F;AAC/F,OAAO,QAAQ,8BAA8B,CAAC;IAC7C,UAAU,QAAQ;QACjB,YAAY,CAAC,EAAE,yBAAyB,CAAC;KACzC;CACD;AAkCD,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,GAAE,4BAAiC,GAAG,IAAI,CAiTxG;eAEc,qBAAqB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAuC,MAAM,gBAAgB,CAAC;AACxF,OAAO,EAAE,KAAK,kBAAkB,EAA4B,MAAM,UAAU,CAAC;AAqB7E,OAAO,EAIN,KAAK,UAAU,EACf,KAAK,gBAAgB,EAErB,MAAM,mBAAmB,CAAC;AAO3B,KAAK,yBAAyB,GAAG;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,yBAAyB,CAAC;CAC3C,CAAC;AAEF,+FAA+F;AAC/F,OAAO,QAAQ,8BAA8B,CAAC;IAC7C,UAAU,QAAQ;QACjB,YAAY,CAAC,EAAE,yBAAyB,CAAC;KACzC;CACD;AA4BD,oFAAoF;AACpF,qBAAa,2BAA2B,CAAC,CAAC;;IAGzC,GAAG,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAE3C;IAED,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAIzC;IAED,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAElC;CACD;AAcD,MAAM,WAAW,4BAA4B;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IACrC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,GAAE,4BAAiC,GAAG,IAAI,CAwUxG;eAEc,qBAAqB"}
@@ -1,21 +1,42 @@
1
1
  import { existsSync, lstatSync, readFileSync } from "node:fs";
2
2
  import { basename, dirname, relative, resolve, sep } from "node:path";
3
+ import { bindToProviderScope } from "@earendil-works/pi-ai/node/provider-scope";
3
4
  import { CONFIG_DIR_NAME, getAgentDir } from "../../../../config.js";
4
5
  import { resolvePath } from "../../../../utils/paths.js";
5
6
  import { ModelConfig } from "../../../model-config.js";
6
7
  import { SettingsManager, wasSelfWrite } from "../../../settings-manager.js";
7
8
  import { createConfigReloadLogger } from "./log.js";
8
9
  import { CONFIG_WATCH_CHANGED, CONFIG_WATCH_READY, CONFIG_WATCH_REGISTER, CONFIG_WATCH_REJECTED, CONFIG_WATCH_RELOADED, CONFIG_WATCH_UNREGISTER, isConfigWatchRegistration, isConfigWatchUnregistration, isConfigWatchValidation, matchesConfigWatchFilter, } from "./protocol.js";
10
+ import { excludeRoutineOnlySettingsChanges, isSettingsPath, joinConfigDir, refreshSettingsContentSnapshots, updateSettingsContentSnapshot, } from "./routine-settings.js";
9
11
  import { ConfigReloadWatchEngine, createFsWatchEventSource, } from "./watch-engine.js";
10
12
  const BUILTIN_REGISTRATION_ID = "builtin";
11
13
  const DEFAULT_DEBOUNCE_MS = 200;
12
14
  const COMPACTION_RECHECK_MS = 250;
13
15
  const CONFIG_FILE_NAMES = ["settings.json", "models.json", "keybindings.json"];
14
- /**
15
- * The builtin module is statically imported, so this survives replacement extension
16
- * factories during session.reload(). It closes the watcher-to-watcher race window.
17
- */
18
- let reloadHandoff;
16
+ /** Session-keyed handoffs survive replacement extension factories during reload. */
17
+ export class ConfigReloadHandoffRegistry {
18
+ #handoffs = new Map();
19
+ set(sessionHandle, handoff) {
20
+ this.#handoffs.set(sessionHandle, handoff);
21
+ }
22
+ take(sessionHandle) {
23
+ const handoff = this.#handoffs.get(sessionHandle);
24
+ this.#handoffs.delete(sessionHandle);
25
+ return handoff;
26
+ }
27
+ delete(sessionHandle) {
28
+ this.#handoffs.delete(sessionHandle);
29
+ }
30
+ }
31
+ const reloadHandoffs = new ConfigReloadHandoffRegistry();
32
+ function bindExternalCallback(callback) {
33
+ try {
34
+ return bindToProviderScope(callback);
35
+ }
36
+ catch {
37
+ return callback;
38
+ }
39
+ }
19
40
  /**
20
41
  * Watch config resources and request the host's existing full reload flow.
21
42
  *
@@ -23,11 +44,23 @@ let reloadHandoff;
23
44
  * filesystem event source and agent directory.
24
45
  */
25
46
  export function configReloadExtension(pi, options = {}) {
47
+ const sessionOwned = (() => {
48
+ try {
49
+ bindToProviderScope(() => undefined);
50
+ return true;
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ })();
56
+ const handoffKey = (ctx) => (sessionOwned ? ctx.sessionManager.getSessionId() : "classic");
26
57
  const agentDir = resolve(options.agentDir ?? getAgentDir());
27
58
  const subscribe = options.subscribe ?? createFsWatchEventSource();
28
59
  const logger = options.logger ?? createConfigReloadLogger(agentDir);
29
60
  const registrations = new Map();
30
61
  const rejectedRegistrations = new Map();
62
+ /** Last-seen settings.json contents per path; the diff base for routine-key classification. */
63
+ const settingsContents = new Map();
31
64
  const eventUnsubscribes = [];
32
65
  const pending = new Map();
33
66
  let engine;
@@ -110,25 +143,28 @@ export function configReloadExtension(pi, options = {}) {
110
143
  const processChange = async (change) => {
111
144
  if (reloadInFlight || !currentContext)
112
145
  return;
113
- const groups = groupChangedPaths(change.changedPaths, activeTargets);
146
+ // Suppression state (self-write consumption, routine-diff base) is per path,
147
+ // so it must be resolved before grouping: a path watched by several
148
+ // registrations would otherwise be classified once per group and reach the
149
+ // reload flow through the later group.
150
+ const watchedPaths = excludeSelfWrites(change.changedPaths, engine, agentDir, currentContext.cwd, logger, settingsContents);
151
+ const significantPaths = excludeRoutineOnlySettingsChanges(watchedPaths, settingsContents, agentDir, currentContext.cwd, logger);
152
+ const groups = groupChangedPaths(significantPaths, activeTargets);
114
153
  const rearmDirectoryWatch = change.created.some((path) => activeTargets.some((target) => target.rearmOnCreation === resolve(path)));
115
154
  for (const [registrationId, paths] of groups) {
116
- const watchedPaths = excludeSelfWrites(paths, engine, agentDir, currentContext.cwd, logger);
117
- if (watchedPaths.length === 0)
118
- continue;
119
- const errors = await validateChangedPaths(registrationId, watchedPaths, registrations, agentDir, currentContext.cwd);
155
+ const errors = await validateChangedPaths(registrationId, paths, registrations, agentDir, currentContext.cwd);
120
156
  if (errors.length > 0) {
121
- rejectChange(currentContext, registrationId, watchedPaths, errors, logger, pi);
157
+ rejectChange(currentContext, registrationId, paths, errors, logger, pi);
122
158
  continue;
123
159
  }
124
- addPending(pending, registrationId, watchedPaths);
160
+ addPending(pending, registrationId, paths);
125
161
  const deferred = !canRequestReload(currentContext);
126
162
  pi.events.emit(CONFIG_WATCH_CHANGED, {
127
163
  registrationId,
128
- paths: [...watchedPaths],
164
+ paths: [...paths],
129
165
  deferred,
130
166
  });
131
- logger.info("change_detected", { registrationId, paths: watchedPaths, deferred });
167
+ logger.info("change_detected", { registrationId, paths, deferred });
132
168
  }
133
169
  if (rearmDirectoryWatch)
134
170
  rebuildWatchers(currentContext);
@@ -166,11 +202,12 @@ export function configReloadExtension(pi, options = {}) {
166
202
  debounceMs: settings.debounceMs,
167
203
  clock: options.clock,
168
204
  hashFile: options.hashFile,
169
- onRealChange: enqueueChange,
170
- onError: (error, path) => {
205
+ onRealChange: bindExternalCallback(enqueueChange),
206
+ onError: bindExternalCallback((error, path) => {
171
207
  logger.error("watcher_error", { path, message: errorMessage(error) });
172
- },
208
+ }),
173
209
  });
210
+ refreshSettingsContentSnapshots(settingsContents, agentDir, ctx.cwd);
174
211
  logger.info("watcher_started", { targetCount: activeTargets.length });
175
212
  pi.events.emit(CONFIG_WATCH_READY, { enabled: true });
176
213
  };
@@ -196,23 +233,23 @@ export function configReloadExtension(pi, options = {}) {
196
233
  const paths = uniquePaths(changes.flatMap((change) => change.paths));
197
234
  reloadInFlight = true;
198
235
  tornDown = false;
199
- reloadHandoff = {
236
+ reloadHandoffs.set(handoffKey(ctx), {
200
237
  hashesAtRequest: engine?.getBaselineSnapshot() ?? new Map(),
201
238
  requestedAt: Date.now(),
202
239
  changes,
203
- };
240
+ });
204
241
  ctx.ui.notify(`Hot-reloading: ${formatPaths(paths)}`, "info");
205
242
  logger.info("reload_requested", { reason: "config changed", paths });
206
243
  try {
207
244
  await ctx.requestReload();
208
245
  if (!tornDown) {
209
246
  reloadInFlight = false;
210
- reloadHandoff = undefined;
247
+ reloadHandoffs.delete(handoffKey(ctx));
211
248
  }
212
249
  }
213
250
  catch (error) {
214
251
  reloadInFlight = false;
215
- reloadHandoff = undefined;
252
+ reloadHandoffs.delete(handoffKey(ctx));
216
253
  logger.error("watcher_error", { path: "reload", message: errorMessage(error) });
217
254
  }
218
255
  };
@@ -226,10 +263,11 @@ export function configReloadExtension(pi, options = {}) {
226
263
  }, COMPACTION_RECHECK_MS);
227
264
  };
228
265
  const processReloadHandoff = async (event, ctx) => {
229
- if (event.reason !== "reload" || !reloadHandoff)
266
+ if (event.reason !== "reload")
267
+ return;
268
+ const handoff = reloadHandoffs.take(handoffKey(ctx));
269
+ if (!handoff)
230
270
  return;
231
- const handoff = reloadHandoff;
232
- reloadHandoff = undefined;
233
271
  const paths = uniquePaths(handoff.changes.flatMap((change) => change.paths));
234
272
  for (const change of handoff.changes) {
235
273
  pi.events.emit(CONFIG_WATCH_RELOADED, {
@@ -268,6 +306,7 @@ export function configReloadExtension(pi, options = {}) {
268
306
  return { trusted: "undecided" };
269
307
  });
270
308
  pi.on("session_shutdown", (event) => {
309
+ const closingContext = currentContext;
271
310
  tornDown = true;
272
311
  started = false;
273
312
  currentContext = undefined;
@@ -275,8 +314,8 @@ export function configReloadExtension(pi, options = {}) {
275
314
  clearCompactionRecheck();
276
315
  cleanupEventListeners();
277
316
  pending.clear();
278
- if (event.reason !== "reload")
279
- reloadHandoff = undefined;
317
+ if (event.reason !== "reload" && closingContext)
318
+ reloadHandoffs.delete(handoffKey(closingContext));
280
319
  });
281
320
  function canRequestReload(ctx) {
282
321
  return (ctx.isIdle() &&
@@ -527,7 +566,7 @@ function targetMatchesPath(target, path) {
527
566
  }
528
567
  return target.filter?.(relativePath) ?? true;
529
568
  }
530
- function excludeSelfWrites(paths, engine, agentDir, cwd, logger) {
569
+ function excludeSelfWrites(paths, engine, agentDir, cwd, logger, settingsContents) {
531
570
  const snapshot = engine?.getBaselineSnapshot();
532
571
  return paths.filter((path) => {
533
572
  if (!isSettingsPath(path, agentDir, cwd))
@@ -536,6 +575,9 @@ function excludeSelfWrites(paths, engine, agentDir, cwd, logger) {
536
575
  if (hash === undefined || !wasSelfWrite(path, hash))
537
576
  return true;
538
577
  logger.debug("self_write_suppressed", { path });
578
+ // Advance the routine-diff base so a later external change is not
579
+ // polluted by this session's own just-applied write.
580
+ updateSettingsContentSnapshot(settingsContents, path);
539
581
  return false;
540
582
  });
541
583
  }
@@ -659,13 +701,6 @@ function compareSnapshots(previous, next) {
659
701
  function uniquePaths(paths) {
660
702
  return [...new Set(paths)].sort();
661
703
  }
662
- function joinConfigDir(cwd) {
663
- return resolve(cwd, CONFIG_DIR_NAME);
664
- }
665
- function isSettingsPath(path, agentDir, cwd) {
666
- return (resolve(path) === resolve(agentDir, "settings.json") ||
667
- resolve(path) === resolve(joinConfigDir(cwd), "settings.json"));
668
- }
669
704
  function isWithin(path, root) {
670
705
  return path === root || path.startsWith(`${root}${sep}`);
671
706
  }