Skip to content

Release Meridian 1.7.16-beta - #321

Merged
MathisVerstrepen merged 11 commits into
mainfrom
dev
Sep 20, 2026
Merged

MathisVerstrepen merged 11 commits into
mainfrom
dev

Conversation

@MathisVerstrepen

Copy link
Copy Markdown
Owner

Meridian 1.7.16-beta

Meridian 1.7.16-beta improves model loading and navigation through large catalogs, restores chat drafts when generation cannot start, and fixes attachment handling for first messages.

Highlights

Faster Model Loading and Selection

Model selection reuses the last catalog while fetching fresh availability and renders only the visible portion of long model lists.

  • Cached catalogs are stored per user in the browser and refreshed from the server when the application loads. Provider connection changes also refresh the cached catalog.
  • Large model menus keep search, keyboard navigation, pinning, and section jumps available without rendering every model row at once.
  • The OpenRouter jump button leads directly to the metered model section, alongside connected subscription-provider sections.
  • OpenRouter batch-only entries are excluded from model discovery, including its fallback catalog source.

Reliable Chat Submission and Draft Recovery

Failed generation startup now leaves a visible error near the chat input and restores the submitted draft when no newer draft has been entered.

  • Restore message text, attached files, and GitHub context after a failed submission without overwriting a newer draft.
  • Block repeated sends while a submission is starting, streaming is active, or attachments are uploading.
  • Prepare attachment content before creating chat nodes. Non-image attachments such as text documents use file content instead of failing client-side conversion, while image recognition covers additional extensions and image MIME types.
  • Continue startup when the graph is already initialized, and bound the render wait when a hidden canvas does not report initialization.

Self-Hosting and Upgrade Notes

Meridian 1.7.16-beta introduces no database migrations, new configuration keys, new secrets, or dependency-file changes.

  • Redeploy or restart the API and UI services to apply model filtering, catalog caching, selector, and chat fixes.
  • Model catalogs now persist in browser local storage under per-user keys. Invalid cached catalogs are discarded and replaced through normal model discovery; no manual cache migration is required.
  • Release publication now requires the release PR body to match its changelog exactly, including line endings and the trailing newline. Preserve the generated PR body when preparing a release.

MathisVerstrepen and others added 11 commits September 20, 2026 15:14
- Make generation report success or failure instead of silently returning, so the
  chat can tell whether a submission was accepted or lost.
- Restore the message, attachments, and Git context when submission fails, while
  never overwriting a newer draft typed while the request was pending.
- Track an isSubmitting state to block duplicate sends from Enter or the send
  button until the current submission settles.
- Move the generation error out of the message list and next to the input so the
  failure stays visible after the draft is restored.
- Prepare attachment message content before creating nodes or migrating the
  session, so a conversion failure leaves graph and chat state untouched.
- Extract waitForRender into useGraphRenderReady and bound it with a timeout so a
  hidden canvas cannot block execution forever.
- Centralize image detection in useFiles and broaden its extension and MIME
  coverage so more image types are sent as images rather than generic files.
- Replace the HeadlessUI combobox with a custom `useModelSelectCombobox` hook built on `useVirtualList`, since mounting every option made catalogs of 500+ models slow to open and navigate.
- Render only visible rows while keeping keyboard traversal and `aria-activedescendant` over the full data set, so accessibility does not regress.
- Move open/close, scroll, jump-to-section, and outside-click tracking into the hook and start position tracking only while open.
- Pin shortcut settings in the catalog fixture and extend e2e coverage to assert bounded option mounts and an open-time responsiveness budget.
Batch endpoints are not intended for interactive chat and cluttered the
model selector while adding latency to model list responses.

- Add _is_openrouter_batch_model helper detecting ":batch" ids and
  "(batch)" names.
- Filter batch entries in both frontend and v1 model mappers.
- Cover both mapping paths with tests asserting batch models are dropped.
Rows were keyed by `${sectionId}:${model.id}`, so duplicate model ids
across the catalog collided and Vue reused the wrong DOM nodes when the
list re-rendered while filtering. This caused duplicated option rows and
slow, janky updates in the model selector.

- Include the row index in the generated row id and use it as the render
  key so each option has a distinct identity.
- Extend the model catalog fixture with two models sharing an id to
  reproduce the collision.
- Add an e2e assertion that duplicate-id models render as two separate,
  non-overlapping options after repeated filter changes.
- Drop focus-within ring classes from the trigger element, which
  caused sluggish interactions when opening the model selector.
- Keep outline-none for focus handling without the costly ring
  repaint.
- Add `jumpLabel` option to section metadata so jump buttons can
  display a different label than the section header.
- Label the OpenRouter jump button "OpenRouter" instead of reusing
  the "All Models" header title, making the target clearer.
- Extend model catalog e2e coverage to click the OpenRouter jump
  and assert it scrolls to the expected section.
…del-selector-slow

perf: virtualize model selector for large catalogs
Persist the decoded model catalog in browser storage per user so the
model dropdown renders immediately on app load while the fresh catalog
is fetched in the background.

- Add modelCatalogCache util to read/write per-user cached catalogs and
  drop malformed or mismatched entries
- Key cache by user id (anonymous fallback) to avoid leaking catalogs
  across accounts
- Seed models from cache in app.vue, then reconcile with the fresh
  catalog once it resolves
- Thread user id through getAvailableModels callers so caches stay scoped
- Add unit tests for cache hit/miss and storage failures, plus an e2e
  test asserting cached models show before fresh data arrives
…models-api-response

Cache model catalog for faster model loading
@MathisVerstrepen
MathisVerstrepen merged commit d98e44a into main Sep 20, 2026
13 checks passed
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