Skip to content
Draft
Changes from all commits
Commits
Show all changes
143 commits
Select commit Hold shift + click to select a range
148d4c7
feat: add elapsed runtime display for in-progress TUI commands
ariane-emory Dec 21, 2025
26ac1fa
fix: ensure only one elapsed timer runs for the active message
ariane-emory Dec 21, 2025
3d371de
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 21, 2025
62f86c8
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 21, 2025
8110759
feat: fix elapsed timer to track current action time instead of total…
ariane-emory Dec 21, 2025
1dfd34a
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 22, 2025
0edd253
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 23, 2025
1066851
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 23, 2025
e8856e5
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 23, 2025
8c538b8
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 23, 2025
de8e350
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 23, 2025
d40346e
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 24, 2025
e211fa9
feat: sinister quotes
ariane-emory Dec 24, 2025
63b7fc3
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 24, 2025
4749d73
Merge branch 'dev' into feat/sinister-quotes-v3
ariane-emory Dec 24, 2025
28131f1
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 24, 2025
d301de9
feat: quotes
ariane-emory Dec 24, 2025
e3f5b0f
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 24, 2025
c17639b
Merge branch 'feat/sinister-quotes' of github.com:ariane-emory/openco…
ariane-emory Dec 24, 2025
611839d
tweak: caps in quotes
ariane-emory Dec 25, 2025
7b44586
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 25, 2025
168e42d
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 25, 2025
d5063a8
tweak: quote wording
ariane-emory Dec 25, 2025
1ff1636
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 25, 2025
0afe407
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 25, 2025
929e1b5
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 25, 2025
3357436
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 25, 2025
9cc7785
tweak: quotes
ariane-emory Dec 26, 2025
519e19a
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 26, 2025
8eb27d5
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 26, 2025
663273e
fix: remove fallback to user message time in elapsed timer
ariane-emory Dec 27, 2025
42296ed
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 27, 2025
53ee7a9
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 27, 2025
f029874
revert file
ariane-emory Dec 27, 2025
f384f27
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 27, 2025
661c2aa
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 27, 2025
821f7c0
tweak: quotes
ariane-emory Dec 27, 2025
d0580a1
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 27, 2025
4d48572
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 27, 2025
6eebb9e
Merge branch 'feat/elapsed-timer' of github.com:ariane-emory/opencode…
ariane-emory Dec 27, 2025
18f9b2c
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 27, 2025
a794589
comment: 'no clobber' warning.
ariane-emory Dec 28, 2025
a6fb9ea
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 28, 2025
2997fe7
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 28, 2025
82fcf77
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 28, 2025
ff5416a
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 28, 2025
33aa327
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 28, 2025
13c2878
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 28, 2025
ce64276
tweak: quote capitalization
ariane-emory Dec 29, 2025
e07008f
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
72415de
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 29, 2025
1802b67
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
650aec5
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 29, 2025
dfbe9e4
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
5041742
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 29, 2025
2939330
Merge branch 'feat/elapsed-timer' of github.com:ariane-emory/opencode…
ariane-emory Dec 29, 2025
d0beeef
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 29, 2025
e8e8d42
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
1408266
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 29, 2025
69887ad
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 29, 2025
d75d5b5
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 29, 2025
02b83a5
Merge branch 'feat/elapsed-timer' of github.com:ariane-emory/opencode…
ariane-emory Dec 29, 2025
e1a8f72
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
3f5af6d
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 30, 2025
87d56ca
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 30, 2025
9152b6e
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
b626b57
tweak: capitalization in quote
ariane-emory Dec 30, 2025
c24c03b
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
b596c0a
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 30, 2025
3a233f7
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 30, 2025
d8525d4
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
855364e
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
05c1dd0
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 30, 2025
44d5424
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 30, 2025
679a53d
tweak: - some quotes.
ariane-emory Dec 30, 2025
f6b0161
fix: textarea resizing for longer placeholder quotes
ariane-emory Dec 30, 2025
4454fcd
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Dec 31, 2025
855e6ef
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Dec 31, 2025
76846fe
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 1, 2026
5f5fddb
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 1, 2026
e6ed2dd
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 1, 2026
d89ddfd
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 1, 2026
8ad5f9d
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 1, 2026
09a00c2
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 1, 2026
fd4ae5b
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 2, 2026
e7b428b
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 2, 2026
188fc6d
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 3, 2026
be64d70
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 3, 2026
63657da
Merge dev into feat/sinister-quotes
ariane-emory Jan 3, 2026
2634eee
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 3, 2026
38169c8
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 3, 2026
12ccd2a
Merge remote-tracking branch 'origin/dev' into feat/elapsed-timer
ariane-emory Jan 4, 2026
1663b41
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 4, 2026
4a6176a
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 4, 2026
766c8bf
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 4, 2026
9192f96
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 4, 2026
247764f
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 4, 2026
c73790a
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 5, 2026
45de74b
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
d7f09ed
fix: prevent yoga-layout WASM error during navigation
ariane-emory Jan 5, 2026
6affd4b
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
f6bed2c
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 5, 2026
fe0ba21
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
54bbd45
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
e1016de
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 5, 2026
5dbe72e
Merge branch 'feat/sinister-quotes' of github.com:ariane-emory/openco…
ariane-emory Jan 5, 2026
f0c67d2
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 5, 2026
c9552e7
Fix JSX syntax error in merge conflict resolution
ariane-emory Jan 5, 2026
9b96827
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 6, 2026
58d2aa7
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 6, 2026
823cdf8
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 6, 2026
57be206
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 6, 2026
564bdd3
Merge remote-tracking branch 'origin/dev' into feat/elapsed-timer
ariane-emory Jan 6, 2026
5d91c1f
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 6, 2026
2f57861
Merge branch 'dev' into feat/sinister-quotes
ariane-emory Jan 6, 2026
4409312
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 6, 2026
4b9e301
Merge branch 'feat/sinister-quotes' of github.com:ariane-emory/openco…
ariane-emory Jan 6, 2026
2e9654b
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 6, 2026
421cdb6
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 7, 2026
d1a372b
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 7, 2026
7b4341d
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 7, 2026
65fcc8e
fix(tui): resolve elapsed timer reactivity issue by accessing parts d…
ariane-emory Jan 7, 2026
2238d0c
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 7, 2026
6265274
fix: revert a file
ariane-emory Jan 11, 2026
7b8afec
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 11, 2026
555bfa6
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 11, 2026
c0ed72d
Merge remote-tracking branch 'origin/dev' into feat/elapsed-timer
ariane-emory Jan 13, 2026
da5d808
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 13, 2026
a72d82c
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 13, 2026
f0a2e82
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 15, 2026
d2572e1
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 16, 2026
5bc10cd
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 17, 2026
a6bfb9b
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 17, 2026
e9917c3
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 19, 2026
ed97eae
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 20, 2026
f061572
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 22, 2026
341a5ed
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 23, 2026
aaffd18
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 25, 2026
9318946
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 25, 2026
7bb5604
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 26, 2026
3d6219c
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 27, 2026
98c333a
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 29, 2026
e411472
Merge branch 'dev' into feat/elapsed-timer
ariane-emory Jan 29, 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
57 changes: 57 additions & 0 deletions packages/opencode/src/cli/cmd/tui/routes/session/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ import {
Show,
Switch,
useContext,
onCleanup,
type Component,
} from "solid-js"
import { Dynamic } from "solid-js/web"
import path from "path"
Expand Down Expand Up @@ -1234,6 +1236,58 @@ function AssistantMessage(props: { message: AssistantMessage; parts: Part[]; las
return props.message.time.completed - user.time.created
})

