open-multi-agent-kit 0.90.0 → 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 (168) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +20 -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/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/bang-skill-invocation.d.ts +26 -0
  12. package/dist/core/bang-skill-invocation.d.ts.map +1 -0
  13. package/dist/core/bang-skill-invocation.js +59 -0
  14. package/dist/core/bang-skill-invocation.js.map +1 -0
  15. package/dist/core/compactor.d.ts.map +1 -1
  16. package/dist/core/compactor.js +0 -3
  17. package/dist/core/compactor.js.map +1 -1
  18. package/dist/core/context-budget-governor-v2.d.ts +2 -1
  19. package/dist/core/context-budget-governor-v2.d.ts.map +1 -1
  20. package/dist/core/context-budget-governor-v2.js +1 -0
  21. package/dist/core/context-budget-governor-v2.js.map +1 -1
  22. package/dist/core/context-budget-headroom-types.d.ts +8 -0
  23. package/dist/core/context-budget-headroom-types.d.ts.map +1 -1
  24. package/dist/core/context-budget-headroom-types.js.map +1 -1
  25. package/dist/core/context-budget-headroom.d.ts +1 -1
  26. package/dist/core/context-budget-headroom.d.ts.map +1 -1
  27. package/dist/core/context-budget-headroom.js +17 -4
  28. package/dist/core/context-budget-headroom.js.map +1 -1
  29. package/dist/core/context-budget-system-prompt.d.ts +2 -1
  30. package/dist/core/context-budget-system-prompt.d.ts.map +1 -1
  31. package/dist/core/context-budget-system-prompt.js +6 -1
  32. package/dist/core/context-budget-system-prompt.js.map +1 -1
  33. package/dist/core/context-budget-v2-cache-hash.d.ts +3 -0
  34. package/dist/core/context-budget-v2-cache-hash.d.ts.map +1 -0
  35. package/dist/core/context-budget-v2-cache-hash.js +16 -0
  36. package/dist/core/context-budget-v2-cache-hash.js.map +1 -0
  37. package/dist/core/context-budget-v2-cache-keys.d.ts +58 -0
  38. package/dist/core/context-budget-v2-cache-keys.d.ts.map +1 -0
  39. package/dist/core/context-budget-v2-cache-keys.js +128 -0
  40. package/dist/core/context-budget-v2-cache-keys.js.map +1 -0
  41. package/dist/core/context-budget-v2-cache-provider.d.ts +23 -0
  42. package/dist/core/context-budget-v2-cache-provider.d.ts.map +1 -0
  43. package/dist/core/context-budget-v2-cache-provider.js +29 -0
  44. package/dist/core/context-budget-v2-cache-provider.js.map +1 -0
  45. package/dist/core/context-budget-v2-cache-telemetry.d.ts +36 -0
  46. package/dist/core/context-budget-v2-cache-telemetry.d.ts.map +1 -0
  47. package/dist/core/context-budget-v2-cache-telemetry.js +64 -0
  48. package/dist/core/context-budget-v2-cache-telemetry.js.map +1 -0
  49. package/dist/core/context-budget-v2-cache-validation.d.ts +36 -0
  50. package/dist/core/context-budget-v2-cache-validation.d.ts.map +1 -0
  51. package/dist/core/context-budget-v2-cache-validation.js +98 -0
  52. package/dist/core/context-budget-v2-cache-validation.js.map +1 -0
  53. package/dist/core/context-budget-v2-cache.d.ts +36 -0
  54. package/dist/core/context-budget-v2-cache.d.ts.map +1 -0
  55. package/dist/core/context-budget-v2-cache.js +50 -0
  56. package/dist/core/context-budget-v2-cache.js.map +1 -0
  57. package/dist/core/context-budget-v2-plan-cache-keys.d.ts +16 -0
  58. package/dist/core/context-budget-v2-plan-cache-keys.d.ts.map +1 -0
  59. package/dist/core/context-budget-v2-plan-cache-keys.js +49 -0
  60. package/dist/core/context-budget-v2-plan-cache-keys.js.map +1 -0
  61. package/dist/core/context-budget-v2-planner.d.ts.map +1 -1
  62. package/dist/core/context-budget-v2-planner.js +55 -2
  63. package/dist/core/context-budget-v2-planner.js.map +1 -1
  64. package/dist/core/context-budget-v2-representation-cache.d.ts +27 -0
  65. package/dist/core/context-budget-v2-representation-cache.d.ts.map +1 -0
  66. package/dist/core/context-budget-v2-representation-cache.js +173 -0
  67. package/dist/core/context-budget-v2-representation-cache.js.map +1 -0
  68. package/dist/core/context-budget-v2-selection.d.ts +2 -0
  69. package/dist/core/context-budget-v2-selection.d.ts.map +1 -1
  70. package/dist/core/context-budget-v2-selection.js +12 -2
  71. package/dist/core/context-budget-v2-selection.js.map +1 -1
  72. package/dist/core/context-budget-v2-types.d.ts +107 -1
  73. package/dist/core/context-budget-v2-types.d.ts.map +1 -1
  74. package/dist/core/context-budget-v2-types.js.map +1 -1
  75. package/dist/core/headroom.d.ts.map +1 -1
  76. package/dist/core/headroom.js +0 -4
  77. package/dist/core/headroom.js.map +1 -1
  78. package/dist/core/hook-inventory.d.ts.map +1 -1
  79. package/dist/core/hook-inventory.js +6 -0
  80. package/dist/core/hook-inventory.js.map +1 -1
  81. package/dist/core/mcp-computer-use-presets.d.ts +64 -0
  82. package/dist/core/mcp-computer-use-presets.d.ts.map +1 -0
  83. package/dist/core/mcp-computer-use-presets.js +158 -0
  84. package/dist/core/mcp-computer-use-presets.js.map +1 -0
  85. package/dist/core/mcp-public-presets.d.ts +578 -0
  86. package/dist/core/mcp-public-presets.d.ts.map +1 -0
  87. package/dist/core/mcp-public-presets.js +647 -0
  88. package/dist/core/mcp-public-presets.js.map +1 -0
  89. package/dist/core/model-registry.d.ts.map +1 -1
  90. package/dist/core/model-registry.js +1 -0
  91. package/dist/core/model-registry.js.map +1 -1
  92. package/dist/core/pi-package-intake-candidates.d.ts +14 -1
  93. package/dist/core/pi-package-intake-candidates.d.ts.map +1 -1
  94. package/dist/core/pi-package-intake-candidates.js +182 -0
  95. package/dist/core/pi-package-intake-candidates.js.map +1 -1
  96. package/dist/core/pi-package-intake.d.ts +8 -1
  97. package/dist/core/pi-package-intake.d.ts.map +1 -1
  98. package/dist/core/pi-package-intake.js +14 -4
  99. package/dist/core/pi-package-intake.js.map +1 -1
  100. package/dist/core/reverse-skill.d.ts +2 -0
  101. package/dist/core/reverse-skill.d.ts.map +1 -0
  102. package/dist/core/reverse-skill.js +7 -0
  103. package/dist/core/reverse-skill.js.map +1 -0
  104. package/dist/core/settings-manager.d.ts +3 -3
  105. package/dist/core/settings-manager.d.ts.map +1 -1
  106. package/dist/core/settings-manager.js.map +1 -1
  107. package/dist/core/system-prompt.d.ts +2 -0
  108. package/dist/core/system-prompt.d.ts.map +1 -1
  109. package/dist/core/system-prompt.js +58 -5
  110. package/dist/core/system-prompt.js.map +1 -1
  111. package/dist/index.d.ts +1 -0
  112. package/dist/index.d.ts.map +1 -1
  113. package/dist/index.js +1 -0
  114. package/dist/index.js.map +1 -1
  115. package/dist/migrations.d.ts +19 -0
  116. package/dist/migrations.d.ts.map +1 -1
  117. package/dist/migrations.js +39 -15
  118. package/dist/migrations.js.map +1 -1
  119. package/dist/modes/interactive/components/control-panel-box.d.ts +3 -3
  120. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
  121. package/dist/modes/interactive/components/control-panel-box.js +10 -10
  122. package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
  123. package/dist/modes/interactive/components/control-panel-gradient-motion.d.ts.map +1 -1
  124. package/dist/modes/interactive/components/control-panel-gradient-motion.js +2 -1
  125. package/dist/modes/interactive/components/control-panel-gradient-motion.js.map +1 -1
  126. package/dist/modes/interactive/components/control-panel-layout.d.ts +15 -1
  127. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  128. package/dist/modes/interactive/components/control-panel-layout.js +212 -68
  129. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  130. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
  131. package/dist/modes/interactive/components/control-panel-runtime-status.js +10 -0
  132. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
  133. package/dist/modes/interactive/components/control-panel-sparkles.d.ts +27 -0
  134. package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -0
  135. package/dist/modes/interactive/components/control-panel-sparkles.js +42 -0
  136. package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -0
  137. package/dist/modes/interactive/components/control-panel.d.ts +8 -0
  138. package/dist/modes/interactive/components/control-panel.d.ts.map +1 -1
  139. package/dist/modes/interactive/components/control-panel.js +40 -8
  140. package/dist/modes/interactive/components/control-panel.js.map +1 -1
  141. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  142. package/dist/modes/interactive/components/settings-selector.js +2 -1
  143. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  144. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  145. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  146. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  147. package/dist/modes/interactive/interactive-mode.d.ts +2 -0
  148. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  149. package/dist/modes/interactive/interactive-mode.js +63 -14
  150. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  151. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  152. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  153. package/dist/modes/interactive/theme/theme.js +2 -0
  154. package/dist/modes/interactive/theme/theme.js.map +1 -1
  155. package/docs/skills.md +8 -4
  156. package/docs/usage.md +4 -3
  157. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  158. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  159. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  160. package/examples/extensions/gondolin/package-lock.json +2 -2
  161. package/examples/extensions/gondolin/package.json +1 -1
  162. package/examples/extensions/preset.ts +2 -2
  163. package/examples/extensions/sandbox/package-lock.json +2 -2
  164. package/examples/extensions/sandbox/package.json +1 -1
  165. package/examples/extensions/with-deps/package-lock.json +2 -2
  166. package/examples/extensions/with-deps/package.json +1 -1
  167. package/npm-shrinkwrap.json +27 -34
  168. 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,10 +523,11 @@ 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,
@@ -525,9 +535,27 @@ export class InteractiveMode {
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
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);
@@ -2050,7 +2078,7 @@ export class InteractiveMode {
2050
2078
  this.defaultEditor.onAction("app.session.resume", () => this.showSessionSelector());
2051
2079
  this.defaultEditor.onChange = (text) => {
2052
2080
  const wasBashMode = this.isBashMode;
2053
- this.isBashMode = text.trimStart().startsWith("!");
2081
+ this.isBashMode = this.isBangBashInput(text);
2054
2082
  if (wasBashMode !== this.isBashMode) {
2055
2083
  this.updateEditorBorderColor();
2056
2084
  }
@@ -2080,6 +2108,18 @@ export class InteractiveMode {
2080
2108
  // Silently ignore clipboard errors (may not have permission, etc.)
2081
2109
  }
2082
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
+ }
2083
2123
  setupEditorSubmitHandler() {
2084
2124
  this.defaultEditor.onSubmit = async (text) => {
2085
2125
  text = text.trim();
@@ -2214,18 +2254,25 @@ export class InteractiveMode {
2214
2254
  await this.shutdown();
2215
2255
  return;
2216
2256
  }
2217
- // Handle bash command (! for normal, !! for excluded from context)
2218
2257
  if (text.startsWith("!")) {
2219
- const isExcluded = text.startsWith("!!");
2220
- const command = isExcluded ? text.slice(2).trim() : text.slice(1).trim();
2221
- 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") {
2222
2269
  if (this.session.isBashRunning) {
2223
2270
  this.showWarning("A bash command is already running. Press Esc to cancel it first.");
2224
2271
  this.editor.setText(text);
2225
2272
  return;
2226
2273
  }
2227
2274
  this.editor.addToHistory?.(text);
2228
- await this.handleBashCommand(command, isExcluded);
2275
+ await this.handleBashCommand(bangInvocation.command, !bangInvocation.includeContext);
2229
2276
  this.isBashMode = false;
2230
2277
  this.updateEditorBorderColor();
2231
2278
  return;
@@ -4656,8 +4703,8 @@ export class InteractiveMode {
4656
4703
  | \`${dequeue}\` | Restore queued messages |
4657
4704
  | \`${pasteImage}\` | Paste image from clipboard |
4658
4705
  | \`/\` | Slash commands |
4659
- | \`!\` | Run bash command |
4660
- | \`!!\` | Run bash command (excluded from context) |
4706
+ | \`!\` | Skills/bash launcher |
4707
+ | \`!!\` | Bash command (excluded from context) |
4661
4708
  `;
4662
4709
  // Add extension-registered shortcuts
4663
4710
  const extensionRunner = this.session.extensionRunner;
@@ -4843,6 +4890,8 @@ export class InteractiveMode {
4843
4890
  this.loadingAnimation = undefined;
4844
4891
  }
4845
4892
  this.clearExtensionTerminalInputListeners();
4893
+ disposeComponent(this.builtInHeader);
4894
+ disposeComponent(this.customHeader);
4846
4895
  this.footer.dispose();
4847
4896
  this.footerDataProvider.dispose();
4848
4897
  if (this.metricsTimer) {