Replies: 1 comment
|
+1 on §1 (per-instance icons) with a second concrete case, this time on the Claude driver. Setup: Kimi Code subscription wired in as a second Small additions to the proposal, in case it helps shape it:
Build: 0.0.34-nightly.20260819.1132 on Windows 11. Authorship disclosure: written by Claude (Fable 5) in Claude Code on the user's machine, at the user's request. |
Uh oh!
There was an error while loading. Please reload this page.
These came out of a few days of running T3 Code with a mix of hosted and local models. They're related, so I'm putting them in one discussion rather than five — happy to split if you'd rather.
Context for all of it: I use a Claude instance, an OpenRouter instance, and local models. OpenRouter isn't a driver, so it's configured as a custom instance of the
opencodedriver, reaching OpenRouter through OpenCode as an upstream.1. Per-instance icons / branding
A custom provider instance can set
displayNameandaccentColor, and gets initials on a badge — but the logo is resolved purely from the driver:So my OpenRouter instance renders the OpenCode logo with an "OP" initials badge. Functionally fine, visually confusing: in the model picker every row reads "OpenCode · openrouter" or "OpenCode · opencode" with the same mark, and the only way to tell them apart at a glance is the two-letter badge.
Suggestion: let an instance supply its own icon (bundled asset key, or a user-provided file/URL), falling back to the driver icon. The accent colour plumbing already exists, so this seems like the natural completion of it.
2. A generic OpenAI-compatible driver
Right now anything that isn't Codex / Claude / Cursor / Grok / OpenCode has to be tunnelled through OpenCode. That works, but it means the provider list, health checks, versions, and the model picker all describe the tunnel rather than the thing I actually chose.
This got more noticeable when the
ollamaandllamacppdrivers disappeared — my existing instances now sit in Settings reading:I assume that removal was deliberate (OpenCode can reach local models). But the net effect is that local models and OpenRouter are both second-class now. A single generic OpenAI-compatible driver — base URL, API key, model list — would cover Ollama, llama.cpp, LM Studio, vLLM, OpenRouter, and most self-hosted gateways, without adding a bespoke driver per vendor.
3. Graceful handling of instances whose driver no longer exists
Related to the above: when a driver is removed, existing instances just sit disabled with the message above and no next step. Something like "this driver was removed in vX — migrate to «generic» / remove this instance" would turn a dead end into a one-click fix. The contracts layer already preserves unknown-driver envelopes verbatim, so the data is there to act on.
4. An extension point that doesn't require modifying the app bundle
This is the one I'd most like you to think about, and the motivation is concrete.
I wanted two behaviours the app doesn't have (switching provider mid-thread with the conversation carried over, and an interrupt that can't strand a thread). The only way to get them was to edit the packaged bundle — patch
bin.mjs, rewrite the asar header integrity, updateElectronAsarIntegrityinInfo.plist, and re-sign.That works, but re-signing has real consequences:
com.apple.developer.associated-domains = webcredentials:clerk.t3.codesplus a team identifier. Any re-sign under a different identity loses the domain association, so Clerk passkey sign-in stops working (passkey_retrieval_failed— "the calling process does not have an application identifier"). Signing ad-hoc drops the entitlements entirely; re-applying the original entitlements under another team makes macOS refuse to launch the app at all.In other words, the current design makes "extend it locally" and "stay updated + stay signed in" mutually exclusive.
A supported extension point would remove that cliff entirely. Rough shapes, in increasing order of ambition:
~/.t3/extensions— enough to wrap orchestration events (turn start, interrupt, session start) without touching the bundle.Even the first one would have covered everything I needed.
5. Ship the update feed in every distributed build
Minor, but it cost me five weeks. I was running a build whose
Contents/Resources/app-update.ymlwas missing, soelectron-updaterreported "Automatic updates are not available because no update feed is configured" and silently never checked — it sat ~600 commits behind until I went looking. The current nightly DMG does shipapp-update.yml, so this may already be fixed, or that bundle may have been repackaged before it reached me.Two small things that would have surfaced it either way: show the updater's disabled reason somewhere in Settings instead of only in logs, and treat "no feed configured" in a packaged build as a visible warning rather than a silent no-op.
Environment: macOS arm64,
v0.0.34-nightly.20260817.1120, providers: Claude (native), OpenRouter + OpenCode (bothopencodedriver), local Ollama.I know contributions are effectively closed right now — none of this is a PR request, just things I ran into that seemed worth writing down.
All reactions