Devvyn and Claude Sonnet 5
25fae9ad10
feat(custom-model): generate Run-menu entries from saved endpoint profiles
...
Follow-up to #393 , picking up the work Ark0N invited in his merge comment:
"generate those entries from the saved profiles rather than a fixed
duplicate per harness, and put it in a follow-up PR so this one stays the
backend... The Run-menu picker is yours if you want it."
Adds the frontend surface the backend has been waiting on:
- Run menu: a "Custom Endpoints" section lists one entry per (harness that
supports customModelInjection, saved endpoint) pair, e.g.
"Claude Code (llama.cpp)". The harness list comes from
window.__codemanCustomModelClis, injected at page render straight off the
CLI registry's own capabilities (never a hardcoded id list in the
frontend), so a CLI whose injection recipe lands later appears with no
frontend change. Picking an entry runs that harness's own existing run*()
function unmodified (case creation, env overrides, everything, forced to
a single instance) and then applies the endpoint's default model to the
session it creates via the existing POST /api/sessions/:id/custom-model
route. Entries are hidden for a remote/docker active case, since that
route already refuses both.
- Settings: App Settings -> Models gets a "Custom model endpoints" group
wiring up the customModelEndpointsEnabled toggle (declared since #393 ,
read by nothing until now) plus CRUD against the existing
/api/model-endpoints routes: list, add/edit (inline form), delete,
discover models.
- Backend: CustomModelHost gains an optional defaultModelId, the model the
picker applies with no further choice per endpoint (one generated menu
entry per CLI+endpoint pair, not per CLI+endpoint+model). The route
refuses a value that isn't one of the endpoint's own discovered models,
and a fresh discovery drops a default that no longer appears rather than
carrying an invalid one forward.
Docs: docs/custom-model-endpoints.md describes the new picker and settings
panel; CLAUDE.md's Custom Model Endpoint Profiles entry drops the
"backend-only" status note and documents the picker's generation mechanism.
Tests: four new route tests cover defaultModelId validation, acceptance,
and the drop/keep behaviour across a re-discovery; a new render-index-html
test pins the __codemanCustomModelClis injection (present, agent CLIs
supporting the capability, antigravity and shell excluded) and its
solo-window skip. No browser test was added for the Run-menu picker itself
or the settings CRUD panel (this box has no tmux, so the live server used
by test:browser/test:mobile could not be exercised here) -- worth a
Playwright pass before merge, same as any other frontend PR.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com >
Claude-Session: https://claude.ai/code/session_01RqZeHrRS6DYcGcGX2p9EwG
2026-09-16 07:01:23 +08:00
..
2026-08-22 14:13:57 +02:00
2026-09-14 23:46:28 +02:00
2026-09-14 23:30:14 +02:00
2026-09-15 17:59:16 +02:00
2026-09-16 07:01:23 +08:00
2026-09-06 21:53:38 +02:00
2026-08-22 14:13:58 +02:00
2026-06-10 01:38:40 +02:00
2026-07-20 17:35:40 +02:00
2026-08-10 12:29:00 +02:00
2026-09-07 19:09:24 +02:00
2026-09-13 17:43:14 +08:00
2026-08-12 02:30:08 +02:00
2026-09-02 08:26:45 +08:00
2026-09-07 19:09:24 +02:00
2026-08-08 22:30:39 +03:00
2026-08-21 02:37:58 +02:00
2026-08-05 01:40:37 +02:00
2026-01-27 23:15:25 +01:00
2026-06-09 20:02:15 +02:00
2026-09-02 10:48:51 +02:00
2026-08-20 12:18:16 +02:00
2026-07-12 17:50:21 +02:00
2026-06-14 12:46:58 -04:00
2026-06-19 17:58:06 -04:00
2026-06-19 17:58:06 -04:00
2026-09-06 23:11:01 +02:00
2026-09-04 16:08:57 -04:00
2026-02-12 13:44:07 +01:00
2026-03-07 07:33:44 +01:00
2026-02-26 16:44:34 +01:00
2026-08-07 16:41:39 +02:00
2026-08-10 11:19:51 +02:00
2026-07-20 02:48:14 +02:00
2026-08-20 11:21:29 +02:00
2026-03-01 16:50:23 +01:00
2026-09-02 08:26:45 +08:00
2026-09-13 17:43:13 +08:00
2026-08-22 14:36:23 +02:00
2026-08-21 02:37:58 +02:00
2026-09-02 08:26:45 +08:00
2026-09-07 21:30:31 -05:00
2026-09-14 23:46:28 +02:00
2026-09-02 08:26:45 +08:00
2026-09-04 14:20:11 +02:00
2026-08-22 14:13:57 +02:00
2026-06-14 12:46:58 -04:00
2026-08-26 18:43:52 +08:00
2026-08-09 05:02:14 +02:00
2026-09-06 21:53:38 +02:00
2026-08-21 08:23:31 -04:00
2026-06-10 22:47:02 +02:00
2026-09-06 21:53:38 +02:00
2026-09-06 19:45:36 +02:00
2026-07-12 18:42:36 +02:00
2026-08-09 15:56:44 +02:00
2026-09-06 23:05:26 +02:00
2026-08-23 14:46:10 -04:00
2026-06-29 11:35:56 +05:30
2026-09-14 23:46:28 +02:00
2026-09-14 23:46:28 +02:00
2026-09-04 16:08:57 -04:00
2026-03-01 16:50:23 +01:00
2026-08-24 18:00:52 +02:00
2026-09-13 17:42:35 +08:00
2026-08-24 18:00:52 +02:00
2026-08-25 18:30:41 +02:00
2026-08-25 03:08:15 +02:00
2026-09-02 08:26:45 +08:00
2026-08-22 14:13:57 +02:00
2026-08-18 23:24:22 +02:00
2026-09-09 15:24:55 +02:00
2026-09-14 23:56:19 +02:00
2026-09-14 23:56:19 +02:00
2026-09-13 17:43:14 +08:00
2026-09-02 19:33:32 +08:00
2026-09-14 23:37:04 +02:00
2026-08-27 19:38:38 +08:00
2026-07-20 02:36:02 +02:00
2026-09-01 11:32:03 +02:00
2026-09-04 14:36:35 +02:00
2026-06-14 08:43:57 +02:00
2026-06-14 08:43:57 +02:00
2026-06-12 09:09:14 -04:00
2026-07-12 17:50:21 +02:00
2026-09-02 20:41:24 -05:00
2026-06-07 04:33:11 +02:00
2026-09-10 02:57:40 +02:00
2026-08-09 22:39:07 +02:00
2026-08-23 21:40:10 -04:00
2026-09-04 16:08:57 -04:00
2026-08-05 08:44:47 +02:00
2026-06-10 01:30:43 +02:00
2026-08-29 23:31:28 -07:00
2026-09-04 16:08:57 -04:00
2026-09-04 16:08:57 -04:00
2026-08-19 23:35:45 +02:00
2026-06-09 20:02:15 +02:00
2026-09-14 16:02:02 +02:00
2026-09-01 12:30:48 +08:00
2026-06-19 13:10:17 -04:00
2026-07-12 17:50:21 +02:00
2026-08-10 00:07:01 +02:00
2026-08-23 08:39:03 +02:00
2026-08-23 08:39:03 +02:00
2026-07-12 18:06:59 +02:00
2026-08-05 02:38:57 +02:00
2026-08-10 03:15:13 +02:00
2026-08-22 01:55:50 +08:00
2026-08-10 11:16:58 +02:00
2026-09-08 00:56:39 -04:00
2026-08-09 14:04:34 +02:00
2026-09-14 15:59:00 +02:00
2026-08-23 14:46:10 -04:00
2026-08-14 00:14:21 +02:00
2026-07-21 02:49:25 +08:00
2026-09-08 16:49:50 +02:00
2026-06-12 09:09:14 -04:00
2026-08-25 19:41:48 +02:00
2026-09-14 23:56:19 +02:00
2026-08-17 01:46:48 +02:00
2026-09-13 17:43:13 +08:00
2026-09-14 15:55:20 +02:00
2026-09-02 20:41:24 -05:00
2026-08-09 18:03:13 +02:00
2026-08-05 02:38:57 +02:00
2026-08-16 20:34:34 +02:00
2026-08-23 08:39:03 +02:00
2026-09-02 08:26:45 +08:00
2026-03-07 07:33:44 +01:00
2026-06-14 22:21:13 +02:00
2026-08-16 20:34:34 +02:00
2026-02-26 16:44:34 +01:00
2026-09-08 00:56:39 -04:00
2026-08-19 19:14:52 +00:00
2026-09-08 00:56:39 -04:00
2026-09-14 23:30:14 +02:00
2026-09-08 00:56:39 -04:00
2026-07-20 12:33:12 +02:00
2026-02-18 12:51:35 +01:00
2026-08-09 13:23:24 +02:00
2026-06-08 11:01:34 -04:00
2026-07-19 15:32:45 +02:00
2026-02-12 13:44:07 +01:00
2026-08-04 15:02:46 +02:00
2026-07-28 23:20:01 +03:00
2026-08-28 11:32:30 -05:00
2026-09-12 05:15:41 +02:00
2026-08-28 13:45:12 -05:00
2026-09-07 22:11:54 -05:00
2026-08-24 19:06:50 +08:00
2026-09-02 20:41:24 -05:00
2026-03-21 19:23:37 +01:00
2026-03-21 07:20:18 +01:00
2026-09-14 23:56:19 +02:00
2026-07-20 04:02:46 +02:00
2026-08-09 16:16:54 +02:00
2026-09-10 12:42:33 +08:00
2026-08-09 17:32:24 +02:00
2026-06-08 10:27:18 -04:00
2026-02-26 16:44:34 +01:00
2026-08-21 02:37:58 +02:00
2026-08-13 17:23:27 +02:00
2026-09-01 11:32:18 +02:00
2026-09-14 15:59:00 +02:00
2026-08-26 18:43:52 +08:00
2026-09-14 14:28:57 +02:00
2026-08-07 01:34:47 +02:00
2026-02-12 18:26:16 +01:00
2026-06-09 20:02:17 +02:00
2026-08-09 16:03:27 +02:00
2026-07-28 04:15:30 +02:00
2026-08-09 03:30:15 +02:00
2026-01-21 22:36:45 +01:00
2026-09-02 20:41:24 -05:00
2026-02-19 14:00:10 +01:00
2026-08-20 12:58:17 -04:00
2026-06-10 18:06:45 +02:00
2026-03-01 16:50:23 +01:00
2026-08-09 23:05:11 +02:00
2026-08-09 23:05:11 +02:00
2026-09-08 00:56:39 -04:00
2026-08-09 23:05:11 +02:00
2026-09-14 23:56:19 +02:00
2026-09-14 23:56:19 +02:00
2026-09-04 13:50:22 +02:00
2026-07-17 16:03:03 -04:00
2026-09-14 23:42:06 +02:00
2026-08-05 01:40:37 +02:00
2026-07-17 15:54:32 -04:00
2026-09-07 21:30:31 -05:00
2026-09-14 23:42:06 +02:00
2026-08-07 05:05:41 +02:00
2026-09-16 07:01:23 +08:00
2026-08-21 02:25:43 +02:00
2026-03-07 07:33:44 +01:00
2026-02-26 16:44:34 +01:00
2026-06-10 20:41:34 +02:00
2026-03-07 07:33:44 +01:00
2026-03-07 07:33:44 +01:00
2026-08-09 15:31:02 +02:00
2026-07-12 18:21:42 +02:00
2026-01-25 07:52:40 +01:00
2026-08-18 10:59:44 -04:00
2026-03-01 14:33:18 +01:00
2026-02-26 16:44:34 +01:00
2026-08-19 19:14:52 +00:00
2026-08-16 20:34:34 +02:00
2026-09-12 05:15:41 +02:00
2026-08-21 02:25:43 +02:00
2026-09-01 12:30:48 +08:00
2026-09-06 21:53:38 +02:00
2026-07-17 16:26:28 -04:00
2026-08-18 10:46:21 -04:00
2026-08-26 20:05:48 -05:00
2026-08-23 14:46:10 -04:00
2026-06-10 03:41:04 +02:00
2026-02-18 18:14:13 +01:00
2026-08-10 03:15:13 +02:00
2026-06-09 20:02:15 +02:00
2026-06-10 17:08:36 +02:00
2026-08-16 20:34:34 +02:00
2026-08-05 01:53:43 +02:00
2026-08-09 01:34:55 +02:00
2026-09-07 22:42:20 +02:00
2026-07-12 19:49:58 +02:00
2026-09-15 17:59:16 +02:00
2026-06-10 20:41:34 +02:00
2026-09-07 08:48:31 +02:00
2026-09-02 20:41:24 -05:00
2026-08-09 01:18:03 +02:00
2026-08-17 22:54:46 +02:00
2026-09-14 23:46:28 +02:00
2026-08-10 03:15:13 +02:00
2026-08-23 12:21:02 -04:00
2026-08-24 22:58:28 +02:00
2026-09-15 17:59:16 +02:00
2026-09-14 23:46:28 +02:00
2026-08-23 12:21:02 -04:00
2026-08-23 12:21:02 -04:00
2026-08-23 14:46:10 -04:00
2026-07-17 16:21:16 -04:00
2026-08-16 05:11:00 +02:00
2026-07-17 16:25:29 -04:00
2026-06-17 23:41:47 +08:00
2026-08-17 21:42:25 +02:00
2026-08-23 12:21:02 -04:00
2026-08-24 00:59:48 +02:00
2026-02-26 16:44:34 +01:00
2026-09-15 17:59:16 +02:00
2026-09-01 02:31:26 +02:00
2026-08-09 01:18:03 +02:00
2026-08-09 21:32:04 -04:00
2026-06-10 01:30:43 +02:00
2026-09-06 23:11:01 +02:00
2026-08-05 01:40:37 +02:00
2026-08-10 03:59:43 +02:00
2026-09-14 23:33:36 +02:00
2026-08-07 01:31:50 +02:00
2026-09-02 20:41:24 -05:00
2026-08-13 17:28:35 +02:00
2026-06-09 20:02:15 +02:00
2026-08-13 17:28:35 +02:00
2026-09-02 20:41:24 -05:00
2026-03-07 07:33:44 +01:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-08-18 23:24:22 +02:00
2026-09-14 15:59:00 +02:00
2026-01-22 11:30:10 +01:00
2026-05-12 10:11:47 +02:00
2026-06-15 01:43:15 +02:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-08-24 00:59:48 +02:00
2026-08-23 14:46:10 -04:00
2026-08-23 14:46:10 -04:00
2026-08-23 12:21:02 -04:00
2026-08-10 03:06:23 +02:00
2026-09-12 06:09:28 +02:00
2026-08-23 12:21:02 -04:00
2026-08-25 18:26:07 +02:00
2026-02-28 17:39:44 +01:00
2026-02-28 17:39:44 +01:00
2026-01-21 07:19:49 +01:00
2026-02-26 16:44:34 +01:00
2026-06-10 18:06:45 +02:00
2026-08-20 10:46:11 +02:00
2026-07-10 14:39:19 -04:00
2026-08-05 02:38:57 +02:00
2026-09-07 19:11:20 -04:00
2026-08-24 19:06:50 +08:00
2026-09-09 16:57:42 +02:00
2026-09-14 14:09:13 +02:00
2026-09-14 14:09:13 +02:00
2026-06-30 19:52:49 -04:00
2026-07-12 12:39:46 +02:00
2026-09-07 19:11:20 -04:00
2026-09-12 06:09:43 +02:00
2026-06-09 15:39:03 -04:00
2026-08-19 19:41:43 +00:00
2026-02-26 16:44:34 +01:00
2026-08-24 19:06:50 +08:00
2026-08-14 00:00:59 +02:00
2026-09-14 23:56:19 +02:00
2026-08-20 11:21:29 +02:00
2026-09-06 23:11:01 +02:00
2026-08-18 19:55:23 +02:00
2026-06-09 15:39:03 -04:00
2026-09-09 15:35:02 +02:00
2026-09-14 23:46:28 +02:00
2026-07-12 19:49:58 +02:00
2026-07-10 11:14:26 -04:00
2026-05-25 23:28:58 +02:00
2026-08-09 18:03:13 +02:00
2026-07-20 03:26:21 +02:00
2026-06-10 20:41:34 +02:00
2026-09-14 15:59:00 +02:00
2026-07-20 02:58:51 +02:00
2026-01-22 11:30:10 +01:00
2026-09-14 15:57:08 +02:00
2026-08-10 11:19:51 +02:00
2026-07-12 12:42:36 +02:00
2026-09-14 23:38:54 +02:00
2026-09-04 15:21:13 +02:00
2026-09-04 15:21:12 +02:00
2026-09-04 15:21:12 +02:00
2026-09-14 23:38:54 +02:00
2026-09-14 23:38:54 +02:00
2026-07-29 09:01:18 +02:00
2026-08-09 04:06:23 +02:00
2026-09-14 23:38:54 +02:00
2026-08-23 14:12:38 -04:00
2026-07-21 00:04:40 +08:00
2026-07-12 18:42:36 +02:00
2026-07-12 18:42:36 +02:00
2026-07-12 18:42:36 +02:00