@qduc/term2 0.31.0 → 0.32.0

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 (455) hide show
  1. package/README.md +52 -370
  2. package/dist/acp-v2/serve.d.ts.map +1 -1
  3. package/dist/acp-v2/serve.js +6 -6
  4. package/dist/acp-v2/serve.js.map +1 -1
  5. package/dist/agent.d.ts +2 -1
  6. package/dist/agent.d.ts.map +1 -1
  7. package/dist/agent.js +14 -7
  8. package/dist/agent.js.map +1 -1
  9. package/dist/app.d.ts +3 -1
  10. package/dist/app.d.ts.map +1 -1
  11. package/dist/app.js +66 -21
  12. package/dist/app.js.map +1 -1
  13. package/dist/build-info.json +2 -2
  14. package/dist/cli.js +30 -24
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/goal-command.d.ts.map +1 -1
  17. package/dist/commands/goal-command.js +9 -8
  18. package/dist/commands/goal-command.js.map +1 -1
  19. package/dist/commands/model-command.d.ts.map +1 -1
  20. package/dist/commands/model-command.js +4 -8
  21. package/dist/commands/model-command.js.map +1 -1
  22. package/dist/commands/retry-failed-turn-command.d.ts.map +1 -1
  23. package/dist/commands/retry-failed-turn-command.js +3 -4
  24. package/dist/commands/retry-failed-turn-command.js.map +1 -1
  25. package/dist/components/InputBox.js +4 -6
  26. package/dist/components/InputBox.js.map +1 -1
  27. package/dist/components/input/ModelMenuSession.d.ts.map +1 -1
  28. package/dist/components/input/ModelMenuSession.js +7 -12
  29. package/dist/components/input/ModelMenuSession.js.map +1 -1
  30. package/dist/components/input/SettingsMenuSession.d.ts.map +1 -1
  31. package/dist/components/input/SettingsMenuSession.js +0 -2
  32. package/dist/components/input/SettingsMenuSession.js.map +1 -1
  33. package/dist/components/input/SubagentPoolMenuSession.d.ts.map +1 -1
  34. package/dist/components/input/SubagentPoolMenuSession.js +0 -2
  35. package/dist/components/input/SubagentPoolMenuSession.js.map +1 -1
  36. package/dist/components/input/menu-types.d.ts +0 -2
  37. package/dist/components/input/menu-types.d.ts.map +1 -1
  38. package/dist/components/input/triggers.d.ts.map +1 -1
  39. package/dist/components/input/triggers.js +0 -2
  40. package/dist/components/input/triggers.js.map +1 -1
  41. package/dist/components/layout/Banner.js +4 -4
  42. package/dist/components/layout/Banner.js.map +1 -1
  43. package/dist/components/layout/BottomArea.d.ts.map +1 -1
  44. package/dist/components/layout/BottomArea.js +13 -11
  45. package/dist/components/layout/BottomArea.js.map +1 -1
  46. package/dist/components/layout/StatusBar.js +4 -4
  47. package/dist/components/layout/StatusBar.js.map +1 -1
  48. package/dist/components/menu/settings-value-formatter.d.ts.map +1 -1
  49. package/dist/components/menu/settings-value-formatter.js +2 -12
  50. package/dist/components/menu/settings-value-formatter.js.map +1 -1
  51. package/dist/components/message/MessageList.d.ts +3 -1
  52. package/dist/components/message/MessageList.d.ts.map +1 -1
  53. package/dist/components/message/MessageList.js +5 -2
  54. package/dist/components/message/MessageList.js.map +1 -1
  55. package/dist/components/message/SessionBoundary.d.ts +11 -0
  56. package/dist/components/message/SessionBoundary.d.ts.map +1 -0
  57. package/dist/components/message/SessionBoundary.js +22 -0
  58. package/dist/components/message/SessionBoundary.js.map +1 -0
  59. package/dist/contracts/provider-input.d.ts +10 -0
  60. package/dist/contracts/provider-input.d.ts.map +1 -1
  61. package/dist/contracts/provider-input.js.map +1 -1
  62. package/dist/contracts/run-termination.d.ts +3 -1
  63. package/dist/contracts/run-termination.d.ts.map +1 -1
  64. package/dist/gateway/gateway.d.ts.map +1 -1
  65. package/dist/gateway/gateway.js +20 -10
  66. package/dist/gateway/gateway.js.map +1 -1
  67. package/dist/gateway/launcher-seam.js +2 -2
  68. package/dist/gateway/launcher-seam.js.map +1 -1
  69. package/dist/gateway/runtime-factory.d.ts.map +1 -1
  70. package/dist/gateway/runtime-factory.js +2 -3
  71. package/dist/gateway/runtime-factory.js.map +1 -1
  72. package/dist/gateway/settings-rpc.d.ts +5 -2
  73. package/dist/gateway/settings-rpc.d.ts.map +1 -1
  74. package/dist/gateway/settings-rpc.js +6 -4
  75. package/dist/gateway/settings-rpc.js.map +1 -1
  76. package/dist/hooks/settings-completion-config.d.ts +0 -2
  77. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  78. package/dist/hooks/settings-completion-config.js +3 -23
  79. package/dist/hooks/settings-completion-config.js.map +1 -1
  80. package/dist/hooks/use-app-commands.d.ts +1 -1
  81. package/dist/hooks/use-app-commands.d.ts.map +1 -1
  82. package/dist/hooks/use-conversation-settings.d.ts +3 -2
  83. package/dist/hooks/use-conversation-settings.d.ts.map +1 -1
  84. package/dist/hooks/use-conversation-settings.js +4 -4
  85. package/dist/hooks/use-conversation-settings.js.map +1 -1
  86. package/dist/hooks/use-conversation.d.ts +1 -1
  87. package/dist/hooks/use-conversation.js +3 -3
  88. package/dist/hooks/use-conversation.js.map +1 -1
  89. package/dist/hooks/use-first-run-setup.d.ts +1 -2
  90. package/dist/hooks/use-first-run-setup.d.ts.map +1 -1
  91. package/dist/hooks/use-first-run-setup.js +7 -17
  92. package/dist/hooks/use-first-run-setup.js.map +1 -1
  93. package/dist/hooks/use-grok-credit-usage.js +1 -1
  94. package/dist/hooks/use-grok-credit-usage.js.map +1 -1
  95. package/dist/hooks/use-handoff-flow.d.ts +1 -1
  96. package/dist/hooks/use-handoff-flow.d.ts.map +1 -1
  97. package/dist/hooks/use-handoff-flow.js +3 -3
  98. package/dist/hooks/use-handoff-flow.js.map +1 -1
  99. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  100. package/dist/hooks/use-model-selection.js +6 -8
  101. package/dist/hooks/use-model-selection.js.map +1 -1
  102. package/dist/hooks/use-opencode-go-usage.js +1 -1
  103. package/dist/hooks/use-opencode-go-usage.js.map +1 -1
  104. package/dist/hooks/use-runtime-settings.d.ts +2 -2
  105. package/dist/hooks/use-runtime-settings.d.ts.map +1 -1
  106. package/dist/hooks/use-runtime-settings.js +3 -3
  107. package/dist/hooks/use-runtime-settings.js.map +1 -1
  108. package/dist/hooks/use-standalone-model-picker.d.ts.map +1 -1
  109. package/dist/hooks/use-standalone-model-picker.js +7 -6
  110. package/dist/hooks/use-standalone-model-picker.js.map +1 -1
  111. package/dist/hooks/use-subagent-pool-selection.d.ts +9 -16
  112. package/dist/hooks/use-subagent-pool-selection.d.ts.map +1 -1
  113. package/dist/hooks/use-subagent-pool-selection.js +15 -33
  114. package/dist/hooks/use-subagent-pool-selection.js.map +1 -1
  115. package/dist/lib/agent-chat-service.d.ts +6 -0
  116. package/dist/lib/agent-chat-service.d.ts.map +1 -1
  117. package/dist/lib/agent-chat-service.js +27 -3
  118. package/dist/lib/agent-chat-service.js.map +1 -1
  119. package/dist/lib/agent-client.d.ts +10 -5
  120. package/dist/lib/agent-client.d.ts.map +1 -1
  121. package/dist/lib/agent-client.js +86 -34
  122. package/dist/lib/agent-client.js.map +1 -1
  123. package/dist/lib/agent-configuration.d.ts +5 -4
  124. package/dist/lib/agent-configuration.d.ts.map +1 -1
  125. package/dist/lib/agent-configuration.js +24 -33
  126. package/dist/lib/agent-configuration.js.map +1 -1
  127. package/dist/lib/agent-factory.d.ts +4 -3
  128. package/dist/lib/agent-factory.d.ts.map +1 -1
  129. package/dist/lib/agent-factory.js +21 -7
  130. package/dist/lib/agent-factory.js.map +1 -1
  131. package/dist/non-interactive.d.ts +5 -0
  132. package/dist/non-interactive.d.ts.map +1 -1
  133. package/dist/non-interactive.js +67 -10
  134. package/dist/non-interactive.js.map +1 -1
  135. package/dist/prompts/durable-goal-context.d.ts.map +1 -1
  136. package/dist/prompts/durable-goal-context.js +12 -2
  137. package/dist/prompts/durable-goal-context.js.map +1 -1
  138. package/dist/prompts/durable-goal-context.test.ts +11 -0
  139. package/dist/prompts/durable-goal-context.ts +13 -2
  140. package/dist/providers/ai-sdk-openrouter.provider.js +3 -2
  141. package/dist/providers/ai-sdk-openrouter.provider.js.map +1 -1
  142. package/dist/providers/ai-sdk-streamed-model.d.ts.map +1 -1
  143. package/dist/providers/ai-sdk-streamed-model.js +12 -2
  144. package/dist/providers/ai-sdk-streamed-model.js.map +1 -1
  145. package/dist/providers/codex-responses-model.d.ts.map +1 -1
  146. package/dist/providers/codex-responses-model.js +35 -16
  147. package/dist/providers/codex-responses-model.js.map +1 -1
  148. package/dist/providers/codex.provider.js +1 -1
  149. package/dist/providers/codex.provider.js.map +1 -1
  150. package/dist/providers/grok.provider.js +1 -1
  151. package/dist/providers/grok.provider.js.map +1 -1
  152. package/dist/providers/openai-chat-completions-model.d.ts.map +1 -1
  153. package/dist/providers/openai-chat-completions-model.js +11 -3
  154. package/dist/providers/openai-chat-completions-model.js.map +1 -1
  155. package/dist/providers/openai-compatible-lazy.js +1 -1
  156. package/dist/providers/openai-compatible-lazy.js.map +1 -1
  157. package/dist/providers/openai.provider.js +1 -1
  158. package/dist/providers/openai.provider.js.map +1 -1
  159. package/dist/providers/openrouter.provider.js +1 -1
  160. package/dist/providers/openrouter.provider.js.map +1 -1
  161. package/dist/providers/provider-service.d.ts.map +1 -1
  162. package/dist/providers/provider-service.js +6 -7
  163. package/dist/providers/provider-service.js.map +1 -1
  164. package/dist/scripts/eval-auto-approval/runner.js +2 -3
  165. package/dist/scripts/eval-auto-approval/runner.js.map +1 -1
  166. package/dist/scripts/eval-context-compaction/runner.js +1 -2
  167. package/dist/scripts/eval-context-compaction/runner.js.map +1 -1
  168. package/dist/services/agent-runtime/application-run-loop.d.ts +34 -1
  169. package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
  170. package/dist/services/agent-runtime/application-run-loop.js +174 -33
  171. package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
  172. package/dist/services/agent-runtime/context-compaction/index.d.ts.map +1 -1
  173. package/dist/services/agent-runtime/context-compaction/index.js +65 -16
  174. package/dist/services/agent-runtime/context-compaction/index.js.map +1 -1
  175. package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts +7 -1
  176. package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts.map +1 -1
  177. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js +115 -20
  178. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js.map +1 -1
  179. package/dist/services/agent-runtime/model-context-policy.d.ts +21 -0
  180. package/dist/services/agent-runtime/model-context-policy.d.ts.map +1 -0
  181. package/dist/services/agent-runtime/model-context-policy.js +46 -0
  182. package/dist/services/agent-runtime/model-context-policy.js.map +1 -0
  183. package/dist/services/agent-runtime/model-resolver.d.ts +4 -13
  184. package/dist/services/agent-runtime/model-resolver.d.ts.map +1 -1
  185. package/dist/services/agent-runtime/model-resolver.js +9 -39
  186. package/dist/services/agent-runtime/model-resolver.js.map +1 -1
  187. package/dist/services/agent-runtime/request-input-limit.d.ts +31 -0
  188. package/dist/services/agent-runtime/request-input-limit.d.ts.map +1 -0
  189. package/dist/services/agent-runtime/request-input-limit.js +86 -0
  190. package/dist/services/agent-runtime/request-input-limit.js.map +1 -0
  191. package/dist/services/agent-runtime/run-budget.d.ts +3 -5
  192. package/dist/services/agent-runtime/run-budget.d.ts.map +1 -1
  193. package/dist/services/agent-runtime/run-budget.js.map +1 -1
  194. package/dist/services/agent-runtime/tool-call-execution.d.ts +24 -2
  195. package/dist/services/agent-runtime/tool-call-execution.d.ts.map +1 -1
  196. package/dist/services/agent-runtime/tool-call-execution.js +36 -6
  197. package/dist/services/agent-runtime/tool-call-execution.js.map +1 -1
  198. package/dist/services/agent-runtime/tool-invocation-context.d.ts +24 -12
  199. package/dist/services/agent-runtime/tool-invocation-context.d.ts.map +1 -1
  200. package/dist/services/agent-runtime/tool-invocation-context.js +38 -27
  201. package/dist/services/agent-runtime/tool-invocation-context.js.map +1 -1
  202. package/dist/services/approval/approval-replay.d.ts +15 -24
  203. package/dist/services/approval/approval-replay.d.ts.map +1 -1
  204. package/dist/services/approval/approval-replay.js +12 -30
  205. package/dist/services/approval/approval-replay.js.map +1 -1
  206. package/dist/services/approval/non-interactive-approval-policy.d.ts.map +1 -1
  207. package/dist/services/approval/non-interactive-approval-policy.js +11 -0
  208. package/dist/services/approval/non-interactive-approval-policy.js.map +1 -1
  209. package/dist/services/approval/tool-approval-batch-coordinator.d.ts.map +1 -1
  210. package/dist/services/approval/tool-approval-batch-coordinator.js +0 -5
  211. package/dist/services/approval/tool-approval-batch-coordinator.js.map +1 -1
  212. package/dist/services/control-socket/control-session-port.js +6 -6
  213. package/dist/services/control-socket/control-session-port.js.map +1 -1
  214. package/dist/services/conversation/conversation-checkpoint-provenance.d.ts.map +1 -1
  215. package/dist/services/conversation/conversation-checkpoint-provenance.js +10 -2
  216. package/dist/services/conversation/conversation-checkpoint-provenance.js.map +1 -1
  217. package/dist/services/conversation/conversation-events.d.ts +2 -0
  218. package/dist/services/conversation/conversation-events.d.ts.map +1 -1
  219. package/dist/services/conversation/conversation-events.js.map +1 -1
  220. package/dist/services/conversation/conversation-orchestrator.d.ts +1 -1
  221. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  222. package/dist/services/conversation/conversation-orchestrator.js +14 -2
  223. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  224. package/dist/services/conversation/conversation-replay.d.ts.map +1 -1
  225. package/dist/services/conversation/conversation-replay.js +87 -3
  226. package/dist/services/conversation/conversation-replay.js.map +1 -1
  227. package/dist/services/conversation/conversation-service.d.ts +4 -5
  228. package/dist/services/conversation/conversation-service.d.ts.map +1 -1
  229. package/dist/services/conversation/conversation-service.js +9 -11
  230. package/dist/services/conversation/conversation-service.js.map +1 -1
  231. package/dist/services/conversation/conversation-state-projector.d.ts +1 -0
  232. package/dist/services/conversation/conversation-state-projector.d.ts.map +1 -1
  233. package/dist/services/conversation/conversation-state-projector.js +5 -1
  234. package/dist/services/conversation/conversation-state-projector.js.map +1 -1
  235. package/dist/services/conversation/durable-goal-stop-check.d.ts +141 -0
  236. package/dist/services/conversation/durable-goal-stop-check.d.ts.map +1 -0
  237. package/dist/services/conversation/durable-goal-stop-check.js +351 -0
  238. package/dist/services/conversation/durable-goal-stop-check.js.map +1 -0
  239. package/dist/services/conversation/durable-goal.d.ts +16 -1
  240. package/dist/services/conversation/durable-goal.d.ts.map +1 -1
  241. package/dist/services/conversation/durable-goal.js +8 -0
  242. package/dist/services/conversation/durable-goal.js.map +1 -1
  243. package/dist/services/conversation/local-checkpoint-projection.d.ts.map +1 -1
  244. package/dist/services/conversation/local-checkpoint-projection.js +12 -1
  245. package/dist/services/conversation/local-checkpoint-projection.js.map +1 -1
  246. package/dist/services/conversation/session-browser.d.ts +2 -0
  247. package/dist/services/conversation/session-browser.d.ts.map +1 -1
  248. package/dist/services/conversation/session-browser.js +23 -8
  249. package/dist/services/conversation/session-browser.js.map +1 -1
  250. package/dist/services/conversation/session-index/session-index-worker-client.d.ts +3 -0
  251. package/dist/services/conversation/session-index/session-index-worker-client.d.ts.map +1 -1
  252. package/dist/services/conversation/session-index/session-index-worker-client.js +6 -1
  253. package/dist/services/conversation/session-index/session-index-worker-client.js.map +1 -1
  254. package/dist/services/conversation/session-index/session-index-worker.d.ts +16 -1
  255. package/dist/services/conversation/session-index/session-index-worker.d.ts.map +1 -1
  256. package/dist/services/conversation/session-index/session-index-worker.js +16 -0
  257. package/dist/services/conversation/session-index/session-index-worker.js.map +1 -1
  258. package/dist/services/conversation-agent-client.d.ts +3 -1
  259. package/dist/services/conversation-agent-client.d.ts.map +1 -1
  260. package/dist/services/handoff/handoff-session.d.ts +1 -1
  261. package/dist/services/handoff/handoff-session.d.ts.map +1 -1
  262. package/dist/services/handoff/handoff-session.js +10 -12
  263. package/dist/services/handoff/handoff-session.js.map +1 -1
  264. package/dist/services/logging/conversation-log-events.d.ts +7 -0
  265. package/dist/services/logging/conversation-log-events.d.ts.map +1 -1
  266. package/dist/services/logging/conversation-log-events.js +1 -2
  267. package/dist/services/logging/conversation-log-events.js.map +1 -1
  268. package/dist/services/model-service.js +1 -1
  269. package/dist/services/model-service.js.map +1 -1
  270. package/dist/services/models/model-resolution.d.ts +2 -2
  271. package/dist/services/models/model-resolution.d.ts.map +1 -1
  272. package/dist/services/models/model-resolution.js +8 -2
  273. package/dist/services/models/model-resolution.js.map +1 -1
  274. package/dist/services/retry/retry-classifier.d.ts.map +1 -1
  275. package/dist/services/retry/retry-classifier.js +2 -1
  276. package/dist/services/retry/retry-classifier.js.map +1 -1
  277. package/dist/services/retry/retry-error-classification.d.ts.map +1 -1
  278. package/dist/services/retry/retry-error-classification.js +1 -0
  279. package/dist/services/retry/retry-error-classification.js.map +1 -1
  280. package/dist/services/runtime-setting-router.d.ts +2 -2
  281. package/dist/services/runtime-setting-router.d.ts.map +1 -1
  282. package/dist/services/runtime-setting-router.js +8 -17
  283. package/dist/services/runtime-setting-router.js.map +1 -1
  284. package/dist/services/service-interfaces.d.ts +2 -0
  285. package/dist/services/service-interfaces.d.ts.map +1 -1
  286. package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -1
  287. package/dist/services/session/initial-turn-recovery-handler.js +6 -0
  288. package/dist/services/session/initial-turn-recovery-handler.js.map +1 -1
  289. package/dist/services/session/session-client-factory.js +1 -1
  290. package/dist/services/session/session-client-factory.js.map +1 -1
  291. package/dist/services/session/session-composition.d.ts.map +1 -1
  292. package/dist/services/session/session-composition.js +11 -9
  293. package/dist/services/session/session-composition.js.map +1 -1
  294. package/dist/services/session/session-input-planner.js +2 -2
  295. package/dist/services/session/session-input-planner.js.map +1 -1
  296. package/dist/services/session/session-manager.d.ts +2 -0
  297. package/dist/services/session/session-manager.d.ts.map +1 -1
  298. package/dist/services/session/session-manager.js +14 -2
  299. package/dist/services/session/session-manager.js.map +1 -1
  300. package/dist/services/session/session-runtime-controller.d.ts +2 -4
  301. package/dist/services/session/session-runtime-controller.d.ts.map +1 -1
  302. package/dist/services/session/session-runtime-controller.js +2 -14
  303. package/dist/services/session/session-runtime-controller.js.map +1 -1
  304. package/dist/services/session/session-tool-tracker.d.ts +1 -0
  305. package/dist/services/session/session-tool-tracker.d.ts.map +1 -1
  306. package/dist/services/session/session-tool-tracker.js +8 -0
  307. package/dist/services/session/session-tool-tracker.js.map +1 -1
  308. package/dist/services/session/terminal-result-collector.d.ts.map +1 -1
  309. package/dist/services/session/terminal-result-collector.js +3 -0
  310. package/dist/services/session/terminal-result-collector.js.map +1 -1
  311. package/dist/services/session/test-helpers/conversation-session-fixtures.d.ts.map +1 -1
  312. package/dist/services/session/test-helpers/conversation-session-fixtures.js +5 -2
  313. package/dist/services/session/test-helpers/conversation-session-fixtures.js.map +1 -1
  314. package/dist/services/session/turn-workflow.d.ts.map +1 -1
  315. package/dist/services/session/turn-workflow.js +3 -0
  316. package/dist/services/session/turn-workflow.js.map +1 -1
  317. package/dist/services/settings/ancillary-settings-migration.d.ts +1 -1
  318. package/dist/services/settings/ancillary-settings-migration.d.ts.map +1 -1
  319. package/dist/services/settings/ancillary-settings-migration.js +4 -37
  320. package/dist/services/settings/ancillary-settings-migration.js.map +1 -1
  321. package/dist/services/settings/model-selection.d.ts +7 -0
  322. package/dist/services/settings/model-selection.d.ts.map +1 -0
  323. package/dist/services/settings/model-selection.js +6 -0
  324. package/dist/services/settings/model-selection.js.map +1 -0
  325. package/dist/services/settings/persisted-selection-migration.d.ts +9 -0
  326. package/dist/services/settings/persisted-selection-migration.d.ts.map +1 -0
  327. package/dist/services/settings/persisted-selection-migration.js +109 -0
  328. package/dist/services/settings/persisted-selection-migration.js.map +1 -0
  329. package/dist/services/settings/setting-schema-utils.d.ts.map +1 -1
  330. package/dist/services/settings/setting-schema-utils.js +5 -2
  331. package/dist/services/settings/setting-schema-utils.js.map +1 -1
  332. package/dist/services/settings/settings-env.d.ts.map +1 -1
  333. package/dist/services/settings/settings-env.js +6 -2
  334. package/dist/services/settings/settings-env.js.map +1 -1
  335. package/dist/services/settings/settings-merger.d.ts.map +1 -1
  336. package/dist/services/settings/settings-merger.js +12 -5
  337. package/dist/services/settings/settings-merger.js.map +1 -1
  338. package/dist/services/settings/settings-persistence.d.ts +3 -1
  339. package/dist/services/settings/settings-persistence.d.ts.map +1 -1
  340. package/dist/services/settings/settings-persistence.js +24 -6
  341. package/dist/services/settings/settings-persistence.js.map +1 -1
  342. package/dist/services/settings/settings-schema.d.ts +69 -119
  343. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  344. package/dist/services/settings/settings-schema.js +71 -183
  345. package/dist/services/settings/settings-schema.js.map +1 -1
  346. package/dist/services/settings/settings-service.d.ts +5 -1
  347. package/dist/services/settings/settings-service.d.ts.map +1 -1
  348. package/dist/services/settings/settings-service.js +105 -41
  349. package/dist/services/settings/settings-service.js.map +1 -1
  350. package/dist/services/settings/settings-service.mock.js +2 -2
  351. package/dist/services/settings/settings-service.mock.js.map +1 -1
  352. package/dist/services/settings/settings-sources.d.ts +2 -20
  353. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  354. package/dist/services/settings/settings-sources.js +2 -20
  355. package/dist/services/settings/settings-sources.js.map +1 -1
  356. package/dist/services/settings/settings-ui-metadata.d.ts.map +1 -1
  357. package/dist/services/settings/settings-ui-metadata.js +5 -25
  358. package/dist/services/settings/settings-ui-metadata.js.map +1 -1
  359. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +6 -6
  360. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
  361. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +4 -28
  362. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
  363. package/dist/services/subagents/execution-runner.d.ts.map +1 -1
  364. package/dist/services/subagents/execution-runner.js +16 -3
  365. package/dist/services/subagents/execution-runner.js.map +1 -1
  366. package/dist/services/subagents/mentor-runner.d.ts.map +1 -1
  367. package/dist/services/subagents/mentor-runner.js +10 -6
  368. package/dist/services/subagents/mentor-runner.js.map +1 -1
  369. package/dist/services/subagents/nested-runner.d.ts.map +1 -1
  370. package/dist/services/subagents/nested-runner.js +3 -2
  371. package/dist/services/subagents/nested-runner.js.map +1 -1
  372. package/dist/services/subagents/role-loader.d.ts.map +1 -1
  373. package/dist/services/subagents/role-loader.js +9 -17
  374. package/dist/services/subagents/role-loader.js.map +1 -1
  375. package/dist/services/subagents/subagent-pool-config.d.ts +0 -6
  376. package/dist/services/subagents/subagent-pool-config.d.ts.map +1 -1
  377. package/dist/services/subagents/subagent-pool-config.js +1 -22
  378. package/dist/services/subagents/subagent-pool-config.js.map +1 -1
  379. package/dist/services/subagents/subagent-role-pool-selector.d.ts +1 -2
  380. package/dist/services/subagents/subagent-role-pool-selector.d.ts.map +1 -1
  381. package/dist/services/subagents/subagent-role-pool-selector.js +4 -10
  382. package/dist/services/subagents/subagent-role-pool-selector.js.map +1 -1
  383. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.d.ts.map +1 -1
  384. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js +8 -2
  385. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js.map +1 -1
  386. package/dist/services/tool-execution-ledger.d.ts +22 -0
  387. package/dist/services/tool-execution-ledger.d.ts.map +1 -1
  388. package/dist/services/tool-execution-ledger.js +40 -3
  389. package/dist/services/tool-execution-ledger.js.map +1 -1
  390. package/dist/services/workflow-evolution/cli.d.ts +2 -0
  391. package/dist/services/workflow-evolution/cli.d.ts.map +1 -0
  392. package/dist/services/workflow-evolution/cli.js +26 -0
  393. package/dist/services/workflow-evolution/cli.js.map +1 -0
  394. package/dist/services/workflow-evolution/demo.d.ts +18 -0
  395. package/dist/services/workflow-evolution/demo.d.ts.map +1 -0
  396. package/dist/services/workflow-evolution/demo.js +177 -0
  397. package/dist/services/workflow-evolution/demo.js.map +1 -0
  398. package/dist/services/workflow-evolution/experiment.d.ts +304 -0
  399. package/dist/services/workflow-evolution/experiment.d.ts.map +1 -0
  400. package/dist/services/workflow-evolution/experiment.js +251 -0
  401. package/dist/services/workflow-evolution/experiment.js.map +1 -0
  402. package/dist/services/workflow-evolution/ledger.d.ts +5 -0
  403. package/dist/services/workflow-evolution/ledger.d.ts.map +1 -0
  404. package/dist/services/workflow-evolution/ledger.js +57 -0
  405. package/dist/services/workflow-evolution/ledger.js.map +1 -0
  406. package/dist/skins/rail/status.d.ts.map +1 -1
  407. package/dist/skins/rail/status.js +21 -11
  408. package/dist/skins/rail/status.js.map +1 -1
  409. package/dist/skins/testing/scenes.d.ts.map +1 -1
  410. package/dist/skins/testing/scenes.js +1 -2
  411. package/dist/skins/testing/scenes.js.map +1 -1
  412. package/dist/tools/agent/goal-check.d.ts +23 -0
  413. package/dist/tools/agent/goal-check.d.ts.map +1 -0
  414. package/dist/tools/agent/goal-check.js +79 -0
  415. package/dist/tools/agent/goal-check.js.map +1 -0
  416. package/dist/tools/file/edit-healing.js +1 -1
  417. package/dist/tools/file/edit-healing.js.map +1 -1
  418. package/dist/tools/file/patch-healing.js +1 -1
  419. package/dist/tools/file/patch-healing.js.map +1 -1
  420. package/dist/tools/system/run-code/run-code-execution.d.ts +7 -0
  421. package/dist/tools/system/run-code/run-code-execution.d.ts.map +1 -1
  422. package/dist/tools/system/run-code/run-code-execution.js.map +1 -1
  423. package/dist/tools/system/run-code/run-code-runtime-contract.d.ts +2 -0
  424. package/dist/tools/system/run-code/run-code-runtime-contract.d.ts.map +1 -1
  425. package/dist/tools/system/run-code/run-code-runtime.d.ts +2 -1
  426. package/dist/tools/system/run-code/run-code-runtime.d.ts.map +1 -1
  427. package/dist/tools/system/run-code/run-code-runtime.js +26 -7
  428. package/dist/tools/system/run-code/run-code-runtime.js.map +1 -1
  429. package/dist/tools/system/run-code/run-code.js +15 -8
  430. package/dist/tools/system/run-code/run-code.js.map +1 -1
  431. package/dist/tools/tool-names.d.ts +1 -0
  432. package/dist/tools/tool-names.d.ts.map +1 -1
  433. package/dist/tools/tool-names.js +1 -0
  434. package/dist/tools/tool-names.js.map +1 -1
  435. package/dist/tools/types.d.ts +21 -0
  436. package/dist/tools/types.d.ts.map +1 -1
  437. package/dist/tools/types.js +7 -0
  438. package/dist/tools/types.js.map +1 -1
  439. package/dist/utils/ai/model-settings.d.ts +0 -2
  440. package/dist/utils/ai/model-settings.d.ts.map +1 -1
  441. package/dist/utils/ai/model-settings.js +2 -11
  442. package/dist/utils/ai/model-settings.js.map +1 -1
  443. package/dist/utils/conversation/conversation-event-handler.d.ts.map +1 -1
  444. package/dist/utils/conversation/conversation-event-handler.js +4 -0
  445. package/dist/utils/conversation/conversation-event-handler.js.map +1 -1
  446. package/dist/utils/output/text-snippet.js +25 -33
  447. package/dist/utils/output/text-snippet.js.map +1 -1
  448. package/dist/utils/settings-command.d.ts.map +1 -1
  449. package/dist/utils/settings-command.js +25 -24
  450. package/dist/utils/settings-command.js.map +1 -1
  451. package/dist/utils/value-suggestions.d.ts +0 -2
  452. package/dist/utils/value-suggestions.d.ts.map +1 -1
  453. package/dist/utils/value-suggestions.js +2 -63
  454. package/dist/utils/value-suggestions.js.map +1 -1
  455. package/package.json +1 -1
