@code-yeongyu/senpi 2026.7.14 → 2026.7.16-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/CHANGELOG.md +157 -0
  2. package/README.md +6 -6
  3. package/dist/bun/cli.js +2 -0
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/cli/args.js +1 -1
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/list-models.d.ts +2 -2
  8. package/dist/cli/list-models.d.ts.map +1 -1
  9. package/dist/cli/list-models.js +3 -3
  10. package/dist/cli/list-models.js.map +1 -1
  11. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  12. package/dist/core/agent-session-runtime.js +3 -0
  13. package/dist/core/agent-session-runtime.js.map +1 -1
  14. package/dist/core/agent-session-services.d.ts +4 -3
  15. package/dist/core/agent-session-services.d.ts.map +1 -1
  16. package/dist/core/agent-session-services.js +14 -5
  17. package/dist/core/agent-session-services.js.map +1 -1
  18. package/dist/core/agent-session.d.ts +8 -4
  19. package/dist/core/agent-session.d.ts.map +1 -1
  20. package/dist/core/agent-session.js +81 -30
  21. package/dist/core/agent-session.js.map +1 -1
  22. package/dist/core/auth-providers.js +1 -1
  23. package/dist/core/auth-providers.js.map +1 -1
  24. package/dist/core/auth-storage.d.ts +32 -87
  25. package/dist/core/auth-storage.d.ts.map +1 -1
  26. package/dist/core/auth-storage.js +158 -221
  27. package/dist/core/auth-storage.js.map +1 -1
  28. package/dist/core/cache-stats.d.ts +2 -2
  29. package/dist/core/cache-stats.d.ts.map +1 -1
  30. package/dist/core/cache-stats.js +1 -1
  31. package/dist/core/cache-stats.js.map +1 -1
  32. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  33. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  34. package/dist/core/compaction/branch-summarization.js.map +1 -1
  35. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  36. package/dist/core/dynamic-prompt/build.js +6 -1
  37. package/dist/core/dynamic-prompt/build.js.map +1 -1
  38. package/dist/core/extensions/builtin/bash-timeout/timeout.js +2 -2
  39. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  40. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +22 -13
  42. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  43. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +1 -1
  44. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/terminal/runtime-session.js +3 -2
  46. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  47. package/dist/core/extensions/loader.d.ts.map +1 -1
  48. package/dist/core/extensions/loader.js +8 -2
  49. package/dist/core/extensions/loader.js.map +1 -1
  50. package/dist/core/extensions/runner.d.ts +1 -0
  51. package/dist/core/extensions/runner.d.ts.map +1 -1
  52. package/dist/core/extensions/runner.js +3 -0
  53. package/dist/core/extensions/runner.js.map +1 -1
  54. package/dist/core/extensions/types.d.ts +15 -2
  55. package/dist/core/extensions/types.d.ts.map +1 -1
  56. package/dist/core/extensions/types.js.map +1 -1
  57. package/dist/core/model-config.d.ts +589 -0
  58. package/dist/core/model-config.d.ts.map +1 -0
  59. package/dist/core/model-config.js +288 -0
  60. package/dist/core/model-config.js.map +1 -0
  61. package/dist/core/model-registry.d.ts +17 -146
  62. package/dist/core/model-registry.d.ts.map +1 -1
  63. package/dist/core/model-registry.js +69 -943
  64. package/dist/core/model-registry.js.map +1 -1
  65. package/dist/core/model-resolver.d.ts +8 -5
  66. package/dist/core/model-resolver.d.ts.map +1 -1
  67. package/dist/core/model-resolver.js +19 -18
  68. package/dist/core/model-resolver.js.map +1 -1
  69. package/dist/core/model-runtime.d.ts +81 -0
  70. package/dist/core/model-runtime.d.ts.map +1 -0
  71. package/dist/core/model-runtime.js +442 -0
  72. package/dist/core/model-runtime.js.map +1 -0
  73. package/dist/core/models-store.d.ts +17 -0
  74. package/dist/core/models-store.d.ts.map +1 -0
  75. package/dist/core/models-store.js +46 -0
  76. package/dist/core/models-store.js.map +1 -0
  77. package/dist/core/package-manager.d.ts.map +1 -1
  78. package/dist/core/package-manager.js +7 -2
  79. package/dist/core/package-manager.js.map +1 -1
  80. package/dist/core/provider-composer.d.ts +64 -0
  81. package/dist/core/provider-composer.d.ts.map +1 -0
  82. package/dist/core/provider-composer.js +406 -0
  83. package/dist/core/provider-composer.js.map +1 -0
  84. package/dist/core/provider-display-names.d.ts.map +1 -1
  85. package/dist/core/provider-display-names.js +2 -1
  86. package/dist/core/provider-display-names.js.map +1 -1
  87. package/dist/core/radius.d.ts +2 -0
  88. package/dist/core/radius.d.ts.map +1 -0
  89. package/dist/core/radius.js +2 -0
  90. package/dist/core/radius.js.map +1 -0
  91. package/dist/core/remote-catalog-provider.d.ts +5 -0
  92. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  93. package/dist/core/remote-catalog-provider.js +83 -0
  94. package/dist/core/remote-catalog-provider.js.map +1 -0
  95. package/dist/core/runtime-credentials.d.ts +15 -0
  96. package/dist/core/runtime-credentials.d.ts.map +1 -0
  97. package/dist/core/runtime-credentials.js +35 -0
  98. package/dist/core/runtime-credentials.js.map +1 -0
  99. package/dist/core/sdk.d.ts +11 -20
  100. package/dist/core/sdk.d.ts.map +1 -1
  101. package/dist/core/sdk.js +61 -89
  102. package/dist/core/sdk.js.map +1 -1
  103. package/dist/core/skills.js +1 -1
  104. package/dist/core/skills.js.map +1 -1
  105. package/dist/core/system-prompt.d.ts.map +1 -1
  106. package/dist/core/system-prompt.js +1 -11
  107. package/dist/core/system-prompt.js.map +1 -1
  108. package/dist/index.d.ts +2 -1
  109. package/dist/index.d.ts.map +1 -1
  110. package/dist/index.js +2 -2
  111. package/dist/index.js.map +1 -1
  112. package/dist/main.d.ts.map +1 -1
  113. package/dist/main.js +10 -13
  114. package/dist/main.js.map +1 -1
  115. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  116. package/dist/modes/interactive/components/assistant-message.js +22 -10
  117. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  118. package/dist/modes/interactive/components/footer.js +1 -1
  119. package/dist/modes/interactive/components/footer.js.map +1 -1
  120. package/dist/modes/interactive/components/login-dialog.d.ts +4 -8
  121. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  122. package/dist/modes/interactive/components/login-dialog.js +14 -12
  123. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  124. package/dist/modes/interactive/components/model-selector.d.ts +13 -4
  125. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  126. package/dist/modes/interactive/components/model-selector.js +84 -41
  127. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  128. package/dist/modes/interactive/components/oauth-selector.d.ts +4 -4
  129. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  130. package/dist/modes/interactive/components/oauth-selector.js +14 -25
  131. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  132. package/dist/modes/interactive/interactive-mode.d.ts +5 -1
  133. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  134. package/dist/modes/interactive/interactive-mode.js +155 -129
  135. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  136. package/dist/package-manager-cli.d.ts.map +1 -1
  137. package/dist/package-manager-cli.js +70 -8
  138. package/dist/package-manager-cli.js.map +1 -1
  139. package/docs/custom-provider.md +8 -11
  140. package/docs/extensions.md +78 -555
  141. package/docs/models.md +4 -0
  142. package/docs/packages.md +1 -0
  143. package/docs/providers.md +23 -11
  144. package/docs/sdk.md +79 -105
  145. package/docs/usage.md +1 -0
  146. package/examples/AGENTS.md +34 -0
  147. package/examples/extensions/README.md +1 -0
  148. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  149. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  150. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  151. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  152. package/examples/extensions/gondolin/package-lock.json +2 -2
  153. package/examples/extensions/gondolin/package.json +1 -1
  154. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  155. package/examples/extensions/sandbox/package-lock.json +2 -2
  156. package/examples/extensions/sandbox/package.json +1 -1
  157. package/examples/extensions/with-deps/package-lock.json +2 -2
  158. package/examples/extensions/with-deps/package.json +1 -1
  159. package/examples/sdk/02-custom-model.ts +5 -8
  160. package/examples/sdk/09-api-keys-and-oauth.ts +13 -31
  161. package/examples/sdk/12-full-control.ts +8 -13
  162. package/examples/sdk/README.md +14 -18
  163. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +40 -0
  164. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  165. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/local-module-loader.ts +2 -2
  166. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/rewrite-imports.ts +4 -4
  167. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +32 -32
  168. package/node_modules/@earendil-works/pi-agent-core/package.json +4 -4
  169. package/node_modules/@earendil-works/pi-ai/README.md +80 -25
  170. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  171. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +23 -42
  172. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  173. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  174. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +10 -6
  175. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  176. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.d.ts.map +1 -1
  177. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js +9 -10
  178. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js.map +1 -1
  179. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +1 -0
  180. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  181. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +4 -3
  182. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  183. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +2 -1
  184. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  185. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +54 -5
  186. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  187. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  188. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +23 -0
  189. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  190. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +1 -0
  191. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  192. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +24 -6
  193. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  194. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts +97 -0
  195. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +1 -0
  196. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js +307 -0
  197. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +1 -0
  198. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.d.ts +3 -0
  199. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.d.ts.map +1 -0
  200. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.js +3 -0
  201. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.js.map +1 -0
  202. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts +2 -1
  203. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
  204. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js +3 -0
  205. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js.map +1 -1
  206. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.d.ts +1 -0
  207. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.d.ts.map +1 -1
  208. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js +4 -3
  209. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js.map +1 -1
  210. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts +9 -0
  211. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.d.ts.map +1 -0
  212. package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/anthropic.js +51 -116
  213. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/anthropic.js.map +1 -0
  214. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/device-code.d.ts.map +1 -0
  215. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/device-code.js.map +1 -0
  216. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.d.ts +6 -0
  217. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.d.ts.map +1 -0
  218. package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/github-copilot.js +18 -77
  219. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js.map +1 -0
  220. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +23 -0
  221. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -0
  222. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +49 -0
  223. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -0
  224. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/oauth-page.d.ts.map +1 -0
  225. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/oauth-page.js.map +1 -0
  226. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.d.ts +9 -0
  227. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.d.ts.map +1 -0
  228. package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/openai-codex.js +61 -155
  229. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -0
  230. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/pkce.d.ts.map +1 -0
  231. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/pkce.js.map +1 -0
  232. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts +16 -0
  233. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.d.ts.map +1 -0
  234. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js +316 -0
  235. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/radius.js.map +1 -0
  236. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/xai.d.ts +6 -0
  237. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/xai.d.ts.map +1 -0
  238. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/xai.js +189 -0
  239. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/xai.js.map +1 -0
  240. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +2 -4
  241. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -1
  242. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +9 -7
  243. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  244. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +49 -10
  245. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  246. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  247. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts +3 -0
  248. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -0
  249. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +17 -0
  250. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -0
  251. package/node_modules/@earendil-works/pi-ai/dist/cli.js +58 -76
  252. package/node_modules/@earendil-works/pi-ai/dist/cli.js.map +1 -1
  253. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.d.ts +42 -0
  254. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.d.ts.map +1 -0
  255. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.js +2 -0
  256. package/node_modules/@earendil-works/pi-ai/dist/compat/extension-oauth-types.js.map +1 -0
  257. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +2 -0
  258. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  259. package/node_modules/@earendil-works/pi-ai/dist/compat.js +49 -22
  260. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  261. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  262. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +1 -0
  263. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  264. package/node_modules/@earendil-works/pi-ai/dist/images-models.d.ts +4 -2
  265. package/node_modules/@earendil-works/pi-ai/dist/images-models.d.ts.map +1 -1
  266. package/node_modules/@earendil-works/pi-ai/dist/images-models.js +5 -4
  267. package/node_modules/@earendil-works/pi-ai/dist/images-models.js.map +1 -1
  268. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +3 -1
  269. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  270. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  271. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  272. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts +25 -0
  273. package/node_modules/@earendil-works/pi-ai/dist/models-store.d.ts.map +1 -0
  274. package/node_modules/@earendil-works/pi-ai/dist/models-store.js +16 -0
  275. package/node_modules/@earendil-works/pi-ai/dist/models-store.js.map +1 -0
  276. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +69 -30
  277. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  278. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +372 -120
  279. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  280. package/node_modules/@earendil-works/pi-ai/dist/models.js +217 -31
  281. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  282. package/node_modules/@earendil-works/pi-ai/dist/oauth.d.ts +2 -1
  283. package/node_modules/@earendil-works/pi-ai/dist/oauth.d.ts.map +1 -1
  284. package/node_modules/@earendil-works/pi-ai/dist/oauth.js +1 -1
  285. package/node_modules/@earendil-works/pi-ai/dist/oauth.js.map +1 -1
  286. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts +11 -6
  287. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  288. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +3 -0
  289. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  290. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  291. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +51 -10
  292. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  293. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  294. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +1 -1
  295. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  296. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  297. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.js +4 -3
  298. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  299. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.d.ts.map +1 -1
  300. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js +13 -20
  301. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js.map +1 -1
  302. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-stream.d.ts +8 -0
  303. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-stream.d.ts.map +1 -0
  304. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-stream.js +21 -0
  305. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-stream.js.map +1 -0
  306. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.d.ts.map +1 -1
  307. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.js +2 -1
  308. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.js.map +1 -1
  309. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.d.ts.map +1 -1
  310. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.js +11 -1
  311. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.js.map +1 -1
  312. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +1 -6
  313. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
  314. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +1 -2
  315. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  316. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
  317. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js +56 -5
  318. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  319. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +66 -0
  320. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  321. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js +42 -0
  322. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  323. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts +36 -0
  324. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts.map +1 -1
  325. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js +19 -0
  326. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js.map +1 -1
  327. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts +36 -0
  328. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts.map +1 -1
  329. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js +19 -0
  330. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js.map +1 -1
  331. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.d.ts.map +1 -1
  332. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js +1 -1
  333. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js.map +1 -1
  334. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts +44 -0
  335. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts.map +1 -1
  336. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +36 -0
  337. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
  338. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +57 -0
  339. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  340. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +19 -0
  341. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  342. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +42 -0
  343. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -1
  344. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +175 -139
  345. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  346. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.d.ts +26 -0
  347. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.d.ts.map +1 -0
  348. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.js +59 -0
  349. package/node_modules/@earendil-works/pi-ai/dist/providers/radius-config.js.map +1 -0
  350. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.d.ts +9 -0
  351. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.d.ts.map +1 -0
  352. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.js +54 -0
  353. package/node_modules/@earendil-works/pi-ai/dist/providers/radius.js.map +1 -0
  354. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +84 -0
  355. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -1
  356. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +74 -2
  357. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  358. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.d.ts +1 -1
  359. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.d.ts.map +1 -1
  360. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.js +15 -3
  361. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.js.map +1 -1
  362. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts +6 -114
  363. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts.map +1 -1
  364. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js +3 -92
  365. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js.map +1 -1
  366. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  367. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js +9 -0
  368. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  369. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -1
  370. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  371. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +6 -2
  372. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  373. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts +8 -0
  374. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts.map +1 -0
  375. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js +92 -0
  376. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js.map +1 -0
  377. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts +6 -0
  378. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts.map +1 -0
  379. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js +54 -0
  380. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js.map +1 -0
  381. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts +4 -0
  382. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts.map +1 -0
  383. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.js +4 -0
  384. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.js.map +1 -0
  385. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts +7 -0
  386. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts.map +1 -0
  387. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js +16 -0
  388. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js.map +1 -0
  389. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +19 -0
  390. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +1 -0
  391. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +217 -0
  392. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +1 -0
  393. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts +4 -0
  394. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts.map +1 -0
  395. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js +46 -0
  396. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js.map +1 -0
  397. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts +13 -0
  398. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +1 -0
  399. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +144 -0
  400. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +1 -0
  401. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts +5 -0
  402. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +1 -0
  403. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +208 -0
  404. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +1 -0
  405. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts +4 -0
  406. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts.map +1 -0
  407. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js +17 -0
  408. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js.map +1 -0
  409. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts +5 -0
  410. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts.map +1 -0
  411. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js +34 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js.map +1 -0
  413. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts +3 -1
  414. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.js.map +1 -1
  416. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +12 -5
  417. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  418. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/package.json +6 -1
  420. package/node_modules/@earendil-works/pi-pty/native/prebuilds/darwin-arm64/senpi_pty.darwin-arm64.node +0 -0
  421. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  422. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
  423. package/node_modules/@earendil-works/pi-tui/dist/utils.js +22 -4
  424. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  425. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  426. package/package.json +6 -6
  427. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts +0 -27
  428. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts.map +0 -1
  429. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js.map +0 -1
  430. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +0 -1
  431. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +0 -1
  432. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts +0 -32
  433. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +0 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +0 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts +0 -58
  436. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +0 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +0 -122
  438. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +0 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.d.ts +0 -5
  440. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.d.ts.map +0 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.js +0 -22
  442. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.js.map +0 -1
  443. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.d.ts.map +0 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.js.map +0 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts +0 -45
  446. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +0 -1
  447. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +0 -1
  448. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.d.ts.map +0 -1
  449. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.js.map +0 -1
  450. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts +0 -64
  451. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts.map +0 -1
  452. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.js +0 -2
  453. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.js.map +0 -1
  454. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/device-code.d.ts +0 -0
  455. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/device-code.js +0 -0
  456. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/oauth-page.d.ts +0 -0
  457. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/oauth-page.js +0 -0
  458. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/pkce.d.ts +0 -0
  459. /package/node_modules/@earendil-works/pi-ai/dist/{utils → auth}/oauth/pkce.js +0 -0
