Repository navigation
feat: say what each provider actually gives you - #583
Merged
Merged
Conversation
omartelo
force-pushed
the
feat/provider-support-matrix
branch
from
September 10, 2026 18:25
4365f72 to
4205a53
Compare
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
force-pushed
the
feat/provider-support-matrix
branch
from
September 10, 2026 18:32
4205a53 to
cdae958
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #577.
README.mdcalled all eight providers first-class;docs/ceilings.mdrecorded 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 supportsection in both READMEs, rows = readings, columns = providers:It is read off
usageSourceFor,contextUsageFor,quota.Plans,providers.SupportsForkanddocs/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, becausetranscriptReaderForreads 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 idiomSessionForkItemalready 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
turnUnavailableReasondeliberately stays silent there rather than blaming a provider for half a second. The reason goes on its own line because the dock resizes down toMIN_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, thatturnSwitchablereads the session's own reports whileturnUnavailableReasonis a hand-written list, so the two disagree until the list moves with the contract.CLAUDE.mdanddocs/adding-a-provider.mdnow point at the table: a provider added later answers every row, or ships a column that reads as a provider giving you nothing.CHANGELOG.mdunder[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 --noEmitall exit 0 (run as the direct binaries;pnpm execmasks the exit code here)gofmt -l .,go vet ./...,go test ./...cleanturnUnavailableReasoncovered 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 sessiondisabledconfirmed a first-class base-uiToggleprop that renders a natively disabled button, sotoggleVariants'disabled:opacity-50appliesMIN_REMand at full screen