Commit Graph

195 Commits

  • feat(skills): improve marketplace disclaimer and icon (#30)
    Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
  • feat: add OpenClaw CLI command and install flow (#25)
    Co-authored-by: chatgpt-codex-connector[bot] <199175422+chatgpt-codex-connector[bot]@users.noreply.github.com>
  • chore(dependencies): add @testing-library/jest-dom to package.json and pnpm-lock.yaml
    - Included @testing-library/jest-dom version 6.9.1 to enhance testing capabilities.
    - Updated pnpm-lock.yaml to reflect the new dependency and its resolution details.
    - Removed unused version click handling from Sidebar component to streamline code.
  • chore(lint): remove ESLint configuration file and update lint scripts
    - Deleted the .eslintrc.cjs file to simplify configuration management.
    - Updated lint scripts in package.json to remove unnecessary extensions for linting.
    - Added new devDependencies for ESLint and globals to enhance linting capabilities.
  • refactor(sidebar): remove version button from Sidebar component
    - Eliminated the version display button from the Sidebar to streamline the UI.
    - Adjusted layout to maintain consistency with the overall design.
  • fix(ui): move chat controls to header, add new session, fix settings layout
    Chat page:
    - Move session selector, refresh, thinking toggle to the Header bar
      (same level as "Chat" title) instead of inside the chat content area
    - Add "New Session" button (+ icon) to create fresh chat sessions
    - Remove duplicate toolbar from chat body
    
    Settings page:
    - Remove max-w-2xl constraint so cards fill available width
    - Redesign provider cards: compact layout with key + actions in one row
    - Shorten API key display (sk-...df67 format instead of full masked key)
    - Move edit/delete/star buttons inside the key row background area
    - Remove duplicate "AI Providers" heading (already in card header)
  • refactor(chat): remove instruction text from ChatInput component
    - Removed the instruction text for sending messages (Enter to send, Shift+Enter for new line) from the ChatInput component to streamline the UI.
  • fix(chat): move toolbar to Header and add New Session button
    - Move ChatToolbar (session selector, refresh, thinking toggle) from
      the Chat page body into the Header component, so controls appear
      at the same level as the "Chat" title
    - Add New Session button (+) to create a fresh conversation
    - Add newSession action to chat store
    - Header conditionally renders ChatToolbar only on /chat route
    - Chat page fills full content area without duplicate toolbar
  • feat(chat): native React chat page with session selector and streaming
    Replace the iframe-based Control UI embed with a native React
    implementation that communicates directly with the Gateway via
    gateway:rpc IPC calls and chat event streaming.
    
    New components:
    - ChatToolbar: session selector dropdown, refresh button, thinking toggle
    - ChatMessage: message bubbles with markdown (react-markdown + GFM),
      collapsible thinking blocks, tool use cards, image attachments
    - ChatInput: textarea with Enter to send, Shift+Enter for new line
    - message-utils: extractText/extractThinking/extractImages/extractToolUse
      ported from OpenClaw's message-extract.ts
    
    Rewritten chat store with:
    - Session management (sessions.list, switchSession)
    - Proper chat.history loading with raw message preservation
    - chat.send with idempotencyKey and run tracking
    - Streaming via handleChatEvent (delta/final/error/aborted)
    - Thinking toggle (show/hide reasoning blocks)
  • fix(stores): channels.status and skills.status return complex objects, not arrays
    The Dashboard crashed with 'channels.slice is not a function' because
    channels.status returns a deeply nested object per channel ID, not a
    Channel[] array. Same issue with skills.status.
    
    For now, use empty arrays since channel/skill management is deferred
    to their dedicated pages. Will properly parse the complex response
    format when those pages are implemented.
  • fix(app): scope header overrides to gateway URLs only
    - The session.webRequest.onHeadersReceived was stripping X-Frame-Options
      and modifying CSP for ALL responses including the Vite dev server,
      which could break the main app rendering. Now only applies to
      gateway URLs (127.0.0.1:18789 / localhost:18789).
    - Dashboard: only fetch channels/skills when gateway is running
    - Dashboard: guard against non-array channels/skills data
    - Gateway store: use dynamic import() instead of require() for chat
      store to avoid ESM/CJS issues in Vite
  • fix(setup): auto-redirect to setup when no API keys are configured
    If setup was previously completed but no provider API keys were saved
    (due to the legacy bug where validation didn't persist keys), the app
    now detects this on startup and redirects to the setup wizard so the
    user can re-enter their key with the fixed save flow.
  • fix(chat): switch from webview to iframe for Control UI embedding
    The <webview> tag had issues with event listener attachment and React
    ref handling, causing the loading overlay to stay forever (white screen).
    Switched to a standard <iframe> which is simpler and works reliably:
    - Uses iframe onLoad/onError instead of webview dom-ready events
    - Added 5s fallback timeout to dismiss loading overlay
    - The X-Frame-Options/CSP header overrides from session.webRequest
      allow the iframe to load the Control UI
  • 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.
  • fix(stores): align RPC methods with OpenClaw protocol and fix chat flow
    - Fix channels store: use channels.status instead of channels.list
    - Fix skills store: use skills.status instead of skills.list
    - Fix chat store: correct chat.history response parsing (messages in payload)
    - Fix chat store: handle chat.send async flow (ack + event streaming)
    - Add chat event handling for streaming AI responses (delta/final/error)
    - Wire gateway:chat-message IPC events to chat store
    - Fix health check: use WebSocket status instead of nonexistent /health endpoint
    - Fix waitForReady: probe via WebSocket instead of HTTP
    - Gracefully degrade when methods are unsupported (no white screen)
  • refactor(setup): replace skills selection with auto-install progress UI
    - Replace manual skill bundle selection with automatic installation step
    - Add InstallingContent component with real-time progress feedback
    - Auto-install essential components: OpenCode, Python, Code Assist, File Tools, Terminal
    - Show animated progress bar and per-skill installation status
    - Auto-proceed to completion after installation finishes
    - Update CompleteContent to display installed components
    - Update architecture docs and build process documentation
  • refactor(setup): remove channel step from setup wizard
    - Remove channel connection step from onboarding flow (6 steps -> 5 steps)
    - Users can now start using ClawX immediately
    - Channel configuration moved to Settings > Channels (future)
    - Update architecture doc to reflect simplified setup flow
    - Reduces onboarding friction for new users
  • feat(providers): implement real API key validation with OpenRouter support
    - Replace mock API key validation with actual API calls to verify keys
    - Add validateApiKeyWithProvider() with provider-specific implementations
    - Support Anthropic, OpenAI, Google, and OpenRouter validation
    - Add OpenRouter as a new provider option in setup wizard and settings
    - Fix setup page to call real validation instead of mock length check
    - Allow validation during setup before provider is saved
    - Return user-friendly error messages instead of raw API errors
  • feat(gateway): integrate OpenClaw as git submodule
    - Add OpenClaw as git submodule at ./openclaw/
    - Update GatewayManager to start gateway from submodule path
    - Support both production (dist) and development (pnpm dev) modes
    - Add IPC handler for OpenClaw status check
    - Update Setup wizard to check real OpenClaw submodule status
    - Configure electron-builder to include submodule in packaged app
    - Add npm scripts for submodule management:
      - postinstall: auto-init submodule
      - openclaw:init: initialize and install dependencies
      - openclaw:install: install dependencies only
      - openclaw:build: build OpenClaw
      - openclaw:update: update to latest version
  • feat(cron): Enhance scheduled tasks with create/edit dialog and presets
    - Add TaskDialog component for creating/editing cron jobs
    - Implement schedule presets (every minute, hourly, daily, weekly, monthly)
    - Add human-readable cron schedule parsing
    - Enhance CronJobCard with run now, edit, delete actions
    - Add failed tasks counter to statistics
    - Show last run success/failure with timestamps
    - Integrate channel selection for task targets
    - Add gateway connection status awareness
    - Update process.md to reflect project completion
  • feat(skills): enhance skills browser with bundles and categories
    - Add skill bundles with batch enable/disable functionality
    - Create SkillDetailDialog for viewing skill metadata
    - Add Tabs component for All Skills / Bundles navigation
    - Implement category filtering with skill counts
    - Add search functionality for skills
    - Show Gateway connection status awareness
    - Add configuration and dependency badges
    - Include recommended bundle highlighting
  • feat(chat): enhance chat interface with markdown support
    - Add markdown rendering with react-markdown and remark-gfm
    - Create ChatMessage component with code copy functionality
    - Add typing indicator animation during AI response
    - Create welcome screen for new users
    - Add Textarea component for multi-line input
    - Improve message styling with avatars and hover actions
    - Add Gateway connection status awareness
    - Add prose styling for markdown content
  • feat(update): implement auto-update functionality with electron-updater
    - Add AppUpdater module with update lifecycle management
    - Create UpdateSettings UI component with progress display
    - Add Progress UI component based on Radix UI
    - Create update Zustand store for state management
    - Register update IPC handlers in main process
    - Auto-check for updates on production startup
    - Add commit documentation for commits 2-6
  • feat(channels): implement channel connection flows with multi-platform support
    - Add comprehensive Channels page with connection statistics and status display
    - Implement AddChannelDialog with type-specific connection flows:
      - QR code-based connection for WhatsApp/WeChat
      - Token-based connection for Telegram/Discord/Slack
    - Enhance channels store with addChannel, deleteChannel, and requestQrCode actions
    - Update electron-store usage to dynamic imports for ESM compatibility
    - Add channel connection instructions and documentation links
  • feat(providers): implement secure API key storage and provider management
    Add complete provider configuration system with the following features:
    
    - Secure API key storage using Electron's safeStorage encryption
    - Provider CRUD operations with IPC handlers
    - Lazy-loaded electron-store for ESM compatibility
    - Provider settings UI component with add/edit/delete functionality
    - API key masking for display (shows first/last 4 chars)
    - Basic API key format validation per provider type
    - Default provider selection
    - Provider enable/disable toggle
    
    New files:
    - electron/utils/secure-storage.ts: Encrypted key storage and provider config
    - src/stores/providers.ts: Zustand store for provider state
    - src/components/settings/ProvidersSettings.tsx: Provider management UI
  • feat(setup): implement functional setup wizard with multi-step flow
    Add complete setup wizard implementation with the following features:
    
    - Welcome step with feature highlights
    - Environment check step with Node.js, OpenClaw, and Gateway verification
    - AI Provider selection with API key input and validation UI
    - Channel connection step with QR code placeholder
    - Skill bundle selection with recommended bundles pre-selected
    - Completion summary showing all configured options
    
    Additional changes:
    - Add setupComplete state and markSetupComplete action to settings store
    - Auto-redirect to setup wizard on first launch
    - Track setup completion in persisted settings
  • feat(gateway): enhance gateway process management with auto-reconnection
    Improve Gateway lifecycle management with the following features:
    
    - Add exponential backoff reconnection (1s-30s delay, max 10 attempts)
    - Add health check monitoring every 30 seconds
    - Add proper restart method with graceful shutdown
    - Handle server-initiated notifications (channel status, chat messages)
    - Add 'reconnecting' state for better UI feedback
    - Enhance IPC handlers with isConnected and health check endpoints
    - Update preload script with new event channels
    - Improve type safety and error handling throughout
    
    Also fixes several TypeScript errors and unused variable warnings.
  • feat(core): initialize project skeleton with Electron + React + TypeScript
    Set up the complete project foundation for ClawX, a graphical AI assistant:
    
    - Electron main process with IPC handlers, menu, tray, and gateway management
    - React renderer with routing, layout components, and page scaffolding
    - Zustand state management for gateway, settings, channels, skills, chat, and cron
    - shadcn/ui components with Tailwind CSS and CSS variable theming
    - Build tooling with Vite, electron-builder, and TypeScript configuration
    - Testing setup with Vitest and Playwright
    - Development configurations (ESLint, Prettier, gitignore, env example)