@@ -31,6 +31,7 @@ import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
31
31
  import { ExecuteToolError, ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
32
32
  import { emitSessionShutdownEvent } from "./extensions/runner.js";
33
33
  import { filterContextExcludedMessages } from "./messages.js";
34
+ import { ModelRegistry } from "./model-registry.js";
34
35
  import { getModelNarrowingPatterns, resolveModelScope } from "./model-resolver.js";
35
36
  import { expandPromptTemplate } from "./prompt-templates.js";
36
37
  import { buildSessionContext, CURRENT_SESSION_VERSION, getLatestCompactionEntry, } from "./session-manager.js";
@@ -56,6 +57,14 @@ export function parseSkillBlock(text) {
56
57
  userMessage: match[4]?.trim() || undefined,
57
58
  };
58
59
  }
60
+ // ============================================================================
61
+ // Types
62
+ // ============================================================================
63
+ function withoutDeletedHeaders(headers) {
64
+ return headers
65
+ ? Object.fromEntries(Object.entries(headers).filter((entry) => entry[1] !== null))
66
+ : undefined;
67
+ }
59
68
  class CompactionRejectedError extends Error {
60
69
  constructor(rejectionCause) {
61
70
  super(rejectionCause === "cancelled-by-extension" ? "Compaction cancelled" : "Compaction rejected");
@@ -63,6 +72,12 @@ class CompactionRejectedError extends Error {
63
72
  this.rejectionCause = rejectionCause;
64
73
  }
65
74
  }
75
+ class MissingModelAccessError extends Error {
76
+ constructor() {
77
+ super("AgentSession requires modelRuntime or modelRegistry");
78
+ this.name = "MissingModelAccessError";
79
+ }
80
+ }
66
81
  function estimateMessagesTokens(messages) {
67
82
  let tokens = 0;
68
83
  for (const message of messages) {
@@ -148,7 +163,12 @@ export class AgentSession {
148
163
  this._resourceLoader = config.resourceLoader;
149
164
  this._customTools = config.customTools ?? [];
150
165
  this._cwd = config.cwd;
151
- this._modelRegistry = config.modelRegistry;
166
+ const modelRuntime = config.modelRuntime ?? config.modelRegistry?.modelRuntime;
167
+ if (!modelRuntime) {
168
+ throw new MissingModelAccessError();
169
+ }
170
+ this._modelRuntime = modelRuntime;
171
+ this._modelRegistry = config.modelRegistry ?? new ModelRegistry(modelRuntime);
152
172
  this._extensionRunnerRef = config.extensionRunnerRef;
153
173
  this._initialActiveToolNames = config.initialActiveToolNames;
154
174
  this._allowedToolNames = config.allowedToolNames ? new Set(config.allowedToolNames) : undefined;
@@ -169,22 +189,33 @@ export class AgentSession {
169
189
  includeAllExtensionTools: true,
170
190
  });
171
191
  }
172
- /** Model registry for API key resolution and model discovery */
192
+ get modelRuntime() {
193
+ return this._modelRuntime;
194
+ }
173
195
  get modelRegistry() {
174
196
  return this._modelRegistry;
175
197
  }
176
198
  async _getRequiredRequestAuth(model) {
177
- const result = await this._modelRegistry.getApiKeyAndHeaders(model);
178
- if (!result.ok) {
179
- if (result.error.startsWith("No API key found")) {
199
+ let result;
200
+ try {
201
+ result = await this._modelRuntime.getAuth(model);
202
+ }
203
+ catch (error) {
204
+ const cause = error instanceof Error ? error.cause : undefined;
205
+ if (cause instanceof Error && cause.message === "authHeader requires a resolved API key") {
180
206
  throw new Error(formatNoApiKeyFoundMessage(model.provider));
181
207
  }
182
- throw new Error(result.error);
208
+ throw error;
183
209
  }
184
- if (result.apiKey) {
185
- return { apiKey: result.apiKey, headers: result.headers, extraBody: result.extraBody, env: result.env };
210
+ if (result?.auth.apiKey) {
211
+ return {
212
+ apiKey: result.auth.apiKey,
213
+ headers: withoutDeletedHeaders(result.auth.headers),
214
+ extraBody: this._modelRuntime.getCompatibilityRequestConfig(model).extraBody,
215
+ env: result.env,
216
+ };
186
217
  }
187
- const isOAuth = this._modelRegistry.isUsingOAuth(model);
218
+ const isOAuth = this._modelRuntime.isUsingOAuth(model.provider);
188
219
  if (isOAuth) {
189
220
  throw new Error(`Authentication failed for "${model.provider}". ` +
190
221
  `Credentials may have expired or network is unavailable. ` +
@@ -196,10 +227,21 @@ export class AgentSession {
196
227
  if (this.agent.streamFn === streamSimple) {
197
228
  return this._getRequiredRequestAuth(model);
198
229
  }
199
- const result = await this._modelRegistry.getApiKeyAndHeaders(model);
200
- return result.ok
201
- ? { apiKey: result.apiKey, headers: result.headers, extraBody: result.extraBody, env: result.env }
202
- : {};
230
+ const compatibility = this._modelRuntime.getCompatibilityRequestConfig(model);
231
+ try {
232
+ const result = await this._modelRuntime.getAuth(model);
233
+ return result
234
+ ? {
235
+ apiKey: result.auth.apiKey,
236
+ headers: withoutDeletedHeaders(result.auth.headers),
237
+ extraBody: compatibility.extraBody,
238
+ env: result.env,
239
+ }
240
+ : { extraBody: compatibility.extraBody };
241
+ }
242
+ catch {
243
+ return { extraBody: compatibility.extraBody };
244
+ }
203
245
  }
204
246
  /**
205
247
  * Install tool hooks once on the Agent instance.
@@ -888,7 +930,7 @@ export class AgentSession {
888
930
  this._favoriteModels = favoriteModels;
889
931
  }
890
932
  _getCurrentFavoriteModels() {
891
- const availableById = new Map(this._modelRegistry.getAvailable().map((model) => [`${model.provider}/${model.id}`, model]));
933
+ const availableById = new Map(this._modelRuntime.getAvailableSnapshot().map((model) => [`${model.provider}/${model.id}`, model]));
892
934
  const narrowedModelIds = this._scopedModels.length > 0
893
935
  ? new Set(this._scopedModels.map((scoped) => `${scoped.model.provider}/${scoped.model.id}`))
894
936
  : undefined;
@@ -1055,8 +1097,10 @@ export class AgentSession {
1055
1097
  if (!this.model) {
1056
1098
  throw new Error(formatNoModelSelectedMessage());
1057
1099
  }
1058
- if (!this._modelRegistry.hasConfiguredAuth(this.model)) {
1059
- const isOAuth = this._modelRegistry.isUsingOAuth(this.model);
1100
+ const hasConfiguredAuth = this._modelRuntime.hasConfiguredAuth(this.model.provider) ||
1101
+ (await this._modelRuntime.checkAuth(this.model.provider)) !== undefined;
1102
+ if (!hasConfiguredAuth) {
1103
+ const isOAuth = this._modelRuntime.isUsingOAuth(this.model.provider);
1060
1104
  if (isOAuth) {
1061
1105
  throw new Error(`Authentication failed for "${this.model.provider}". ` +
1062
1106
  `Credentials may have expired or network is unavailable. ` +
@@ -1527,7 +1571,7 @@ export class AgentSession {
1527
1571
  * @throws Error if no auth is configured for the model
1528
1572
  */
1529
1573
  async setModel(model) {
1530
- if (!this._modelRegistry.hasConfiguredAuth(model)) {
1574
+ if (!(await this._modelRuntime.checkAuth(model.provider))) {
1531
1575
  throw new Error(`No API key for ${model.provider}/${model.id}`);
1532
1576
  }
1533
1577
  const previousModel = this.model;
@@ -1822,6 +1866,7 @@ export class AgentSession {
1822
1866
  }
1823
1867
  async _executeCompaction(request) {
1824
1868
  const finishCompactionWork = this._sessionWorkBarrier.begin();
1869
+ const agentMessagesAtStart = request.agentMessagesAtStart ?? this.agent.state.messages.slice();
1825
1870
  try {
1826
1871
  if (!this.model) {
1827
1872
  throw new Error(formatNoModelSelectedMessage());
@@ -1880,7 +1925,12 @@ export class AgentSession {
1880
1925
  throw new Error("Compaction entry was not saved");
1881
1926
  }
1882
1927
  const sessionContext = this.sessionManager.buildSessionContext();
1883
- this.agent.state.messages = sessionContext.messages;
1928
+ const currentAgentMessages = this.agent.state.messages;
1929
+ const hasUnchangedPrefix = agentMessagesAtStart.every((message, index) => currentAgentMessages[index] === message);
1930
+ const messagesAppendedDuringCompaction = hasUnchangedPrefix
1931
+ ? currentAgentMessages.slice(agentMessagesAtStart.length)
1932
+ : [];
1933
+ this.agent.state.messages = [...sessionContext.messages, ...messagesAppendedDuringCompaction];
1884
1934
  compactionResult.estimatedTokensAfter = estimateMessagesTokens(sessionContext.messages);
1885
1935
  this._incrementMessageRevision();
1886
1936
  await this._extensionRunner.emit({
@@ -1977,7 +2027,7 @@ export class AgentSession {
1977
2027
  // to a larger-context model (e.g. codex) - the overflow error from the old model
1978
2028
  // shouldn't trigger compaction for the new model.
1979
2029
  const sameModel = this.model &&
1980
- isSameOverflowSource(assistantMessage, this.model, this._modelRegistry.getUpstreamModelId(this.model));
2030
+ isSameOverflowSource(assistantMessage, this.model, this._modelRuntime.getCompatibilityRequestConfig(this.model).upstreamModelId);
1981
2031
  // Skip compaction checks if this assistant message is older than the latest
1982
2032
  // compaction boundary. This prevents a stale pre-compaction usage/error
1983
2033
  // from retriggering compaction on the first prompt after compaction.
@@ -2128,6 +2178,7 @@ export class AgentSession {
2128
2178
  */
2129
2179
  async _runAutoCompaction(reason, willRetry) {
2130
2180
  const finishCompactionWork = this._sessionWorkBarrier.begin();
2181
+ const agentMessagesAtStart = this.agent.state.messages.slice();
2131
2182
  this._emit({ type: "compaction_start", reason });
2132
2183
  const autoCompactionController = new AbortController();
2133
2184
  this._autoCompactionAbortController = autoCompactionController;
@@ -2144,8 +2195,8 @@ export class AgentSession {
2144
2195
  });
2145
2196
  return false;
2146
2197
  }
2147
- const authResult = await this._modelRegistry.getApiKeyAndHeaders(this.model);
2148
- if (this.agent.streamFn === streamSimple && (!authResult.ok || !authResult.apiKey)) {
2198
+ const authResult = await this._modelRuntime.getAuth(this.model);
2199
+ if (this.agent.streamFn === streamSimple && !authResult?.auth.apiKey) {
2149
2200
  if (reason === "overflow")
2150
2201
  this._overflowRecoveryAttempted = false;
2151
2202
  this._emit({
@@ -2170,7 +2221,7 @@ export class AgentSession {
2170
2221
  });
2171
2222
  return false;
2172
2223
  }
2173
- const execution = await this._executeCompaction({ reason, willRetry });
2224
+ const execution = await this._executeCompaction({ reason, willRetry, agentMessagesAtStart });
2174
2225
  if (!execution.accepted) {
2175
2226
  if (reason === "overflow")
2176
2227
  this._overflowRecoveryAttempted = false;
@@ -2317,7 +2368,7 @@ export class AgentSession {
2317
2368
  if (!currentModel) {
2318
2369
  return;
2319
2370
  }
2320
- const refreshedModel = this._modelRegistry.find(currentModel.provider, currentModel.id);
2371
+ const refreshedModel = this._modelRuntime.getModel(currentModel.provider, currentModel.id);
2321
2372
  if (!refreshedModel || refreshedModel === currentModel) {
2322
2373
  return;
2323
2374
  }
@@ -2387,7 +2438,7 @@ export class AgentSession {
2387
2438
  refreshTools: () => this._refreshToolRegistry(),
2388
2439
  getCommands,
2389
2440
  setModel: async (model) => {
2390
- if (!this.modelRegistry.hasConfiguredAuth(model))
2441
+ if (!this._modelRuntime.hasConfiguredAuth(model.provider))
2391
2442
  return false;
2392
2443
  await this.setModel(model);
2393
2444
  return true;
@@ -2471,11 +2522,11 @@ export class AgentSession {
2471
2522
  getSystemPromptOptions: () => this._baseSystemPromptOptions,
2472
2523
  }, {
2473
2524
  registerProvider: (name, config) => {
2474
- this._modelRegistry.registerProvider(name, config);
2525
+ this._modelRuntime.registerProvider(name, config);
2475
2526
  this._refreshCurrentModelFromRegistry();
2476
2527
  },
2477
2528
  unregisterProvider: (name) => {
2478
- this._modelRegistry.unregisterProvider(name);
2529
+ this._modelRuntime.unregisterProvider(name);
2479
2530
  this._refreshCurrentModelFromRegistry();
2480
2531
  },
2481
2532
  });
@@ -2598,11 +2649,11 @@ export class AgentSession {
2598
2649
  await this.settingsManager.reload();
2599
2650
  this.syncQueueModesFromSettings();
2600
2651
  resetApiProviders();
2601
- this._modelRegistry.refresh();
2652
+ await this._modelRuntime.reloadConfig();
2602
2653
  this.setScopedModels(await resolveModelScope(getModelNarrowingPatterns({
2603
2654
  legacyEnabledPatterns: this.settingsManager.getEnabledModels(),
2604
- }), this._modelRegistry));
2605
- this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels() ?? [], this._modelRegistry));
2655
+ }), this._modelRuntime));
2656
+ this.setFavoriteModels(await resolveModelScope(this.settingsManager.getFavoriteModels() ?? [], this._modelRuntime));
2606
2657
  await this._resourceLoader.reload();
2607
2658
  this._buildRuntime({
2608
2659
  activeToolNames: this.getActiveToolNames(),
@@ -2965,7 +3016,7 @@ export class AgentSession {
2965
3016
  let summaryDetails;
2966
3017
  if (options.summarize && entriesToSummarize.length > 0 && !extensionSummary) {
2967
3018
  const model = this.model;
2968
- const { apiKey, headers, extraBody, env } = await this._getRequiredRequestAuth(model);
3019
+ const { apiKey, headers, extraBody, env } = await this._getCompactionRequestAuth(model);
2969
3020
  const branchSummarySettings = this.settingsManager.getBranchSummarySettings();
2970
3021
  const result = await generateBranchSummary(entriesToSummarize, {
2971
3022
  model,