Skip to content

ConversationNavigator

A searchable list of conversations or sessions. Each row shows a title, status, and latest message (plus an unread count or pinned mark when they apply), and typing in the query field filters the rows.

Import: package:fleury/fleury.dart, or package:fleury/fleury_core.dart in browser code.

const ConversationNavigator(
conversations: <ConversationEntry>[
ConversationEntry(
id: 'c1',
title: 'Benchmark scoreboard',
subtitle: 'Perf follow-up',
status: ConversationStatus.active,
latestMessage: 'All peers green',
unreadCount: 2,
),
ConversationEntry(
id: 'c2',
title: 'Docs site',
status: ConversationStatus.idle,
latestMessage: 'Examples shipped',
),
],
)

By default a query keeps conversations that match it exactly, by prefix, as a substring, or as a fuzzy subsequence, listed in that order; pass matcher to decide matches yourself. Up and Down move the selected conversation from the query field or the list; in the list, PageUp, PageDown, Home, and End also jump. Enter or a click activates an enabled conversation and calls onSelect. Ctrl+C copies the selected conversation (in the query field, selected query text is copied instead).

ParameterTypeDefaultDescription
conversations:List<ConversationEntry>requiredSource conversations to search, display, activate, and copy.
queryController:TextEditingController?—External controller for the query input.
controller:ConversationNavigatorController?—External controller for list selection and visible range.
matcher:ConversationMatcher?—Optional app-owned matcher used instead of default ranked search.
semanticLabel:String'Conversations'Semantic label (the accessibility name; not rendered) for the navigator.
placeholder:String'Search conversations...'Placeholder shown in the query input.
width:int60Width, in terminal cells, reserved for query and rows.
maxVisible:int6Maximum visible rows before the list scrolls.
showTimestamp:boolfalsePrefix each row with the conversation’s ConversationEntry.timestamp as a local HH:mm:ss clock, when one is set. Off by default.
queryFocusNode:FocusNode?—Focus node used by the query input.
listFocusNode:FocusNode?—Focus node used by the conversation list.
autofocus:boolfalseWhether the query input should request focus when mounted.
copySelection:booltrueWhether Ctrl+C (and the semantic copy action) copies the selected conversation.
copyOptions:ConversationNavigatorCopyOptionsconst ConversationNavigatorCopyOptions()Clipboard/export options for selected-row copy.
onSelect:void Function(ConversationNavigatorSelectResult result)?—Called when the user activates an enabled conversation: Enter in the query field or the list, or a click on its row.
onCopy:void Function(ConversationNavigatorCopyResult result)?—Called after a copy attempt completes.

ConversationNavigator is defined in packages/fleury/lib/src/catalog/conversation_navigator.dart.

Category: Agent surfaces · All widgets