Skip to content

feat(frontend): keep only the console in the bottom panel - #9060

Draft
kz930 wants to merge 20 commits into
apache:mainfrom
kz930:feat/9059-console-only-panel
Draft

kz930 wants to merge 20 commits into
apache:mainfrom
kz930:feat/9059-console-only-panel

Conversation

@kz930

@kz930 kz930 commented Oct 20, 2026 •

Copy link
Copy Markdown
Contributor

What changes were proposed in this PR?

With results open beside their operators (#9063), the bottom panel drops its Result tab and keeps the console, plus the AI Fix tab from #8637 when it applies.

With no operator selected, the console shows every operator's messages in time order, each tagged with its operator. Clicking a tag narrows it to that operator, as selecting the operator does. With one operator selected, it shows that operator's messages alone, under a line naming it that closes back to all. The errors from the Static Error tab join the console as error messages, shown by the rule the tab used: an operator's own errors with it, and errors that belong to no operator when none is selected. That tab and its component are removed.

A run still selects the first Python UDF, so its console and debug input are at hand when it raises. The AI Fix tab sits beside the console and shows on the same conditions as before: Copilot on, one Python UDF selected, an error in its console.

An operator's result now opens beside it from its right-click menu ("Pin result") and on a double-click, which used to open the bottom panel. Nothing opens the bottom panel by itself any more, so openResultPanel() and its stream are removed.

pr9060-1-console-all-operators pr9060-2-console-error pr9060-3-console-one-operator pr9060-4-ai-fix-tab

This needs #9063, so the diff includes its commits and those of #9058 until they merge. The PR's own changes are d127081, b80462b, the AI Fix tab in the merge fe818e7, and 3f0efdd.

Any related issues, documentation, discussions?

Closes #9059. Part of #9052. Design discussed in #8842.

How was this PR tested?

The specs of the console, the console service and the result panel cover every operator's messages and their tags, narrowing to one operator and back, errors as console messages, a recompile that sends the same error not moving the list, a run selecting the first Python UDF, and the AI Fix tab coming and going without rebuilding the console. The workflow editor's spec covers a double-click pinning the operator's result. The full frontend suite passes. In the running app, two Python UDFs' prints and an error appear together, tagged by operator, and narrow to one operator when it is selected; a UDF that raises while selected brings up the AI Fix tab.

Was this PR authored or co-authored using generative AI tooling?

Generated-by: Claude Code (Claude Opus 5.5)

🤖 Generated with Claude Code

The default height went from 300 to 500 while the docked offset stayed at
-300px, so a panel that had never been moved, and every press of the dock
button, left 200px of it below the window. The offset now comes from the
same constant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kz930

kz930 commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

@carloea2 could you take a look at this when you have a chance? It stays a draft until #9058 and #9056 merge, but its own change, the last commit, is ready for review.

Every external output port of an operator that keeps its result is
stored, but results were only ever read from the first port, so a
Split's second output or an If's True branch could not be shown.

A pagination request can now name the output port to read, with the
first port as the default, and the reply carries the port it read and
that port's row count. The live result updates keep following the
first port, so a client paging another port takes the count from the
reply. The result store's count per operator now comes from the first
port too; it was built from every stored port, so a terminal Split's
second output could replace its first output's count.

On the frontend, the result service gives each extra port its own
pagination service, which names its port in its requests, keeps no
page cache and takes its row count from each reply, and every port's
service takes its schema only from replies to its own requests. The
result table and its row detail can show any port.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kz930
kz930 force-pushed the feat/9059-console-only-panel branch from 29221cd to 8ef2a74 Compare October 20, 2026 23:26
kz930 and others added 5 commits October 20, 2026 16:37
Switching the table to another output port left the previous port's
rows on screen when the new port was empty, with the loading state
never ending, and a late reply for the previous port could replace the
new port's rows. A port change now starts from an empty table, a reply
for an operator or port no longer shown is dropped, and an empty page
ends the loading.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…canvas

Resting the pointer on an operator for half a second shows a card
beside it with the operator's first rows and its size, or its error,
or how to keep a result the run did not keep. A pointer passing over,
dragging, or a click opens nothing, and the card lingers a moment so
the pointer can move into it. An operator with several outputs says
the rows are the first output's. The preview can be turned off under
Layers, and stays off while the heat-map overlay is on.

The first rows come from a request of their own, so a preview never
moves the result table's page or reads its cache.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tput port

Pinning the hover card opens a window beside the operator with its
whole result table, tied to it by a dashed line. Several windows can
be open at once; each can be dragged and resized, and follows its
operator when the operator or the canvas moves.

An operator with more than one output gets a tab per output port in
its window. The first port is the one the running execution reports
on; another port is read through the port-aware result service when
its tab is shown.

The table in a window measures what it draws around its rows, the
search bar, header, statistics and pager, and fits as many rows as
the rest of the window allows, so the pager sits near the window's
bottom at any size. The bottom panel keeps its own rule. The
statistics row shows only when a column has statistics, which a port
past the first never has.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The default height went from 300 to 500 while the docked offset stayed at
-300px, so a panel that had never been moved, and every press of the dock
button, left 200px of it below the window. The offset now comes from the
same constant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An operator's result is now read beside it on the canvas, in the hover
card and the pinned window, so the bottom panel drops its Result tab and
holds the console alone.

With no operator highlighted, the console shows every operator's
messages in time order, each tagged with its operator; clicking a tag
narrows to that operator, as highlighting it does. One highlighted
operator shows its messages alone under a "Showing" line whose close
button goes back to all. The errors that stopped a run or a compilation
join the list as ERROR messages, so the Static Error tab goes too; they
follow the same rule the Static Error tab did, and the same error gives
the same message on every render, so the list does not jump to its end.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kz930
kz930 force-pushed the feat/9059-console-only-panel branch from 8ef2a74 to d127081 Compare October 20, 2026 23:40
@kz930

kz930 commented Oct 20, 2026

Copy link
Copy Markdown
Contributor Author

@carloea2 heads-up: this PR was reorganized to split the work more evenly. It now holds only the console change; the pinned windows moved to #9063. Its own change is still the last commit.

@github-actions github-actions Bot added feature engine frontend Changes related to the frontend GUI labels Oct 21, 2026
@github-actions

github-actions Bot commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Automated Reviewer Suggestions

Based on the git blame history of the changed files, we recommend the following reviewers:

  • Contributors with relevant context: @aglinxinyuan, @sshiv012, @yangzhang75
    You can notify them by mentioning @aglinxinyuan, @sshiv012, @yangzhang75 in a comment.

@codecov-commenter

codecov-commenter commented Oct 21, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 83.84279% with 74 lines in your changes missing coverage. Please review.
✅ Project coverage is 92.11%. Comparing base (7b8422e) to head (3f0efdd).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
...ed-result-window/pinned-result-window.component.ts 54.16% 18 Missing and 4 partials ⚠️
...onent/workflow-editor/workflow-editor.component.ts 79.54% 10 Missing and 8 partials ⚠️
...-result-window/pinned-result-window.component.html 62.06% 10 Missing and 1 partial ⚠️
...esult-preview/operator-result-preview.component.ts 90.00% 0 Missing and 7 partials ⚠️
...ult-panel/console-frame/console-frame.component.ts 86.36% 1 Missing and 5 partials ⚠️
...result-table-frame/result-table-frame.component.ts 88.46% 0 Missing and 3 partials ⚠️
...c/app/workspace/component/menu/menu.component.html 50.00% 2 Missing ⚠️
...ult-preview/operator-result-preview.component.html 95.34% 1 Missing and 1 partial ⚠️
...src/app/workspace/component/menu/menu.component.ts 66.66% 1 Missing ⚠️
...e/component/result-panel/result-panel.component.ts 97.29% 0 Missing and 1 partial ⚠️
... and 1 more
Additional details and impacted files
@@             Coverage Diff              @@
##               main    #9060      +/-   ##
============================================
- Coverage     92.18%   92.11%   -0.07%     
  Complexity     5051     5051              
============================================
  Files          1286     1288       +2     
  Lines         55937    56173     +236     
  Branches       7140     7170      +30     
============================================
+ Hits          51563    51745     +182     
- Misses         2612     2636      +24     
- Partials       1762     1792      +30     
Flag Coverage Δ *Carryforward flag
access-control-service 77.44% <ø> (ø) Carriedforward from 7b8422e
agent-service 99.16% <ø> (ø) Carriedforward from 7b8422e
amber 86.93% <ø> (ø) Carriedforward from 7b8422e
computing-unit-managing-service 64.02% <ø> (ø) Carriedforward from 7b8422e
config-service 87.61% <ø> (ø) Carriedforward from 7b8422e
file-service 82.29% <ø> (ø) Carriedforward from 7b8422e
frontend 96.30% <83.84%> (-0.18%) ⬇️
notebook-migration-service 83.77% <ø> (ø) Carriedforward from 7b8422e
pyamber 98.47% <ø> (ø) Carriedforward from 7b8422e
workflow-compiling-service 74.25% <ø> (ø) Carriedforward from 7b8422e

*This pull request uses carry forward flags. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@carloea2 carloea2 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One result-access regression reproduced in the rendered component tests on fresh upstream main. The added regression fails and 216 existing checks pass.

node node_modules/@angular/cli/bin/ng test --watch=false --progress=false --include=src/app/workspace/component/workflow-editor/workflow-editor.component.spec.ts --include=src/app/workspace/component/result-panel/result-panel.component.spec.ts --include=src/app/workspace/component/result-panel/console-frame/console-frame.component.spec.ts --include=src/app/workspace/service/workflow-console/workflow-console.service.spec.ts --include=src/app/workspace/component/workflow-editor/pinned-result-window/pinned-result-window.component.spec.ts

Leaving the PR as a draft.

@carloea2

Copy link
Copy Markdown
Contributor

Confirmed the same result-access regression in local Chromium too: 123 existing editor tests pass and the added hover-disabled regression fails. This was the repository browser-test target, not jsdom.

With Result preview off or the heat-map on there is no hover card, and the
bottom panel now holds only the console, so the right-click menu is the way to
a result window. Pinning an operator already pinned keeps one window.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@carloea2 carloea2 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The result-access finding is fixed. Pinning through the right-click menu works with Result preview off and with the heat-map on, including duplicate-pin handling. The 263 focused unit tests and all 125 workflow-editor tests in real Chromium pass. Focused prettier-eslint and ESLint checks pass. Rebase over #8766 must retain its empty-result schema handling alongside the stale-reply guard. CI still needs clearing before merge.

kz930 and others added 6 commits October 26, 2026 14:27
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Benchmark changes need a look

🟢 1 better · 🔴 9 worse · ⚪ 5 noise (<±5%) · 0 without baseline

Compared against main 94914a0 benchmarked on this same runner, so the delta is largely free of cross-runner hardware noise. The "7d avg" column still reflects the gh-pages dashboard. Treat <±5% as noise unless repeated.

Dashboard · Run

config throughput MB/s latency max Δ latest / 7d
🔴 bs=10 sw=10 sl=64 549 0.335 16,791/26,926/26,926 us 🔴 +26.5% / 🔴 +120.3%
🔴 bs=100 sw=10 sl=64 1,229 0.75 81,293/114,651/114,651 us 🔴 +23.8% / 🔴 +31.5%
⚪ bs=1000 sw=10 sl=64 1,468 0.896 681,197/770,171/770,171 us ⚪ within ±5% / 🟢 -12.7%
Baseline details

Latest main 94914a0 from same runner

config metric PR latest main 7d avg Δ latest Δ 7d
bs=10 sw=10 sl=64 throughput 549 tuples/sec 595 tuples/sec 1,019 tuples/sec -7.7% -46.1%
bs=10 sw=10 sl=64 MB/s 0.335 MB/s 0.363 MB/s 0.622 MB/s -7.7% -46.1%
bs=10 sw=10 sl=64 p50 16,791 us 17,786 us 10,144 us -5.6% +65.5%
bs=10 sw=10 sl=64 p95 26,926 us 21,281 us 12,225 us +26.5% +120.3%
bs=10 sw=10 sl=64 p99 26,926 us 21,281 us 15,527 us +26.5% +73.4%
bs=100 sw=10 sl=64 throughput 1,229 tuples/sec 1,340 tuples/sec 1,371 tuples/sec -8.3% -10.4%
bs=100 sw=10 sl=64 MB/s 0.75 MB/s 0.818 MB/s 0.837 MB/s -8.3% -10.4%
bs=100 sw=10 sl=64 p50 81,293 us 73,756 us 79,910 us +10.2% +1.7%
bs=100 sw=10 sl=64 p95 114,651 us 92,639 us 87,155 us +23.8% +31.5%
bs=100 sw=10 sl=64 p99 114,651 us 92,639 us 106,643 us +23.8% +7.5%
bs=1000 sw=10 sl=64 throughput 1,468 tuples/sec 1,443 tuples/sec 1,415 tuples/sec +1.7% +3.7%
bs=1000 sw=10 sl=64 MB/s 0.896 MB/s 0.881 MB/s 0.864 MB/s +1.7% +3.7%
bs=1000 sw=10 sl=64 p50 681,197 us 689,643 us 780,407 us -1.2% -12.7%
bs=1000 sw=10 sl=64 p95 770,171 us 758,378 us 817,814 us +1.6% -5.8%
bs=1000 sw=10 sl=64 p99 770,171 us 758,378 us 848,683 us +1.6% -9.3%
Raw CSV
config_idx,batch_size,schema_width,string_len,num_batches,total_ms,total_tuples,total_bytes,tuples_per_sec,mb_per_sec,lat_p50_us,lat_p95_us,lat_p99_us
0,10,10,64,20,363.99,200,128000,549,0.335,16791.01,26925.61,26925.61
1,100,10,64,20,1627.89,2000,1280000,1229,0.750,81293.30,114650.60,114650.60
2,1000,10,64,20,13626.52,20000,12800000,1468,0.896,681197.46,770170.52,770170.52

@aglinxinyuan aglinxinyuan left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Left some minor comments below.

@aglinxinyuan aglinxinyuan left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two more points:

  1. Double-clicking an operator still calls openResultPanel() (workflow-editor.component.ts:1108). That now opens the console narrowed to that operator, which shows nothing for anything but a UDF. Double-click was the quickest way to a result; should it call pinResult instead?
  2. The body still says the PR's own change is "the last commit". It is now d127081 and b80462b. The body could also mention the right-click "pin result" item and the double-click change.

kz930 and others added 6 commits October 31, 2026 22:39
…nd keep it fresh

Pressing an output port to drag a link now closes the card: a native
capture listener on the paper replaces element/blank:pointerdown, which
JointJS never emits for a magnet. Deleting the card's operator closes it
and cancels a pending one, and ngOnDestroy clears both card timers.

The card fetches its rows again on its operator's result updates until
it shows a full preview, keeping the rows on show while it does.

selectPage's default column limit is ALL_COLUMNS, as peekFirstRows'
is: Number.MAX_SAFE_INTEGER fails the server's Int parse, so the row
details modal's request was never answered.

The heat-map test now waits out the preview delay, and a new test
covers the Layers > Result preview toggle.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The row details modal's column limit is a separate fix, as the review
asked, so selectPage goes back to what it was before 7e4e75f.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…teady

A double-click on an operator pins its result window, as the right-click
menu does. Nothing opens the bottom panel by itself any more, so
openResultPanel() and its stream are removed.

A run selects the first Python UDF again, so its console and debug input
are at hand when it raises. An operator already selected that is a UDF
stays selected; any other selection moves to the UDF.

A compilation error is known by its content rather than its object, as
every compile sends a new one with a new timestamp. The console no longer
jumps to its end on each edit while a compilation error is shown.

The console's close button clears the highlight through the action
service, so co-editors see it cleared too.

The AI Fix tab's styles set only heights, so the tab not chosen stays
hidden and the console keeps its own layout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot removed the engine label Nov 1, 2026
@kz930

kz930 commented Nov 1, 2026

Copy link
Copy Markdown
Contributor Author

Thanks! 1. Double-click now pins the operator's result, and openResultPanel() is removed since nothing else used it (3f0efdd). 2. The body now lists the PR's own commits and describes the "Pin result" item and the double-click change.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature frontend Changes related to the frontend GUI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Keep only the console in the bottom panel

4 participants