Commit Graph

1138 Commits

  • fix(ui): add vertical spacing between directory settings sections
    Replace React Fragment with a div using space-y-6 to add proper
    vertical spacing between the app config directory and directory
    override sections in Settings > Advanced > Directory Settings.
  • fix: Don't add ?beta=true to OpenAI Chat Completions endpoints (#1052)
    Fixes Nvidia provider and other providers using apiFormat="openai_chat".
    
    The ClaudeAdapter::build_url() method was incorrectly adding ?beta=true
    to both /v1/messages and /v1/chat/completions endpoints. This caused
    the Nvidia provider to fail because:
    
    1. Nvidia uses apiFormat="openai_chat"
    2. Requests are transformed to OpenAI format and sent to /v1/chat/completions
    3. The URL gets ?beta=true appended (Anthropic-specific parameter)
    4. Nvidia's API rejects requests with this parameter
    
    Fix:
    - Only add ?beta=true to /v1/messages endpoint
    - Exclude /v1/chat/completions from getting this parameter
    
    Tested:
    - Anthropic /v1/messages still gets ?beta=true ✓
    - OpenAI Chat Completions /v1/chat/completions does NOT get ?beta=true ✓
    - All 13 Claude adapter tests pass ✓
    
    Co-authored-by: jnorthrup <jnorthrup@example.com>
  • feat(ui): add quick config toggles to Claude config editor (#1012)
    Add 3 quick-toggle checkboxes above the JSON editor in Claude provider settings:
    - Hide AI Attribution (sets attribution.commit/pr to empty string)
    - Extended Thinking (sets alwaysThinkingEnabled to true)
    - Teammates Mode (sets env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS to "1")
    
    Uses local state to keep toggles and JsonEditor in sync without
    triggering ProviderForm re-renders. Includes i18n for zh/en/ja.
    
    Co-authored-by: Jason <farion1231@gmail.com>
  • feat(webdav): follow-up 补齐自动同步与大文件防护 (#1043)
    * feat(webdav): add robust auto sync with failure feedback
    
    (cherry picked from commit bb6760124a62a964b36902c004e173534910728f)
    
    * fix(webdav): enforce bounded download and extraction size
    
    (cherry picked from commit 7777d6ec2b9bba07c8bbba9b04fe3ea6b15e0e79)
    
    * fix(webdav): only show auto-sync callout for auto-source errors
    
    * refactor(webdav): remove services->commands auto-sync dependency
  • Fix/skill zip symlink resolution (#1040)
    * fix(skill): resolve symlinks in ZIP extraction for GitHub repos (#1001)
    
    - detect symlink entries via is_symlink() during ZIP extraction and collect target paths
    
    - add resolve_symlinks_in_dir() to copy symlink target content into link location
    
    - canonicalize base_dir to fix macOS /tmp → /private/tmp path comparison issue
    
    - add path traversal safety check to block symlinks pointing outside repo boundary
    
    - apply symlink resolution to both download_and_extract and extract_local_zip paths
    
    Closes https://github.com/farion1231/cc-switch/issues/1001
    
    * fix(skill): change search to match name and repo instead of description
    
    * feat(skill): support importing skills from ~/.agents/skills/ directory
    
    - Scan ~/.agents/skills/ in scan_unmanaged() for skill discovery
    - Parse ~/.agents/.skill-lock.json to extract repo owner/name metadata
    - Auto-add discovered repos to skill_repos management on import
    - Add path field to UnmanagedSkill to show discovered location in UI
    
    Closes #980
    
    * fix(skill): use metadata name or ZIP filename for root-level SKILL.md imports (#1000)
    
    When a ZIP contains SKILL.md at the root without a wrapper directory,
    the install name was derived from the temp directory name (e.g. .tmpDZKGpF).
    Now falls back to SKILL.md frontmatter name, then ZIP filename stem.
    
    * feat(skill): scan ~/.cc-switch/skills/ for unmanaged skill discovery and import
    
    * refactor(skill): unify scan/import logic with lock file skillPath and repo saving
    
    - Deduplicate scan_unmanaged and import_from_apps using shared source list
    - Replace hand-written AppType match with as_str() and AppType::all()
    - Extract read_skill_name_desc, build_repo_info_from_lock, save_repos_from_lock helpers
    - Add SkillApps::from_labels for building enable state from source labels
    - Parse skillPath from .skill-lock.json for correct readme URLs
    - Save skill repos to skill_repos table in both import and migration paths
    
    * fix(skill): resolve symlink and path traversal issues in ZIP skill import
    
    * fix(skill): separate source path validation and add canonicalization for symlink safety
  • fix(opencode): 补齐 install.sh 安装路径检测 (#988)
    补齐 OpenCode 路径扫描来源(按官方 install.sh 优先级):
      OPENCODE_INSTALL_DIR > XDG_BIN_DIR > ~/bin > ~/.opencode/bin
    保留并增强 Go 安装路径扫描(~/go/bin、GOPATH/*/bin)。
    
    区分单值环境变量(push_env_single_dir)与 path-list 环境变量
    (extend_from_path_list),避免对 OPENCODE_INSTALL_DIR 等单值
    变量误用 split_paths。
    
    增加路径去重逻辑(push_unique_path),避免重复扫描。
    
    增加跨平台可执行候选逻辑(tool_executable_candidates):
      Windows: .cmd / .exe / 裸命令
      Unix:    裸命令
    
    将 PATH 拼接提至外层循环,减少重复 syscall。
    
    增加单元测试覆盖路径拼装、去重及 Windows 候选顺序。
    
    Closes #958
    
    Co-authored-by: Warp <agent@warp.dev>
  • feat(openclaw): add 13 new provider presets
    Migrate missing providers from Claude/Codex/Gemini/OpenCode presets:
    
    Tier 1 Partners:
    - RightCode (anthropic-messages)
    - AICodeMirror (anthropic-messages)
    - Zhipu GLM en (openai-completions, international)
    - MiniMax en (openai-completions, international)
    
    Tier 2 Chinese Officials:
    - Kimi For Coding, KAT-Coder, Longcat, DouBaoSeed,
      BaiLing, Xiaomi MiMo
    
    Tier 3 Aggregators:
    - SiliconFlow, SiliconFlow en, Nvidia
  • fix(openclaw): remove /v1 from anthropic-messages provider baseUrls
    Anthropic SDK auto-appends /v1 to baseUrl, so including it in the
    preset causes double-path (/v1/v1/messages). Affects AiHubMix, DMXAPI,
    PackyCode, Cubence, and AIGoCode.
  • refactor(openclaw): move model detail fields into advanced options
    Keep only model ID and display name visible by default,
    collapse context window, max tokens, reasoning, and cost
    fields into the advanced options section.
  • fix(openclaw): address code review findings across P0-P3 issues
    - Add 25 missing i18n keys for OpenClawFormFields in all 3 locales (P0)
    - Replace key={index} with stable crypto.randomUUID() keys in EnvPanel,
      ToolsPanel, and OpenClawFormFields to prevent list state bugs (P1)
    - Exclude openclaw from ProxyToggle/FailoverToggle in App.tsx (P1)
    - Add merge_additive_config() for openclaw/opencode deep link imports (P1)
    - Normalize serde(flatten) field naming to `extra` + HashMap (P2)
    - Add directory existence check in remove_openclaw_provider_from_live (P2)
    - Remove dead code in import_default_config and openclaw API methods (P2)
    - Add duplicate key validation in EnvPanel before save (P2)
    - Add openclawConfigDir to Settings type (P2)
    - Add staleTime to OpenClaw query hooks (P3)
    - Fix type-unsafe delete via destructuring in mutations.ts (P3)
  • refactor(openclaw): migrate config panels to TanStack Query hooks
    Centralize query keys and extract reusable hooks (useOpenClaw.ts),
    replacing manual useState/useEffect load/save patterns in Env, Tools,
    and AgentsDefaults panels for consistency with MCP/Skills modules.
  • fix(openclaw): address code review findings for robustness
    - Fix EnvPanel visibleKeys using entry key name instead of array index
      to prevent visibility state corruption after deletion
    - Add NaN guard in AgentsDefaultsPanel numeric field parsing
    - Validate provider id and models before importing from live config
    - Upgrade import failure log level from debug to warn for OpenCode/OpenClaw
  • fix(openclaw): enable scrolling on config panels
    Add overflow-y-auto to main content area so OpenClaw panels
    (Env, Tools, Agents) can scroll when content exceeds viewport.
  • feat(openclaw): add Env/Tools/Agents config panels
    - Migrate OpenClaw commands from provider.rs to dedicated commands/openclaw.rs
    - Add backend types and read/write for env, tools, agents.defaults sections
    - Create EnvPanel (API key + custom vars KV editor)
    - Create ToolsPanel (profile selector + allow/deny lists)
    - Create AgentsDefaultsPanel (default model + runtime parameters)
    - Extend App.tsx menu bar with Env/Tools/Agents buttons
    - Remove Prompts button for OpenClaw (overlaps with Workspace AGENTS.md)
  • feat(openclaw): extend workspace files with HEARTBEAT/BOOTSTRAP/BOOT
    Add 3 new markdown files to the workspace whitelist and frontend grid:
    - HEARTBEAT.md: activity runlist
    - BOOTSTRAP.md: first-run ritual
    - BOOT.md: gateway restart checklist
    
    Update i18n for all 3 locales (zh, en, ja).
  • feat(openclaw): show only Workspace button in menu bar
    Hide Skills, Prompts, Sessions, and MCP buttons when OpenClaw is active,
    as it only needs Workspace file management functionality.
  • feat(openclaw): add Workspace Files panel for managing bootstrap md files
    Add a dedicated panel to read/write OpenClaw's 6 workspace bootstrap files
    (AGENTS.md, SOUL.md, USER.md, IDENTITY.md, TOOLS.md, MEMORY.md) directly
    from ~/.openclaw/workspace/, with a whitelist-secured backend and Markdown
    editor UI. Also fix prompt auto-import missing OpenCode/OpenClaw and the
    PromptFormPanel filenameMap type exclusion.
  • fix(openclaw): add openclaw to all Record<AppId, T> usages
    Expand McpApps interface, APP_IDS, APP_ICON_MAP, enabledCounts
    initializers, and test mock data to include the openclaw key,
    resolving TypeScript errors after AppId union was extended.
  • perf: remove unnecessary query cache for Tauri local IPC
    Tauri IPC calls are in-process (microsecond latency), so the 5-minute
    staleTime and disabled refetchOnWindowFocus from web app templates are
    counterproductive. Set staleTime to 0 and enable refetchOnWindowFocus
    so external config changes are reflected immediately.
  • feat(openclaw): add default model button and fix sessionsApi export
    - Add "Enable as Default" button to OpenClaw provider cards
    - Place enable button before add/remove button for better UX
    - Disable remove button when provider is set as default
    - Add sessionsApi re-export from api barrel file to fix white screen
    - Add i18n keys for default model feature (zh/en/ja)
  • fix(openclaw,opencode): correct Opus pricing and upgrade to Opus 4.6
    - Fix Opus pricing from $15/$75 (Opus 4 price) to $5/$25 in openclaw presets
    - Upgrade model ID from claude-opus-4-5-20251101 to claude-opus-4-6
    - Update all suggestedDefaults references (fallbacks + modelCatalog)
    - Apply same model upgrade in opencode presets (7 providers)
  • feat(openclaw): register suggested models to allowlist on provider add
    When adding an OpenClaw provider with suggestedDefaults, automatically
    merge its model catalog into the allowlist and set the default model
    if not already configured.
  • fix(openclaw): update button state and toast message after switch
    Add cache invalidation for openclawLiveProviderIds in useSwitchProviderMutation
    to ensure button state updates correctly after adding/removing providers.
    
    Also fix toast message to show "已添加到配置" for OpenClaw (same as OpenCode).
  • feat(openclaw): add providerKey input field with validation
    - Add providerKey input field in ProviderForm for OpenClaw
    - Implement duplicate key detection by querying existing providers
    - Add format validation (lowercase letters, numbers, hyphens only)
    - Disable field in edit mode (key cannot be changed after creation)
    - Update mutations.ts to support OpenClaw providerKey
    - Add i18n translations for zh/en/ja
  • fix(openclaw): pass providerKey in AddProviderDialog submit handler
    The providerKey was only being passed for opencode, causing openclaw
    provider creation to fail with "Provider key is required" error.
  • fix(openclaw): prevent creating default provider on first launch
    Add additive mode guard in import_default_config() to skip OpenCode
    and OpenClaw apps, which should use their dedicated import functions.
  • fix(openclaw): update API protocol values in provider presets
    Update anthropic -> anthropic-messages to match OpenClaw gateway config
  • feat(openclaw): add provider form fields and UI components
    - Add OpenClawFormFields component for provider configuration
    - Add Collapsible UI component (radix-ui dependency)
    - Update ProviderForm with OpenClaw-specific handlers and preset logic
    - Extend OpenClawModel type with reasoning, input, maxTokens fields
    - Exclude OpenClaw from universal provider tab in AddProviderDialog
  • feat(openclaw): add additive mode frontend support
    - Add getOpenClawLiveProviderIds() API for querying live config
    - Update ProviderList to query OpenClaw live IDs
    - Rename isOpenCodeMode to isAdditiveMode (covers OpenCode + OpenClaw)
    - Update ProviderCard shouldAutoQuery and isActiveProvider logic
    - Update App.tsx onRemoveFromConfig and invalidateQueries for OpenClaw
  • feat(openclaw): add agents.defaults config support
    - Add types for default model config (primary + fallbacks)
    - Add types for model catalog/allowlist with aliases
    - Extend OpenClawModelEntry with cost and contextWindow fields
    - Add Tauri commands: get/set_openclaw_default_model, get/set_openclaw_model_catalog
    - Create frontend API (src/lib/api/openclaw.ts)
    - Add suggestedDefaults to provider presets with model metadata
    - Add i18n translations (zh/en/ja) for openclawConfig.*
  • fix(ui): update OpenClaw icon in icon index
    Replace old pixel-art style icon with new gradient lobster icon
    to match the SVG added in 2dad4729.
  • fix(ui): add OpenClaw to app switcher
    Add "openclaw" to ALL_APPS array so OpenClaw appears in the main
    interface app switcher when enabled in visibility settings.
  • chore(openclaw): remove dead code functions from openclaw_config
    Remove 6 unused functions marked with #[allow(dead_code)]:
    - get_openclaw_skills_dir: Skills not supported
    - get_env_vars/set_env_var: Environment vars unused
    - get_mcp_servers/set_mcp_server/remove_mcp_server: MCP not supported
    
    OpenClaw integration only requires provider management functionality.
  • fix(tests): add mcp_servers table to v4 migration test fixture
    Also includes OpenClaw icon that was added in previous commits.
  • fix(openclaw): remove MCP/Skills/Prompts support from OpenClaw
    OpenClaw only needs provider management functionality, not MCP, Skills,
    or Prompts features. This commit removes the incorrectly added support:
    
    - Revert SCHEMA_VERSION from 6 to 5 (remove v5->v6 migration)
    - Remove enabled_openclaw field from mcp_servers and skills tables
    - Remove openclaw field from McpApps and SkillApps structs
    - Update DAO queries to exclude enabled_openclaw column
    - Fix frontend components and types to exclude openclaw from MCP/Prompts
    - Update all related test files
  • feat(i18n): add OpenClaw translations
    - Add "openclaw": "OpenClaw" to apps translations in zh.json
    - Add "openclaw": "OpenClaw" to apps translations in en.json
    - Add "openclaw": "OpenClaw" to apps translations in ja.json
  • feat(ui): add OpenClaw support to frontend components
    - Update App.tsx with openclaw visibility and skills fallback
    - Add OpenClaw to AppSwitcher icon and display name maps
    - Update McpFormModal with openclaw in enabled apps
    - Update PromptFormModal/Panel with openclaw filename map
    - Update EndpointSpeedTest with openclaw timeout
    - Update AppVisibilitySettings with openclaw toggle
    - Update test state with openclaw defaults
  • feat(presets): add OpenClaw provider presets
    - Create openclawProviderPresets.ts with provider templates
    - Include Chinese officials (DeepSeek, Zhipu, Qwen, Kimi, MiniMax)
    - Include aggregators (AiHubMix, DMXAPI, OpenRouter, ModelScope)
    - Include third party partners (PackyCode, Cubence, AIGoCode)
    - Include OpenAI Compatible custom template
  • feat(types): add OpenClaw TypeScript type definitions
    - Add OpenClawProviderConfig and OpenClawModel interfaces
    - Add openclaw to McpApps, VisibleApps, ProxyTakeoverStatus
    - Add "openclaw" to AppId union type
    - Add openclaw to SkillApps interface
  • feat(backend): add OpenClaw support to commands and deeplinks
    - Register openclaw_config module in lib.rs
    - Add OpenClaw commands and provider import on startup
    - Add OpenClaw branches to config and provider commands
    - Add build_openclaw_settings() for deeplink imports
    - Update MCP handlers with openclaw field in McpApps
    - Add OpenClaw prompt file path
  • feat(services): add OpenClaw branches to backend services
    - Add OpenClaw branches to proxy service (not supported)
    - Add OpenClaw to MCP service (skip sync, MCP still in development)
    - Add OpenClaw skills directory path
    - Update ProxyTakeoverStatus with openclaw field
    - Add OpenClaw to stream check (not supported)
  • feat(provider): add OpenClaw provider service support
    - Add import_openclaw_providers_from_live() function
    - Add remove_openclaw_provider_from_live() function
    - Update write_live_snapshot() for OpenClaw
    - Add openclaw fields to VisibleApps and AppSettings
    - Add get_openclaw_override_dir() function