Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
b90ebe0
Measure conversation widget scaling baseline
VolkerChristian Sep 9, 2026
2786583
Add stable conversation item model foundation
VolkerChristian Sep 9, 2026
6c4a0e1
Virtualize conversation row materialization
VolkerChristian Sep 9, 2026
bd2297e
Paint passive conversation rows with a delegate
VolkerChristian Sep 9, 2026
d58020d
Preserve virtualized conversation interactions
VolkerChristian Sep 9, 2026
42c05ad
Cut over conversation workflows to virtualization
VolkerChristian Sep 9, 2026
84ba466
Bound canonical conversation tail updates
VolkerChristian Sep 9, 2026
3b7b5fa
Prevent recursive conversation mouse forwarding
VolkerChristian Sep 9, 2026
3f64b7c
Grow active turn border on direct tail append
VolkerChristian Sep 9, 2026
f1a2dd6
Stop idle conversation layout loop
VolkerChristian Sep 9, 2026
9617653
Add delayed thread loading spinners
VolkerChristian Sep 9, 2026
34b9752
Remove obsolete nested card ownership
VolkerChristian Sep 10, 2026
7df7a60
Keep conversation activity data presentation-only
VolkerChristian Sep 10, 2026
0c1090b
Keep conversation visibility in the Qt model
VolkerChristian Sep 10, 2026
0d21950
Share pure conversation presentation values
VolkerChristian Sep 10, 2026
29a93b0
Add explicit conversation model operations
VolkerChristian Sep 10, 2026
95800b2
Target prompt materialization to one row
VolkerChristian Sep 10, 2026
141e000
Route exact conversation structure deltas
VolkerChristian Sep 10, 2026
32ec5e1
Move conversation staging state into the view
VolkerChristian Sep 10, 2026
57a4523
Maintain conversation indexes incrementally
VolkerChristian Sep 10, 2026
b2de44a
Bound conversation presentation work per frame
VolkerChristian Sep 10, 2026
92b13cd
Separate conversation authority and delta paths
VolkerChristian Sep 10, 2026
1026d5f
Preserve retained activity anchor during paging
VolkerChristian Sep 10, 2026
3e37c79
Document final conversation view qualification
VolkerChristian Sep 10, 2026
196a73f
Preserve steering position across turn replacement
VolkerChristian Sep 10, 2026
9f45ac0
Preserve pending prompt projection order
VolkerChristian Sep 10, 2026
6f81d99
Keep virtual conversation geometry exact
VolkerChristian Sep 10, 2026
8ba61f7
Bound command output presentation cost
VolkerChristian Sep 10, 2026
aab2723
Reuse Markdown documents across presentation
VolkerChristian Sep 10, 2026
04e8344
Cache image thumbnail presentation
VolkerChristian Sep 10, 2026
6ccc504
Bound file change card presentation
VolkerChristian Sep 10, 2026
6ac7bef
Bound conversation accessibility projection
VolkerChristian Sep 10, 2026
abf0cb1
Defer collapsed card body projection
VolkerChristian Sep 10, 2026
585f5a5
Document bounded rich card presentation
VolkerChristian Sep 10, 2026
2fa5481
Improve thread workflow and stabilize conversation UI
VolkerChristian Sep 11, 2026
6c153ec
Smooth live workspace splitter resizing
VolkerChristian Sep 11, 2026
4d10c49
ci: track SNode.C master
VolkerChristian Sep 11, 2026
7b55f0a
Fix wrapped command output sizing across Qt versions
VolkerChristian Sep 11, 2026
2d59267
Make wrapped output test font-metric safe
VolkerChristian Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ jobs:
${{ github.event_name == 'pull_request' &&
github.event.pull_request.head.sha || github.sha }}

- name: Check out pinned SNode.C
- name: Check out SNode.C head
uses: actions/checkout@v5
with:
repository: SNodeC/snode.c
ref: 212bd4f8a16637405ab850a52adb9da8555dca3d
ref: master
path: _deps/snodec

