open-multi-agent-kit 0.91.0 → 0.93.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 (168) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/README.md +2 -2
  3. package/dist/core/agent-session.d.ts +29 -0
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +89 -21
  6. package/dist/core/agent-session.js.map +1 -1
  7. package/dist/core/command-safety.d.ts.map +1 -1
  8. package/dist/core/command-safety.js +0 -50
  9. package/dist/core/command-safety.js.map +1 -1
  10. package/dist/core/compaction/branch-summarization.d.ts +5 -1
  11. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  12. package/dist/core/compaction/branch-summarization.js +5 -7
  13. package/dist/core/compaction/branch-summarization.js.map +1 -1
  14. package/dist/core/compaction/compaction.d.ts +12 -3
  15. package/dist/core/compaction/compaction.d.ts.map +1 -1
  16. package/dist/core/compaction/compaction.js +28 -15
  17. package/dist/core/compaction/compaction.js.map +1 -1
  18. package/dist/core/compaction/transaction.d.ts.map +1 -1
  19. package/dist/core/compaction/transaction.js +7 -3
  20. package/dist/core/compaction/transaction.js.map +1 -1
  21. package/dist/core/context-budget-headroom-candidates.d.ts.map +1 -1
  22. package/dist/core/context-budget-headroom-candidates.js +21 -11
  23. package/dist/core/context-budget-headroom-candidates.js.map +1 -1
  24. package/dist/core/context-budget-system-prompt-items.d.ts +1 -0
  25. package/dist/core/context-budget-system-prompt-items.d.ts.map +1 -1
  26. package/dist/core/context-budget-system-prompt-items.js +7 -8
  27. package/dist/core/context-budget-system-prompt-items.js.map +1 -1
  28. package/dist/core/extensions/builtin/command-safety-gate.d.ts +8 -0
  29. package/dist/core/extensions/builtin/command-safety-gate.d.ts.map +1 -1
  30. package/dist/core/extensions/builtin/command-safety-gate.js +23 -0
  31. package/dist/core/extensions/builtin/command-safety-gate.js.map +1 -1
  32. package/dist/core/extensions/runner.d.ts.map +1 -1
  33. package/dist/core/extensions/runner.js +4 -0
  34. package/dist/core/extensions/runner.js.map +1 -1
  35. package/dist/core/extensions/types.d.ts +2 -0
  36. package/dist/core/extensions/types.d.ts.map +1 -1
  37. package/dist/core/extensions/types.js.map +1 -1
  38. package/dist/core/keybindings.d.ts +5 -0
  39. package/dist/core/keybindings.d.ts.map +1 -1
  40. package/dist/core/keybindings.js +5 -0
  41. package/dist/core/keybindings.js.map +1 -1
  42. package/dist/core/loadouts.d.ts.map +1 -1
  43. package/dist/core/loadouts.js +27 -48
  44. package/dist/core/loadouts.js.map +1 -1
  45. package/dist/core/model-resolver.d.ts +41 -3
  46. package/dist/core/model-resolver.d.ts.map +1 -1
  47. package/dist/core/model-resolver.js +17 -9
  48. package/dist/core/model-resolver.js.map +1 -1
  49. package/dist/core/provider-resilience.d.ts.map +1 -1
  50. package/dist/core/provider-resilience.js +3 -1
  51. package/dist/core/provider-resilience.js.map +1 -1
  52. package/dist/core/reasoning-router-v4-weights.d.ts.map +1 -1
  53. package/dist/core/reasoning-router-v4-weights.js +9 -3
  54. package/dist/core/reasoning-router-v4-weights.js.map +1 -1
  55. package/dist/core/reasoning-router-v4.d.ts.map +1 -1
  56. package/dist/core/reasoning-router-v4.js +94 -24
  57. package/dist/core/reasoning-router-v4.js.map +1 -1
  58. package/dist/core/resource-loader.d.ts.map +1 -1
  59. package/dist/core/resource-loader.js +11 -5
  60. package/dist/core/resource-loader.js.map +1 -1
  61. package/dist/core/session-file-compaction.d.ts.map +1 -1
  62. package/dist/core/session-file-compaction.js +39 -5
  63. package/dist/core/session-file-compaction.js.map +1 -1
  64. package/dist/core/session-termination.d.ts.map +1 -1
  65. package/dist/core/session-termination.js +1 -1
  66. package/dist/core/session-termination.js.map +1 -1
  67. package/dist/core/settings-manager.d.ts +3 -0
  68. package/dist/core/settings-manager.d.ts.map +1 -1
  69. package/dist/core/settings-manager.js +8 -0
  70. package/dist/core/settings-manager.js.map +1 -1
  71. package/dist/core/system-prompt.d.ts.map +1 -1
  72. package/dist/core/system-prompt.js +36 -31
  73. package/dist/core/system-prompt.js.map +1 -1
  74. package/dist/core/tools/bash.d.ts +2 -0
  75. package/dist/core/tools/bash.d.ts.map +1 -1
  76. package/dist/core/tools/bash.js +38 -11
  77. package/dist/core/tools/bash.js.map +1 -1
  78. package/dist/main.d.ts.map +1 -1
  79. package/dist/main.js +112 -11
  80. package/dist/main.js.map +1 -1
  81. package/dist/modes/interactive/components/control-panel-box.d.ts +27 -0
  82. package/dist/modes/interactive/components/control-panel-box.d.ts.map +1 -1
  83. package/dist/modes/interactive/components/control-panel-box.js +60 -8
  84. package/dist/modes/interactive/components/control-panel-box.js.map +1 -1
  85. package/dist/modes/interactive/components/control-panel-layout.d.ts.map +1 -1
  86. package/dist/modes/interactive/components/control-panel-layout.js +100 -45
  87. package/dist/modes/interactive/components/control-panel-layout.js.map +1 -1
  88. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts +9 -0
  89. package/dist/modes/interactive/components/control-panel-runtime-status.d.ts.map +1 -1
  90. package/dist/modes/interactive/components/control-panel-runtime-status.js +10 -8
  91. package/dist/modes/interactive/components/control-panel-runtime-status.js.map +1 -1
  92. package/dist/modes/interactive/components/control-panel-sparkles.d.ts +5 -0
  93. package/dist/modes/interactive/components/control-panel-sparkles.d.ts.map +1 -1
  94. package/dist/modes/interactive/components/control-panel-sparkles.js +14 -9
  95. package/dist/modes/interactive/components/control-panel-sparkles.js.map +1 -1
  96. package/dist/modes/interactive/components/footer.d.ts +10 -0
  97. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  98. package/dist/modes/interactive/components/footer.js +3 -3
  99. package/dist/modes/interactive/components/footer.js.map +1 -1
  100. package/dist/modes/interactive/components/status-sidebar.d.ts +49 -0
  101. package/dist/modes/interactive/components/status-sidebar.d.ts.map +1 -0
  102. package/dist/modes/interactive/components/status-sidebar.js +253 -0
  103. package/dist/modes/interactive/components/status-sidebar.js.map +1 -0
  104. package/dist/modes/interactive/interactive-mode.d.ts +9 -0
  105. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  106. package/dist/modes/interactive/interactive-mode.js +94 -20
  107. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  108. package/dist/modes/interactive/theme/omk-neon-control.json +13 -13
  109. package/dist/modes/print-mode.d.ts.map +1 -1
  110. package/dist/modes/print-mode.js +9 -0
  111. package/dist/modes/print-mode.js.map +1 -1
  112. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  113. package/dist/modes/rpc/rpc-mode.js +1 -0
  114. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  115. package/dist/utils/clipboard.d.ts.map +1 -1
  116. package/dist/utils/clipboard.js +19 -8
  117. package/dist/utils/clipboard.js.map +1 -1
  118. package/docs/adaptorch-preview-spec.md +174 -0
  119. package/docs/adaptorch-preview.md +1 -1
  120. package/docs/compaction.md +20 -13
  121. package/docs/correctness-wall.md +13 -5
  122. package/docs/custom-provider.md +8 -8
  123. package/docs/development.md +2 -2
  124. package/docs/docs.json +4 -0
  125. package/docs/environment-variables.md +90 -0
  126. package/docs/extensions.md +8 -8
  127. package/docs/index.md +1 -0
  128. package/docs/json.md +4 -4
  129. package/docs/providers.md +1 -1
  130. package/docs/rpc.md +5 -2
  131. package/docs/session-format.md +5 -5
  132. package/docs/settings.md +1 -0
  133. package/docs/skills.md +2 -0
  134. package/docs/themes.md +2 -2
  135. package/docs/tui.md +4 -4
  136. package/docs/usage.md +4 -0
  137. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  138. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  139. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  140. package/examples/extensions/gondolin/package-lock.json +2 -2
  141. package/examples/extensions/gondolin/package.json +1 -1
  142. package/examples/extensions/sandbox/package-lock.json +2 -2
  143. package/examples/extensions/sandbox/package.json +1 -1
  144. package/examples/extensions/subagent/README.md +35 -10
  145. package/examples/extensions/subagent/adaptive-agent-runtime.test.ts +234 -0
  146. package/examples/extensions/subagent/adaptive-agent-runtime.ts +240 -0
  147. package/examples/extensions/subagent/adaptive-result.ts +112 -0
  148. package/examples/extensions/subagent/agents.test.ts +86 -0
  149. package/examples/extensions/subagent/agents.ts +18 -4
  150. package/examples/extensions/subagent/capabilities.ts +15 -1
  151. package/examples/extensions/subagent/checkpoint-runtime.test.ts +125 -0
  152. package/examples/extensions/subagent/checkpoint-runtime.ts +198 -0
  153. package/examples/extensions/subagent/deadline-budget.test.ts +135 -0
  154. package/examples/extensions/subagent/deadline-budget.ts +242 -0
  155. package/examples/extensions/subagent/deadline-profile-store.test.ts +72 -0
  156. package/examples/extensions/subagent/deadline-profile-store.ts +172 -0
  157. package/examples/extensions/subagent/domain-profiles.ts +272 -0
  158. package/examples/extensions/subagent/fixtures/fake-omk-json.mjs +13 -0
  159. package/examples/extensions/subagent/fixtures/hanging-process-tree.mjs +40 -0
  160. package/examples/extensions/subagent/index.ts +253 -137
  161. package/examples/extensions/subagent/managed-process.test.ts +178 -0
  162. package/examples/extensions/subagent/managed-process.ts +236 -0
  163. package/examples/extensions/subagent/subagent-extension-smoke.test.ts +112 -0
  164. package/examples/extensions/subagent/subagent-runtime-types.ts +76 -0
  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 +21 -21
  168. package/package.json +10 -7
@@ -62,6 +62,7 @@ import { ScopedModelsSelectorComponent } from "./components/scoped-models-select
62
62
  import { SessionSelectorComponent } from "./components/session-selector.js";
63
63
  import { SettingsSelectorComponent, ThinkingSelectorComponent } from "./components/settings-selector.js";
64
64
  import { SkillInvocationMessageComponent } from "./components/skill-invocation-message.js";
65
+ import { STATUS_SIDEBAR_GUTTER_GAP, STATUS_SIDEBAR_MIN_WIDTH, StatusSidebarComponent, statusSidebarWidth, } from "./components/status-sidebar.js";
65
66
  import { ToolExecutionComponent } from "./components/tool-execution.js";
66
67
  import { TreeSelectorComponent } from "./components/tree-selector.js";
67
68
  import { UserMessageComponent } from "./components/user-message.js";
@@ -267,6 +268,21 @@ export class InteractiveMode {
267
268
  widgetContainerBelow;
268
269
  // Custom footer from extension (undefined = use built-in footer)
269
270
  customFooter = undefined;
271
+ // Pinned status sidebar (Ctrl+Q): bottom bar data as a fixed right rail
272
+ statusSidebar;
273
+ statusSidebarPinned = false;
274
+ // Footer slot: always mounted. It hides the bottom bar only while the pinned
275
+ // rail is actually visible, so narrow terminals never lose the status line.
276
+ footerSlot = {
277
+ render: (width) => {
278
+ if (this.isStatusSidebarVisible(this.ui.terminal.columns, this.ui.terminal.rows))
279
+ return [];
280
+ return (this.customFooter ?? this.footer).render(width);
281
+ },
282
+ invalidate: () => {
283
+ (this.customFooter ?? this.footer).invalidate?.();
284
+ },
285
+ };
270
286
  // Header container that holds the built-in or custom header
271
287
  headerContainer;
272
288
  // Built-in header (logo + keybinding hints + changelog)
@@ -588,7 +604,7 @@ export class InteractiveMode {
588
604
  isReducedMotion: () => process.env.OMK_REDUCED_MOTION === "1" || process.env.OMK_REDUCE_MOTION === "1",
589
605
  isIdleDriftEnabled: () => process.env.OMK_CONTROL_IDLE_DRIFT !== "0",
590
606
  isHeaderVisibleHint: () => this.customHeader === undefined,
591
- getRenderWidth: () => this.ui.terminal.columns,
607
+ getRenderWidth: () => this.ui.contentWidth,
592
608
  });
