feat(app): show assistant response timer in the composer #336
No reviewers
Labels
No labels
Epic 5
MCP
P1
PR-0
PR-1
api
api-layer
architecture
area:backend
area:frontend
arrow
authentication
backend
bug
chat
client
clipboard
common-module
compose
cross-cutting
cross-cutting-requirement
data-layer
data-models
database
desktop-client
documentation
duplicate
enhancement
epic
epic-1
epic-2
epic-3
epic-4
epic-5
epic-6
epic-7
epic-llm-config
error-handling
feature
frontend
good first issue
help wanted
implementation
infrastructure
installer
invalid
kotlin
ktor
llm
medium-priority
message
multiplatform
needs-review
needs-triage
packaging
performance
phase-1
phase-2
phase-3
phase-4
phase-5
phase3
phase:3
priority: high
question
refactor
refactoring
resource-sharing
security
server
server-module
services
session
session-management
settings
setup
shutdown
state
storage
streaming
sub-issue
tests
tooling
type:task
ui
ui/ux
user-accounts
user-management
ux
viewmodel
websocket
windows
windows-integration
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Torvian.eu/chatbot!336
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/assistant-response-timer"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Adds a non-interactive
mm:sselapsed-time indicator to the chat composer action row, immediately left of the send, pause and stop button, in both composer instances. The measurement starts when a turn entersRUNNING, keeps counting throughPAUSINGandSTOPPING, freezes at the final value onIDLE, and stays visible until the next message is sent. The change is client-only: no server, worker, shared-model, protocol or database change.Changes
AssistantResponseTimerState(hidden, running, frozen) and derived it solely from turn-state transitions insideChatStateImpl.setTurnExecutionState, so the measurement can never disagree with the turn state machine.resetStateso a reused session slot cannot display another session's value.ChatStateandChatViewModel.formatAssistantResponseDuration, rendering a turn duration as a zero-paddedmm:ssvalue with unbounded minutes and a zero clamp for negative durations.AssistantResponseTimercomposable, which ticks once per second from the turn start instant while a turn is active and renders the final value afterwards, dimmed to read as inactive.InputAreainstances and threaded the state throughChatScreen,ChatAreaState,ChatAreaandMessageList.Implementation notes
RUNNINGwrites keep the original start instant, and repeatedIDLEwrites cannot overwrite an already frozen value.Validation
./gradlew :app:desktopTest --offline— PASS, 0 failures, 25 new tests across 4 new test classes../gradlew :app:desktopMainClasses --offline— PASS../gradlew :app:wasmJsMainClasses --offline— PASS../gradlew :app:compileAndroidMaincannot run in this environment (missing Android SDK path inlocal.properties); pre-existing and unrelated.Risks and follow-up