Skip to content

feat(provider): add HornetDriver for local Mixr-routed Hornet server.

MacroscopeApp / Macroscope - UI Consistency failed Aug 30, 2026 in 3m 33s

UI Consistency: 1 issue found

apps/web/src/session-logic.ts (lines 55-60) — The new hornet entry is added to PROVIDER_OPTIONS (and PROVIDER_ICON_BY_PROVIDER) as an available provider, but no matching ProviderClientDefinition is registered in apps/web/src/components/settings/providerDriverMeta.ts. Since ProviderSettingsPanel builds PROVIDER_SETTINGS from DRIVER_OPTIONS, Settings → Providers renders no Hornet row, AddProviderInstanceDialog cannot create a Hornet instance, and any existing instance falls through the unknown-driver path in ProviderInstanceCard (raw hornet label, no icon, no Early Access badge, no settings form for serverUrl/binaryPath, no models section). Fix: add a Hornet entry to PROVIDER_CLIENT_DEFINITIONS using HornetIcon and the new HornetSettings schema, matching the grok/cursor pattern.

An inline review comment with the suggested fix has been posted.

Details

Note

Your check run agent prompt is: .macroscope/check-run-agents/ui-consistency.md
More information about how Check Run Agents work can be found in our Help Center.

Scope examined (include patterns apps/web/src/**/*.{ts,tsx,css})

  • apps/web/src/components/Icons.tsx — new HornetIcon. Follows existing icon conventions (Icon type, {...props} spread, viewBox, fill="none"); uses stroke-current so it inherits currentColor like other themed marks, and renders correctly through ProviderInstanceIcon's size-5 className forwarding. No finding.
  • apps/web/src/components/chat/providerIconUtils.ts — icon map entry consistent with the other provider kinds. No finding.
  • apps/web/src/session-logic.ts — new picker option; see finding above.

Context consulted (out of scope for actions)

  • apps/web/src/components/settings/providerDriverMeta.ts (PROVIDER_CLIENT_DEFINITIONS, getDriverOption)
  • apps/web/src/components/settings/ProviderSettingsPanel.tsx (PROVIDER_SETTINGS = DRIVER_OPTIONS.map(...), row construction at lines 512-569)
  • apps/web/src/components/settings/ProviderInstanceCard.tsx (unknown-driver read-only path, badge and settings-form gating at lines 542-780)
  • apps/web/src/components/settings/AddProviderInstanceDialog.tsx (driver list sourced from DRIVER_OPTIONS)
  • packages/contracts/src/settings.ts (HornetSettings, ServerSettings.providers.hornet) and apps/server/src/provider/Layers/HornetProvider.ts (badgeLabel: "Early Access")

Other partial provider maps (CUSTOM_MODEL_PLACEHOLDER_BY_KIND, formatProviderDisplayName) intentionally omit some drivers (grok is absent too) and degrade gracefully, so no findings were raised there.


🔍 Agent activity — 24 tool calls

💭 I need to check the in-scope files—Icons.tsx, providerIconUtils.ts, and session-logic.ts—and see how existing icons are structured for consistency.

1. browse_code — apps/web/src/components/Icons.tsx

2. browse_code — apps/web/src/components/chat/providerIconUtils.ts

💭 I should check other provider icons like OpenCodeIcon, GrokIcon, and CursorIcon to see how they handle styling conventions such as fill vs stroke color classes.

3. git_tools — export const (OpenCodeIcon|GrokIcon|CursorIcon|ClaudeAI|OpenAI): Icon — rejected: repo.url: required parameter is missing or empty;repo: required parameter is missing or empty

4. git_tools — export const (OpenCodeIcon|GrokIcon|CursorIcon): Icon

💭 I'm checking the HornetIcon's stroke styling—it uses currentColor classes which work fine, though I'm noting the strokeWidth might look thin at small render sizes without vector-effect applied. Now I want to check consistency across provider picker icons—whether HornetIcon's stroke-based rendering fits alongside the fill-based icons in PROVIDER_ICON_BY_PROVIDER. I should also look at session-logic's PROVIDER_OPTIONS to see how the "new" badge and provider entries are structured elsewhere, like display names or settings forms.

5. browse_code — apps/web/src/session-logic.ts

💭 These changes look consistent. I should check whether apps/web has other maps keyed by ProviderDriverKind—things like settings pages, accent colors, or badge labels—that would need a new provider entry to keep the UI consistent.

6. git_tools — ProviderDriverKind.make("grok")

7. git_tools — "grok"

💭 I also notice the settings UI's provider metadata file doesn't include Hornet yet, so I should check that file too.

8. browse_code — apps/web/src/components/settings/providerDriverMeta.ts

💭 I'm noticing the PR registers Hornet in the provider picker and icon map, and adds HornetSettings to contracts plus a server-side HornetDriver, but never registers a ProviderClientDefinition in providerDriverMeta.ts. That gap means the settings UI won't actually render the Hornet form fields like serverUrl and binaryPath, so the driver will likely fail without proper configuration. I want to check what happens when getDriverOption returns undefined for Hornet -- whether there's a generic fallback card, and whether settings are still editable in that case. I should grep for usages to confirm.

9. git_tools — getDriverOption|DRIVER_OPTION_BY_VALUE|PROVIDER_CLIENT_DEFINITION

10. browse_code — apps/web/src/components/settings/ProviderSettingsPanel.tsx

