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 {

Reply via email to