- name: Check out paired AISuite Codex
Expand Down
120 changes: 120 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ set(
src/codex/GitDiffProvider.h
src/codex/FileSelectionDialog.cpp
src/codex/FileSelectionDialog.h
src/codex/ForkNaming.h
src/codex/MainWindow.cpp
src/codex/MainWindow.h
src/codex/NewThreadDialog.cpp
Expand Down Expand Up @@ -89,6 +90,12 @@ set(
src/codex/middle/ComposerPane.h
src/codex/middle/ConversationCards.cpp
src/codex/middle/ConversationCards.h
src/codex/middle/ConversationPresentation.cpp
src/codex/middle/ConversationPresentation.h
src/codex/middle/ConversationHeightIndex.cpp
src/codex/middle/ConversationHeightIndex.h
src/codex/middle/ConversationItemModel.cpp
src/codex/middle/ConversationItemModel.h
src/codex/middle/ConversationView.cpp
src/codex/middle/ConversationView.h
src/codex/middle/InspectorPane.cpp
Expand Down Expand Up @@ -191,8 +198,14 @@ if(BUILD_TESTING)
src/codex/ui/NodeGraphUiAdapter.h
src/codex/middle/ConversationCards.cpp
src/codex/middle/ConversationCards.h
src/codex/middle/ConversationPresentation.cpp
src/codex/middle/ConversationPresentation.h
src/codex/middle/ConversationView.cpp
src/codex/middle/ConversationView.h
src/codex/middle/ConversationHeightIndex.cpp
src/codex/middle/ConversationHeightIndex.h
src/codex/middle/ConversationItemModel.cpp
src/codex/middle/ConversationItemModel.h
src/codex/middle/MiddleTypes.cpp
src/codex/middle/MiddleTypes.h
src/codex/ui/UiStyle.cpp
Expand Down Expand Up @@ -334,8 +347,14 @@ if(BUILD_TESTING)
tests/codex/ConversationCardsTest.cpp
src/codex/middle/ConversationCards.cpp
src/codex/middle/ConversationCards.h
src/codex/middle/ConversationPresentation.cpp
src/codex/middle/ConversationPresentation.h
src/codex/middle/ConversationView.cpp
src/codex/middle/ConversationView.h
src/codex/middle/ConversationHeightIndex.cpp
src/codex/middle/ConversationHeightIndex.h
src/codex/middle/ConversationItemModel.cpp
src/codex/middle/ConversationItemModel.h
src/codex/middle/MiddleTypes.cpp
src/codex/middle/MiddleTypes.h
src/codex/ui/UiStyle.cpp
Expand All @@ -357,6 +376,101 @@ if(BUILD_TESTING)
PROPERTIES TIMEOUT 35 ENVIRONMENT "QT_QPA_PLATFORM=offscreen"
)

qt_add_executable(
codexui-conversation-item-model-test
tests/codex/ConversationItemModelTest.cpp
src/codex/middle/ConversationHeightIndex.cpp
src/codex/middle/ConversationHeightIndex.h
src/codex/middle/ConversationItemModel.cpp
src/codex/middle/ConversationItemModel.h
src/codex/middle/MiddleTypes.cpp
src/codex/middle/MiddleTypes.h
)
target_compile_features(
codexui-conversation-item-model-test PRIVATE cxx_std_20
)
target_include_directories(
codexui-conversation-item-model-test PRIVATE src
)
target_link_libraries(
codexui-conversation-item-model-test
PRIVATE codexui-nodegraph Qt6::Widgets
)
add_test(
NAME codexui-conversation-item-model
COMMAND codexui-conversation-item-model-test
)
set_tests_properties(
codexui-conversation-item-model
PROPERTIES TIMEOUT 15
)

qt_add_executable(
codexui-conversation-virtualization-test
tests/codex/ConversationVirtualizationTest.cpp
src/codex/middle/ConversationCards.cpp
src/codex/middle/ConversationCards.h
src/codex/middle/ConversationPresentation.cpp
src/codex/middle/ConversationPresentation.h
src/codex/middle/ConversationHeightIndex.cpp
src/codex/middle/ConversationHeightIndex.h
src/codex/middle/ConversationItemModel.cpp
src/codex/middle/ConversationItemModel.h
src/codex/middle/ConversationView.cpp
src/codex/middle/ConversationView.h
src/codex/middle/MiddleTypes.cpp
src/codex/middle/MiddleTypes.h
src/codex/ui/UiStyle.cpp
src/codex/ui/UiStyle.h
)
target_compile_features(
codexui-conversation-virtualization-test PRIVATE cxx_std_20
)
target_include_directories(
codexui-conversation-virtualization-test PRIVATE src
)
target_link_libraries(
codexui-conversation-virtualization-test
PRIVATE codexui-nodegraph Qt6::Widgets
)
add_test(
NAME codexui-conversation-virtualization
COMMAND codexui-conversation-virtualization-test
)
set_tests_properties(
codexui-conversation-virtualization
PROPERTIES TIMEOUT 20 ENVIRONMENT "QT_QPA_PLATFORM=offscreen"
)

qt_add_executable(
codexui-conversation-view-benchmark
tests/codex/ConversationViewBenchmark.cpp
src/codex/middle/ConversationCards.cpp
src/codex/middle/ConversationCards.h
src/codex/middle/ConversationPresentation.cpp
src/codex/middle/ConversationPresentation.h
src/codex/middle/ConversationView.cpp
src/codex/middle/ConversationView.h
src/codex/middle/ConversationHeightIndex.cpp
src/codex/middle/ConversationHeightIndex.h
src/codex/middle/ConversationItemModel.cpp
src/codex/middle/ConversationItemModel.h
src/codex/middle/MiddleTypes.cpp
src/codex/middle/MiddleTypes.h
src/codex/ui/UiStyle.cpp
src/codex/ui/UiStyle.h
)
target_compile_features(
codexui-conversation-view-benchmark PRIVATE cxx_std_20
)
target_include_directories(
codexui-conversation-view-benchmark PRIVATE src
)
target_link_libraries(
codexui-conversation-view-benchmark
PRIVATE codexui-nodegraph Qt6::Widgets
)

qt_add_executable(
codexui-application-layout-test
tests/codex/EstablishedUiUxTest.cpp
Expand All @@ -376,8 +490,14 @@ if(BUILD_TESTING)
src/codex/middle/ComposerPane.h
src/codex/middle/ConversationCards.cpp
src/codex/middle/ConversationCards.h
src/codex/middle/ConversationPresentation.cpp
src/codex/middle/ConversationPresentation.h
src/codex/middle/ConversationView.cpp
src/codex/middle/ConversationView.h
src/codex/middle/ConversationHeightIndex.cpp
src/codex/middle/ConversationHeightIndex.h
src/codex/middle/ConversationItemModel.cpp
src/codex/middle/ConversationItemModel.h
src/codex/middle/InspectorPane.cpp
src/codex/middle/InspectorPane.h
src/codex/middle/MiddleRegionWidget.cpp
Expand Down
13 changes: 8 additions & 5 deletions docs/native-ui-ux-qualification-inventory.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ child, partial order, or intermediate lifecycle style.

| Area | Situations and expected result | Qualification |
| --- | --- | --- |
| Main window | Initial show, maximize/restore, resize, splitter drag, pane hide/show, minimum useful size | No clipped controls, oscillating layout requests, stale overlay geometry, or whole-window repaint from a descendant update |
| Main window | Initial show, maximize/restore, resize, splitter drag, pane hide/show, minimum useful size | No clipped controls, oscillating layout requests, stale overlay geometry, or whole-window repaint from a descendant update; splitter widths track immediately, conversation reflow is frame-bounded, and release settles exactly |
| Top chrome | Connection label/dot/menu, controller button, request indicator, restore-pane buttons | Setters/style polish/paint occur only when the effective displayed value changes; item streaming does no work here |
| Bottom status | Ready/connecting/disconnected/error and attribution | Stable geometry; exact state/tone; unrelated thread changes do not repaint it |
| Conversation chrome | Selected-thread title, workspace, last activity, lifecycle state and visibility/filter buttons | Only changed effective fields update; item text streaming does not rewrite thread chrome; final status is immediate |
Expand All @@ -63,9 +63,9 @@ with fixed screen geometry and pixel-difference regions.
| Rows | Name/preview/ID fallback, status dot, hover, selected state, badges/tooltips and exact canonical state vocabulary match the legacy appearance |
| Selection | Left click changes selection once; background activity never steals it; selecting a child keeps its root visible; removal clears selection safely |
| Hierarchy | Root/child ownership, expansion/collapse, deep indentation, late parent, fork reassignment and child removal retain complete reachable topology |
| Sorting | Recent, Created, Last changed and natural Alphanumeric orders; missing timestamps; local prompt ticks; non-sort field changes never scan/reorder |
| Local draft row | New Thread insertion, animation, promotion to provider ID, failure, abandon-empty, second-create guard and later-navigation preservation use one stable row |
| Context menu | Right-click targets the pointed row without selection, holds hover while open, dismisses without click-through, and exposes correct reload/rename/fork/archive/delete state |
| Sorting | Exactly Alphanumeric, Created, and Recent; natural-number titles; newest-first timestamps; missing timestamps last; fast DB-only first page, automatic background file reconciliation, cursor-guarded near-end paging; Recent admission promotion, acknowledgement confirmation, rejection rollback, and criterion-specific re-sorting |
| Local draft row | New Thread insertion, chosen-name preservation, prompt-bound animation, promotion to provider ID, failure, abandon-empty, second-create guard and later-navigation preservation use one stable row |
| Context menu | Right-click targets the pointed row without selection, holds hover while open, dismisses without click-through, and exposes correct reload/rename/Quick fork/Fork with options/archive/delete state; advanced fork fields and hierarchical chosen names reach the exact action |
| Incremental update | Name/status/tooltips patch only the affected row and repaint only its rectangle; no whole-list update suppression |
| Atomic topology | Insert/remove/reparent/reorder computes a complete target before commit and never exposes partial ordering |
| Large list | Visible rows plus two-row overscan only; bounded scans complete under unrelated revisions; scroll position and expansion remain stable |
Expand Down Expand Up @@ -135,7 +135,10 @@ For each type verify:
direction, title anchoring, keyboard focus and no geometry change for
paint-only state;
- Copy availability, exact plain/Markdown content, 0.5-second check feedback,
reduced-motion behavior, overlay placement and no header movement;
reduced-motion behavior, overlay placement, uniformly narrow phase-to-Copy
spacing and no header movement;
- authored single newlines remain visible in normal and steering You cards
while copied Markdown, blank lines, and fenced code remain exact;
- retained text truncation notice and copied disclosure at the byte bound;
- attachment order, encoded filenames, bounded image ribbon, horizontal
scrolling without vertical growth, missing-image accessibility and modeless
Expand Down
Loading
Loading