Skip to content

Warn when a live provider CLI catalog diverges from the snapshot #745

Closed

Description

@currentbits

Parent: #738
Ship after the snapshot updates (#740, #741, #742). Does not block adding Sol / ultra / ultracode.

Why

electron/providers.js is a handwritten snapshot of each CLI catalogue. It goes stale the moment a model ships. That is how GPT-5.6 Sol, Codex ultra, Claude ultracode, and the OpenCode Zen churn (#742) went missing from the picker even though Custom... already accepts the id.

Keep snapshots as the offline default (no network at picker open). Add a divergence warning so the next miss is visible in-app instead of a research thread.

What to ship

  1. When providers.list (or the config doctor) can cheaply read a local CLI cache, compare live ids to the snapshot:
    • Codex: ~/.codex/models_cache.json (visibility=list only)
    • Grok: grok models / ~/.grok/models_cache.json
    • OpenCode: opencode models
    • Cursor: cursor-agent --list-models
    • Kimi: ~/.kimi-code/config.toml [models."..."] alias keys
    • Claude: only if a logged-in CLI has a cheap /model listing; claude --help does not enumerate models. Skip rather than guess.
  2. Surface a doctor row or a providers.list note when live has ids the snapshot lacks, or the snapshot still lists ids the CLI no longer does. One line per harness, not a toast on every composer open.
  3. Do not auto-merge live ids into the picker in this issue. Merging would also pull visibility=hide models, paid OpenCode providers, and Cursor's 200-id explosion into the default list. Snapshot remains the curated picker; Custom... remains the escape hatch.
  4. Never probe the network. Local cache / local models command only. Missing cache = no warning.

Out of scope

  • Live-refreshing the picker (optional later, not this issue).
  • Treating Cursor's baked-in effort suffixes as a separate effort pill.
  • Closing the custom-id path. setProvider must keep accepting any non-empty id up to 100 chars; the snapshot is a suggestion.

Files

electron/providers.js, electron/doctor.js / electron/configDoctor.js (whichever already lists provider CLIs), electron/test/ for the comparison helper.

Activity

  1. added and removed on Aug 28, 2026
  2. currentbits commented on Aug 28, 2026

    @currentbits
    OwnerAuthor

    Shipped on coder/fork-warn-when-a-live-provider-cli-catal-c916c9:

    • Cheap file compares at providers.list: Codex ~/.codex/models_cache.json (visibility=list only), Grok ~/.grok/models_cache.json, Kimi ~/.kimi-code/config.toml alias keys.
    • OpenCode (opencode models) and Cursor (cursor-agent --list-models) run in the background after the first list so boot stays cheap; the next list (model picker open already refreshes) awaits the inflight probe.
    • Claude is skipped (no cheap listing). Missing cache / failed local command = no warning. Snapshot models are never merged.
    • One line per harness on ProviderInfo.catalogNote, shown in Settings → Threads and in the model picker detail pane (not a toast). Custom... is unchanged.

    Helper: electron/catalogDivergence.js. Tests: electron/test/catalog-divergence.test.js.

  3. currentbits commented on Aug 28, 2026

    @currentbits
    OwnerAuthor

    listProviders (via providers.list / listProvidersForApi) attaches catalogNote when catalogHome is set and a local cache diverges. Codex: ~/.codex/models_cache.json visibility=list. Grok: ~/.grok/models_cache.json keys. Kimi: ~/.kimi-code/config.toml [models."..."]. Claude skipped (no cheap listing). OpenCode skipped in the default probe because ~/.cache/opencode/models.json is the full paid catalog, not the Zen list; tests inject opencodeModelsText. Missing cache = no warning. Snapshot is not auto-merged.

  4. added and removed on Aug 28, 2026
  5. currentbits commented on Aug 28, 2026

    @currentbits
    OwnerAuthor

    Shipped on this thread as part of #738.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions