This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch fix/CAMEL-23855 in repository https://gitbox.apache.org/repos/asf/camel.git
commit fbf71a6136e65121ba580db9779f64b38aca0124 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Jun 29 18:59:00 2026 +0200 CAMEL-23855: camel-jbang - Show AI panel always and fix shell scrollback Co-Authored-By: Claude <[email protected]> Signed-off-by: Claus Ibsen <[email protected]> --- .../dsl/jbang/core/commands/tui/CamelMonitor.java | 8 +++----- .../dsl/jbang/core/commands/tui/ShellPanel.java | 23 ++++++++++------------ 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java index 94b4472a1e7c..dea72389ce84 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java @@ -319,12 +319,12 @@ public class CamelMonitor extends CamelCommand { eventLog = new TuiEventLog(500); Path mcpJsonFile = null; + actionsPopup.setAiActivityLog(aiPanel::getActivityLog); if (mcp) { mcpServer = new TuiMcpServer(mcpPort, this); try { mcpServer.start(); actionsPopup.setMcpEnabled(true, mcpPort, mcpServer::getConnectedClient, mcpServer::getActivityLog); - actionsPopup.setAiActivityLog(aiPanel::getActivityLog); mcpJsonFile = writeMcpJson(mcpPort); } catch (java.net.BindException e) { System.err.println("MCP server failed to start: port " + mcpPort + " is already in use."); @@ -659,7 +659,7 @@ public class CamelMonitor extends CamelCommand { } return true; } - if (ke.isKey(KeyCode.F8) && mcp) { + if (ke.isKey(KeyCode.F8)) { if (aiPanel.isOpen()) { aiPanel.close(); } else { @@ -1892,9 +1892,7 @@ public class CamelMonitor extends CamelCommand { hint(fKeySpans, "F3", "switch"); } hint(fKeySpans, "F6", "shell"); - if (mcp) { - hint(fKeySpans, "F8", "AI"); - } + hint(fKeySpans, "F8", "AI"); spans.addAll(insertPos, fKeySpans); // Return total F-key span count. The footer drop loop uses this to remove pairs from // the tail (F6, then F3, F2), stopping before the first pair (F1 help when present). diff --git a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java index fbdee894f0e0..d8a0f98d47bf 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java +++ b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/ShellPanel.java @@ -18,7 +18,7 @@ package org.apache.camel.dsl.jbang.core.commands.tui; import java.io.IOException; import java.io.OutputStream; -import java.lang.reflect.Method; +import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; @@ -138,13 +138,13 @@ class ShellPanel { return true; } - // Shift+PageUp/Down for scrollback through history - if (ke.isKey(KeyCode.PAGE_UP) && ke.hasShift()) { + // PageUp/Down for scrollback through history + if (ke.isKey(KeyCode.PAGE_UP)) { int histSize = screenTerminal != null ? getHistorySize(screenTerminal) : 0; scrollOffset = Math.min(scrollOffset + lastHeight, histSize); return true; } - if (ke.isKey(KeyCode.PAGE_DOWN) && ke.hasShift()) { + if (ke.isKey(KeyCode.PAGE_DOWN)) { scrollOffset = Math.max(0, scrollOffset - lastHeight); return true; } @@ -280,7 +280,7 @@ class ShellPanel { void renderFooter(List<Span> spans) { MonitorContext.hint(spans, "F6", "close"); MonitorContext.hint(spans, "Shift+F6", SPLIT_PERCENTS[splitIndex] + "%"); - MonitorContext.hint(spans, "Shift+PgUp/Dn", "scroll"); + MonitorContext.hint(spans, "PgUp/Dn", "scroll"); } private List<Line> renderLiveView(long[] screen, int width, int height) { @@ -619,20 +619,17 @@ class ShellPanel { @SuppressWarnings("unchecked") private static List<long[]> getHistory(ScreenTerminal st) { try { - Method m = ScreenTerminal.class.getMethod("getHistory"); - return (List<long[]>) m.invoke(st); + Field f = ScreenTerminal.class.getDeclaredField("history"); + f.setAccessible(true); + List<long[]> history = (List<long[]>) f.get(st); + return history != null ? history : Collections.emptyList(); } catch (Exception e) { return Collections.emptyList(); } } private static int getHistorySize(ScreenTerminal st) { - try { - Method m = ScreenTerminal.class.getMethod("getHistorySize"); - return (int) m.invoke(st); - } catch (Exception e) { - return 0; - } + return getHistory(st).size(); } private static class DelegateOutputStream extends OutputStream {