@@ -1,92 +1,64 @@
1
1
  import { z } from 'zod';
2
2
  import envPaths from 'env-paths';
3
3
  import path from 'node:path';
4
+ import { ModelSelectionSchema } from './model-selection.js';
4
5
  import { THEME_SETTING_VALUES } from '../../theme/resolve-theme.js';
5
6
  import { SKIN_NAMES } from '../../skins/names.js';
6
7
  import { normalizeProviderIdentifier, resolveProviderId, resolveProviderName, } from './custom-provider-normalization.js';
7
- // Shared shape for the fan-out mentor model pool. One entry overrides the
8
- // role's configured model; `provider`/`reasoningEffort` fall back to the
9
- // role's configuration when omitted.
10
- const SubagentPoolEntrySchema = z.object({
11
- model: z.string().min(1),
12
- provider: z.string().min(1).optional(),
8
+ // Saved mentor entries pin the host and model; only reasoning may inherit.
9
+ export const SubagentPoolEntrySchema = ModelSelectionSchema.extend({
13
10
  reasoningEffort: z.enum(['default', 'none', 'minimal', 'low', 'medium', 'high', 'xhigh']).optional(),
14
11
  });
12
+ function rejectRemovedSelectionKeys(keys) {
13
+ return (value, ctx) => {
14
+ if (value && typeof value === 'object') {
15
+ for (const key of keys) {
16
+ if (Object.hasOwn(value, key)) {
17
+ ctx.addIssue({
18
+ code: 'custom',
19
+ path: [key],
20
+ message: 'Removed model/provider setting; use complete bound selections in modelSelection or tier/mentor pools',
21
+ });
22
+ }
23
+ }
24
+ }
25
+ return value;
26
+ };
27
+ }
15
28
  const MAX_SUBAGENT_POOL_ENTRIES = 8;
16
29
  const subagentPoolSchema = (description) => z.array(SubagentPoolEntrySchema).max(MAX_SUBAGENT_POOL_ENTRIES).default([]).describe(description);
17
- // Tier model settings are model pools: a list of model ids round-robined for
18
- // subagent spawns (see SubagentRolePoolSelector) and read first-entry for
19
- // other ancillary consumers. A bare id runs on the tier's provider; an entry
20
- // picked from another provider's catalog pins it as `{model, provider}`. A
21
- // bare string from older configs (or the legacy migration) normalizes to a
22
- // single-entry pool.
23
- export const TierModelPoolEntrySchema = z.union([
24
- z.string().min(1),
25
- z.object({ model: z.string().min(1), provider: z.string().min(1).optional() }),
26
- ]);
27
- const tierModelPoolSchema = (description) => z
28
- .preprocess((value) => {
29
- if (value === undefined || value === null || value === '')
30
- return undefined;
31
- return Array.isArray(value) ? value : [value];
32
- }, z.array(TierModelPoolEntrySchema).max(MAX_SUBAGENT_POOL_ENTRIES).optional())
33
- .describe(description);
34
- // Define schemas for validation
35
- export const AgentSettingsSchema = z.object({
36
- model: z.string().min(1).default('gpt-5.1'),
37
- efficientModel: z
38
- .string()
39
- .min(1)
40
- .optional()
41
- .describe('Model for lower-tier workflow agents. Falls back to agent.model when unset.'),
42
- capableModel: z
43
- .string()
44
- .min(1)
45
- .optional()
46
- .describe('Model for higher-tier workflow agents. Falls back to agent.model when unset.'),
47
- smartModel: tierModelPoolSchema('Models for smart-tier helper agents (the hardest side tasks); subagent spawns round-robin the pool, other consumers use the first entry. Falls back to agent.model when unset.'),
48
- smartProvider: z
49
- .string()
50
- .min(1)
51
- .optional()
52
- .describe('Provider for smart-tier helper agents (the hardest side tasks). Falls back to agent.provider when unset.'),
30
+ export const TierModelPoolEntrySchema = ModelSelectionSchema;
31
+ const tierModelPoolSchema = (description) => z.array(TierModelPoolEntrySchema).max(MAX_SUBAGENT_POOL_ENTRIES).optional().describe(description);
32
+ const AgentSettingsObjectSchema = z.object({
33
+ modelSelection: ModelSelectionSchema.default({ model: 'gpt-5.1', provider: 'openai' }).describe('Bound provider and model selection for the main agent'),
34
+ smartModel: tierModelPoolSchema('Models for smart-tier helper agents (the hardest side tasks); subagent spawns round-robin the pool, other consumers use the first entry. Falls back to agent.modelSelection when unset.'),
53
35
  smartReasoningEffort: z
54
36
  .enum(['default', 'none', 'minimal', 'low', 'medium', 'high', 'xhigh'])
55
37
  .optional()
56
38
  .describe('Reasoning effort for smart-tier helper agents (the hardest side tasks). Falls back to agent.reasoningEffort when unset.'),
57
- balancedModel: tierModelPoolSchema('Models for balanced-tier helper agents (everyday side tasks); subagent spawns round-robin the pool, other consumers use the first entry. Falls back to agent.model when unset.'),
58
- balancedProvider: z
59
- .string()
60
- .min(1)
61
- .optional()
62
- .describe('Provider for balanced-tier helper agents (everyday side tasks). Falls back to agent.provider when unset.'),
39
+ balancedModel: tierModelPoolSchema('Models for balanced-tier helper agents (everyday side tasks); subagent spawns round-robin the pool, other consumers use the first entry. Falls back to agent.modelSelection when unset.'),
63
40
  balancedReasoningEffort: z
64
41
  .enum(['default', 'none', 'minimal', 'low', 'medium', 'high', 'xhigh'])
65
42
  .optional()
66
43
  .describe('Reasoning effort for balanced-tier helper agents (everyday side tasks). Falls back to agent.reasoningEffort when unset.'),
67
- cheapModel: tierModelPoolSchema('Models for cheap-tier helper agents (simple, high-volume side tasks); subagent spawns round-robin the pool, other consumers use the first entry. Falls back to agent.model when unset.'),
68
- cheapProvider: z
69
- .string()
70
- .min(1)
71
- .optional()
72
- .describe('Provider for cheap-tier helper agents (simple, high-volume side tasks). Falls back to agent.provider when unset.'),
44
+ cheapModel: tierModelPoolSchema('Models for cheap-tier helper agents (simple, high-volume side tasks); subagent spawns round-robin the pool, other consumers use the first entry. Falls back to agent.modelSelection when unset.'),
73
45
  cheapReasoningEffort: z
74
46
  .enum(['default', 'none', 'minimal', 'low', 'medium', 'high', 'xhigh'])
75
47
  .optional()
76
48
  .describe('Reasoning effort for cheap-tier helper agents (simple, high-volume side tasks). Falls back to agent.reasoningEffort when unset.'),
77
- choreModel: tierModelPoolSchema('Models for small background jobs like repairing failed file edits and reviewing shell auto-approvals (auto-approval reviews, edit healing). Falls back to agent.model when unset.'),
78
- choreProvider: z
79
- .string()
80
- .min(1)
81
- .optional()
82
- .describe('Provider for small background jobs like repairing failed file edits and reviewing shell auto-approvals. Falls back to agent.provider when unset.'),
83
- // 'default' signals we should *not* explicitly pass a reasoningEffort
84
- // to the API, allowing it to decide what to use.
49
+ choreModel: tierModelPoolSchema('Models for small background jobs like repairing failed file edits and reviewing shell auto-approvals (auto-approval reviews, edit healing). Falls back to agent.modelSelection when unset.'),
85
50
  reasoningEffort: z.enum(['default', 'none', 'minimal', 'low', 'medium', 'high', 'xhigh']).default('default'),
86
51
  // Temperature controls randomness. We keep it optional so providers/models
87
52
  // can use their own defaults when unset.
88
53
  temperature: z.number().min(0).max(2).optional(),
89
54
  maxTurns: z.number().int().positive().default(100),
55
+ maxRequestInputTokens: z
56
+ .number()
57
+ .int()
58
+ .min(1_000)
59
+ .nullable()
60
+ .default(null)
61
+ .describe('Per-request estimated or last-observed input cost/latency ceiling; retains work on refusal (null uses known model capacity)'),
90
62
  maxOutputTokens: z.number().int().positive().default(32_000),
91
63
  maxStreamOutputChars: z.number().int().positive().default(100_000),
92
64
  // Total wall-clock ceiling per provider request. 0 means "no ceiling": the
@@ -122,9 +94,9 @@ export const AgentSettingsSchema = z.object({
122
94
  maxParentExtensions: z.number().int().nonnegative().finite().default(2),
123
95
  identicalToolCallThreshold: z.number().int().positive().finite().default(3),
124
96
  escalation: z
125
- .enum(['warn', 'pause', 'disabled'])
97
+ .enum(['warn', 'contain', 'pause', 'disabled'])
126
98
  .default('warn')
127
- .describe('What a non-soft budget stage does: warn in the status bar, pause the run for a decision, or disabled'),
99
+ .describe('warn is advisory; contain pauses at exhaustion; pause also stops on warning/stall; disabled emits no evidence'),
128
100
  })
129
101
  .default({
130
102
  maxUsdMicros: 5_000_000,
@@ -161,7 +133,6 @@ export const AgentSettingsSchema = z.object({
161
133
  // NOTE: We do NOT validate provider existence here because the provider
162
134
  // registry can be extended at runtime from settings.json (custom providers).
163
135
  // We validate/fallback after SettingsService loads and registers runtime providers.
164
- provider: z.string().min(1).default('openai').describe('Provider to use for the agent'),
165
136
  favoriteModels: z
166
137
  .array(z.string())
167
138
  .optional()
@@ -196,12 +167,6 @@ export const AgentSettingsSchema = z.object({
196
167
  websocketInterFrameTimeoutMs: z.number().int().positive().finite().default(600_000),
197
168
  })
198
169
  .default({ websocketFirstFrameTimeoutMs: 90_000, websocketInterFrameTimeoutMs: 600_000 }),
199
- mentorModel: z.string().optional().describe('Model to use as a mentor'),
200
- mentorProvider: z
201
- .string()
202
- .min(1)
203
- .optional()
204
- .describe('Provider to use for the mentor model (defaults to agent.provider when unset)'),
205
170
  mentorReasoningEffort: z
206
171
  .enum(['default', 'none', 'minimal', 'low', 'medium', 'high', 'xhigh'])
207
172
  .default('default')
@@ -221,23 +186,13 @@ export const AgentSettingsSchema = z.object({
221
186
  .describe('Use OpenAI Flex Service Tier to reduce costs (OpenAI only)'),
222
187
  contextCompaction: z
223
188
  .object({
224
- enabled: z.boolean().default(false),
189
+ enabled: z.boolean().default(true),
225
190
  mode: z.enum(['native', 'auto', 'local']).default('auto'),
226
191
  compactThreshold: z.number().finite().min(0).max(1).default(0.8),
227
192
  compactThresholdTokens: z.number().int().finite().min(1_000).nullable().default(null),
228
193
  })
229
- .default({ enabled: false, mode: 'auto', compactThreshold: 0.8, compactThresholdTokens: null })
194
+ .default({ enabled: true, mode: 'auto', compactThreshold: 0.8, compactThresholdTokens: null })
230
195
  .describe('Native and application-owned context compaction settings'),
231
- autoApproveModel: z
232
- .string()
233
- .optional()
234
- .default('gpt-4o-mini')
235
- .describe('Faster model to use for auto-approval evaluation'),
236
- autoApproveProvider: z
237
- .string()
238
- .min(1)
239
- .optional()
240
- .describe('Provider to use for the auto-approval model (defaults to agent.provider when unset)'),
241
196
  autoApproveReasoningEffort: z
242
197
  .enum(['none', 'minimal', 'low', 'medium', 'high', 'xhigh'])
243
198
  .default('low')
@@ -247,49 +202,39 @@ export const AgentSettingsSchema = z.object({
247
202
  .min(1)
248
203
  .optional()
249
204
  .describe('OpenRouter Decisions model shared by the approval fast path and failure-triage comparisons. For approval, only low/medium-risk, explicit/implied decisions at confidence 0.8 or higher can authorize execution; every other outcome falls back to the chore reviewer. Sends approval context plus failure evidence. Adds API charges'),
250
- subagentExplorerModel: z
251
- .string()
252
- .min(1)
253
- .optional()
254
- .describe('Model override for the explorer subagent. Falls back to agent.model when unset.'),
255
- subagentExplorerProvider: z
256
- .string()
257
- .min(1)
258
- .optional()
259
- .describe('Provider override for the explorer subagent. Falls back to agent.provider when unset.'),
260
205
  subagentExplorerReasoningEffort: z
261
206
  .enum(['default', 'none', 'minimal', 'low', 'medium', 'high', 'xhigh'])
262
207
  .optional()
263
208
  .describe('Reasoning effort override for the explorer subagent. Falls back to agent.reasoningEffort when unset.'),
264
- subagentWorkerModel: z
265
- .string()
266
- .min(1)
267
- .optional()
268
- .describe('Model override for the worker subagent. Falls back to agent.model when unset.'),
269
- subagentWorkerProvider: z
270
- .string()
271
- .min(1)
272
- .optional()
273
- .describe('Provider override for the worker subagent. Falls back to agent.provider when unset.'),
274
209
  subagentWorkerReasoningEffort: z
275
210
  .enum(['default', 'none', 'minimal', 'low', 'medium', 'high', 'xhigh'])
276
211
  .optional()
277
212
  .describe('Reasoning effort override for the worker subagent. Falls back to agent.reasoningEffort when unset.'),
278
- subagentLibrarianModel: z
279
- .string()
280
- .min(1)
281
- .optional()
282
- .describe('Model override for the librarian subagent. Falls back to agent.model when unset.'),
283
- subagentLibrarianProvider: z
284
- .string()
285
- .min(1)
286
- .optional()
287
- .describe('Provider override for the librarian subagent. Falls back to agent.provider when unset.'),
288
213
  subagentLibrarianReasoningEffort: z
289
214
  .enum(['default', 'none', 'minimal', 'low', 'medium', 'high', 'xhigh'])
290
215
  .optional()
291
216
  .describe('Reasoning effort override for the librarian subagent. Falls back to agent.reasoningEffort when unset.'),
292
217
  });
218
+ export const AgentSettingsSchema = z.preprocess(rejectRemovedSelectionKeys([
219
+ 'model',
220
+ 'provider',
221
+ 'efficientModel',
222
+ 'capableModel',
223
+ 'mentorModel',
224
+ 'mentorProvider',
225
+ 'subagentExplorerModel',
226
+ 'subagentExplorerProvider',
227
+ 'subagentWorkerModel',
228
+ 'subagentWorkerProvider',
229
+ 'subagentLibrarianModel',
230
+ 'subagentLibrarianProvider',
231
+ 'autoApproveModel',
232
+ 'autoApproveProvider',
233
+ 'smartProvider',
234
+ 'balancedProvider',
235
+ 'cheapProvider',
236
+ 'choreProvider',
237
+ ]), AgentSettingsObjectSchema);
293
238
  export const ShellSettingsSchema = z.object({
294
239
  timeout: z.number().int().positive().default(120000),
295
240
  backgroundTimeout: z
@@ -399,15 +344,9 @@ export const AppSettingsSchema = z.object({
399
344
  .optional()
400
345
  .default('auto'),
401
346
  });
402
- export const ToolsSettingsSchema = z.object({
347
+ const ToolsSettingsObjectSchema = z.object({
403
348
  logFileOperations: z.boolean().optional().default(true),
404
349
  enableEditHealing: z.boolean().optional().default(true),
405
- editHealingModel: z.string().optional().default('gpt-4o-mini'),
406
- editHealingProvider: z
407
- .string()
408
- .min(1)
409
- .optional()
410
- .describe('Provider to use for the edit-healing model (defaults to agent.provider when unset)'),
411
350
  // Per-tool-group kill switches for the main agent. Each masks exactly one
412
351
  // capability group from the profile's tool capabilities (tool-toggles.ts),
413
352
  // removing that group's tools and capability-gated prompt fragments on the
@@ -476,6 +415,7 @@ export const ToolsSettingsSchema = z.object({
476
415
  .default({ enabled: true })
477
416
  .describe('Enable code-context tools (read_code_outline, code_context_search) for the main agent (true|false). Applies on the next model request.'),
478
417
  });
418
+ export const ToolsSettingsSchema = z.preprocess(rejectRemovedSelectionKeys(['editHealingModel', 'editHealingProvider']), ToolsSettingsObjectSchema);
479
419
  export const DebugSettingsSchema = z.object({
480
420
  debugBashTool: z.boolean().optional().default(false),
481
421
  });
@@ -604,7 +544,7 @@ function getSensitiveSettingKeys() {
604
544
  ]);
605
545
  }
606
546
  export const SENSITIVE_SETTING_KEYS = getSensitiveSettingKeys();
607
- export const SettingsSchema = z.object({
547
+ const SettingsObjectSchema = z.object({
608
548
  providers: z.array(CustomProviderSchema).optional().default([]),
609
549
  enable_agent_workflow: z.boolean().optional().default(false),
610
550
  agent: AgentSettingsSchema.optional(),
@@ -623,33 +563,28 @@ export const SettingsSchema = z.object({
623
563
  memory: MemorySettingsSchema.optional().default(MemorySettingsSchema.parse({})),
624
564
  hooks: HooksSettingsSchema.optional().default(HooksSettingsSchema.parse({})),
625
565
  });
566
+ export const SettingsSchema = SettingsObjectSchema;
626
567
  /**
627
568
  * Centralized list of all setting keys for consistency across the app.
628
569
  * Used by settings command UI and other components to avoid duplication.
629
570
  */
630
571
  export const SETTING_KEYS = {
631
572
  ENABLE_AGENT_WORKFLOW: 'enable_agent_workflow',
632
- AGENT_MODEL: 'agent.model',
633
- AGENT_EFFICIENT_MODEL: 'agent.efficientModel',
634
- AGENT_CAPABLE_MODEL: 'agent.capableModel',
573
+ AGENT_MODEL_SELECTION: 'agent.modelSelection',
635
574
  AGENT_SMART_MODEL: 'agent.smartModel',
636
- AGENT_SMART_PROVIDER: 'agent.smartProvider',
637
575
  AGENT_SMART_REASONING_EFFORT: 'agent.smartReasoningEffort',
638
576
  AGENT_BALANCED_MODEL: 'agent.balancedModel',
639
- AGENT_BALANCED_PROVIDER: 'agent.balancedProvider',
640
577
  AGENT_BALANCED_REASONING_EFFORT: 'agent.balancedReasoningEffort',
641
578
  AGENT_CHEAP_MODEL: 'agent.cheapModel',
642
- AGENT_CHEAP_PROVIDER: 'agent.cheapProvider',
643
579
  AGENT_CHEAP_REASONING_EFFORT: 'agent.cheapReasoningEffort',
644
580
  AGENT_CHORE_MODEL: 'agent.choreModel',
645
- AGENT_CHORE_PROVIDER: 'agent.choreProvider',
646
581
  AGENT_REASONING_EFFORT: 'agent.reasoningEffort',
647
582
  AGENT_TEMPERATURE: 'agent.temperature',
648
- AGENT_PROVIDER: 'agent.provider',
649
583
  AGENT_FAVORITE_MODELS: 'agent.favoriteModels',
650
584
  AGENT_MODEL_NICKNAMES: 'agent.modelNicknames',
651
585
  AGENT_DISABLED_PROVIDERS: 'agent.disabledProviders',
652
586
  AGENT_MAX_TURNS: 'agent.maxTurns',
587
+ AGENT_MAX_REQUEST_INPUT_TOKENS: 'agent.maxRequestInputTokens',
653
588
  AGENT_MAX_OUTPUT_TOKENS: 'agent.maxOutputTokens',
654
589
  AGENT_MAX_STREAM_OUTPUT_CHARS: 'agent.maxStreamOutputChars',
655
590
  AGENT_MAX_MODEL_REQUEST_DURATION_MS: 'agent.maxModelRequestDurationMs',
@@ -683,8 +618,6 @@ export const SETTING_KEYS = {
683
618
  AGENT_OPENROUTER_TITLE: 'agent.openrouter.title', // Sensitive - env only
684
619
  AGENT_CODEX_WEBSOCKET_FIRST_FRAME_TIMEOUT_MS: 'agent.codex.websocketFirstFrameTimeoutMs',
685
620
  AGENT_CODEX_WEBSOCKET_INTER_FRAME_TIMEOUT_MS: 'agent.codex.websocketInterFrameTimeoutMs',
686
- AGENT_MENTOR_MODEL: 'agent.mentorModel',
687
- AGENT_MENTOR_PROVIDER: 'agent.mentorProvider',
688
621
  AGENT_MENTOR_REASONING_EFFORT: 'agent.mentorReasoningEffort',
689
622
  AGENT_MENTOR_SAMPLES: 'agent.mentorSamples',
690
623
  AGENT_MENTOR_POOL: 'agent.mentorPool',
@@ -703,18 +636,10 @@ export const SETTING_KEYS = {
703
636
  SANDBOX_ALLOW_READ_EXTRA: 'sandbox.allowReadExtra',
704
637
  SANDBOX_DOCKER_HOST_CONTROL_PROJECTS: 'sandbox.dockerHostControlProjects',
705
638
  SANDBOX_ALLOW_NETWORKING: 'sandbox.allowNetworking',
706
- AGENT_AUTO_APPROVE_MODEL: 'agent.autoApproveModel',
707
- AGENT_AUTO_APPROVE_PROVIDER: 'agent.autoApproveProvider',
708
639
  AGENT_AUTO_APPROVE_REASONING_EFFORT: 'agent.autoApproveReasoningEffort',
709
640
  AGENT_DECISION_MODEL: 'agent.decisionModel',
710
- AGENT_SUBAGENT_EXPLORER_MODEL: 'agent.subagentExplorerModel',
711
- AGENT_SUBAGENT_EXPLORER_PROVIDER: 'agent.subagentExplorerProvider',
712
641
  AGENT_SUBAGENT_EXPLORER_REASONING_EFFORT: 'agent.subagentExplorerReasoningEffort',
713
- AGENT_SUBAGENT_WORKER_MODEL: 'agent.subagentWorkerModel',
714
- AGENT_SUBAGENT_WORKER_PROVIDER: 'agent.subagentWorkerProvider',
715
642
  AGENT_SUBAGENT_WORKER_REASONING_EFFORT: 'agent.subagentWorkerReasoningEffort',
716
- AGENT_SUBAGENT_LIBRARIAN_MODEL: 'agent.subagentLibrarianModel',
717
- AGENT_SUBAGENT_LIBRARIAN_PROVIDER: 'agent.subagentLibrarianProvider',
718
643
  AGENT_SUBAGENT_LIBRARIAN_REASONING_EFFORT: 'agent.subagentLibrarianReasoningEffort',
719
644
  SUBAGENT_ASYNC_SESSION_TTL_MS: 'subagent.asyncSessionTtlMs',
720
645
  SUBAGENT_ASYNC_MESSAGE_CAP: 'subagent.asyncMessageCap',
@@ -740,8 +665,6 @@ export const SETTING_KEYS = {
740
665
  APP_SEARCH_VIA_SHELL: 'app.searchViaShell',
741
666
  TOOLS_LOG_FILE_OPS: 'tools.logFileOperations',
742
667
  TOOLS_ENABLE_EDIT_HEALING: 'tools.enableEditHealing',
743
- TOOLS_EDIT_HEALING_MODEL: 'tools.editHealingModel',
744
- TOOLS_EDIT_HEALING_PROVIDER: 'tools.editHealingProvider',
745
668
  TOOLS_SHELL_ENABLED: 'tools.shell.enabled',
746
669
  TOOLS_WEB_ENABLED: 'tools.web.enabled',
747
670
  TOOLS_FILE_READ_ENABLED: 'tools.fileRead.enabled',
@@ -781,31 +704,25 @@ export const SETTING_KEYS = {
781
704
  };
782
705
  // Define which settings are modifiable at runtime
783
706
  export const RUNTIME_MODIFIABLE_SETTINGS = new Set([
707
+ 'agent.modelSelection',
784
708
  SETTING_KEYS.AGENT_OPENROUTER_API_KEY,
785
709
  SETTING_KEYS.AGENT_OPENAI_API_KEY,
786
- SETTING_KEYS.AGENT_MODEL,
787
- SETTING_KEYS.AGENT_EFFICIENT_MODEL,
788
- SETTING_KEYS.AGENT_CAPABLE_MODEL,
789
710
  SETTING_KEYS.AGENT_SMART_MODEL,
790
- SETTING_KEYS.AGENT_SMART_PROVIDER,
791
711
  SETTING_KEYS.AGENT_SMART_REASONING_EFFORT,
792
712
  SETTING_KEYS.AGENT_BALANCED_MODEL,
793
- SETTING_KEYS.AGENT_BALANCED_PROVIDER,
794
713
  SETTING_KEYS.AGENT_BALANCED_REASONING_EFFORT,
795
714
  SETTING_KEYS.AGENT_CHEAP_MODEL,
796
- SETTING_KEYS.AGENT_CHEAP_PROVIDER,
797
715
  SETTING_KEYS.AGENT_CHEAP_REASONING_EFFORT,
798
716
  SETTING_KEYS.AGENT_CHORE_MODEL,
799
- SETTING_KEYS.AGENT_CHORE_PROVIDER,
800
717
  SETTING_KEYS.AGENT_AUTO_APPROVE_REASONING_EFFORT,
801
718
  SETTING_KEYS.AGENT_DECISION_MODEL,
802
719
  SETTING_KEYS.AGENT_REASONING_EFFORT,
803
720
  SETTING_KEYS.AGENT_TEMPERATURE,
804
- SETTING_KEYS.AGENT_PROVIDER,
805
721
  SETTING_KEYS.AGENT_FAVORITE_MODELS,
806
722
  SETTING_KEYS.AGENT_MODEL_NICKNAMES,
807
723
  SETTING_KEYS.AGENT_DISABLED_PROVIDERS,
808
724
  SETTING_KEYS.AGENT_RETRY_ATTEMPTS,
725
+ SETTING_KEYS.AGENT_MAX_REQUEST_INPUT_TOKENS,
809
726
  SETTING_KEYS.AGENT_MAX_OUTPUT_TOKENS,
810
727
  SETTING_KEYS.AGENT_MAX_STREAM_OUTPUT_CHARS,
811
728
  SETTING_KEYS.AGENT_MAX_MODEL_REQUEST_DURATION_MS,
@@ -830,8 +747,6 @@ export const RUNTIME_MODIFIABLE_SETTINGS = new Set([
830
747
  SETTING_KEYS.AGENT_SESSION_ROLLOVER_ENABLED,
831
748
  SETTING_KEYS.AGENT_SESSION_ROLLOVER_MILESTONES,
832
749
  SETTING_KEYS.AGENT_SESSION_ROLLOVER_AUTO_BRIEF,
833
- SETTING_KEYS.AGENT_MENTOR_MODEL,
834
- SETTING_KEYS.AGENT_MENTOR_PROVIDER,
835
750
  SETTING_KEYS.AGENT_MENTOR_REASONING_EFFORT,
836
751
  SETTING_KEYS.AGENT_MENTOR_POOL,
837
752
  SETTING_KEYS.AGENT_USE_FLEX_SERVICE_TIER,
@@ -864,21 +779,11 @@ export const RUNTIME_MODIFIABLE_SETTINGS = new Set([
864
779
  SETTING_KEYS.UI_DISPLAY_MODE,
865
780
  SETTING_KEYS.UI_THEME,
866
781
  SETTING_KEYS.UI_SKIN,
867
- SETTING_KEYS.AGENT_AUTO_APPROVE_MODEL,
868
- SETTING_KEYS.AGENT_AUTO_APPROVE_PROVIDER,
869
- SETTING_KEYS.AGENT_SUBAGENT_EXPLORER_MODEL,
870
- SETTING_KEYS.AGENT_SUBAGENT_EXPLORER_PROVIDER,
871
782
  SETTING_KEYS.AGENT_SUBAGENT_EXPLORER_REASONING_EFFORT,
872
- SETTING_KEYS.AGENT_SUBAGENT_WORKER_MODEL,
873
- SETTING_KEYS.AGENT_SUBAGENT_WORKER_PROVIDER,
874
783
  SETTING_KEYS.AGENT_SUBAGENT_WORKER_REASONING_EFFORT,
875
- SETTING_KEYS.AGENT_SUBAGENT_LIBRARIAN_MODEL,
876
- SETTING_KEYS.AGENT_SUBAGENT_LIBRARIAN_PROVIDER,
877
784
  SETTING_KEYS.AGENT_SUBAGENT_LIBRARIAN_REASONING_EFFORT,
878
785
  SETTING_KEYS.SUBAGENT_ASYNC_SESSION_TTL_MS,
879
786
  SETTING_KEYS.SUBAGENT_ASYNC_MESSAGE_CAP,
880
- SETTING_KEYS.TOOLS_EDIT_HEALING_MODEL,
881
- SETTING_KEYS.TOOLS_EDIT_HEALING_PROVIDER,
882
787
  SETTING_KEYS.TOOLS_SHELL_ENABLED,
883
788
  SETTING_KEYS.TOOLS_WEB_ENABLED,
884
789
  SETTING_KEYS.TOOLS_FILE_READ_ENABLED,
@@ -906,28 +811,24 @@ export const RUNTIME_MODIFIABLE_SETTINGS = new Set([
906
811
  SETTING_KEYS.HOOKS_TIMEOUT_MS,
907
812
  ]);
908
813
  // Some settings with default values are optional to persist
909
- export const OPTIONAL_DEFAULT_KEYS = new Set([]);
814
+ // Absence preserves inherited output-allocation provenance on disk.
815
+ export const OPTIONAL_DEFAULT_KEYS = new Set(['agent.maxOutputTokens']);
910
816
  // Default settings
911
817
  export const DEFAULT_SETTINGS = {
912
818
  providers: [],
913
819
  enable_agent_workflow: false,
914
820
  agent: {
915
- model: 'gpt-5.1',
916
- efficientModel: undefined,
917
- capableModel: undefined,
821
+ modelSelection: { model: 'gpt-5.1', provider: 'openai' },
918
822
  smartModel: undefined,
919
- smartProvider: undefined,
920
823
  smartReasoningEffort: undefined,
921
824
  balancedModel: undefined,
922
- balancedProvider: undefined,
923
825
  balancedReasoningEffort: undefined,
924
826
  cheapModel: undefined,
925
- cheapProvider: undefined,
926
827
  cheapReasoningEffort: undefined,
927
828
  choreModel: undefined,
928
- choreProvider: undefined,
929
829
  reasoningEffort: 'default',
930
830
  maxTurns: 100,
831
+ maxRequestInputTokens: null,
931
832
  maxOutputTokens: 32_000,
932
833
  maxStreamOutputChars: 100_000,
933
834
  maxModelRequestDurationMs: 0,
@@ -960,7 +861,6 @@ export const DEFAULT_SETTINGS = {
960
861
  milestones: [200_000, 300_000, 400_000],
961
862
  autoBrief: true,
962
863
  },
963
- provider: 'openai',
964
864
  favoriteModels: [],
965
865
  modelNicknames: {},
966
866
  disabledProviders: [],
@@ -975,30 +875,20 @@ export const DEFAULT_SETTINGS = {
975
875
  websocketFirstFrameTimeoutMs: 90_000,
976
876
  websocketInterFrameTimeoutMs: 600_000,
977
877
  },
978
- mentorModel: undefined,
979
- mentorProvider: undefined,
980
878
  mentorReasoningEffort: 'default',
981
879
  mentorSamples: 1,
982
880
  mentorPool: [],
983
881
  useFlexServiceTier: false,
984
882
  contextCompaction: {
985
- enabled: false,
883
+ enabled: true,
986
884
  mode: 'auto',
987
885
  compactThreshold: 0.8,
988
886
  compactThresholdTokens: null,
989
887
  },
990
- autoApproveModel: 'gpt-4o-mini',
991
- autoApproveProvider: undefined,
992
888
  autoApproveReasoningEffort: 'low',
993
889
  decisionModel: undefined,
994
- subagentExplorerModel: undefined,
995
- subagentExplorerProvider: undefined,
996
890
  subagentExplorerReasoningEffort: undefined,
997
- subagentWorkerModel: undefined,
998
- subagentWorkerProvider: undefined,
999
891
  subagentWorkerReasoningEffort: undefined,
1000
- subagentLibrarianModel: undefined,
1001
- subagentLibrarianProvider: undefined,
1002
892
  subagentLibrarianReasoningEffort: undefined,
1003
893
  },
1004
894
  shell: {
@@ -1058,8 +948,6 @@ export const DEFAULT_SETTINGS = {
1058
948
  tools: {
1059
949
  logFileOperations: true,
1060
950
  enableEditHealing: true,
1061
- editHealingModel: 'gpt-4o-mini',
1062
- editHealingProvider: undefined,
1063
951
  shell: { enabled: true },
1064
952
  web: { enabled: true },
1065
953
  fileRead: { enabled: true },