Skip to content

Commit 0a139ab

Browse files
committed
tui: show full session history in chat and timeline
Long sessions previously dropped older messages from the in-memory store: the initial sync was capped at 100 and a per-event eviction removed the oldest message whenever new ones arrived, leaving the chat starting mid-conversation and the Timeline / Jump-to-Message features unable to reach the missing entries. - Remove the 100-message limit from the initial session sync so all historical messages are loaded. - Remove the eviction block from the message.updated handler so older messages are no longer purged when new ones arrive. - Add Locale.datetimeFull (DD/MM/YYYY HH:MM) and use it for the Timeline footer so each entry shows full date and time instead of just time.
1 parent 2cb697b commit 0a139ab

3 files changed

Lines changed: 12 additions & 21 deletions

File tree

packages/opencode/src/cli/cmd/tui/context/sync.tsx

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -268,25 +268,6 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
268268
draft.splice(result.index, 0, event.properties.info)
269269
}),
270270
)
271-
const updated = store.message[event.properties.info.sessionID]
272-
if (updated.length > 100) {
273-
const oldest = updated[0]
274-
batch(() => {
275-
setStore(
276-
"message",
277-
event.properties.info.sessionID,
278-
produce((draft) => {
279-
draft.shift()
280-
}),
281-
)
282-
setStore(
283-
"part",
284-
produce((draft) => {
285-
delete draft[oldest.id]
286-
}),
287-
)
288-
})
289-
}
290271
break
291272
}
292273
case "message.removed": {
@@ -522,7 +503,7 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
522503
if (fullSyncedSessions.has(sessionID)) return
523504
const [session, messages, todo, diff] = await Promise.all([
524505
sdk.client.session.get({ sessionID }, { throwOnError: true }),
525-
sdk.client.session.messages({ sessionID, limit: 100 }),
506+
sdk.client.session.messages({ sessionID }),
526507
sdk.client.session.todo({ sessionID }),
527508
sdk.client.session.diff({ sessionID }),
528509
])

packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export function DialogTimeline(props: {
3131
result.push({
3232
title: part.text.replace(/\n/g, " "),
3333
value: message.id,
34-
footer: Locale.time(message.time.created),
34+
footer: Locale.datetimeFull(message.time.created),
3535
onSelect: (dialog) => {
3636
dialog.replace(() => (
3737
<DialogMessage messageID={message.id} sessionID={props.sessionID} setPrompt={props.setPrompt} />

packages/opencode/src/util/locale.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,16 @@ export function datetime(input: number): string {
1414
return `${localTime} · ${localDate}`
1515
}
1616

17+
export function datetimeFull(input: number): string {
18+
const date = new Date(input)
19+
const dd = String(date.getDate()).padStart(2, "0")
20+
const mm = String(date.getMonth() + 1).padStart(2, "0")
21+
const yyyy = date.getFullYear()
22+
const hh = String(date.getHours()).padStart(2, "0")
23+
const min = String(date.getMinutes()).padStart(2, "0")
24+
return `${dd}/${mm}/${yyyy} ${hh}:${min}`
25+
}
26+
1727
export function todayTimeOrDateTime(input: number): string {
1828
const date = new Date(input)
1929
const now = new Date()

0 commit comments

Comments
 (0)