@averyyy/pi-coding-agent 0.84.2-piclient.1 → 0.84.3-piclient.1

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 (302) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +8 -4
  3. package/dist/bundle/chunks/anthropic-messages-JWX2WP65.js +45 -0
  4. package/dist/bundle/chunks/anthropic.js +75 -0
  5. package/dist/bundle/chunks/azure-openai-responses-B2RCCN5N.js +2 -0
  6. package/dist/bundle/chunks/bedrock-converse-stream.js +74 -0
  7. package/dist/bundle/chunks/chunk-4L3WN2XY.js +2 -0
  8. package/dist/bundle/chunks/chunk-6CYCI3EJ.js +12 -0
  9. package/dist/bundle/chunks/chunk-6R7UI4IY.js +2 -0
  10. package/dist/bundle/chunks/chunk-AXIIZGTV.js +2 -0
  11. package/dist/bundle/chunks/chunk-DRQDKNXA.js +2 -0
  12. package/dist/bundle/chunks/chunk-GMWCTUPB.js +2 -0
  13. package/dist/bundle/chunks/chunk-GPPBJGBU.js +50 -0
  14. package/dist/bundle/chunks/chunk-JUUC5AZY.js +2 -0
  15. package/dist/bundle/chunks/chunk-L2ZPNLYD.js +2 -0
  16. package/dist/bundle/chunks/chunk-LRBSW3NQ.js +11 -0
  17. package/dist/bundle/chunks/chunk-MNAIPA3J.js +2 -0
  18. package/dist/bundle/chunks/chunk-NUHFSC37.js +25 -0
  19. package/dist/bundle/chunks/chunk-PGXDEOVV.js +2 -0
  20. package/dist/bundle/chunks/chunk-PJACZCIR.js +2 -0
  21. package/dist/bundle/chunks/chunk-PRRNXB7S.js +2 -0
  22. package/dist/bundle/chunks/chunk-QI42RBZ4.js +1632 -0
  23. package/dist/bundle/chunks/chunk-TEPMHNKQ.js +2 -0
  24. package/dist/bundle/chunks/chunk-TRDNDS6A.js +4 -0
  25. package/dist/bundle/chunks/chunk-UAQELI3K.js +2 -0
  26. package/dist/bundle/chunks/chunk-XDUWOHPL.js +6 -0
  27. package/dist/bundle/chunks/chunk-XNGRGP62.js +2 -0
  28. package/dist/bundle/chunks/dist-RDWOYWHR.js +13 -0
  29. package/dist/bundle/chunks/github-copilot.js +2 -0
  30. package/dist/bundle/chunks/google-generative-ai-XDKMGBCJ.js +2 -0
  31. package/dist/bundle/chunks/google-vertex-D5FGEO3Y.js +2 -0
  32. package/dist/bundle/chunks/image-resize-worker.js +2 -0
  33. package/dist/bundle/chunks/kimi-coding.js +2 -0
  34. package/dist/bundle/chunks/lib-HGQMNYVT.js +9 -0
  35. package/dist/bundle/chunks/mistral-conversations-YK73UAOZ.js +5 -0
  36. package/dist/bundle/chunks/multipart-parser-SQ6GDJL7.js +3 -0
  37. package/dist/bundle/chunks/openai-codex-responses-MJHX7NXI.js +8 -0
  38. package/dist/bundle/chunks/openai-codex.js +75 -0
  39. package/dist/bundle/chunks/openai-completions-JD4WAC3R.js +7 -0
  40. package/dist/bundle/chunks/openai-responses-CP4VKB27.js +2 -0
  41. package/dist/bundle/chunks/openrouter-images-N4XVVFSD.js +2 -0
  42. package/dist/bundle/chunks/openrouter.js +75 -0
  43. package/dist/bundle/chunks/pi-messages-TPFH44NP.js +8 -0
  44. package/dist/bundle/chunks/radius.js +75 -0
  45. package/dist/bundle/chunks/src-UK77SYZE.js +4 -0
  46. package/dist/bundle/chunks/xai.js +2 -0
  47. package/dist/bundle/cli.js +3 -0
  48. package/dist/bundle/client.js +2 -0
  49. package/dist/bundle/index.js +2 -0
  50. package/dist/bundle/rpc-entry.js +3 -0
  51. package/dist/cli/args.d.ts +1 -0
  52. package/dist/cli/args.d.ts.map +1 -1
  53. package/dist/cli/args.js +29 -9
  54. package/dist/cli/args.js.map +1 -1
  55. package/dist/cli/file-processor.d.ts.map +1 -1
  56. package/dist/cli/file-processor.js +2 -1
  57. package/dist/cli/file-processor.js.map +1 -1
  58. package/dist/config.d.ts +4 -3
  59. package/dist/config.d.ts.map +1 -1
  60. package/dist/config.js +22 -14
  61. package/dist/config.js.map +1 -1
  62. package/dist/core/agent-session.d.ts +15 -8
  63. package/dist/core/agent-session.d.ts.map +1 -1
  64. package/dist/core/agent-session.js +48 -39
  65. package/dist/core/agent-session.js.map +1 -1
  66. package/dist/core/auth-storage.d.ts.map +1 -1
  67. package/dist/core/auth-storage.js +6 -7
  68. package/dist/core/auth-storage.js.map +1 -1
  69. package/dist/core/defaults.d.ts +1 -0
  70. package/dist/core/defaults.d.ts.map +1 -1
  71. package/dist/core/defaults.js +9 -0
  72. package/dist/core/defaults.js.map +1 -1
  73. package/dist/core/exec.d.ts.map +1 -1
  74. package/dist/core/exec.js +3 -1
  75. package/dist/core/exec.js.map +1 -1
  76. package/dist/core/extensions/index.d.ts +2 -2
  77. package/dist/core/extensions/index.d.ts.map +1 -1
  78. package/dist/core/extensions/index.js +1 -1
  79. package/dist/core/extensions/index.js.map +1 -1
  80. package/dist/core/extensions/loader.d.ts.map +1 -1
  81. package/dist/core/extensions/loader.js +115 -48
  82. package/dist/core/extensions/loader.js.map +1 -1
  83. package/dist/core/extensions/types.d.ts +38 -9
  84. package/dist/core/extensions/types.d.ts.map +1 -1
  85. package/dist/core/extensions/types.js +3 -0
  86. package/dist/core/extensions/types.js.map +1 -1
  87. package/dist/core/footer-data-provider.d.ts +1 -1
  88. package/dist/core/footer-data-provider.d.ts.map +1 -1
  89. package/dist/core/footer-data-provider.js +1 -1
  90. package/dist/core/footer-data-provider.js.map +1 -1
  91. package/dist/core/index.d.ts +1 -0
  92. package/dist/core/index.d.ts.map +1 -1
  93. package/dist/core/index.js +1 -0
  94. package/dist/core/index.js.map +1 -1
  95. package/dist/core/keybindings.d.ts +20 -19
  96. package/dist/core/keybindings.d.ts.map +1 -1
  97. package/dist/core/keybindings.js +26 -5
  98. package/dist/core/keybindings.js.map +1 -1
  99. package/dist/core/model-config.d.ts +5 -0
  100. package/dist/core/model-config.d.ts.map +1 -1
  101. package/dist/core/model-config.js +3 -1
  102. package/dist/core/model-config.js.map +1 -1
  103. package/dist/core/model-resolver.d.ts +1 -0
  104. package/dist/core/model-resolver.d.ts.map +1 -1
  105. package/dist/core/model-resolver.js +14 -8
  106. package/dist/core/model-resolver.js.map +1 -1
  107. package/dist/core/models-store.d.ts.map +1 -1
  108. package/dist/core/models-store.js +2 -1
  109. package/dist/core/models-store.js.map +1 -1
  110. package/dist/core/package-manager.d.ts.map +1 -1
  111. package/dist/core/package-manager.js +22 -14
  112. package/dist/core/package-manager.js.map +1 -1
  113. package/dist/core/pi-client-cli-adapter.d.ts +11 -0
  114. package/dist/core/pi-client-cli-adapter.d.ts.map +1 -0
  115. package/dist/core/pi-client-cli-adapter.js +91 -0
  116. package/dist/core/pi-client-cli-adapter.js.map +1 -0
  117. package/dist/core/pi-manifest.d.ts.map +1 -1
  118. package/dist/core/pi-manifest.js +2 -1
  119. package/dist/core/pi-manifest.js.map +1 -1
  120. package/dist/core/pi-server-client.d.ts +0 -1
  121. package/dist/core/pi-server-client.d.ts.map +1 -1
  122. package/dist/core/pi-server-client.js +148 -65
  123. package/dist/core/pi-server-client.js.map +1 -1
  124. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  125. package/dist/core/remote-catalog-provider.js +2 -1
  126. package/dist/core/remote-catalog-provider.js.map +1 -1
  127. package/dist/core/resource-loader.d.ts.map +1 -1
  128. package/dist/core/resource-loader.js +3 -2
  129. package/dist/core/resource-loader.js.map +1 -1
  130. package/dist/core/sdk.d.ts +2 -2
  131. package/dist/core/sdk.d.ts.map +1 -1
  132. package/dist/core/sdk.js +10 -3
  133. package/dist/core/sdk.js.map +1 -1
  134. package/dist/core/session-export.d.ts +4 -0
  135. package/dist/core/session-export.d.ts.map +1 -0
  136. package/dist/core/session-export.js +32 -0
  137. package/dist/core/session-export.js.map +1 -0
  138. package/dist/core/session-manager.d.ts.map +1 -1
  139. package/dist/core/session-manager.js +2 -1
  140. package/dist/core/session-manager.js.map +1 -1
  141. package/dist/core/settings-diagnostics.d.ts +9 -0
  142. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  143. package/dist/core/settings-diagnostics.js +21 -0
  144. package/dist/core/settings-diagnostics.js.map +1 -0
  145. package/dist/core/settings-manager.d.ts +9 -0
  146. package/dist/core/settings-manager.d.ts.map +1 -1
  147. package/dist/core/settings-manager.js +52 -10
  148. package/dist/core/settings-manager.js.map +1 -1
  149. package/dist/core/skills.d.ts.map +1 -1
  150. package/dist/core/skills.js +51 -33
  151. package/dist/core/skills.js.map +1 -1
  152. package/dist/core/slash-commands.d.ts.map +1 -1
  153. package/dist/core/slash-commands.js +2 -1
  154. package/dist/core/slash-commands.js.map +1 -1
  155. package/dist/core/system-prompt.d.ts.map +1 -1
  156. package/dist/core/system-prompt.js +11 -2
  157. package/dist/core/system-prompt.js.map +1 -1
  158. package/dist/core/tools/bash.d.ts +13 -1
  159. package/dist/core/tools/bash.d.ts.map +1 -1
  160. package/dist/core/tools/bash.js +30 -14
  161. package/dist/core/tools/bash.js.map +1 -1
  162. package/dist/core/tools/edit-diff.d.ts +0 -5
  163. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  164. package/dist/core/tools/edit-diff.js +2 -5
  165. package/dist/core/tools/edit-diff.js.map +1 -1
  166. package/dist/core/tools/edit.d.ts.map +1 -1
  167. package/dist/core/tools/edit.js +20 -4
  168. package/dist/core/tools/edit.js.map +1 -1
  169. package/dist/core/tools/index.d.ts +4 -1
  170. package/dist/core/tools/index.d.ts.map +1 -1
  171. package/dist/core/tools/index.js +18 -1
  172. package/dist/core/tools/index.js.map +1 -1
  173. package/dist/core/tools/powershell.d.ts +16 -0
  174. package/dist/core/tools/powershell.d.ts.map +1 -0
  175. package/dist/core/tools/powershell.js +39 -0
  176. package/dist/core/tools/powershell.js.map +1 -0
  177. package/dist/core/trust-manager.d.ts.map +1 -1
  178. package/dist/core/trust-manager.js +2 -1
  179. package/dist/core/trust-manager.js.map +1 -1
  180. package/dist/extensions/llama/client.d.ts +6 -0
  181. package/dist/extensions/llama/client.d.ts.map +1 -1
  182. package/dist/extensions/llama/client.js +7 -0
  183. package/dist/extensions/llama/client.js.map +1 -1
  184. package/dist/extensions/llama/index.d.ts.map +1 -1
  185. package/dist/extensions/llama/index.js +2 -0
  186. package/dist/extensions/llama/index.js.map +1 -1
  187. package/dist/extensions/llama/provider.d.ts +3 -1
  188. package/dist/extensions/llama/provider.d.ts.map +1 -1
  189. package/dist/extensions/llama/provider.js +29 -4
  190. package/dist/extensions/llama/provider.js.map +1 -1
  191. package/dist/index.d.ts +2 -2
  192. package/dist/index.d.ts.map +1 -1
  193. package/dist/index.js +3 -3
  194. package/dist/index.js.map +1 -1
  195. package/dist/main.d.ts +4 -0
  196. package/dist/main.d.ts.map +1 -1
  197. package/dist/main.js +20 -15
  198. package/dist/main.js.map +1 -1
  199. package/dist/migrations.d.ts.map +1 -1
  200. package/dist/migrations.js +4 -3
  201. package/dist/migrations.js.map +1 -1
  202. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  203. package/dist/modes/interactive/components/bash-execution.js +2 -1
  204. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  205. package/dist/modes/interactive/components/model-selector.d.ts +9 -3
  206. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  207. package/dist/modes/interactive/components/model-selector.js +56 -12
  208. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  209. package/dist/modes/interactive/components/settings-selector.d.ts +7 -2
  210. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  211. package/dist/modes/interactive/components/settings-selector.js +118 -56
  212. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  213. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  214. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  215. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  216. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  217. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  218. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  219. package/dist/modes/interactive/components/thinking-selector.js +74 -17
  220. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  221. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  222. package/dist/modes/interactive/external-editor.js +2 -1
  223. package/dist/modes/interactive/external-editor.js.map +1 -1
  224. package/dist/modes/interactive/interactive-mode.d.ts +13 -12
  225. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  226. package/dist/modes/interactive/interactive-mode.js +196 -226
  227. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  228. package/dist/modes/interactive/session-share.d.ts +16 -0
  229. package/dist/modes/interactive/session-share.d.ts.map +1 -0
  230. package/dist/modes/interactive/session-share.js +188 -0
  231. package/dist/modes/interactive/session-share.js.map +1 -0
  232. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  233. package/dist/modes/interactive/theme/theme.js +4 -3
  234. package/dist/modes/interactive/theme/theme.js.map +1 -1
  235. package/dist/modes/json-event.d.ts +16 -13
  236. package/dist/modes/json-event.d.ts.map +1 -1
  237. package/dist/modes/json-event.js +20 -6
  238. package/dist/modes/json-event.js.map +1 -1
  239. package/dist/package-manager-cli.d.ts +1 -0
  240. package/dist/package-manager-cli.d.ts.map +1 -1
  241. package/dist/package-manager-cli.js +186 -2
  242. package/dist/package-manager-cli.js.map +1 -1
  243. package/dist/utils/child-process.d.ts.map +1 -1
  244. package/dist/utils/child-process.js +8 -3
  245. package/dist/utils/child-process.js.map +1 -1
  246. package/dist/utils/frontmatter.d.ts.map +1 -1
  247. package/dist/utils/frontmatter.js +2 -1
  248. package/dist/utils/frontmatter.js.map +1 -1
  249. package/dist/utils/management-http.d.ts +5 -3
  250. package/dist/utils/management-http.d.ts.map +1 -1
  251. package/dist/utils/management-http.js +14 -10
  252. package/dist/utils/management-http.js.map +1 -1
  253. package/dist/utils/shell.d.ts +3 -0
  254. package/dist/utils/shell.d.ts.map +1 -1
  255. package/dist/utils/shell.js +21 -7
  256. package/dist/utils/shell.js.map +1 -1
  257. package/dist/utils/syntax-highlight.d.ts +1 -0
  258. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  259. package/dist/utils/syntax-highlight.js +60 -1
  260. package/dist/utils/syntax-highlight.js.map +1 -1
  261. package/dist/utils/text.d.ts +8 -0
  262. package/dist/utils/text.d.ts.map +1 -0
  263. package/dist/utils/text.js +9 -0
  264. package/dist/utils/text.js.map +1 -0
  265. package/dist/utils/version-check.d.ts.map +1 -1
  266. package/dist/utils/version-check.js +2 -1
  267. package/dist/utils/version-check.js.map +1 -1
  268. package/docs/compaction.md +15 -0
  269. package/docs/custom-provider.md +5 -2
  270. package/docs/environment-variables.md +8 -8
  271. package/docs/extensions.md +17 -7
  272. package/docs/json.md +7 -2
  273. package/docs/keybindings.md +8 -8
  274. package/docs/llama-cpp.md +2 -0
  275. package/docs/models.md +8 -2
  276. package/docs/packages.md +2 -2
  277. package/docs/rpc.md +9 -3
  278. package/docs/sdk.md +7 -2
  279. package/docs/settings.md +11 -3
  280. package/docs/skills.md +4 -3
  281. package/docs/terminal-setup.md +11 -9
  282. package/docs/usage.md +6 -2
  283. package/docs/windows.md +24 -2
  284. package/examples/extensions/border-status-editor.ts +1 -1
  285. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  286. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  287. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  288. package/examples/extensions/git-checkpoint.ts +2 -2
  289. package/examples/extensions/gondolin/package-lock.json +2 -2
  290. package/examples/extensions/gondolin/package.json +1 -1
  291. package/examples/extensions/notify.ts +3 -1
  292. package/examples/extensions/sandbox/package-lock.json +2 -2
  293. package/examples/extensions/sandbox/package.json +1 -1
  294. package/examples/extensions/subagent/README.md +1 -1
  295. package/examples/extensions/subagent/index.ts +6 -1
  296. package/examples/extensions/titlebar-spinner.ts +1 -1
  297. package/examples/extensions/with-deps/package-lock.json +2 -2
  298. package/examples/extensions/with-deps/package.json +1 -1
  299. package/examples/rpc-extension-ui.ts +1 -1
  300. package/examples/sdk/06-extensions.ts +1 -1
  301. package/examples/sdk/README.md +1 -1
  302. package/package.json +12 -14
