open-multi-agent-kit 0.90.0 → 0.90.4

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 (307) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/README.md +22 -31
  3. package/dist/cli/args.d.ts +0 -2
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +1 -7
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/config.d.ts +3 -6
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +27 -19
  10. package/dist/config.js.map +1 -1
  11. package/dist/core/adaptorch-bridge.d.ts +257 -0
  12. package/dist/core/adaptorch-bridge.d.ts.map +1 -0
  13. package/dist/core/adaptorch-bridge.js +473 -0
  14. package/dist/core/adaptorch-bridge.js.map +1 -0
  15. package/dist/core/agent-session.d.ts +132 -0
  16. package/dist/core/agent-session.d.ts.map +1 -1
  17. package/dist/core/agent-session.js +327 -5
  18. package/dist/core/agent-session.js.map +1 -1
  19. package/dist/core/bang-skill-invocation.d.ts +26 -0
  20. package/dist/core/bang-skill-invocation.d.ts.map +1 -0
  21. package/dist/core/bang-skill-invocation.js +208 -0
  22. package/dist/core/bang-skill-invocation.js.map +1 -0
  23. package/dist/core/compaction/utils.d.ts.map +1 -1
  24. package/dist/core/compaction/utils.js +15 -2
  25. package/dist/core/compaction/utils.js.map +1 -1
  26. package/dist/core/compactor.d.ts.map +1 -1
  27. package/dist/core/compactor.js +0 -3
  28. package/dist/core/compactor.js.map +1 -1
  29. package/dist/core/context-budget-governor-v2.d.ts +2 -1
  30. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  31. package/dist/core/context-budget-governor-v2.js +1 -0
  32. package/dist/core/context-budget-governor-v2.js.map +1 -1
  33. package/dist/core/context-budget-headroom-types.d.ts +8 -0
  34. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  35. package/dist/core/context-budget-headroom-types.js.map +1 -1
  36. package/dist/core/context-budget-headroom.d.ts +1 -1
  37. package/dist/core/context-budget-headroom.d.ts.map +1 -1
  38. package/dist/core/context-budget-headroom.js +17 -4
  39. package/dist/core/context-budget-headroom.js.map +1 -1
  40. package/dist/core/context-budget-system-prompt.d.ts +2 -1
  41. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  42. package/dist/core/context-budget-system-prompt.js +6 -1
  43. package/dist/core/context-budget-system-prompt.js.map +1 -1
  44. package/dist/core/context-budget-v2-cache-hash.d.ts +3 -0
  45. package/dist/core/context-budget-v2-cache-hash.d.ts.map +1 -0
  46. package/dist/core/context-budget-v2-cache-hash.js +16 -0
  47. package/dist/core/context-budget-v2-cache-hash.js.map +1 -0
  48. package/dist/core/context-budget-v2-cache-keys.d.ts +58 -0
  49. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -0
  50. package/dist/core/context-budget-v2-cache-keys.js +128 -0
  51. package/dist/core/context-budget-v2-cache-keys.js.map +1 -0
  52. package/dist/core/context-budget-v2-cache-provider.d.ts +23 -0
  53. package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -0
  54. package/dist/core/context-budget-v2-cache-provider.js +29 -0
  55. package/dist/core/context-budget-v2-cache-provider.js.map +1 -0
  56. package/dist/core/context-budget-v2-cache-telemetry.d.ts +36 -0
  57. package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -0
  58. package/dist/core/context-budget-v2-cache-telemetry.js +64 -0
  59. package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -0
  60. package/dist/core/context-budget-v2-cache-validation.d.ts +36 -0
  61. package/dist/core/context-budget-v2-cache-validation.d.ts.map +1 -0
  62. package/dist/core/context-budget-v2-cache-validation.js +98 -0
  63. package/dist/core/context-budget-v2-cache-validation.js.map +1 -0
  64. package/dist/core/context-budget-v2-cache.d.ts +36 -0
  65. package/dist/core/context-budget-v2-cache.d.ts.map +1 -0
  66. package/dist/core/context-budget-v2-cache.js +50 -0
  67. package/dist/core/context-budget-v2-cache.js.map +1 -0
  68. package/dist/core/context-budget-v2-plan-cache-keys.d.ts +16 -0
  69. package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -0
  70. package/dist/core/context-budget-v2-plan-cache-keys.js +49 -0
  71. package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -0
  72. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  73. package/dist/core/context-budget-v2-planner.js +55 -2
  74. package/dist/core/context-budget-v2-planner.js.map +1 -1
  75. package/dist/core/context-budget-v2-representation-cache.d.ts +27 -0
  76. package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -0
  77. package/dist/core/context-budget-v2-representation-cache.js +173 -0
  78. package/dist/core/context-budget-v2-representation-cache.js.map +1 -0
  79. package/dist/core/context-budget-v2-selection.d.ts +2 -0
  80. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  81. package/dist/core/context-budget-v2-selection.js +12 -2
  82. package/dist/core/context-budget-v2-selection.js.map +1 -1
  83. package/dist/core/context-budget-v2-types.d.ts +107 -1
  84. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  85. package/dist/core/context-budget-v2-types.js.map +1 -1
  86. package/dist/core/domain-loadouts.d.ts.map +1 -1
  87. package/dist/core/domain-loadouts.js +1 -1
  88. package/dist/core/domain-loadouts.js.map +1 -1
  89. package/dist/core/headroom.d.ts.map +1 -1
  90. package/dist/core/headroom.js +0 -4
  91. package/dist/core/headroom.js.map +1 -1
  92. package/dist/core/hook-inventory.d.ts.map +1 -1
  93. package/dist/core/hook-inventory.js +6 -0
  94. package/dist/core/hook-inventory.js.map +1 -1
  95. package/dist/core/mcp-computer-use-presets.d.ts +64 -0
  96. package/dist/core/mcp-computer-use-presets.d.ts.map +1 -0
  97. package/dist/core/mcp-computer-use-presets.js +158 -0
  98. package/dist/core/mcp-computer-use-presets.js.map +1 -0
  99. package/dist/core/mcp-public-presets.d.ts +578 -0
  100. package/dist/core/mcp-public-presets.d.ts.map +1 -0
  101. package/dist/core/mcp-public-presets.js +647 -0
  102. package/dist/core/mcp-public-presets.js.map +1 -0
  103. package/dist/core/model-registry.d.ts.map +1 -1
  104. package/dist/core/model-registry.js +1 -0
  105. package/dist/core/model-registry.js.map +1 -1
  106. package/dist/core/pi-package-intake-candidates.d.ts +14 -1
  107. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -1
  108. package/dist/core/pi-package-intake-candidates.js +182 -0
  109. package/dist/core/pi-package-intake-candidates.js.map +1 -1
  110. package/dist/core/pi-package-intake.d.ts +8 -1
  111. package/dist/core/pi-package-intake.d.ts.map +1 -1
  112. package/dist/core/pi-package-intake.js +14 -4
  113. package/dist/core/pi-package-intake.js.map +1 -1
  114. package/dist/core/reasoning-router-bias.d.ts +119 -0
  115. package/dist/core/reasoning-router-bias.d.ts.map +1 -0
  116. package/dist/core/reasoning-router-bias.js +287 -0
  117. package/dist/core/reasoning-router-bias.js.map +1 -0
  118. package/dist/core/reasoning-router-v2.d.ts +94 -0
  119. package/dist/core/reasoning-router-v2.d.ts.map +1 -0
  120. package/dist/core/reasoning-router-v2.js +288 -0
  121. package/dist/core/reasoning-router-v2.js.map +1 -0
  122. package/dist/core/reasoning-router-v3.d.ts +15 -0
  123. package/dist/core/reasoning-router-v3.d.ts.map +1 -0
  124. package/dist/core/reasoning-router-v3.js +193 -0
  125. package/dist/core/reasoning-router-v3.js.map +1 -0
  126. package/dist/core/reasoning-router-v4-weights.d.ts +124 -0
  127. package/dist/core/reasoning-router-v4-weights.d.ts.map +1 -0
  128. package/dist/core/reasoning-router-v4-weights.js +112 -0
  129. package/dist/core/reasoning-router-v4-weights.js.map +1 -0
  130. package/dist/core/reasoning-router-v4.d.ts +163 -0
  131. package/dist/core/reasoning-router-v4.d.ts.map +1 -0
  132. package/dist/core/reasoning-router-v4.js +683 -0
  133. package/dist/core/reasoning-router-v4.js.map +1 -0
  134. package/dist/core/reasoning-router-weights.d.ts +155 -0
  135. package/dist/core/reasoning-router-weights.d.ts.map +1 -0
  136. package/dist/core/reasoning-router-weights.js +204 -0
  137. package/dist/core/reasoning-router-weights.js.map +1 -0
  138. package/dist/core/reasoning-router.d.ts +44 -0
  139. package/dist/core/reasoning-router.d.ts.map +1 -0
  140. package/dist/core/reasoning-router.js +138 -0
  141. package/dist/core/reasoning-router.js.map +1 -0
  142. package/dist/core/reverse-skill.d.ts +2 -0
  143. package/dist/core/reverse-skill.d.ts.map +1 -0
  144. package/dist/core/reverse-skill.js +7 -0
  145. package/dist/core/reverse-skill.js.map +1 -0
  146. package/dist/core/router-feedback-collector.d.ts +101 -0
  147. package/dist/core/router-feedback-collector.d.ts.map +1 -0
  148. package/dist/core/router-feedback-collector.js +239 -0
  149. package/dist/core/router-feedback-collector.js.map +1 -0
  150. package/dist/core/settings-manager.d.ts +31 -3
  151. package/dist/core/settings-manager.d.ts.map +1 -1
  152. package/dist/core/settings-manager.js +16 -0
  153. package/dist/core/settings-manager.js.map +1 -1
  154. package/dist/core/slash-commands.d.ts.map +1 -1
  155. package/dist/core/slash-commands.js +4 -1
  156. package/dist/core/slash-commands.js.map +1 -1
  157. package/dist/core/system-prompt.d.ts +2 -0
  158. package/dist/core/system-prompt.d.ts.map +1 -1
  159. package/dist/core/system-prompt.js +58 -5
  160. package/dist/core/system-prompt.js.map +1 -1
  161. package/dist/index.d.ts +1 -0
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js +1 -0
  164. package/dist/index.js.map +1 -1
  165. package/dist/migrations.d.ts +19 -0
  166. package/dist/migrations.d.ts.map +1 -1
  167. package/dist/migrations.js +39 -15
  168. package/dist/migrations.js.map +1 -1
  169. package/dist/modes/interactive/components/control-panel-box.d.ts +3 -3
  170. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
  171. package/dist/modes/interactive/components/control-panel-box.js +10 -10
  172. package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
  173. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  174. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -1
  175. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  176. package/dist/modes/interactive/components/control-panel-layout.d.ts +15 -1
  177. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  178. package/dist/modes/interactive/components/control-panel-layout.js +212 -68
  179. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  180. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +15 -0
  181. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
  182. package/dist/modes/interactive/components/control-panel-runtime-status.js +105 -5
  183. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
  184. package/dist/modes/interactive/components/control-panel-sparkles.d.ts +27 -0
  185. package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -0
  186. package/dist/modes/interactive/components/control-panel-sparkles.js +42 -0
  187. package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -0
  188. package/dist/modes/interactive/components/control-panel.d.ts +8 -0
  189. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  190. package/dist/modes/interactive/components/control-panel.js +40 -8
  191. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  192. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  193. package/dist/modes/interactive/components/settings-selector.js +2 -1
  194. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  195. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  196. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  197. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  198. package/dist/modes/interactive/interactive-mode.d.ts +6 -0
  199. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  200. package/dist/modes/interactive/interactive-mode.js +206 -32
  201. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  202. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  203. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  204. package/dist/modes/interactive/theme/theme.js +2 -0
  205. package/dist/modes/interactive/theme/theme.js.map +1 -1
  206. package/docs/loadout-domains/README.md +8 -6
  207. package/docs/loadout-domains/ai-agent-ops.md +3 -2
  208. package/docs/loadout-domains/backend-api.md +3 -2
  209. package/docs/loadout-domains/data-science.md +3 -2
  210. package/docs/loadout-domains/devops-infra.md +2 -1
  211. package/docs/loadout-domains/docs-writing.md +7 -2
  212. package/docs/loadout-domains/frontend-ui.md +42 -11
  213. package/docs/loadout-domains/korean-document.md +83 -0
  214. package/docs/loadout-domains/mobile.md +1 -1
  215. package/docs/loadout-domains/qa-testing.md +4 -2
  216. package/docs/loadout-domains/security-audit.md +2 -1
  217. package/docs/loadout-domains/visual-qa.md +94 -0
  218. package/docs/skills.md +11 -4
  219. package/docs/usage.md +39 -4
  220. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  221. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  222. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  223. package/examples/extensions/gondolin/package-lock.json +2 -2
  224. package/examples/extensions/gondolin/package.json +1 -1
  225. package/examples/extensions/preset.ts +2 -2
  226. package/examples/extensions/sandbox/package-lock.json +2 -2
  227. package/examples/extensions/sandbox/package.json +1 -1
  228. package/examples/extensions/with-deps/package-lock.json +2 -2
  229. package/examples/extensions/with-deps/package.json +1 -1
  230. package/npm-shrinkwrap.json +27 -34
  231. package/package.json +5 -5
  232. package/dist/agents/jailbreak/index.d.ts +0 -7
  233. package/dist/agents/jailbreak/index.d.ts.map +0 -1
  234. package/dist/agents/jailbreak/index.js +0 -7
  235. package/dist/agents/jailbreak/index.js.map +0 -1
  236. package/dist/agents/jailbreak/subagent-f.d.ts +0 -44
  237. package/dist/agents/jailbreak/subagent-f.d.ts.map +0 -1
  238. package/dist/agents/jailbreak/subagent-f.js +0 -60
  239. package/dist/agents/jailbreak/subagent-f.js.map +0 -1
  240. package/dist/cli/jailbreak-args.d.ts +0 -26
  241. package/dist/cli/jailbreak-args.d.ts.map +0 -1
  242. package/dist/cli/jailbreak-args.js +0 -86
  243. package/dist/cli/jailbreak-args.js.map +0 -1
  244. package/dist/commands/jailbreak.d.ts +0 -49
  245. package/dist/commands/jailbreak.d.ts.map +0 -1
  246. package/dist/commands/jailbreak.js +0 -201
  247. package/dist/commands/jailbreak.js.map +0 -1
  248. package/dist/encoding/index.d.ts +0 -6
  249. package/dist/encoding/index.d.ts.map +0 -1
  250. package/dist/encoding/index.js +0 -6
  251. package/dist/encoding/index.js.map +0 -1
  252. package/dist/encoding/l4-encoder.d.ts +0 -96
  253. package/dist/encoding/l4-encoder.d.ts.map +0 -1
  254. package/dist/encoding/l4-encoder.js +0 -474
  255. package/dist/encoding/l4-encoder.js.map +0 -1
  256. package/dist/fuzzing/index.d.ts +0 -6
  257. package/dist/fuzzing/index.d.ts.map +0 -1
  258. package/dist/fuzzing/index.js +0 -6
  259. package/dist/fuzzing/index.js.map +0 -1
  260. package/dist/fuzzing/mutation-engine.d.ts +0 -93
  261. package/dist/fuzzing/mutation-engine.d.ts.map +0 -1
  262. package/dist/fuzzing/mutation-engine.js +0 -244
  263. package/dist/fuzzing/mutation-engine.js.map +0 -1
  264. package/dist/jailbreak-extension.d.ts +0 -48
  265. package/dist/jailbreak-extension.d.ts.map +0 -1
  266. package/dist/jailbreak-extension.js +0 -47
  267. package/dist/jailbreak-extension.js.map +0 -1
  268. package/dist/modules/index.d.ts +0 -8
  269. package/dist/modules/index.d.ts.map +0 -1
  270. package/dist/modules/index.js +0 -7
  271. package/dist/modules/index.js.map +0 -1
  272. package/dist/modules/lrl-bypass.d.ts +0 -40
  273. package/dist/modules/lrl-bypass.d.ts.map +0 -1
  274. package/dist/modules/lrl-bypass.js +0 -84
  275. package/dist/modules/lrl-bypass.js.map +0 -1
  276. package/dist/modules/lrl-deps.d.ts +0 -38
  277. package/dist/modules/lrl-deps.d.ts.map +0 -1
  278. package/dist/modules/lrl-deps.js +0 -128
  279. package/dist/modules/lrl-deps.js.map +0 -1
  280. package/dist/multiturn/easl-chain.d.ts +0 -113
  281. package/dist/multiturn/easl-chain.d.ts.map +0 -1
  282. package/dist/multiturn/easl-chain.js +0 -351
  283. package/dist/multiturn/easl-chain.js.map +0 -1
  284. package/dist/multiturn/index.d.ts +0 -6
  285. package/dist/multiturn/index.d.ts.map +0 -1
  286. package/dist/multiturn/index.js +0 -6
  287. package/dist/multiturn/index.js.map +0 -1
  288. package/dist/routing/fallback-router.d.ts +0 -123
  289. package/dist/routing/fallback-router.d.ts.map +0 -1
  290. package/dist/routing/fallback-router.js +0 -355
  291. package/dist/routing/fallback-router.js.map +0 -1
  292. package/dist/routing/index.d.ts +0 -6
  293. package/dist/routing/index.d.ts.map +0 -1
  294. package/dist/routing/index.js +0 -6
  295. package/dist/routing/index.js.map +0 -1
  296. package/dist/types/jailbreak.d.ts +0 -246
  297. package/dist/types/jailbreak.d.ts.map +0 -1
  298. package/dist/types/jailbreak.js +0 -8
  299. package/dist/types/jailbreak.js.map +0 -1
  300. package/dist/utils/jailbreak/common.d.ts +0 -63
  301. package/dist/utils/jailbreak/common.d.ts.map +0 -1
  302. package/dist/utils/jailbreak/common.js +0 -130
  303. package/dist/utils/jailbreak/common.js.map +0 -1
  304. package/dist/utils/jailbreak/index.d.ts +0 -7
  305. package/dist/utils/jailbreak/index.d.ts.map +0 -1
  306. package/dist/utils/jailbreak/index.js +0 -7
  307. package/dist/utils/jailbreak/index.js.map +0 -1
