Skip to content

feat(island): Boite's model picker and effort chip for the assistant - #40

Closed
klNuno wants to merge 1 commit into
mainfrom
feat/boite-model-picker
Closed

klNuno wants to merge 1 commit into
mainfrom
feat/boite-model-picker

Conversation

@klNuno

@klNuno klNuno commented Oct 14, 2026

Copy link
Copy Markdown
Member

What changed

Choosing a model in Bots now looks and behaves like Boite's composer model picker.

  • src/components/model-picker/: Boite's ModelPicker, ProviderTiles, AccountSeats and EffortSlider, copied from Boite at 4b6335b1 (each file names its source). Same chip, same popover: provider rail with logos, favourites tile, search past 12 models, prefix groups, show-all fold, legacy fold, account seats, refresh, skeletons, keyboard and outside click. Leaf modules that are the same in the vendored submodule (ModelSearch, ProviderLogo, floating, Closing, model-list, model-order, model-picker-keys) come from @boite/ui.
  • src/lib/model-picker/store.svelte.ts: a PickerStore giving the picker the part of Boite's Store it reads, on top of CoreLink. Favourites are Boite's own list: read from the core's settings and written with settings.set { modelFavorites }, so a star set in Boite shows in Bots and back (favorites.ts copies the types and the merge rules, which the vendored contracts lack).
  • CoreLink gains follow(client) (the island borrows the companion's client), a refresh read and a reading state per provider and account, and saveSettings.
  • The assistant's ModelMenu is now the picker plus the effort chip, on the agent's selection. A model of another provider or account moves the agent there with its model's default level, as Boite's agent editor does; the effort chip offers the model's own levels. The popover hangs under the chat's head inside the 940x530 island window, and takes clicks there (data-hit, new optional resized() in the view contract).
  • CompanionModelPicker.svelte (not wired yet): the companion's model and effort with an "Automatic" tile first (provider null). Props: store: CoreLink, prefs: CompanionPrefs, onchange?: (next: CompanionPrefs) => void; it writes with writeCompanionPrefs.
  • .island-tokens maps the remaining Boite tokens the picker uses (surface-3, active, control glaze, reasoning, shadows) to dark values, and theme-aware logos keep their dark colours on the island.
  • Boite's settings pages cannot be opened through ui.reveal, so the install and connect actions are left out.
  • Demo: the fake core starts with four starred models; scene=menu|models|search|effort open the picker on the favourites, on Claude, on OpenCode searched for nvidia, or the effort chip.

How it was verified

  • bun run check: 0 errors, 0 warnings.
  • bun run test: 61 files, 459 tests passed, including new tests for the favourites round trip through the fake core (Bots stars, Boite reads; Boite stars, Bots shows; unstar), the read-once, pending and refresh behaviour, the Automatic choice, the companion picker mounted, and moving the assistant to another provider.
  • bun run test:scripts passed, bun run check:manifest: accepted.
  • Captures of the island at its real window size with the demo poses, compared with Boite's own picker at 4b6335b1 run on its fake client in the same headless browser.

@klNuno

klNuno commented Oct 14, 2026

Copy link
Copy Markdown
Member Author

Note

Clanker Claude Opus 5.5 is responding on behalf of meetsu

landed in #44 (be3e00f).

@klNuno klNuno closed this Oct 14, 2026
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.

1 participant