feat: SSH dev routing, model registry UX, chat input toolbar, doc sync
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>
This commit is contained in:
@@ -3,7 +3,7 @@ from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
anthropic_api_key: str | None = None # not used — claude CLI handles auth
|
||||
anthropic_api_key: str | None = None # not used — configure via model registry
|
||||
|
||||
# Google OAuth — "Sign in with Google" for all users
|
||||
# Create credentials at console.cloud.google.com → APIs & Services → Credentials
|
||||
@@ -38,7 +38,6 @@ class Settings(BaseSettings):
|
||||
default_model: str = "claude-sonnet-4-6"
|
||||
default_tier: int = 2
|
||||
max_history_messages: int = 40 # rolling window — 20 turns (user + assistant)
|
||||
primary_backend: str = "claude" # "claude" | "local" — gemini CLI removed June 2026
|
||||
|
||||
# Local model backend — OpenAI-compatible API (Open WebUI / Ollama)
|
||||
# Set LOCAL_API_URL in .env to enable; leave blank to disable
|
||||
@@ -46,9 +45,6 @@ class Settings(BaseSettings):
|
||||
local_api_key: str = "" # sk-... from Open WebUI → Settings → Account → API Keys
|
||||
local_model: str = "" # workspace or model name, e.g. test-agent-simple
|
||||
|
||||
# Per-backend timeouts in seconds
|
||||
timeout_claude: int = 60
|
||||
timeout_gemini: int = 120 # frequently slow under load
|
||||
timeout_local: int = 300 # local models may need to load first
|
||||
|
||||
# Auto-distillation schedule — override in .env
|
||||
@@ -66,14 +62,13 @@ class Settings(BaseSettings):
|
||||
distill_backend_long: str = ""
|
||||
|
||||
# Model registry: default backend type per role when user registry has no entry.
|
||||
# Values: "claude_cli" | "gemini_cli" | "gemini_api" (builtin IDs)
|
||||
# Override in .env: ROLE_CHAT=claude_cli ROLE_DISTILL=gemini_api etc.
|
||||
role_chat: str = "claude_cli"
|
||||
role_orchestrator: str = "gemini_api"
|
||||
role_distill: str = "claude_cli"
|
||||
role_janitor: str = "claude_cli" # assign a cheap/fast model: Haiku 4.5, local Gemma E4B
|
||||
role_coder: str = "claude_cli"
|
||||
role_research: str = "gemini_api"
|
||||
# All roles must be configured via /settings/models — no built-in fallback.
|
||||
role_chat: str = ""
|
||||
role_orchestrator: str = ""
|
||||
role_distill: str = ""
|
||||
role_janitor: str = ""
|
||||
role_coder: str = ""
|
||||
role_research: str = ""
|
||||
|
||||
# Comma-separated list of standard roles shown in the model settings UI.
|
||||
# Add custom roles here to extend the UI without code changes.
|
||||
@@ -122,8 +117,8 @@ class Settings(BaseSettings):
|
||||
return [r.strip() for r in self.defined_roles.split(",") if r.strip()]
|
||||
|
||||
def get_role_default(self, role: str) -> str:
|
||||
"""Return the .env default backend type for a role (e.g. 'claude_cli')."""
|
||||
return getattr(self, f"role_{role.replace('-', '_')}", "claude_cli")
|
||||
"""Return the .env default backend type for a role, or '' if unconfigured."""
|
||||
return getattr(self, f"role_{role.replace('-', '_')}", "")
|
||||
|
||||
def home_root(self) -> Path:
|
||||
"""Resolve home_dir relative to this file's location if not absolute."""
|
||||
|
||||
Reference in New Issue
Block a user