open-multi-agent-kit 0.80.8 → 0.90.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +21 -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 +2 -7
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/core/agent-session.d.ts +2 -0
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +41 -5
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/automation/index.d.ts +359 -0
  12. package/dist/core/automation/index.d.ts.map +1 -0
  13. package/dist/core/automation/index.js +665 -0
  14. package/dist/core/automation/index.js.map +1 -0
  15. package/dist/core/bang-skill-invocation.d.ts +26 -0
  16. package/dist/core/bang-skill-invocation.d.ts.map +1 -0
  17. package/dist/core/bang-skill-invocation.js +59 -0
  18. package/dist/core/bang-skill-invocation.js.map +1 -0
  19. package/dist/core/browser-use.d.ts +8 -0
  20. package/dist/core/browser-use.d.ts.map +1 -1
  21. package/dist/core/browser-use.js +61 -23
  22. package/dist/core/browser-use.js.map +1 -1
  23. package/dist/core/compactor.d.ts.map +1 -1
  24. package/dist/core/compactor.js +0 -3
  25. package/dist/core/compactor.js.map +1 -1
  26. package/dist/core/context-budget-governor-v2.d.ts +2 -1
  27. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  28. package/dist/core/context-budget-governor-v2.js +1 -0
  29. package/dist/core/context-budget-governor-v2.js.map +1 -1
  30. package/dist/core/context-budget-headroom-types.d.ts +8 -0
  31. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  32. package/dist/core/context-budget-headroom-types.js.map +1 -1
  33. package/dist/core/context-budget-headroom.d.ts +1 -1
  34. package/dist/core/context-budget-headroom.d.ts.map +1 -1
  35. package/dist/core/context-budget-headroom.js +17 -4
  36. package/dist/core/context-budget-headroom.js.map +1 -1
  37. package/dist/core/context-budget-system-prompt.d.ts +2 -1
  38. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  39. package/dist/core/context-budget-system-prompt.js +6 -1
  40. package/dist/core/context-budget-system-prompt.js.map +1 -1
  41. package/dist/core/context-budget-v2-cache-hash.d.ts +3 -0
  42. package/dist/core/context-budget-v2-cache-hash.d.ts.map +1 -0
  43. package/dist/core/context-budget-v2-cache-hash.js +16 -0
  44. package/dist/core/context-budget-v2-cache-hash.js.map +1 -0
  45. package/dist/core/context-budget-v2-cache-keys.d.ts +58 -0
  46. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -0
  47. package/dist/core/context-budget-v2-cache-keys.js +128 -0
  48. package/dist/core/context-budget-v2-cache-keys.js.map +1 -0
  49. package/dist/core/context-budget-v2-cache-provider.d.ts +23 -0
  50. package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -0
  51. package/dist/core/context-budget-v2-cache-provider.js +29 -0
  52. package/dist/core/context-budget-v2-cache-provider.js.map +1 -0
  53. package/dist/core/context-budget-v2-cache-telemetry.d.ts +36 -0
  54. package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -0
  55. package/dist/core/context-budget-v2-cache-telemetry.js +64 -0
  56. package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -0
  57. package/dist/core/context-budget-v2-cache-validation.d.ts +36 -0
  58. package/dist/core/context-budget-v2-cache-validation.d.ts.map +1 -0
  59. package/dist/core/context-budget-v2-cache-validation.js +98 -0
  60. package/dist/core/context-budget-v2-cache-validation.js.map +1 -0
  61. package/dist/core/context-budget-v2-cache.d.ts +36 -0
  62. package/dist/core/context-budget-v2-cache.d.ts.map +1 -0
  63. package/dist/core/context-budget-v2-cache.js +50 -0
  64. package/dist/core/context-budget-v2-cache.js.map +1 -0
  65. package/dist/core/context-budget-v2-plan-cache-keys.d.ts +16 -0
  66. package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -0
  67. package/dist/core/context-budget-v2-plan-cache-keys.js +49 -0
  68. package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -0
  69. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  70. package/dist/core/context-budget-v2-planner.js +55 -2
  71. package/dist/core/context-budget-v2-planner.js.map +1 -1
  72. package/dist/core/context-budget-v2-representation-cache.d.ts +27 -0
  73. package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -0
  74. package/dist/core/context-budget-v2-representation-cache.js +173 -0
  75. package/dist/core/context-budget-v2-representation-cache.js.map +1 -0
  76. package/dist/core/context-budget-v2-selection.d.ts +2 -0
  77. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  78. package/dist/core/context-budget-v2-selection.js +12 -2
  79. package/dist/core/context-budget-v2-selection.js.map +1 -1
  80. package/dist/core/context-budget-v2-types.d.ts +107 -1
  81. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  82. package/dist/core/context-budget-v2-types.js.map +1 -1
  83. package/dist/core/diagnostics.d.ts +2 -0
  84. package/dist/core/diagnostics.d.ts.map +1 -1
  85. package/dist/core/diagnostics.js.map +1 -1
  86. package/dist/core/extensions/builtin/todo-checklist.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/todo-checklist.js +3 -0
  88. package/dist/core/extensions/builtin/todo-checklist.js.map +1 -1
  89. package/dist/core/footer-data-provider.d.ts +3 -1
  90. package/dist/core/footer-data-provider.d.ts.map +1 -1
  91. package/dist/core/footer-data-provider.js +4 -0
  92. package/dist/core/footer-data-provider.js.map +1 -1
  93. package/dist/core/headroom.d.ts.map +1 -1
  94. package/dist/core/headroom.js +0 -4
  95. package/dist/core/headroom.js.map +1 -1
  96. package/dist/core/hook-inventory.d.ts.map +1 -1
  97. package/dist/core/hook-inventory.js +6 -0
  98. package/dist/core/hook-inventory.js.map +1 -1
  99. package/dist/core/mcp-computer-use-presets.d.ts +64 -0
  100. package/dist/core/mcp-computer-use-presets.d.ts.map +1 -0
  101. package/dist/core/mcp-computer-use-presets.js +158 -0
  102. package/dist/core/mcp-computer-use-presets.js.map +1 -0
  103. package/dist/core/mcp-public-presets.d.ts +578 -0
  104. package/dist/core/mcp-public-presets.d.ts.map +1 -0
  105. package/dist/core/mcp-public-presets.js +647 -0
  106. package/dist/core/mcp-public-presets.js.map +1 -0
  107. package/dist/core/model-registry.d.ts.map +1 -1
  108. package/dist/core/model-registry.js +1 -0
  109. package/dist/core/model-registry.js.map +1 -1
  110. package/dist/core/model-resolver.d.ts.map +1 -1
  111. package/dist/core/model-resolver.js +1 -0
  112. package/dist/core/model-resolver.js.map +1 -1
  113. package/dist/core/pi-package-intake-candidates.d.ts +34 -0
  114. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -0
  115. package/dist/core/pi-package-intake-candidates.js +291 -0
  116. package/dist/core/pi-package-intake-candidates.js.map +1 -0
  117. package/dist/core/pi-package-intake.d.ts +50 -0
  118. package/dist/core/pi-package-intake.d.ts.map +1 -0
  119. package/dist/core/pi-package-intake.js +132 -0
  120. package/dist/core/pi-package-intake.js.map +1 -0
  121. package/dist/core/provider-display-names.d.ts.map +1 -1
  122. package/dist/core/provider-display-names.js +1 -0
  123. package/dist/core/provider-display-names.js.map +1 -1
  124. package/dist/core/resource-loader.d.ts.map +1 -1
  125. package/dist/core/resource-loader.js +1 -0
  126. package/dist/core/resource-loader.js.map +1 -1
  127. package/dist/core/reverse-skill.d.ts +2 -0
  128. package/dist/core/reverse-skill.d.ts.map +1 -0
  129. package/dist/core/reverse-skill.js +7 -0
  130. package/dist/core/reverse-skill.js.map +1 -0
  131. package/dist/core/settings-manager.d.ts +3 -3
  132. package/dist/core/settings-manager.d.ts.map +1 -1
  133. package/dist/core/settings-manager.js.map +1 -1
  134. package/dist/core/skills.d.ts +4 -0
  135. package/dist/core/skills.d.ts.map +1 -1
  136. package/dist/core/skills.js +115 -43
  137. package/dist/core/skills.js.map +1 -1
  138. package/dist/core/system-prompt.d.ts +2 -0
  139. package/dist/core/system-prompt.d.ts.map +1 -1
  140. package/dist/core/system-prompt.js +58 -5
  141. package/dist/core/system-prompt.js.map +1 -1
  142. package/dist/core/todo-runtime-state.d.ts +5 -0
  143. package/dist/core/todo-runtime-state.d.ts.map +1 -0
  144. package/dist/core/todo-runtime-state.js +12 -0
  145. package/dist/core/todo-runtime-state.js.map +1 -0
  146. package/dist/index.d.ts +2 -0
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +2 -0
  149. package/dist/index.js.map +1 -1
  150. package/dist/migrations.d.ts +19 -0
  151. package/dist/migrations.d.ts.map +1 -1
  152. package/dist/migrations.js +39 -15
  153. package/dist/migrations.js.map +1 -1
  154. package/dist/modes/interactive/components/control-panel-box.d.ts +3 -3
  155. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
  156. package/dist/modes/interactive/components/control-panel-box.js +10 -10
  157. package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
  158. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  159. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -1
  160. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  161. package/dist/modes/interactive/components/control-panel-layout.d.ts +22 -1
  162. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  163. package/dist/modes/interactive/components/control-panel-layout.js +244 -68
  164. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  165. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +2 -1
  166. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
  167. package/dist/modes/interactive/components/control-panel-runtime-status.js +20 -1
  168. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
  169. package/dist/modes/interactive/components/control-panel-sparkles.d.ts +27 -0
  170. package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -0
  171. package/dist/modes/interactive/components/control-panel-sparkles.js +42 -0
  172. package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -0
  173. package/dist/modes/interactive/components/control-panel.d.ts +9 -0
  174. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  175. package/dist/modes/interactive/components/control-panel.js +50 -6
  176. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  177. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  178. package/dist/modes/interactive/components/footer.js +6 -0
  179. package/dist/modes/interactive/components/footer.js.map +1 -1
  180. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  181. package/dist/modes/interactive/components/settings-selector.js +2 -1
  182. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  183. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  184. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  185. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  186. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  187. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  188. package/dist/modes/interactive/interactive-mode.js +70 -15
  189. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  190. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  191. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  192. package/dist/modes/interactive/theme/theme.js +5 -0
  193. package/dist/modes/interactive/theme/theme.js.map +1 -1
  194. package/docs/providers.md +12 -0
  195. package/docs/skills.md +8 -4
  196. package/docs/usage.md +4 -3
  197. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  198. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  199. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  200. package/examples/extensions/gondolin/package-lock.json +2 -2
  201. package/examples/extensions/gondolin/package.json +1 -1
  202. package/examples/extensions/preset.ts +2 -2
  203. package/examples/extensions/sandbox/package-lock.json +2 -2
  204. package/examples/extensions/sandbox/package.json +1 -1
  205. package/examples/extensions/with-deps/package-lock.json +2 -2
  206. package/examples/extensions/with-deps/package.json +1 -1
  207. package/npm-shrinkwrap.json +27 -34
  208. package/package.json +5 -5
@@ -14,6 +14,7 @@ import { CombinedAutocompleteProvider, Container, fuzzyFilter, getCapabilities,
14
14
  import { APP_NAME, APP_TITLE, getAgentDir, getAuthPath, getDebugLogPath, getDocsPath, getShareViewerUrl, VERSION, } from "../../config.js";
15
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;
@@ -193,7 +203,6 @@ export class InteractiveMode {
193
203
  // Agent subscription unsubscribe function
194
204
  unsubscribe;
195
205
  signalCleanupHandlers = [];
196
- // Track if editor is in bash mode (text starts with !)
197
206
  isBashMode = false;
198
207
  // Track current bash execution component
199
208
  bashComponent = undefined;
@@ -503,8 +512,8 @@ export class InteractiveMode {
503
512
  hint("app.thinking.toggle", "to expand thinking"),
504
513
  hint("app.editor.external", "for external editor"),
505
514
  rawKeyHint("/", "for commands"),
506
- rawKeyHint("!", "to run bash"),
507
- rawKeyHint("!!", "to run bash (no context)"),
515
+ rawKeyHint("!", "skills/bash"),
516
+ rawKeyHint("!!", "bash(no ctx)"),
508
517
  hint("app.message.followUp", "to queue follow-up"),
509
518
  hint("app.message.dequeue", "to edit all queued messages"),
510
519
  hint("app.clipboard.pasteImage", "to paste image"),
@@ -514,20 +523,39 @@ export class InteractiveMode {
514
523
  hint("app.interrupt", "interrupt"),
515
524
  rawKeyHint(`${keyText("app.clear")}/${keyText("app.exit")}`, "clear/exit"),
516
525
  rawKeyHint("/", "commands"),
517
- rawKeyHint("!", "bash"),
526
+ rawKeyHint("!", "skills/bash"),
527
+ rawKeyHint("!!", "bash(no ctx)"),
518
528
  hint("app.tools.expand", "more"),
519
529
  ].join(theme.fg("muted", " · "));
520
- const controlPanel = new ControlPanelComponent({
530
+ const controlPanelContent = {
521
531
  appName: APP_NAME,
522
532
  version: this.version,
523
533
  compactInstructions,
524
534
  expandedInstructions,
525
535
  compactOnboarding: () => `Press ${keyText("app.tools.expand")} to show full startup help and loaded resources.`,
526
536
  onboarding: () => `OMK can explain its own features and look up its docs. Ask it how to use or extend OMK.`,
527
- statusSnapshot: () => createControlPanelStatusSnapshot(this.session, this.sessionManager),
537
+ statusSnapshot: () => createControlPanelStatusSnapshot(this.session, this.sessionManager, this.footerDataProvider),
538
+ };
539
+ const controlPanel = new ControlPanelComponent(controlPanelContent, {
540
+ requestRender: () => this.ui.requestRender(),
541
+ isTTY: () => process.stdout.isTTY === true,
542
+ isReducedMotion: () => process.env.OMK_REDUCED_MOTION === "1" || process.env.OMK_REDUCE_MOTION === "1",
543
+ isIdleDriftEnabled: () => process.env.OMK_CONTROL_IDLE_DRIFT !== "0",
544
+ isHeaderVisibleHint: () => this.customHeader === undefined,
545
+ getRenderWidth: () => this.ui.terminal.columns,
528
546
  });
529
547
  controlPanel.setExpanded(this.getStartupExpansionState());
530
548
  this.builtInHeader = controlPanel;
549
+ this.ui.showOverlay(new ControlPanelRightPaneComponent(controlPanelContent), {
550
+ anchor: "top-right",
551
+ width: CONTROL_PANEL_SIDEBAR_WIDTH,
552
+ maxHeight: "100%",
553
+ nonCapturing: true,
554
+ visible: (termWidth, termHeight) => this.customHeader === undefined &&
555
+ this.toolOutputExpanded &&
556
+ termWidth >= CONTROL_PANEL_OVERLAY_MIN_WIDTH &&
557
+ termHeight >= 12,
558
+ });
531
559
  // Setup UI layout
532
560
  this.headerContainer.addChild(new Spacer(1));
533
561
  this.headerContainer.addChild(this.builtInHeader);
@@ -1043,6 +1071,12 @@ export class InteractiveMode {
1043
1071
  scope: d.collision.loserScope,
1044
1072
  origin: d.collision.loserOrigin,
1045
1073
  })} (skipped)`));
1074
+ if (d.collision.resolutionReason) {
1075
+ lines.push(theme.fg("dim", ` reason: ${d.collision.resolutionReason}`));
1076
+ }
1077
+ if (d.collision.resolutionAction) {
1078
+ lines.push(theme.fg("dim", ` action: ${d.collision.resolutionAction}`));
1079
+ }
1046
1080
  }
1047
1081
  }
1048
1082
  }
@@ -2044,7 +2078,7 @@ export class InteractiveMode {
2044
2078
  this.defaultEditor.onAction("app.session.resume", () => this.showSessionSelector());
2045
2079
  this.defaultEditor.onChange = (text) => {
2046
2080
  const wasBashMode = this.isBashMode;
2047
- this.isBashMode = text.trimStart().startsWith("!");
2081
+ this.isBashMode = this.isBangBashInput(text);
2048
2082
  if (wasBashMode !== this.isBashMode) {
2049
2083
  this.updateEditorBorderColor();
2050
2084
  }
@@ -2074,6 +2108,18 @@ export class InteractiveMode {
2074
2108
  // Silently ignore clipboard errors (may not have permission, etc.)
2075
2109
  }
2076
2110
  }
2111
+ parseBangInput(text) {
2112
+ return parseBangInvocation(text.trim(), {
2113
+ hasSkill: (name) => this.session.resourceLoader.getSkills().skills.some((skill) => skill.name === name),
2114
+ });
2115
+ }
2116
+ isBangBashInput(text) {
2117
+ const trimmed = text.trimStart();
2118
+ if (!trimmed.startsWith("!")) {
2119
+ return false;
2120
+ }
2121
+ return this.parseBangInput(trimmed).kind === "bash";
2122
+ }
2077
2123
  setupEditorSubmitHandler() {
2078
2124
  this.defaultEditor.onSubmit = async (text) => {
2079
2125
  text = text.trim();
@@ -2208,18 +2254,25 @@ export class InteractiveMode {
2208
2254
  await this.shutdown();
2209
2255
  return;
2210
2256
  }
2211
- // Handle bash command (! for normal, !! for excluded from context)
2212
2257
  if (text.startsWith("!")) {
2213
- const isExcluded = text.startsWith("!!");
2214
- const command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();
2215
- if (command) {
2258
+ const bangInvocation = parseBangInvocation(text, {
2259
+ hasSkill: (name) => this.session.resourceLoader.getSkills().skills.some((skill) => skill.name === name),
2260
+ });
2261
+ if (bangInvocation.kind === "unknownSkill") {
2262
+ this.showWarning(`Unknown skill: ${bangInvocation.skillName}`);
2263
+ this.editor.setText(text);
2264
+ this.isBashMode = false;
2265
+ this.updateEditorBorderColor();
2266
+ return;
2267
+ }
2268
+ if (bangInvocation.kind === "bash") {
2216
2269
  if (this.session.isBashRunning) {
2217
2270
  this.showWarning("A bash command is already running. Press Esc to cancel it first.");
2218
2271
  this.editor.setText(text);
2219
2272
  return;
2220
2273
  }
2221
2274
  this.editor.addToHistory?.(text);
2222
- await this.handleBashCommand(command, isExcluded);
2275
+ await this.handleBashCommand(bangInvocation.command, !bangInvocation.includeContext);
2223
2276
  this.isBashMode = false;
2224
2277
  this.updateEditorBorderColor();
2225
2278
  return;
@@ -4650,8 +4703,8 @@ export class InteractiveMode {
4650
4703
  | \`${dequeue}\` | Restore queued messages |
4651
4704
  | \`${pasteImage}\` | Paste image from clipboard |
4652
4705
  | \`/\` | Slash commands |
4653
- | \`!\` | Run bash command |
4654
- | \`!!\` | Run bash command (excluded from context) |
4706
+ | \`!\` | Skills/bash launcher |
4707
+ | \`!!\` | Bash command (excluded from context) |
4655
4708
  `;
4656
4709
  // Add extension-registered shortcuts
4657
4710
  const extensionRunner = this.session.extensionRunner;
@@ -4837,6 +4890,8 @@ export class InteractiveMode {
4837
4890
  this.loadingAnimation = undefined;
4838
4891
  }
4839
4892
  this.clearExtensionTerminalInputListeners();
4893
+ disposeComponent(this.builtInHeader);
4894
+ disposeComponent(this.customHeader);
4840
4895
  this.footer.dispose();
4841
4896
  this.footerDataProvider.dispose();
4842
4897
  if (this.metricsTimer) {