Skip to content

v1 TUI sync hardcodes limit:100 — api.state.session.messages() returns truncated data for long sessions #31513

Description

@zhumengzhu

Description

Sessions with >100 messages silently return truncated data via api.state.session.messages(). Plugins (cache-hit, etc.) see incorrect statistics because the API only returns the last 100 messages.

The root cause is in packages/opencode/src/cli/cmd/tui/context/sync.tsx:

// line 559
sdk.client.session.messages({ sessionID, limit: 100 }),
// lines 580-581
const removed = infos.slice(0, -100)
const visible = infos.slice(-100)

This hardcoded window means any session exceeding 100 messages is silently truncated.

Concrete example — a real opus-4-6 session with 284 messages (234 assistant + 50 user):

Full (DB session table) API (messages(), last 100) Loss
tokens_cache_read 138,989,149 59,585,432 −57%
tokens_input 329 118 −64%
tokens_output 91,895 32,749 −64%
cost $80.61 $31.17 −61%

The cache-hit plugin correctly aggregates whatever the API returns — the data is simply incomplete.

Related issues:


Plugins

opencode-cache-hit


Steps to reproduce

  1. Run a long session that accumulates >100 messages
  2. Compare session table aggregate (tokens_cache_read, cost) with what api.state.session.messages() returns
  3. Cache-hit sidebar will show ~43% of actual values

OpenCode version

1.16.0


Operating System

Linux

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions