Backend / infrastructure:
- cortex/tools/_projects.py (new): shared project alias registry with ssh_host
for workstation projects (aether_api, aether_frontend, aether_container)
- cortex/tools/git.py: all git tools route to workstation via SSH when ssh_host set
- cortex/tools/aider.py: aider_run SSH-routes to workstation using bash -l -c
- cortex/routers/local_llm.py: POST /api/models/{id}/edit AJAX endpoint — save
model edits without page reload or tab reset; returns JSON {ok, label, model_name}
- cortex/llm_client.py: remove Gemini CLI and Claude CLI backends; clean up
fallback chain and process group tracking (continuation of Gemini CLI removal)
- cortex/routers/auth.py: strip Claude/Gemini CLI auth status checks (CLI removed)
- cortex/routers/chat.py: remove legacy claude/gemini backend fields
- cortex/config.py: clean up CLI-related settings
- cortex/main.py: remove CLI lifecycle hooks
UI:
- cortex/static/local_llm.html: model edit forms now save via fetch() + toast;
stay on Models tab; update row header label in place on success
- cortex/static/index.html: restructure input area to column layout — textarea
above, compact toolbar below (Chat/Tools/Attach + Send); fixes dead space at
M/L/XL sizes; context panel "Role" → "Model" section label
- cortex/static/style.css: column input-area layout; #input-toolbar; flex:1 →
width:100% on textarea (fixes scrollHeight in column flex context); compact
send/stop button padding
- cortex/static/app.js: add XL (720px) to height cycle; default M (240px)
Docs:
- cortex/static/HELP.md: S/M/L → S/M/L/XL; add Rebuild to distill table; fix
"Role selector" references (no such UI); fix "your active role" → Chat role;
fix ⚡ toggle description; Model Registry section cleanup
- documentation/ARCH__BACKENDS.md: reflect CLI removal, current backend state
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
"""
|
|
GET /auth/status — returns connectivity status for configured model backends.
|
|
"""
|
|
import logging
|
|
from fastapi import APIRouter
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter(prefix="/auth")
|
|
|
|
|
|
async def _local_status(username: str = "scott") -> dict:
|
|
"""Check reachability of the user's configured local model host."""
|
|
import model_registry
|
|
cfg = model_registry.get_best_local_model(username)
|
|
if not cfg:
|
|
return {"configured": False}
|
|
api_url = cfg.get("api_url", "")
|
|
if not api_url:
|
|
return {"configured": False}
|
|
try:
|
|
import httpx
|
|
url = api_url.rstrip("/") + "/api/models"
|
|
headers = {}
|
|
api_key = cfg.get("api_key", "")
|
|
if api_key:
|
|
headers["Authorization"] = f"Bearer {api_key}"
|
|
async with httpx.AsyncClient(timeout=5) as client:
|
|
resp = await client.get(url, headers=headers)
|
|
reachable = resp.status_code < 400
|
|
return {
|
|
"configured": True,
|
|
"reachable": reachable,
|
|
"model": cfg.get("model_name", ""),
|
|
"label": cfg.get("label", ""),
|
|
}
|
|
except Exception as e:
|
|
return {"configured": True, "reachable": False, "error": str(e), "model": cfg.get("model_name", "")}
|
|
|
|
|
|
@router.get("/status")
|
|
async def auth_status() -> dict:
|
|
return {
|
|
"local": await _local_status(),
|
|
}
|