Claus Ibsen created CAMEL-26864:
-----------------------------------

             Summary: camel-jbang - TUI: issues found walking the tabs of a 
running integration
                 Key: CAMEL-26864
                 URL: https://issues.apache.org/jira/browse/CAMEL-26864
             Project: Camel
          Issue Type: Bug
          Components: camel-jbang
            Reporter: Claus Ibsen


Findings from walking every tab of the Camel TUI (4.24.0-SNAPSHOT, main at 
89929a305815) on a running integration, driven from the TUI's own AI panel 
through the camel-tui MCP tools. Each item says the tab, what was seen, what 
was expected, and where the code is when known. The items are independent and 
can be fixed one by one.

h3. Reproduce

{{camel run hello.camel.yaml}} then {{camel tui}}:
{code:yaml}
- route:
    id: hello
    from:
      uri: timer:tick
      parameters:
        period: 2000
      steps:
        - setBody:
            simple: "Hello ${random(100)}"
        - choice:
            when:
              - simple: "${body} contains '7'"
                steps:
                  - to: direct:seven
            otherwise:
              steps:
                - log: "${body}"
- route:
    id: seven
    from:
      uri: direct:seven
      steps:
        - log: "Lucky ${body}"
{code}

h3. Bugs

# *Diagram: drilling into a route shows the nodes of another route.* 
{{tui_navigate(tab=Diagram, route=hello, node=choice1)}} fails with "Node not 
found: choice1 in route hello". The state is then diagramMode=route, 
routeId=hello, but the EIP node list is [seven, log2] (route seven's nodes) and 
the selected node is from[direct:seven]. The Topology route list is ordered 
[seven, hello] and the routes are [hello, seven], so it looks like an index 
into a list in a different order. Expected: hello's nodes (setBody1, choice1, 
to1, log1).
# *Diagram: the screen does not follow the drill-down.* After the call above 
(and after {{tui_navigate(tab=Diagram, route=hello)}}, which returns 
selectedRoute=hello), the screen still draws the Architecture view while 
tui_get_state says diagramMode=route. Expected: the screen shows the Topology / 
Route view the state says.
# *Inspect: the screen shows an old exchange.* The Info panel and the History 
Topology diagram show exchange ...0051 from 13:16:12 ("Step: 1/6"), while the 
tab's table data (tui_get_table Inspect) is the latest exchange ...046E from 
13:51:18 with 5 steps. Expected: the screen and the data show the same exchange.
# *tui_get_history finds no data.* It returns "No history data available. 
Ensure the History tab has data." while the Inspect tab has data. 
{{TuiToolRegistry.callGetHistory}} looks up the tab "History", which is now 
called "Inspect". With an exchangeId it also calls 
{{facade.navigateToTab("History")}}, so a tui_get_* tool changes what the user 
sees, unlike the other tui_get_* tools.
# *Startup: the total is wrong.* The title says "Total: 222ms", the longest 
single step ({{StartupTab}} line 369: {{max(duration)}}). The startup went from 
the first step at ...209063 to the end of "Start CamelContext" at ...209527, 
which is about 465ms, and "Start CamelContext" (182ms) runs after "Init 
CamelContext" (222ms). Expected: the time from the first step to the end of the 
last one.
# *Startup: steps are under the wrong parent.* The rows are ordered by begin 
time, so the children of "seven Create Route" ("direct:seven Get Endpoint", 
"log2 Create Log Processor", parentId 19) are shown under "hello Init Route" 
(id 22), which began at the same millisecond. Expected: depth-first by 
parentId, so each child is under its own parent.
# *camel-core typo.* {{InternalRouteStartupManager.java:320}} records the 
startup step "Warump Route". It should be "Warmup Route" (shown on the Startup 
tab).
# *Endpoints: outgoing is 0 for a route that sends.* With the hello → 
direct://seven (out, 202 hits) row selected, the Flow panel shows "1131 in, 0 
out" and the msg/s chart shows "out:0", while the avg body chart shows "out:7 
B". Expected: the out count and rate include direct://seven ({{EndpointsTab}} 
around line 370, {{EndpointFlow.total}}).
# *tui_send_keys has no effect while the AI panel is open.* 
{{tui_send_keys(["Enter"])}} on the Diagram tab returned sent=1, but nothing 
changed and tui_get_events did not record the key. The keys seem to go to the 
AI panel's input. Expected: keys from the MCP tool reach the active tab, or the 
tool says where they went.

h3. Inconsistencies and UX

# *Log: same paused-or-live problem as the Timeline.* The Log tab stayed paused 
at 13:17 while the time was 13:51. The only signs were "(paused, End follows)" 
in plain text in the title and "f follow off" in the footer. The Timeline 
pauses with Space and the Log with f/End. Expected: the same badge and border 
as the Timeline (see the PR that adds ‖ PAUSED / ● live there), and the same 
key on both tabs.
# *Log: missing space in the title.* "Log level:INFO" should be "Log level: 
INFO".
# *Source and Inspect: the body type "null".* On the Source tab the setBody 
line shows the body type as the word "null" (the timer exchange's body before 
setBody), and Inspect has bodyType "null" for the from and setBody steps. 
Expected: "(no body)", or say whether the type is before or after the step.
# *Endpoints: the arrows are the wrong way round.* The DIR column shows "→ in" 
and "← out" ({{EndpointsTab}} lines 247-248: in = KEY_RIGHT, out = KEY_LEFT), 
while the Flow panel draws in ───► [route] ───► out. Expected: the same 
direction in both.
# *tui_get_table names the wrong tab.* tui_get_table(tab=Inspect) returns 
"tab":"History" ({{HistoryTab}} line 2473) and tui_get_table(tab="Memory 
Usage") returns "tab":"Memory" ({{MemoryTab}} line 503). Expected: the names 
tui_get_options lists.
# *Inspect: two ids for the same step.* The trace says nodeId "from1" for the 
from of route hello, while tui_get_processor_detail says its id is "hello". The 
exchange property CamelMessageBodySize is 0 at every step, even when the body 
is "Hello 34". The Info panel shows the raw direction marker ("Step: 1/6 *->") 
and an empty "Changed:" label.
# *Routes and Overview: unlabelled time in TOTAL.* The TOTAL column shows "1128 
(1s)" and "201 (13s)". The value in brackets, the time since the last exchange, 
has no header or legend.
# *Consumers: no count for event-driven consumers.* The direct consumer of 
route seven has an empty POLLS column and no total (tui_get_table has no 
totalCounter for it), although it received 200+ messages. Expected: a received 
count for consumers that are not polled.
# *Diagram (Architecture): double brackets.* The entry point label reads 
"timer:tick (period=2000) (internal)". Expected: something like "timer:tick 
(period=2000, internal)".
# *Startup: a leading space for steps with no name.* "  Init CamelContext" and 
"  Scan HealthChecks" get an extra space where the name would be.
# *Errors: empty state in the wrong place.* "No errors captured" is drawn in 
the middle of the row, under EXCEPTION/MESSAGE. Expected: aligned like the 
empty states of the other tabs.

h3. Notes for whoever picks this up

* Most items are in {{dsl/camel-jbang/camel-jbang-plugin-tui}}. Item 7 is in 
{{core/camel-base-engine}}.
* The render tests ({{*RenderTest}}, {{TuiTestHelper.renderToString}}) are the 
quickest way to reproduce and cover the screen items. Items 1, 2, 4 and 9 are 
in the MCP tool layer ({{TuiToolRegistry}} and the facade).




--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to