// Elapsed time for in-progress messages
const [elapsedTime, setElapsedTime] = createSignal(0)

createEffect(() => {
// Only run timer for the last in-progress message (not final/completed)
// This prevents multiple timers from running for older messages
if (!props.last || final()) {
setElapsedTime(0)
return
}

// Access parts directly from the store for proper reactivity tracking
// Using props.parts doesn't trigger updates when individual parts change
const parts = sync.data.part[props.message.id] ?? []

// Find the start time of the last active part (current action)
let startTime: number | undefined

// Check parts in reverse order to find the most recent one with timing
for (let i = parts.length - 1; i >= 0; i--) {
const part = parts[i]

if (part.type === "tool") {
// Running tool has time.start
if (part.state.status === "running" && part.state.time?.start) {
startTime = part.state.time.start
break
}
} else if (part.type === "text" || part.type === "reasoning") {
// Text/reasoning parts have time.start if in progress (no end time)
if (part.time?.start && !part.time?.end) {
startTime = part.time.start
break
}
}
}

// No running part found - don't show elapsed time
if (!startTime) {
setElapsedTime(0)
return
}

const interval = setInterval(() => {
setElapsedTime(Date.now() - startTime!)
}, 1000)

onCleanup(() => {
clearInterval(interval)
})
})

return (
<>
<For each={props.parts}>
Expand Down Expand Up @@ -1284,6 +1338,9 @@ function AssistantMessage(props: { message: AssistantMessage; parts: Part[]; las
<Show when={duration()}>
<span style={{ fg: theme.textMuted }}> · {Locale.duration(duration())}</span>
</Show>
<Show when={!final() && elapsedTime()}>
<span style={{ fg: theme.textMuted }}> · running {Locale.duration(elapsedTime())}</span>
</Show>
<Show when={props.message.error?.name === "MessageAbortedError"}>
<span style={{ fg: theme.textMuted }}> · interrupted</span>
</Show>
Expand Down