Skip to content
Draft
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
f841782
Fix TUI text truncation during streaming (#5006)
ariane-emory Dec 22, 2025
9fac82a
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 22, 2025
ef5fbe5
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 23, 2025
1eb8a72
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 23, 2025
4ba73cd
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 23, 2025
cbc4376
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 23, 2025
109f0e4
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 23, 2025
97b670b
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 24, 2025
146a26a
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 24, 2025
1db8c9a
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 24, 2025
e6b8af2
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 24, 2025
9b02950
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 25, 2025
380e6e5
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 25, 2025
6613472
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 25, 2025
5c963ec
Merge remote-tracking branch 'origin/dev' into fix/message-truncation
ariane-emory Dec 27, 2025
449b845
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 27, 2025
86d55c6
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 28, 2025
cfd5ba8
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 28, 2025
61b9793
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 28, 2025
ed8e541
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 28, 2025
a7889b5
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 29, 2025
40e53cc
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 29, 2025
b0e4a4c
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 29, 2025
56013e6
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 29, 2025
4e15021
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 29, 2025
3d3c9f0
Merge branch 'fix/message-truncation' of github.com:ariane-emory/open…
ariane-emory Dec 29, 2025
c91c138
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 30, 2025
9a4a262
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 30, 2025
ec64cd4
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 30, 2025
66fb8bd
Merge branch 'fix/message-truncation' of github.com:ariane-emory/open…
ariane-emory Dec 30, 2025
063cb7b
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 30, 2025
fefaad2
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 30, 2025
2cad5d2
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 30, 2025
93991b6
Merge branch 'dev' into fix/message-truncation
ariane-emory Dec 31, 2025
6f93872
Merge branch 'dev' into fix/message-truncation
ariane-emory Jan 1, 2026
42c5ff0
Merge branch 'dev' into fix/message-truncation
ariane-emory Jan 1, 2026
364e089
Merge branch 'dev' into fix/message-truncation
ariane-emory Jan 1, 2026
ed9a9b2
Merge branch 'dev' into fix/message-truncation
ariane-emory Jan 2, 2026
4cc0752
Merge branch 'dev' into fix/message-truncation
ariane-emory Jan 3, 2026
46d895c
Merge branch 'dev' into fix/message-truncation
ariane-emory Jan 3, 2026
827776a
Merge branch 'dev' into fix/message-truncation
ariane-emory Jan 4, 2026
57480e2
Merge branch 'dev' into fix/message-truncation
ariane-emory Jan 4, 2026
d069a56
Merge branch 'dev' into fix/message-truncation
ariane-emory Jan 4, 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
26 changes: 26 additions & 0 deletions packages/opencode/src/cli/cmd/tui/context/sync.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,32 @@ export const { use: useSync, provider: SyncProvider } = createSimpleContext({
}
const result = Binary.search(parts, event.properties.part.id, (p) => p.id)
if (result.found) {
// For TextParts during streaming, use produce to merge deltas safely
// This prevents race conditions where text-end overwrites accumulated text
const currentPart = parts[result.index]
if (currentPart.type === "text" && event.properties.part.type === "text") {
const incomingTextPart = event.properties.part as Extract<Part, { type: "text" }>
const currentTextPart = currentPart as Extract<Part, { type: "text" }>

// If this is a streaming update (has text field), use produce for safe merge
if (incomingTextPart.text !== undefined) {
setStore(
"part",
event.properties.part.messageID,
produce((draft) => {
const part = draft[result.index] as Extract<Part, { type: "text" }>
// Update text content but preserve other metadata
part.text = incomingTextPart.text
// Update timing only if end time is provided (text-end event)
if (incomingTextPart.time?.end) {
part.time = incomingTextPart.time
}
})
)
break
}
}
// Fall back to reconcile for non-text parts or non-streaming updates
setStore("part", event.properties.part.messageID, result.index, reconcile(event.properties.part))
break
}
Expand Down