@@ -24,7 +24,7 @@ import { normalizeToolResultImages } from "../utils/tool-result-images.js";
24
24
  import { formatNoApiKeyFoundMessage, formatNoModelSelectedMessage } from "./auth-guidance.js";
25
25
  import { executeBashWithOperations } from "./bash-executor.js";
26
26
  import { calculateContextTokens, collectEntriesForBranchSummary, compact, estimateContextTokens, estimateTokens, generateBranchSummary, prepareCompaction, shouldCompact, } from "./compaction/index.js";
27
- import { DEFAULT_THINKING_LEVEL } from "./defaults.js";
27
+ import { DEFAULT_THINKING_LEVEL, THINKING_LEVEL_OPTIONS } from "./defaults.js";
28
28
  import { exportSessionToHtml } from "./export-html/index.js";
29
29
  import { createToolHtmlRenderer } from "./export-html/tool-renderer.js";
30
30
  import { ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
@@ -72,8 +72,6 @@ function estimateMessagesTokens(messages) {
72
72
  // ============================================================================
73
73
  // Constants
74
74
  // ============================================================================
75
- /** Standard thinking levels */
76
- const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high"];
77
75
  const INTRA_TURN_COMPACTION_MARKER_TYPE = "pi:intra-turn-compaction";
78
76
  const INTRA_TURN_COMPACTION_MARKER_TEXT = "Continue from the compaction summary above. The previous tool loop was compacted before the next provider request; use the summary's Operational State, file lists, failures, last command, and next steps.";
79
77
  const VALIDATION_HINT_MESSAGE_TYPE = "pi:validation-hint";
@@ -1503,10 +1501,11 @@ export class AgentSession {
1503
1501
  }
1504
1502
  /**
1505
1503
  * Set model directly.
1506
- * Validates that auth is configured, saves to session and settings.
1504
+ * Validates that auth is configured and saves to the session transcript.
1505
+ * Persists to global defaults only when options.persist is true.
1507
1506
  * @throws Error if no auth is configured for the model
1508
1507
  */
1509
- async setModel(model) {
1508
+ async setModel(model, options = {}) {
1510
1509
  if (!(await this._modelRuntime.checkAuth(model.provider))) {
1511
1510
  throw new Error(`No API key for ${model.provider}/${model.id}`);
1512
1511
  }
@@ -1514,11 +1513,15 @@ export class AgentSession {
1514
1513
  await this.abort();
1515
1514
  }
1516
1515
  const previousModel = this.model;
1517
- const thinkingLevel = this._getThinkingLevelForModelSwitch();
1516
+ const thinkingLevel = this._getThinkingLevelForModelSwitch(model);
1518
1517
  this.agent.state.model = model;
1519
1518
  this.sessionManager.appendModelChange(model.provider, model.id);
1520
- this.settingsManager.setDefaultModelAndProvider(model.provider, model.id);
1521
- // Re-clamp thinking level for new model's capabilities
1519
+ if (options.persist) {
1520
+ this.settingsManager.setDefaultModelAndProvider(model.provider, model.id);
1521
+ }
1522
+ // Apply thinking level for the new model.
1523
+ // Per-model thinking level overrides take priority over the global default.
1524
+ // Model persistence does not implicitly rewrite the global thinking default.
1522
1525
  this.setThinkingLevel(thinkingLevel);
1523
1526
  await this._emitModelSelect(model, previousModel, "set");
1524
1527
  }
@@ -1528,13 +1531,13 @@ export class AgentSession {
1528
1531
  * @param direction - "forward" (default) or "backward"
1529
1532
  * @returns The new model info, or undefined if only one model available
1530
1533
  */
1531
- async cycleModel(direction = "forward") {
1534
+ async cycleModel(direction = "forward", options = {}) {
1532
1535
  if (this._scopedModels.length > 0) {
1533
- return this._cycleScopedModel(direction);
1536
+ return this._cycleScopedModel(direction, options);
1534
1537
  }
1535
- return this._cycleAvailableModel(direction);
1538
+ return this._cycleAvailableModel(direction, options);
1536
1539
  }
1537
- async _cycleScopedModel(direction) {
1540
+ async _cycleScopedModel(direction, options) {
1538
1541
  const availableIds = new Set(this._modelRuntime.getAvailableSnapshot().map((model) => `${model.provider}\0${model.id}`));
1539
1542
  const scopedModels = this._scopedModels.filter((scoped) => availableIds.has(`${scoped.model.provider}\0${scoped.model.id}`));
1540
1543
  if (scopedModels.length <= 1)
@@ -1546,20 +1549,23 @@ export class AgentSession {
1546
1549
  const len = scopedModels.length;
1547
1550
  const nextIndex = direction === "forward" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;
1548
1551
  const next = scopedModels[nextIndex];
1549
- const thinkingLevel = this._getThinkingLevelForModelSwitch(next.thinkingLevel);
1552
+ const thinkingLevel = this._getThinkingLevelForModelSwitch(next.model, next.thinkingLevel);
1550
1553
  // Apply model
1551
1554
  this.agent.state.model = next.model;
1552
1555
  this.sessionManager.appendModelChange(next.model.provider, next.model.id);
1553
- this.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);
1554
- // Apply thinking level.
1555
- // - Explicit scoped model thinking level overrides current session level
1556
- // - Undefined scoped model thinking level inherits the current session preference
1556
+ if (options.persist) {
1557
+ this.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);
1558
+ }
1559
+ // Apply thinking level for the new model.
1560
+ // - Explicit scoped model thinking level overrides defaults
1561
+ // - Per-model thinking level overrides take priority over the global default
1557
1562
  // setThinkingLevel clamps to model capabilities.
1563
+ // Model persistence does not implicitly rewrite the global thinking default.
1558
1564
  this.setThinkingLevel(thinkingLevel);
1559
1565
  await this._emitModelSelect(next.model, currentModel, "cycle");
1560
1566
  return { model: next.model, thinkingLevel: this.thinkingLevel, isScoped: true };
1561
1567
  }
1562
- async _cycleAvailableModel(direction) {
1568
+ async _cycleAvailableModel(direction, options) {
1563
1569
  const availableModels = this._modelRuntime.getAvailableSnapshot();
1564
1570
  if (availableModels.length <= 1)
1565
1571
  return undefined;
@@ -1570,11 +1576,14 @@ export class AgentSession {
1570
1576
  const len = availableModels.length;
1571
1577
  const nextIndex = direction === "forward" ? (currentIndex + 1) % len : (currentIndex - 1 + len) % len;
1572
1578
  const nextModel = availableModels[nextIndex];
1573
- const thinkingLevel = this._getThinkingLevelForModelSwitch();
1579
+ const thinkingLevel = this._getThinkingLevelForModelSwitch(nextModel);
1574
1580
  this.agent.state.model = nextModel;
1575
1581
  this.sessionManager.appendModelChange(nextModel.provider, nextModel.id);
1576
- this.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);
1577
- // Re-clamp thinking level for new model's capabilities
1582
+ if (options.persist) {
1583
+ this.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);
1584
+ }
1585
+ // Apply thinking level for the new model.
1586
+ // Model persistence does not implicitly rewrite the global thinking default.
1578
1587
  this.setThinkingLevel(thinkingLevel);
1579
1588
  await this._emitModelSelect(nextModel, currentModel, "cycle");
1580
1589
  return { model: nextModel, thinkingLevel: this.thinkingLevel, isScoped: false };
@@ -1585,20 +1594,21 @@ export class AgentSession {
1585
1594
  /**
1586
1595
  * Set thinking level.
1587
1596
  * Clamps to model capabilities based on available thinking levels.
1588
- * Saves to session and settings only if the level actually changes.
1597
+ * Saves the clamped level to the session transcript only if the level actually changes.
1598
+ * Persists the requested level to global defaults only when options.persist is true.
1589
1599
  */
1590
- setThinkingLevel(level) {
1600
+ setThinkingLevel(level, options = {}) {
1591
1601
  const availableLevels = this.getAvailableThinkingLevels();
1592
1602
  const effectiveLevel = availableLevels.includes(level) ? level : this._clampThinkingLevel(level, availableLevels);
1593
1603
  // Only persist if actually changing
1594
1604
  const previousLevel = this.agent.state.thinkingLevel;
1595
1605
  const isChanging = effectiveLevel !== previousLevel;
1596
1606
  this.agent.state.thinkingLevel = effectiveLevel;
1607
+ if (options.persist) {
1608
+ this.settingsManager.setDefaultThinkingLevel(level);
1609
+ }
1597
1610
  if (isChanging) {
1598
1611
  this.sessionManager.appendThinkingLevelChange(effectiveLevel);
1599
- if (this.supportsThinking() || effectiveLevel !== "off") {
1600
- this.settingsManager.setDefaultThinkingLevel(effectiveLevel);
1601
- }
1602
1612
  this._emit({ type: "thinking_level_changed", level: effectiveLevel });
1603
1613
  void this._extensionRunner.emit({
1604
1614
  type: "thinking_level_select",
@@ -1611,14 +1621,14 @@ export class AgentSession {
1611
1621
  * Cycle to next thinking level.
1612
1622
  * @returns New level, or undefined if model doesn't support thinking
1613
1623
  */
1614
- cycleThinkingLevel() {
1624
+ cycleThinkingLevel(options = {}) {
1615
1625
  if (!this.supportsThinking())
1616
1626
  return undefined;
1617
1627
  const levels = this.getAvailableThinkingLevels();
1618
1628
  const currentIndex = levels.indexOf(this.thinkingLevel);
1619
1629
  const nextIndex = (currentIndex + 1) % levels.length;
1620
1630
  const nextLevel = levels[nextIndex];
1621
- this.setThinkingLevel(nextLevel);
1631
+ this.setThinkingLevel(nextLevel, options);
1622
1632
  return nextLevel;
1623
1633
  }
1624
1634
  /**
@@ -1627,7 +1637,7 @@ export class AgentSession {
1627
1637
  */
1628
1638
  getAvailableThinkingLevels() {
1629
1639
  if (!this.model)
1630
- return THINKING_LEVELS;
1640
+ return [...THINKING_LEVEL_OPTIONS];
1631
1641
  return getSupportedThinkingLevels(this.model);
1632
1642
  }
1633
1643
  /**
@@ -1636,14 +1646,17 @@ export class AgentSession {
1636
1646
  supportsThinking() {
1637
1647
  return !!this.model?.reasoning;
1638
1648
  }
1639
- _getThinkingLevelForModelSwitch(explicitLevel) {
1649
+ _getThinkingLevelForModelSwitch(targetModel, explicitLevel) {
1640
1650
  if (explicitLevel !== undefined) {
1641
1651
  return explicitLevel;
1642
1652
  }
1643
- if (!this.supportsThinking()) {
1644
- return this.settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;
1653
+ if (targetModel) {
1654
+ const perModel = this.settingsManager.getModelThinkingLevel(targetModel.provider, targetModel.id);
1655
+ if (perModel !== undefined) {
1656
+ return perModel;
1657
+ }
1645
1658
  }
1646
- return this.thinkingLevel;
1659
+ return this.settingsManager.getDefaultThinkingLevel() ?? this.thinkingLevel ?? DEFAULT_THINKING_LEVEL;
1647
1660
  }
1648
1661
  _clampThinkingLevel(level, _availableLevels) {
1649
1662
  return this.model ? clampThinkingLevel(this.model, level) : "off";
@@ -2537,11 +2550,9 @@ export class AgentSession {
2537
2550
  // =========================================================================
2538
2551
  // Auto-Retry
2539
2552
  // =========================================================================
2540
- _isNonRetryableProviderLimitError(errorMessage) {
2541
- return /GoUsageLimitError|FreeUsageLimitError|Monthly usage limit reached|available balance|insufficient.?balance|balance.?insufficient|insufficient_quota|out of budget|quota exceeded|billing|payment required|402/i.test(errorMessage);
2542
- }
2543
2553
  /**
2544
- * Check if an error is retryable (overloaded, rate limit, server errors).
2554
+ * Check if an error is retryable. Provider error text is retryable by default,
2555
+ * except usage/quota/balance limits and session or context failures.
2545
2556
  * Context overflow errors are NOT retryable (handled by compaction instead).
2546
2557
  */
2547
2558
  _isRetryableError(message) {
@@ -2553,8 +2564,6 @@ export class AgentSession {
2553
2564
  const piServerPhase = getPiServerFailurePhase(message);
2554
2565
  if (piServerPhase && piServerPhase !== "provider_stream")
2555
2566
  return false;
2556
- if (message.errorMessage && this._isNonRetryableProviderLimitError(message.errorMessage))
2557
- return false;
2558
2567
  return isRetryableAssistantError(message);
2559
2568
  }
2560
2569
  /**