@@ -12,8 +12,9 @@ import { spawn, spawnSync } from "child_process";
12
12
  import { getProviders, } from "omk-ai";
13
13
  import { CombinedAutocompleteProvider, Container, fuzzyFilter, getCapabilities, hyperlink, Loader, Markdown, matchesKey, ProcessTerminal, Spacer, setKeybindings, Text, TruncatedText, TUI, visibleWidth, } from "omk-tui";
14
14
  import { APP_NAME, APP_TITLE, getAgentDir, getAuthPath, getDebugLogPath, getDocsPath, getShareViewerUrl, VERSION, } from "../../config.js";
15
- import { parseSkillBlock } from "../../core/agent-session.js";
15
+ import { parseSkillBlock, } from "../../core/agent-session.js";
16
16
  import { SessionImportFileNotFoundError } from "../../core/agent-session-runtime.js";
17
+ import { parseBangInvocation } from "../../core/bang-skill-invocation.js";
17
18
  import { FooterDataProvider } from "../../core/footer-data-provider.js";
18
19
  import { configureHttpDispatcher, formatHttpIdleTimeoutMs } from "../../core/http-dispatcher.js";
19
20
  import { KeybindingsManager } from "../../core/keybindings.js";
@@ -39,7 +40,8 @@ import { BashExecutionComponent } from "./components/bash-execution.js";
39
40
  import { BorderedLoader } from "./components/bordered-loader.js";
