Skip to content

feat: say what each provider actually gives you - #583

Merged
omartelo merged 1 commit into
mainfrom
feat/provider-support-matrix
Sep 10, 2026
Merged

omartelo merged 1 commit into
mainfrom
feat/provider-support-matrix

Conversation

@omartelo

Copy link
Copy Markdown
Collaborator

Closes #577.

README.md called all eight providers first-class; docs/ceilings.md recorded what each one actually reaches. A contributor document is not where a stranger picks a binary, so the spread now lives beside the provider list, in what the user sees.

The table

New ## Provider support section in both READMEs, rows = readings, columns = providers:

What you get Claude Code Codex Antigravity opencode oh-my-pi Crush Cursor CLI Kiro CLI
Context window in the footer yes yes no no no no no yes
Cost in the footer yes yes no yes yes yes no credits
How much of your plan is left yes yes no no no no no no
Spinner while a turn runs, ring when it ends yes yes yes yes yes no no yes
Bell when the agent is blocked on you yes yes no yes no no no no
Machine kept out of idle sleep while a turn runs yes yes yes yes yes no no yes
Review tab's Last turn, with the agent's recap yes yes yes yes yes no no yes
Search the conversation from the palette yes yes yes yes yes yes no yes
Fork a conversation into a new worktree yes yes no yes no no no no

It is read off usageSourceFor, contextUsageFor, quota.Plans, providers.SupportsFork and docs/hooks/session-state.md, not off the issue's own table, which is wrong in one row: Antigravity has palette search and the last-turn recap, because transcriptReaderFor reads its JSONL. Cursor CLI is the only provider with neither.

"first-class" is spent rather than repeated. Every provider is spawned, resumed, sandboxed and reachable from other sessions the same way; what differs is what lich can read back, because it reads what each CLI writes down.

The Review tab stops hiding it

On a Crush or Cursor CLI session, {switchable && <SourceRow/>} meant the Working tree / Last turn control simply never appeared, which reads the same as a bug. The strip is now drawn with Last turn dead under a line naming why, the idiom SessionForkItem already uses for a card that cannot fork.

A session whose provider does report is untouched, including one that has not reported yet: its switch is seconds away, and turnUnavailableReason deliberately stays silent there rather than blaming a provider for half a second. The reason goes on its own line because the dock resizes down to MIN_REM, where a sentence sharing the row with the toggle group has nowhere to go.

Paperwork

  • docs/ceilings.md: the "neither the switch nor the recap band is ever drawn" clause is gone, replaced by the trap it leaves behind, that turnSwitchable reads the session's own reports while turnUnavailableReason is a hand-written list, so the two disagree until the list moves with the contract.
  • Rule 5 in CLAUDE.md and docs/adding-a-provider.md now point at the table: a provider added later answers every row, or ships a column that reads as a provider giving you nothing.
  • CHANGELOG.md under [Unreleased].

Out of scope

No new transcript reader. Antigravity already has one and what it lacks is a window and a cost its CLI never writes; Cursor files a chat as a content-addressed blob store whose order lives in a protobuf index, and neither schema is a contract anybody promised to keep.

Test plan

  • biome ci ., vitest run, tsc --noEmit all exit 0 (run as the direct binaries; pnpm exec masks the exit code here)
  • gofmt -l ., go vet ./..., go test ./... clean
  • turnUnavailableReason covered four ways: names the provider on the two that report no turn, says what the absence costs, stays silent for a provider that reports, stays silent for a shell and for no active session
  • disabled confirmed a first-class base-ui Toggle prop that renders a natively disabled button, so toggleVariants' disabled:opacity-50 applies
  • Eyeball the dead switch on a real Crush card at MIN_REM and at full screen

@omartelo
omartelo force-pushed the feat/provider-support-matrix branch from 4365f72 to 4205a53 Compare September 10, 2026 18:25
The README called all eight providers first-class while docs/ceilings.md
recorded a wide spread, and a contributor document is not where a user
picks a binary. A Provider support table now sits beside the provider
list in both READMEs, written in what the user sees: the footer's context
window, cost and plan gauge, the card's spinner and bell, whether the
machine stays awake, the Review tab's last turn, palette search, and
forking a conversation into a worktree. It is built from usageSourceFor,
contextUsageFor, quota.Plans, SupportsFork and the session-state contract,
not from the issue's own table, which had Antigravity down as having no
search or recap when transcriptReaderFor reads its JSONL.

The word first-class is spent rather than repeated: every provider runs
the same way, and what lich can read back out of a session is the part
that differs.

The Review tab stops hiding the difference. On Crush and Cursor CLI the
Working tree / Last turn control simply never appeared, which reads the
same as a bug; it is now drawn with Last turn dead under a line saying
the provider reports neither the start nor the end of a turn, the same
idiom SessionForkItem uses for a card that cannot fork. A session whose
provider does report is untouched, including one that has not reported
yet: its switch is seconds away and naming its provider there would be
wrong by the time it was read.

Rule 5 and docs/adding-a-provider.md now point at the table too, so a
provider added later has to answer every row of it rather than leaving a
column that reads as a provider giving you nothing.

No new transcript reader: Antigravity already has one and what it lacks
is a window and a cost its CLI never writes, while Cursor files a chat as
a content-addressed blob store ordered by a protobuf index, and neither
schema is a contract anybody promised to keep.
@omartelo
omartelo force-pushed the feat/provider-support-matrix branch from 4205a53 to cdae958 Compare September 10, 2026 18:32
@omartelo
omartelo merged commit bd66770 into main Sep 10, 2026
7 checks passed
@omartelo
omartelo deleted the feat/provider-support-matrix branch September 10, 2026 18:35
@omartelo omartelo mentioned this pull request Sep 11, 2026
4 of 5 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The eight providers are not equally first-class, and only docs/ceilings.md says so

1 participant