feat(headroom): add proxy lifecycle management + dashboard UI

Build on the optional Headroom Token Saver from Carmelo Campos
(PR: feat: add optional Headroom token saver). Add managed start/stop
of the local headroom proxy from the dashboard, install detection,
status probing, and a simplified Token Saver UI.

- detect headroom CLI + python>=3.10, probe proxy /health
- spawn/stop proxy as a detached, pid-tracked process
- /api/headroom/{status,start,stop} routes, gated local-only in dashboardGuard
- one-click Start/Stop Headroom modal, no manual config needed
- claude<->openai shape conversion for /v1/compress via 9router translators

Thanks to Carmelo Campos (@carmelogunsroses) for the original Headroom integration.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
decolua
2026-06-20 10:09:50 +07:00
parent efd20be8d8
commit b55cf36d2e
33 changed files with 1019 additions and 130 deletions

View File

@@ -136,6 +136,16 @@ export function getTargetFormat(provider) {
return config.format || "openai";
}
// Resolve which transport to use for a provider given the client sourceFormat.
// Multi-endpoint providers (transport.transports[]) pick the entry matching sourceFormat
// to avoid lossy translation; falls back to the default transport when no match.
export function resolveTransport(provider, sourceFormat) {
const config = PROVIDERS[provider];
const transports = config?.transports;
if (!Array.isArray(transports) || !transports.length) return null;
return transports.find(t => t.format === sourceFormat) || null;
}
// Check if last message is from user
export function isLastMessageFromUser(body) {
const messages = body.messages || body.contents;