40
41
  import { BranchSummaryMessageComponent } from "./components/branch-summary-message.js";
41
42
  import { CompactionSummaryMessageComponent } from "./components/compaction-summary-message.js";
42
- import { ControlPanelComponent } from "./components/control-panel.js";
43
+ import { ControlPanelComponent, ControlPanelRightPaneComponent } from "./components/control-panel.js";
44
+ import { CONTROL_PANEL_OVERLAY_MIN_WIDTH, CONTROL_PANEL_SIDEBAR_WIDTH } from "./components/control-panel-layout.js";
43
45
  import { createControlPanelStatusSnapshot } from "./components/control-panel-runtime-status.js";
44
46
  import { CountdownTimer } from "./components/countdown-timer.js";
45
47
  import { CustomEditor } from "./components/custom-editor.js";
@@ -67,6 +69,14 @@ import { getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMar
67
69
  function isExpandable(obj) {
68
70
  return typeof obj === "object" && obj !== null && "setExpanded" in obj && typeof obj.setExpanded === "function";
69
71
  }
72
+ function disposeComponent(component) {
73
+ if (typeof component === "object" &&
74
+ component !== null &&
75
+ "dispose" in component &&
76
+ typeof component.dispose === "function") {
77
+ component.dispose();
78
+ }
79
+ }
70
80
  class ExpandableText extends Text {
71
81
  getCollapsedText;
72
82
  getExpandedText;
@@ -87,6 +97,18 @@ class ExpandableText extends Text {
87
97
  }
88
98
  }
89
99
  const DEAD_TERMINAL_ERROR_CODES = new Set(["EIO", "EPIPE", "ENOTCONN"]);
100
+ /**
101
+ * Pseudo-entries for the thinking selector/autocomplete representing auto mode.
102
+ * "auto", "auto-v2", "auto-v3", and "auto-v4" are thinking MODES (per-task
103
+ * routing), not ThinkingLevel values; the selector renders plain strings, so
104
+ * they are injected as pseudo-level entries and intercepted before reaching
105
+ * the session level API.
106
+ */
107
+ const AUTO_THINKING_ENTRY = "auto";
108
+ const AUTO_V1_THINKING_ENTRY = "auto-v1";
109
+ const AUTO_V2_THINKING_ENTRY = "auto-v2";
110
+ const AUTO_V3_THINKING_ENTRY = "auto-v3";
111
+ const AUTO_V4_THINKING_ENTRY = "auto-v4";
90
112
  function isDeadTerminalError(error) {
91
113
  if (!error || typeof error !== "object" || !("code" in error)) {
92
114
  return false;
@@ -193,7 +215,6 @@ export class InteractiveMode {
193
215
  // Agent subscription unsubscribe function
194
216
  unsubscribe;
195
217
  signalCleanupHandlers = [];
196
- // Track if editor is in bash mode (text starts with !)
197
218
  isBashMode = false;
198
219
  // Track current bash execution component
199
220
  bashComponent = undefined;
@@ -328,15 +349,45 @@ export class InteractiveMode {
328
349
  const thinkCommand = slashCommands.find((command) => command.name === "think");
329
350
  if (thinkCommand) {
330
351
  thinkCommand.getArgumentCompletions = (prefix) => {
331
- const levels = this.session.getAvailableThinkingLevels();
332
- const filtered = fuzzyFilter(levels, prefix, (level) => level);
352
+ const isAutoMode = this.session.thinkingMode === "auto";
353
+ const currentAutoVersion = this.session.thinkingRouterVersion;
354
+ const choices = [
355
+ AUTO_THINKING_ENTRY,
356
+ AUTO_V1_THINKING_ENTRY,
357
+ AUTO_V2_THINKING_ENTRY,
358
+ AUTO_V3_THINKING_ENTRY,
359
+ AUTO_V4_THINKING_ENTRY,
360
+ ...this.session.getAvailableThinkingLevels(),
361
+ ];
362
+ const filtered = fuzzyFilter(choices, prefix, (choice) => choice);
333
363
  if (filtered.length === 0)
334
364
  return null;
335
- return filtered.map((level) => ({
336
- value: level,
337
- label: level,
338
- description: level === this.session.thinkingLevel ? "current" : undefined,
339
- }));
365
+ return filtered.map((choice) => {
366
+ let description;
367
+ if (choice === AUTO_THINKING_ENTRY) {
368
+ description = `route level per task${isAutoMode ? ` (current: ${currentAutoVersion})` : ""}`;
369
+ }
370
+ else if (choice === AUTO_V1_THINKING_ENTRY) {
371
+ description = `route level per task with v1 router${isAutoMode && currentAutoVersion === "v1" ? " (current)" : ""}`;
372
+ }
373
+ else if (choice === AUTO_V2_THINKING_ENTRY) {
374
+ description = `route level per task with v2 router${isAutoMode && currentAutoVersion === "v2" ? " (current)" : ""}`;
375
+ }
376
+ else if (choice === AUTO_V3_THINKING_ENTRY) {
377
+ description = `route level per task with v3 router${isAutoMode && currentAutoVersion === "v3" ? " (current)" : ""}`;
378
+ }
379
+ else if (choice === AUTO_V4_THINKING_ENTRY) {
380
+ description = `route level per task with v4 router${isAutoMode && currentAutoVersion === "v4" ? " (current)" : ""}`;
381
+ }
382
+ else if (!isAutoMode && choice === this.session.thinkingLevel) {
383
+ description = "current";
384
+ }
385
+ return {
386
+ value: choice,
387
+ label: choice,
388
+ description,
389
+ };
390
+ });
340
391
  };
341
392
  }
342
393
  const modelCommand = slashCommands.find((command) => command.name === "model");
@@ -503,8 +554,8 @@ export class InteractiveMode {
503
554
  hint("app.thinking.toggle", "to expand thinking"),
504
555
  hint("app.editor.external", "for external editor"),
505
556
  rawKeyHint("/", "for commands"),
506
- rawKeyHint("!", "to run bash"),
507
- rawKeyHint("!!", "to run bash (no context)"),
557
+ rawKeyHint("!", "skills/bash"),
558
+ rawKeyHint("!!", "bash(no ctx)"),
508
559
  hint("app.message.followUp", "to queue follow-up"),
509
560
  hint("app.message.dequeue", "to edit all queued messages"),
510
561
  hint("app.clipboard.pasteImage", "to paste image"),
@@ -514,10 +565,11 @@ export class InteractiveMode {
514
565
  hint("app.interrupt", "interrupt"),
515
566
  rawKeyHint(`${keyText("app.clear")}/${keyText("app.exit")}`, "clear/exit"),
516
567
  rawKeyHint("/", "commands"),
517
- rawKeyHint("!", "bash"),
568
+ rawKeyHint("!", "skills/bash"),
569
+ rawKeyHint("!!", "bash(no ctx)"),
518
570
  hint("app.tools.expand", "more"),
519
571
  ].join(theme.fg("muted", " · "));
520
- const controlPanel = new ControlPanelComponent({
572
+ const controlPanelContent = {
521
573
  appName: APP_NAME,
522
574
  version: this.version,
523
575
  compactInstructions,
@@ -525,9 +577,27 @@ export class InteractiveMode {
525
577
  compactOnboarding: () => `Press ${keyText("app.tools.expand")} to show full startup help and loaded resources.`,
526
578
  onboarding: () => `OMK can explain its own features and look up its docs. Ask it how to use or extend OMK.`,
527
579
  statusSnapshot: () => createControlPanelStatusSnapshot(this.session, this.sessionManager, this.footerDataProvider),
580
+ };
581
+ const controlPanel = new ControlPanelComponent(controlPanelContent, {
582
+ requestRender: () => this.ui.requestRender(),
583
+ isTTY: () => process.stdout.isTTY === true,
584
+ isReducedMotion: () => process.env.OMK_REDUCED_MOTION === "1" || process.env.OMK_REDUCE_MOTION === "1",
585
+ isIdleDriftEnabled: () => process.env.OMK_CONTROL_IDLE_DRIFT !== "0",
586
+ isHeaderVisibleHint: () => this.customHeader === undefined,
587
+ getRenderWidth: () => this.ui.terminal.columns,
528
588
  });
529
589
  controlPanel.setExpanded(this.getStartupExpansionState());
530
590
  this.builtInHeader = controlPanel;
591
+ this.ui.showOverlay(new ControlPanelRightPaneComponent(controlPanelContent), {
592
+ anchor: "top-right",
593
+ width: CONTROL_PANEL_SIDEBAR_WIDTH,
594
+ maxHeight: "100%",
595
+ nonCapturing: true,
596
+ visible: (termWidth, termHeight) => this.customHeader === undefined &&
597
+ this.toolOutputExpanded &&
598
+ termWidth >= CONTROL_PANEL_OVERLAY_MIN_WIDTH &&
599
+ termHeight >= 12,
600
+ });
531
601
  // Setup UI layout
532
602
  this.headerContainer.addChild(new Spacer(1));
533
603
  this.headerContainer.addChild(this.builtInHeader);
@@ -2050,7 +2120,7 @@ export class InteractiveMode {
2050
2120
  this.defaultEditor.onAction("app.session.resume", () => this.showSessionSelector());
2051
2121
  this.defaultEditor.onChange = (text) => {
2052
2122
  const wasBashMode = this.isBashMode;
2053
- this.isBashMode = text.trimStart().startsWith("!");
2123
+ this.isBashMode = this.isBangBashInput(text);
2054
2124
  if (wasBashMode !== this.isBashMode) {
2055
2125
  this.updateEditorBorderColor();
2056
2126
  }
@@ -2080,6 +2150,18 @@ export class InteractiveMode {
2080
2150
  // Silently ignore clipboard errors (may not have permission, etc.)
2081
2151
  }
2082
2152
  }
2153
+ parseBangInput(text) {
2154
+ return parseBangInvocation(text.trim(), {
2155
+ hasSkill: (name) => this.session.resourceLoader.getSkills().skills.some((skill) => skill.name === name),
2156
+ });
2157
+ }
2158
+ isBangBashInput(text) {
2159
+ const trimmed = text.trimStart();
2160
+ if (!trimmed.startsWith("!")) {
2161
+ return false;
2162
+ }
2163
+ return this.parseBangInput(trimmed).kind === "bash";
2164
+ }
2083
2165
  setupEditorSubmitHandler() {
2084
2166
  this.defaultEditor.onSubmit = async (text) => {
2085
2167
  text = text.trim();
@@ -2214,18 +2296,25 @@ export class InteractiveMode {
2214
2296
  await this.shutdown();
2215
2297
  return;
2216
2298
  }
2217
- // Handle bash command (! for normal, !! for excluded from context)
2218
2299
  if (text.startsWith("!")) {
2219
- const isExcluded = text.startsWith("!!");
2220
- const command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();
2221
- if (command) {
2300
+ const bangInvocation = parseBangInvocation(text, {
2301
+ hasSkill: (name) => this.session.resourceLoader.getSkills().skills.some((skill) => skill.name === name),
2302
+ });
2303
+ if (bangInvocation.kind === "unknownSkill") {
2304
+ this.showWarning(`Unknown skill: ${bangInvocation.skillName}`);
2305
+ this.editor.setText(text);
2306
+ this.isBashMode = false;
2307
+ this.updateEditorBorderColor();
2308
+ return;
2309
+ }
2310
+ if (bangInvocation.kind === "bash") {
2222
2311
  if (this.session.isBashRunning) {
2223
2312
  this.showWarning("A bash command is already running. Press Esc to cancel it first.");
2224
2313
  this.editor.setText(text);
2225
2314
  return;
2226
2315
  }
2227
2316
  this.editor.addToHistory?.(text);
2228
- await this.handleBashCommand(command, isExcluded);
2317
+ await this.handleBashCommand(bangInvocation.command, !bangInvocation.includeContext);
2229
2318
  this.isBashMode = false;
2230
2319
  this.updateEditorBorderColor();
2231
2320
  return;
@@ -2990,6 +3079,8 @@ export class InteractiveMode {
2990
3079
  this.showStatus("Current model does not support thinking");
2991
3080
  }
2992
3081
  else {
3082
+ // Cycling picks a concrete level: an explicit user override back to manual mode.
3083
+ this.session.setThinkingMode("manual");
2993
3084
  this.footer.invalidate();
2994
3085
  this.updateEditorBorderColor();
2995
3086
  this.showStatus(`Thinking level: ${newLevel}`);
@@ -3340,8 +3431,8 @@ export class InteractiveMode {
3340
3431
  followUpMode: this.session.followUpMode,
3341
3432
  transport: this.settingsManager.getTransport(),
3342
3433
  httpIdleTimeoutMs: this.settingsManager.getHttpIdleTimeoutMs(),
3343
- thinkingLevel: this.session.thinkingLevel,
3344
- availableThinkingLevels: this.session.getAvailableThinkingLevels(),
3434
+ thinkingLevel: this.getThinkingSelectorValue(),
3435
+ availableThinkingLevels: this.getThinkingSelectorLevels(),
3345
3436
  currentTheme: this.settingsManager.getTheme() || "dark",
3346
3437
  availableThemes: getAvailableThemes(),
3347
3438
  hideThinkingBlock: this.hideThinkingBlock,
@@ -3403,9 +3494,7 @@ export class InteractiveMode {
3403
3494
  this.showStatus(`HTTP idle timeout: ${formatHttpIdleTimeoutMs(timeoutMs)}`);
3404
3495
  },
3405
3496
  onThinkingLevelChange: (level) => {
3406
- this.session.setThinkingLevel(level);
3407
- this.footer.invalidate();
3408
- this.updateEditorBorderColor();
3497
+ this.applyThinkingSelection(level);
3409
3498
  },
3410
3499
  onThemeChange: (themeName) => {
3411
3500
  const result = setTheme(themeName, true);
@@ -3489,19 +3578,102 @@ export class InteractiveMode {
3489
3578
  this.showThinkingSelector();
3490
3579
  return;
3491
3580
  }
3581
+ const normalizedLevel = level.replace(/\s+/g, " ");
3582
+ switch (normalizedLevel) {
3583
+ case AUTO_THINKING_ENTRY:
3584
+ case "auto v1":
3585
+ case AUTO_V1_THINKING_ENTRY:
3586
+ case "auto:v1":
3587
+ this.enableAutoThinkingMode("v1");
3588
+ return;
3589
+ case "auto v2":
3590
+ case AUTO_V2_THINKING_ENTRY:
3591
+ case "auto:v2":
3592
+ this.enableAutoThinkingMode("v2");
3593
+ return;
3594
+ case "auto v3":
3595
+ case AUTO_V3_THINKING_ENTRY:
3596
+ case "auto:v3":
3597
+ this.enableAutoThinkingMode("v3");
3598
+ return;
3599
+ case "auto v4":
3600
+ case AUTO_V4_THINKING_ENTRY:
3601
+ case "auto:v4":
3602
+ this.enableAutoThinkingMode("v4");
3603
+ return;
3604
+ }
3492
3605
  const availableLevels = this.session.getAvailableThinkingLevels();
3493
- if (!availableLevels.includes(level)) {
3494
- this.showError(`Thinking level "${level}" is not available. Available: ${availableLevels.join(", ")}`);
3606
+ if (!availableLevels.includes(normalizedLevel)) {
3607
+ this.showError(`Thinking level "${level}" is not available. Available: auto, auto-v1, auto-v2, auto-v3, auto-v4, ${availableLevels.join(", ")}`);
3608
+ return;
3609
+ }
3610
+ this.applyThinkingLevel(normalizedLevel);
3611
+ }
3612
+ applyThinkingSelection(level) {
3613
+ if (level === AUTO_THINKING_ENTRY) {
3614
+ this.enableAutoThinkingMode("v1");
3615
+ return;
3616
+ }
3617
+ if (level === AUTO_V2_THINKING_ENTRY) {
3618
+ this.enableAutoThinkingMode("v2");
3619
+ return;
3620
+ }
3621
+ if (level === AUTO_V3_THINKING_ENTRY) {
3622
+ this.enableAutoThinkingMode("v3");
3623
+ return;
3624
+ }
3625
+ if (level === AUTO_V4_THINKING_ENTRY) {
3626
+ this.enableAutoThinkingMode("v4");
3495
3627
  return;
3496
3628
  }
3497
3629
  this.applyThinkingLevel(level);
3498
3630
  }
3631
+ enableAutoThinkingMode(version) {
3632
+ this.session.setThinkingRouterVersion(version);
3633
+ this.session.setThinkingMode("auto");
3634
+ this.footer.invalidate();
3635
+ this.updateEditorBorderColor();
3636
+ const label = version === "v1"
3637
+ ? AUTO_THINKING_ENTRY
3638
+ : version === "v2"
3639
+ ? AUTO_V2_THINKING_ENTRY
3640
+ : version === "v3"
3641
+ ? AUTO_V3_THINKING_ENTRY
3642
+ : AUTO_V4_THINKING_ENTRY;
3643
+ this.showStatus(`Thinking: ${label} (${version} router, level routed per task)`);
3644
+ }
3499
3645
  applyThinkingLevel(level) {
3646
+ // A concrete level is an explicit user override: always return to manual mode.
3647
+ this.session.setThinkingMode("manual");
3500
3648
  this.session.setThinkingLevel(level);
3501
3649
  this.footer.invalidate();
3502
3650
  this.updateEditorBorderColor();
3503
3651
  this.showStatus(`Thinking: ${this.session.thinkingLevel}`);
3504
3652
  }
3653
+ getThinkingSelectorValue() {
3654
+ if (this.session.thinkingMode !== "auto") {
3655
+ return this.session.thinkingLevel;
3656
+ }
3657
+ if (this.session.thinkingRouterVersion === "v2") {
3658
+ return AUTO_V2_THINKING_ENTRY;
3659
+ }
3660
+ if (this.session.thinkingRouterVersion === "v3") {
3661
+ return AUTO_V3_THINKING_ENTRY;
3662
+ }
3663
+ if (this.session.thinkingRouterVersion === "v4") {
3664
+ return AUTO_V4_THINKING_ENTRY;
3665
+ }
3666
+ return AUTO_THINKING_ENTRY;
3667
+ }
3668
+ getThinkingSelectorLevels() {
3669
+ return [
3670
+ AUTO_THINKING_ENTRY,
3671
+ AUTO_V2_THINKING_ENTRY,
3672
+ AUTO_V3_THINKING_ENTRY,
3673
+ AUTO_V4_THINKING_ENTRY,
3674
+ ...this.session.getAvailableThinkingLevels(),
3675
+ ];
3676
+ }
3505
3677
  async handleModelCommand(searchTerm) {
3506
3678
  if (!searchTerm) {
3507
3679
  this.showModelSelector();
@@ -3578,11 +3750,11 @@ export class InteractiveMode {
3578
3750
  showThinkingSelector() {
3579
3751
  this.showSelector((done) => {
3580
3752
  const selector = new ThinkingSelectorComponent({
3581
- thinkingLevel: this.session.thinkingLevel,
3582
- availableThinkingLevels: this.session.getAvailableThinkingLevels(),
3753
+ thinkingLevel: this.getThinkingSelectorValue(),
3754
+ availableThinkingLevels: this.getThinkingSelectorLevels(),
3583
3755
  }, {
3584
3756
  onThinkingLevelChange: (level) => {
3585
- this.applyThinkingLevel(level);
3757
+ this.applyThinkingSelection(level);
3586
3758
  },
3587
3759
  onSelectComplete: () => {
3588
3760
  done();
@@ -4656,8 +4828,8 @@ export class InteractiveMode {
4656
4828
  | \`${dequeue}\` | Restore queued messages |
4657
4829
  | \`${pasteImage}\` | Paste image from clipboard |
4658
4830
  | \`/\` | Slash commands |
4659
- | \`!\` | Run bash command |
4660
- | \`!!\` | Run bash command (excluded from context) |
4831
+ | \`!\` | Skills/bash launcher |
4832
+ | \`!!\` | Bash command (excluded from context) |
4661
4833
  `;
4662
4834
  // Add extension-registered shortcuts
4663
4835
  const extensionRunner = this.session.extensionRunner;
@@ -4843,6 +5015,8 @@ export class InteractiveMode {
4843
5015
  this.loadingAnimation = undefined;
4844
5016
  }
4845
5017
  this.clearExtensionTerminalInputListeners();
5018
+ disposeComponent(this.builtInHeader);
5019
+ disposeComponent(this.customHeader);
4846
5020
  this.footer.dispose();
4847
5021
  this.footerDataProvider.dispose();
4848
5022
  if (this.metricsTimer) {