Commit Graph

55 Commits

  • fix(auth): use correct model config format (object, not string)
    OpenClaw expects agents.defaults.model as { primary: "provider/model" }
    not a plain string. The previous code wrote a string which caused:
    "agents.defaults.model: Invalid input: expected object, received string"
  • fix(auth): configure OpenClaw default model when saving provider
    - Add setOpenClawDefaultModel() to write the correct model to
      ~/.openclaw/openclaw.json based on the selected provider
    - Maps: openrouter -> openrouter/anthropic/claude-sonnet-4,
      anthropic -> anthropic/claude-sonnet-4, etc.
    - Call setOpenClawDefaultModel on provider:save IPC handler
    - Fixes "No API key found for provider anthropic" when user
      configured OpenRouter (wrong default model was being used)
  • feat(chat): write API keys to OpenClaw and embed Control UI for chat
    Part 1: API Key Integration
    - Create electron/utils/openclaw-auth.ts to write keys to
      ~/.openclaw/agents/main/agent/auth-profiles.json
    - Update provider:save and provider:setApiKey IPC handlers to
      persist keys to OpenClaw auth-profiles alongside ClawX storage
    - Save API key to OpenClaw on successful validation in Setup wizard
    - Pass provider API keys as environment variables when starting
      the Gateway process (ANTHROPIC_API_KEY, OPENROUTER_API_KEY, etc.)
    
    Part 2: Embed OpenClaw Control UI for Chat
    - Replace custom Chat UI with <webview> embedding the Gateway's
      built-in Control UI at http://127.0.0.1:{port}/?token={token}
    - Add gateway:getControlUiUrl IPC handler to provide tokenized URL
    - Enable webviewTag in Electron BrowserWindow preferences
    - Override X-Frame-Options/CSP headers to allow webview embedding
    - Suppress noisy control-ui token_mismatch stderr messages
    - Add loading/error states for the embedded webview
    
    This fixes the "No API key found for provider" error and replaces
    the buggy custom chat implementation with OpenClaw's battle-tested
    Control UI.