💭 I need to check how ProviderInstanceCard handles an undefined driverOption—if hornet appears in settings without a matching schema, it would likely render a generic card without the serverUrl configuration field, which means users couldn't set it through the UI. I should look at ProviderInstanceCard's source to confirm this.

11. git_tools — driverOption

💭 I'm confirming that without a ProviderClientDefinition for hornet, the settings UI treats it as an unknown driver — no icon, no proper label, no Early Access badge, and no editable settings form or models section — even though session-logic.ts already offers it as a selectable provider. Since that provider-picker file is in the diff, I can flag the missing settings registration there as a concrete, in-scope consistency issue. Now I want to check whether ProviderSettingsPanel builds its rows from DRIVER_OPTIONS defaults or from the server's settings.providers list, since that determines whether hornet even shows a card at all.

12. git_tools — const rows

13. git_tools — visibleProviderSettings =

💭 I wonder where PROVIDER_SETTINGS is defined - probably in the web or contracts module with the provider settings keys. Let me search for it.

14. git_tools — PROVIDER_SETTINGS(:| =)

💭 Since default provider rows come from DRIVER_OPTIONS and Hornet is missing there, the Settings > Providers panel won't show a Hornet card and users can't configure serverUrl, and the AddProviderInstanceDialog also can't add a Hornet instance since it pulls from the same list—yet the chat provider picker still shows Hornet as available with a "new" badge, which is a real UI inconsistency from the changed lines. But wait, I need to check whether the picker only shows providers that exist server-side, since the server registers the hornet driver via BUILT_IN_DRIVERS with default settings enabled and a default serverUrl, so it would still appear in the picker even without a settings card. I want to check if provider rows also loop over driver kinds found in providerInstances that aren't in the visible set, which would explain forked drivers showing up—I need to look further into that section of the code to confirm.

15. browse_code — apps/web/src/components/settings/ProviderSettingsPanel.tsx

💭 I've confirmed that Hornet's provider settings won't render since it's missing from DRIVER_OPTIONS, so Settings > Providers has no way to configure its server URL, icon, label, or badge—even though the chat provider picker already lists it as available with a "new" badge. Now I'm checking whether HornetIcon exists among the provider icons.

16. git_tools — stroke-current

17. git_tools — PROVIDER_ICON_BY_PROVIDER

💭 I'm checking how provider icons are rendered elsewhere, like in ProviderInstanceIcon, to confirm sizing and stroke width will work for the Hornet icon at small dimensions, and considering whether other icons rely on currentColor versus explicit fills.

18. browse_code — apps/web/src/components/chat/ProviderInstanceIcon.tsx

💭 HornetIcon spreads props onto the svg with fill set to "none" after, overriding any caller fill just like OpenCodeIcon, and it relies on currentColor for stroke so it inherits text color naturally without needing a cn() className merge like other icon components. Now I should check other provider-keyed maps in the web app — things like accent colors, provider labels, model picker grouping, or onboarding flows — to see if opencode needs a corresponding hornet entry there too, so I'm grepping for "opencode" across apps/web.

19. git_tools — opencode

💭 There are also default model placeholders per driver in ProviderModelsSection and a per-provider switch in contextWindow.ts—I should check those to see if a missing hornet entry would degrade the UI.

20. browse_code — apps/web/src/lib/contextWindow.ts

21. browse_code — apps/web/src/components/settings/ProviderModelsSection.tsx

💭 Every provider in PROVIDER_OPTIONS has a matching PROVIDER_CLIENT_DEFINITION except Hornet, which breaks that pattern. I'll post an inline comment on session-logic.ts lines 55-60 pointing this out. Since the fix requires two separate hunks in providerDriverMeta.ts (an import plus an array entry), I shouldn't include a unified diff — better to just describe the fix in prose. I also want to quickly verify that Hornet actually surfaces in the model picker, since that would strengthen the finding, so I'm checking how AVAILABLE_PROVIDER_OPTIONS gets used in ChatView.

22. git_tools — AVAILABLE_PROVIDER_OPTIONS|PROVIDER_OPTIONS

💭 AVAILABLE_PROVIDER_OPTIONS seems only defined but not referenced elsewhere, maybe used in tests. I'm checking where PROVIDER_OPTIONS actually feeds the picker sidebar badge, so I'll search for that usage.

23. git_tools — pickerSidebarBadge

💭 The badge labeling is consistent across providers, so that's not an issue. The stroke width difference in HornetIcon versus provider icon sizing is a minor aesthetic detail I'll skip, and the className handling is also fine as-is. Now I need to pin down the diff location for my comment — the added lines in session-logic.ts fall around 55-60, so I'll reference that range with side RIGHT. I'm drafting the review comment explaining that Hornet lacks a ProviderClientDefinition, meaning it won't get a settings card, can't be added via the dialog, and any existing instance would fall back to the unknown-driver rendering path. Since this fix spans multiple files and hunks, I won't provide a suggested diff — instead I'll describe the fix in prose and include a small illustrative snippet showing the entry that should be added to providerDriverMeta.ts alongside grok/cursor, then submit the review.

24. modify_pr — One finding: the new hornet provider is exposed in the chat provider picker but is not registered in the web settings provider metadata, so it cannot be configured from Settings → Providers.


Agent Credits: 187 credits

Token usage: 42 uncached input · 1,656,662 cache-read input · 110,814 cache-write input · 10,390 output
Agent Credits may also include non-token charges from external tools such as web research.