593
609
  controlPanel.setExpanded(this.getStartupExpansionState());
594
610
  this.builtInHeader = controlPanel;
@@ -599,6 +615,7 @@ export class InteractiveMode {
599
615
  nonCapturing: true,
600
616
  visible: (termWidth, termHeight) => this.customHeader === undefined &&
601
617
  this.toolOutputExpanded &&
618
+ !this.statusSidebarPinned &&
602
619
  termWidth >= CONTROL_PANEL_OVERLAY_MIN_WIDTH &&
603
620
  termHeight >= 12,
604
621
  });
@@ -619,7 +636,27 @@ export class InteractiveMode {
619
636
  this.ui.addChild(this.widgetContainerAbove);
620
637
  this.ui.addChild(this.editorContainer);
621
638
  this.ui.addChild(this.widgetContainerBelow);
622
- this.ui.addChild(this.footer);
639
+ // Pinned status sidebar: renders footer data as a fixed right rail (Ctrl+Q).
640
+ // Pinned by default via the pinStatusSidebar setting / OMK_PIN_STATUS_SIDEBAR=1.
641
+ // The footer slot below stays mounted and yields to the rail only while the
642
+ // rail is actually visible, so the same data is never rendered twice.
643
+ this.statusSidebarPinned = this.settingsManager.getPinStatusSidebar();
644
+ this.ui.addChild(this.footerSlot);
645
+ this.statusSidebar = new StatusSidebarComponent(() => this.session, this.footerDataProvider, () => this.session.autoCompactionEnabled, () => this.ui.terminal.rows);
646
+ this.ui.showOverlay(this.statusSidebar, {
647
+ anchor: "top-right",
648
+ // Responsive: ~26% of the terminal, clamped — grows on fullscreen.
649
+ width: (termWidth) => statusSidebarWidth(termWidth),
650
+ maxHeight: "100%",
651
+ nonCapturing: true,
652
+ visible: (termWidth, termHeight) => this.isStatusSidebarVisible(termWidth, termHeight),
653
+ });
654
+ // Reserve real layout space for the rail: chat, editor, and widgets render
655
+ // at (terminal - rail) width, so the prompt is never covered by the sidebar.
656
+ // Must stay in lockstep with the overlay width above.
657
+ this.ui.setRightGutter((termWidth, termHeight) => this.isStatusSidebarVisible(termWidth, termHeight)
658
+ ? statusSidebarWidth(termWidth) + STATUS_SIDEBAR_GUTTER_GAP
659
+ : 0);
623
660
  this.ui.setFocus(this.editor);
624
661
  this.setupKeyHandlers();
625
662
  this.setupEditorSubmitHandler();
@@ -1450,6 +1487,7 @@ export class InteractiveMode {
1450
1487
  sessionManager: this.sessionManager,
1451
1488
  modelRegistry: this.session.modelRegistry,
1452
1489
  model: this.session.model,
1490
+ thinkingLevel: this.session.thinkingLevel,
1453
1491
  isIdle: () => !this.session.isStreaming,
1454
1492
  signal: this.session.agent.signal,
1455
1493
  abort: () => {
@@ -1598,7 +1636,9 @@ export class InteractiveMode {
1598
1636
  if (this.extensionEditor) {
1599
1637
  this.hideExtensionEditor();
1600
1638
  }
1601
- this.ui.hideOverlay();
1639
+ // Clear transient extension overlays without evicting pinned chrome:
1640
+ // a blind ui.hideOverlay() pops the status rail on session resume/new/fork/reload.
1641
+ this.ui.hideOverlaysExcept(this.statusSidebar);
1602
1642
  this.clearExtensionTerminalInputListeners();
1603
1643
  this.setExtensionFooter(undefined);
1604
1644
  this.setExtensionHeader(undefined);
@@ -1645,6 +1685,19 @@ export class InteractiveMode {
1645
1685
  container.addChild(component);
1646
1686
  }
1647
1687
  }
1688
+ /** The pinned rail is only shown (and its gutter reserved) when the terminal is large enough. */
1689
+ isStatusSidebarVisible(termWidth, termHeight) {
1690
+ return this.statusSidebarPinned && termWidth >= STATUS_SIDEBAR_MIN_WIDTH && termHeight >= 16;
1691
+ }
1692
+ /**
1693
+ * Toggle the pinned status sidebar: bottom bar data moves to a fixed right rail.
1694
+ */
1695
+ toggleStatusSidebar() {
1696
+ this.statusSidebarPinned = !this.statusSidebarPinned;
1697
+ // The footer slot and the right gutter both key off isStatusSidebarVisible,
1698
+ // so flipping the flag is enough — no child add/remove bookkeeping.
1699
+ this.ui.requestRender();
1700
+ }
1648
1701
  /**
1649
1702
  * Set a custom footer component, or restore the built-in footer.
1650
1703
  */
@@ -1653,23 +1706,9 @@ export class InteractiveMode {
1653
1706
  if (this.customFooter?.dispose) {
1654
1707
  this.customFooter.dispose();
1655
1708
  }
1656
- // Remove current footer from UI
1657
- if (this.customFooter) {
1658
- this.ui.removeChild(this.customFooter);
1659
- }
1660
- else {
1661
- this.ui.removeChild(this.footer);
1662
- }
1663
- if (factory) {
1664
- // Create and add custom footer, passing the data provider
1665
- this.customFooter = factory(this.ui, theme, this.footerDataProvider);
1666
- this.ui.addChild(this.customFooter);
1667
- }
1668
- else {
1669
- // Restore built-in footer
1670
- this.customFooter = undefined;
1671
- this.ui.addChild(this.footer);
1672
- }
1709
+ // The footer slot stays mounted and renders whichever footer is active,
1710
+ // so swapping footers requires no child add/remove bookkeeping.
1711
+ this.customFooter = factory ? factory(this.ui, theme, this.footerDataProvider) : undefined;
1673
1712
  this.ui.requestRender();
1674
1713
  }
1675
1714
  /**
@@ -2117,6 +2156,7 @@ export class InteractiveMode {
2117
2156
  this.ui.onDebug = () => this.handleDebugCommand();
2118
2157
  this.defaultEditor.onAction("app.model.select", () => this.showModelSelector());
2119
2158
  this.defaultEditor.onAction("app.tools.expand", () => this.toggleToolOutputExpansion());
2159
+ this.defaultEditor.onAction("app.sidebar.toggle", () => this.toggleStatusSidebar());
2120
2160
  this.defaultEditor.onAction("app.thinking.toggle", () => this.toggleThinkingBlockVisibility());
2121
2161
  this.defaultEditor.onAction("app.editor.external", () => this.openExternalEditor());
2122
2162
  this.defaultEditor.onAction("app.message.followUp", () => this.handleFollowUp());
@@ -2651,6 +2691,40 @@ export class InteractiveMode {
2651
2691
  this.ui.requestRender();
2652
2692
  break;
2653
2693
  }
2694
+ case "summarization_retry_scheduled": {
2695
+ this.showError(event.errorMessage);
2696
+ this.statusContainer.clear();
2697
+ this.retryCountdown?.dispose();
2698
+ const retryMessage = (seconds) => `Retrying summarization (${event.attempt}/${event.maxAttempts}) in ${seconds}s...`;
2699
+ this.retryLoader = new Loader(this.ui, (spinner) => theme.fg("warning", spinner), (text) => theme.fg("muted", text), retryMessage(Math.ceil(event.delayMs / 1000)));
2700
+ this.retryCountdown = new CountdownTimer(event.delayMs, this.ui, (seconds) => {
2701
+ this.retryLoader?.setMessage(retryMessage(seconds));
2702
+ }, () => {
2703
+ this.retryCountdown = undefined;
2704
+ });
2705
+ this.statusContainer.addChild(this.retryLoader);
2706
+ this.ui.requestRender();
2707
+ break;
2708
+ }
2709
+ case "summarization_retry_attempt_start":
2710
+ case "summarization_retry_finished": {
2711
+ // Attempt underway or retry loop settled: clear the retry indicator.
2712
+ // The compaction/branch-summary flow owns its own progress display.
2713
+ if (this.retryCountdown) {
2714
+ this.retryCountdown.dispose();
2715
+ this.retryCountdown = undefined;
2716
+ }
2717
+ if (this.retryLoader) {
2718
+ this.retryLoader.stop();
2719
+ this.retryLoader = undefined;
2720
+ this.statusContainer.clear();
2721
+ }
2722
+ this.ui.requestRender();
2723
+ break;
2724
+ }
2725
+ case "bash_execution_update":
2726
+ // The bash execution callback handles TUI output rendering.
2727
+ break;
2654
2728
  }
2655
2729
  }
2656
2730
  /** Extract text content from a user message */