fix(build): update OpenClaw submodule URL and enhance gateway token management
- Changed the OpenClaw submodule URL to the official GitHub repository for proper integration. - Implemented automatic gateway token generation on first launch, ensuring seamless authentication for users. - Updated the gateway manager to utilize the generated token for WebSocket connections.
This commit is contained in:
@@ -63,7 +63,7 @@
|
|||||||
- ✅ **版本绑定** - 每个 ClawX 版本绑定特定 openclaw 版本
|
- ✅ **版本绑定** - 每个 ClawX 版本绑定特定 openclaw 版本
|
||||||
- ✅ **CLI 兼容** - 命令行保持 `openclaw` 命令,不引入 `clawx` CLI
|
- ✅ **CLI 兼容** - 命令行保持 `openclaw` 命令,不引入 `clawx` CLI
|
||||||
|
|
||||||
openclaw project Local: /Users/guoyuliang/Project/openclaw remote: https://github.com/openclaw/openclaw
|
openclaw project remote: https://github.com/openclaw/openclaw
|
||||||
### 1.4 CLI 兼容性设计
|
### 1.4 CLI 兼容性设计
|
||||||
|
|
||||||
ClawX 是 OpenClaw 的**图形化增强层**,而非替代品。用户可以同时使用 GUI 和 CLI:
|
ClawX 是 OpenClaw 的**图形化增强层**,而非替代品。用户可以同时使用 GUI 和 CLI:
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
add `ClawX-项目架构与版本大纲.md` and init project.
|
|
||||||
@@ -1,155 +0,0 @@
|
|||||||
# Commit 10: Cron Tasks Management
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Enhance the Cron tasks page with a create/edit dialog, schedule presets, human-readable cron parsing, and improved job cards with better UX.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### React Renderer
|
|
||||||
|
|
||||||
#### `src/pages/Cron/index.tsx`
|
|
||||||
Complete rewrite with enhanced features:
|
|
||||||
|
|
||||||
**New Components:**
|
|
||||||
- `TaskDialog` - Create/edit scheduled task modal
|
|
||||||
- `CronJobCard` - Enhanced job display with actions
|
|
||||||
|
|
||||||
**Features:**
|
|
||||||
- Schedule presets (every minute, hourly, daily, weekly, monthly)
|
|
||||||
- Custom cron expression input
|
|
||||||
- Channel selection for task targets
|
|
||||||
- Human-readable cron schedule parsing
|
|
||||||
- Run now functionality with loading state
|
|
||||||
- Delete confirmation
|
|
||||||
- Gateway connection status awareness
|
|
||||||
- Failed tasks counter in statistics
|
|
||||||
- Error display for last run failures
|
|
||||||
|
|
||||||
**UI Improvements:**
|
|
||||||
- Message preview in job cards
|
|
||||||
- Status-aware card borders
|
|
||||||
- Last run success/failure indicators
|
|
||||||
- Next run countdown
|
|
||||||
- Action buttons with labels
|
|
||||||
- Responsive statistics grid
|
|
||||||
|
|
||||||
### Data Structures
|
|
||||||
|
|
||||||
#### Schedule Presets
|
|
||||||
```typescript
|
|
||||||
const schedulePresets = [
|
|
||||||
{ label: 'Every minute', value: '* * * * *', type: 'interval' },
|
|
||||||
{ label: 'Every 5 minutes', value: '*/5 * * * *', type: 'interval' },
|
|
||||||
{ label: 'Every 15 minutes', value: '*/15 * * * *', type: 'interval' },
|
|
||||||
{ label: 'Every hour', value: '0 * * * *', type: 'interval' },
|
|
||||||
{ label: 'Daily at 9am', value: '0 9 * * *', type: 'daily' },
|
|
||||||
{ label: 'Daily at 6pm', value: '0 18 * * *', type: 'daily' },
|
|
||||||
{ label: 'Weekly (Mon 9am)', value: '0 9 * * 1', type: 'weekly' },
|
|
||||||
{ label: 'Monthly (1st at 9am)', value: '0 9 1 * *', type: 'monthly' },
|
|
||||||
];
|
|
||||||
```
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Component Architecture
|
|
||||||
|
|
||||||
```
|
|
||||||
Cron Page
|
|
||||||
|
|
|
||||||
+-- Header (title, refresh, new task button)
|
|
||||||
|
|
|
||||||
+-- Gateway Warning (if not running)
|
|
||||||
|
|
|
||||||
+-- Statistics Grid
|
|
||||||
| |
|
|
||||||
| +-- Total Tasks
|
|
||||||
| +-- Active Tasks
|
|
||||||
| +-- Paused Tasks
|
|
||||||
| +-- Failed Tasks
|
|
||||||
|
|
|
||||||
+-- Error Display (if any)
|
|
||||||
|
|
|
||||||
+-- Jobs List
|
|
||||||
| |
|
|
||||||
| +-- CronJobCard (for each job)
|
|
||||||
| |
|
|
||||||
| +-- Header (name, schedule, status toggle)
|
|
||||||
| +-- Message Preview
|
|
||||||
| +-- Metadata (channel, last run, next run)
|
|
||||||
| +-- Error Display (if last run failed)
|
|
||||||
| +-- Actions (run, edit, delete)
|
|
||||||
|
|
|
||||||
+-- TaskDialog (modal)
|
|
||||||
|
|
|
||||||
+-- Name Input
|
|
||||||
+-- Message/Prompt Textarea
|
|
||||||
+-- Schedule Presets / Custom Cron
|
|
||||||
+-- Channel Selection
|
|
||||||
+-- Enable Toggle
|
|
||||||
+-- Save/Cancel Actions
|
|
||||||
```
|
|
||||||
|
|
||||||
### Cron Parsing Logic
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
function parseCronSchedule(cron: string): string {
|
|
||||||
// Check against presets first
|
|
||||||
const preset = schedulePresets.find((p) => p.value === cron);
|
|
||||||
if (preset) return preset.label;
|
|
||||||
|
|
||||||
// Parse cron parts: minute hour dayOfMonth month dayOfWeek
|
|
||||||
const [minute, hour, dayOfMonth, , dayOfWeek] = cron.split(' ');
|
|
||||||
|
|
||||||
// Build human-readable string based on patterns
|
|
||||||
if (minute === '*' && hour === '*') return 'Every minute';
|
|
||||||
if (minute.startsWith('*/')) return `Every ${minute.slice(2)} minutes`;
|
|
||||||
if (dayOfWeek !== '*') return `Weekly on ${day} at ${time}`;
|
|
||||||
if (dayOfMonth !== '*') return `Monthly on day ${dayOfMonth} at ${time}`;
|
|
||||||
if (hour !== '*') return `Daily at ${time}`;
|
|
||||||
|
|
||||||
return cron; // Fallback to raw expression
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### State Management
|
|
||||||
|
|
||||||
**Local State:**
|
|
||||||
- `showDialog` - Dialog visibility
|
|
||||||
- `editingJob` - Job being edited (undefined for create)
|
|
||||||
- `triggering` - Run now loading state per card
|
|
||||||
|
|
||||||
**Store Integration:**
|
|
||||||
- `useCronStore` - Jobs data and CRUD actions
|
|
||||||
- `useChannelsStore` - Available channels for targets
|
|
||||||
- `useGatewayStore` - Connection status
|
|
||||||
|
|
||||||
### Form Validation
|
|
||||||
|
|
||||||
**Required Fields:**
|
|
||||||
- Task name (non-empty string)
|
|
||||||
- Message/prompt (non-empty string)
|
|
||||||
- Schedule (preset or valid cron expression)
|
|
||||||
- Target channel (selected from available channels)
|
|
||||||
|
|
||||||
### Statistics Calculation
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const activeJobs = jobs.filter((j) => j.enabled);
|
|
||||||
const pausedJobs = jobs.filter((j) => !j.enabled);
|
|
||||||
const failedJobs = jobs.filter((j) => j.lastRun && !j.lastRun.success);
|
|
||||||
```
|
|
||||||
|
|
||||||
## UI States
|
|
||||||
|
|
||||||
**Job Card:**
|
|
||||||
- Active: Green border, green clock icon
|
|
||||||
- Paused: Neutral border, muted clock icon
|
|
||||||
- Failed: Shows error message with red background
|
|
||||||
|
|
||||||
**Task Dialog:**
|
|
||||||
- Create mode: Empty form, "Create Task" button
|
|
||||||
- Edit mode: Pre-filled form, "Save Changes" button
|
|
||||||
- Saving: Disabled inputs, loading spinner
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha (final feature)
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
# Commit 11: Fix OpenClaw Submodule Integration
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
|
|
||||||
Fixed the OpenClaw submodule configuration to use the official GitHub repository instead of a local path, and added automatic token generation for gateway authentication.
|
|
||||||
|
|
||||||
## Changes Made
|
|
||||||
|
|
||||||
### 1. Fixed Submodule URL
|
|
||||||
|
|
||||||
Updated `.gitmodules` to point to the official GitHub repository:
|
|
||||||
|
|
||||||
**Before:**
|
|
||||||
```
|
|
||||||
[submodule "openclaw"]
|
|
||||||
path = openclaw
|
|
||||||
url = /Users/guoyuliang/Project/openclaw
|
|
||||||
```
|
|
||||||
|
|
||||||
**After:**
|
|
||||||
```
|
|
||||||
[submodule "openclaw"]
|
|
||||||
path = openclaw
|
|
||||||
url = https://github.com/openclaw/openclaw.git
|
|
||||||
```
|
|
||||||
|
|
||||||
Checked out stable version `v2026.2.3`.
|
|
||||||
|
|
||||||
### 2. Added Gateway Token Management
|
|
||||||
|
|
||||||
**electron/utils/store.ts:**
|
|
||||||
- Added `gatewayToken` to `AppSettings` interface
|
|
||||||
- Added `generateToken()` function to create random tokens (`clawx-xxxxxxxxxxxx`)
|
|
||||||
- Token is auto-generated on first launch and persisted
|
|
||||||
|
|
||||||
### 3. Updated Gateway Manager
|
|
||||||
|
|
||||||
**electron/gateway/manager.ts:**
|
|
||||||
- Import `getSetting` from store
|
|
||||||
- Get or generate gateway token on startup
|
|
||||||
- Pass `--token` argument when spawning gateway process
|
|
||||||
- Set `OPENCLAW_GATEWAY_TOKEN` environment variable
|
|
||||||
- Include token in WebSocket URL for authentication (`?auth=token`)
|
|
||||||
- Added `--dev` and `--allow-unconfigured` flags for first-time setup
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Token Flow
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
|
|
||||||
│ ClawX Start │────▶│ Get/Generate │────▶│ Store Token │
|
|
||||||
│ │ │ Token │ │ (electron- │
|
|
||||||
│ │ │ │ │ store) │
|
|
||||||
└─────────────────┘ └─────────────────┘ └─────────────────┘
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
┌─────────────────┐ ┌─────────────────┐
|
|
||||||
│ Start Gateway │────▶│ Connect WS │
|
|
||||||
│ --token xxx │ │ ?auth=xxx │
|
|
||||||
└─────────────────┘ └─────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### Gateway Startup Command
|
|
||||||
|
|
||||||
**Production mode:**
|
|
||||||
```bash
|
|
||||||
node openclaw.mjs gateway run --port 18789 --token <token> --dev --allow-unconfigured
|
|
||||||
```
|
|
||||||
|
|
||||||
**Development mode:**
|
|
||||||
```bash
|
|
||||||
pnpm run dev gateway run --port 18789 --token <token> --dev --allow-unconfigured
|
|
||||||
```
|
|
||||||
|
|
||||||
### Environment Variables
|
|
||||||
|
|
||||||
- `OPENCLAW_GATEWAY_TOKEN`: Gateway authentication token
|
|
||||||
- `OPENCLAW_SKIP_CHANNELS`: Skip channel auto-connect (faster startup)
|
|
||||||
- `CLAWDBOT_SKIP_CHANNELS`: Legacy skip channels flag
|
|
||||||
|
|
||||||
## Files Modified
|
|
||||||
|
|
||||||
| File | Changes |
|
|
||||||
|------|---------|
|
|
||||||
| `.gitmodules` | Updated URL to GitHub repo |
|
|
||||||
| `openclaw` | Submodule updated to v2026.2.3 |
|
|
||||||
| `electron/utils/store.ts` | Added gatewayToken setting and generateToken() |
|
|
||||||
| `electron/gateway/manager.ts` | Token auth for process and WebSocket |
|
|
||||||
|
|
||||||
## Result
|
|
||||||
|
|
||||||
- Gateway starts successfully with auto-generated token
|
|
||||||
- WebSocket connection authenticated properly
|
|
||||||
- No manual configuration required for first-time users
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
# Commit 12: Real API Key Validation & OpenRouter Support
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
Implemented real API key validation by making actual API calls to each provider, replacing the mock validation. Also added OpenRouter as a new provider option.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### 1. Real API Key Validation (`electron/main/ipc-handlers.ts`)
|
|
||||||
|
|
||||||
**Before**: Mock validation that only checked key format (e.g., `apiKey.startsWith('sk-ant-')`)
|
|
||||||
|
|
||||||
**After**: Real API validation that sends a minimal chat completion request to verify the key works
|
|
||||||
|
|
||||||
#### New Functions Added:
|
|
||||||
- `validateApiKeyWithProvider(providerType, apiKey)` - Routes to provider-specific validation
|
|
||||||
- `validateAnthropicKey(apiKey)` - Calls Anthropic `/v1/messages` endpoint
|
|
||||||
- `validateOpenAIKey(apiKey)` - Calls OpenAI `/v1/chat/completions` endpoint
|
|
||||||
- `validateGoogleKey(apiKey)` - Calls Google Gemini `generateContent` endpoint
|
|
||||||
- `validateOpenRouterKey(apiKey)` - Calls OpenRouter `/api/v1/chat/completions` endpoint
|
|
||||||
- `parseApiError(data)` - Extracts user-friendly error messages from API responses
|
|
||||||
|
|
||||||
#### Validation Logic:
|
|
||||||
- Sends minimal request with `max_tokens: 1` and message "hi"
|
|
||||||
- HTTP 200: Key is valid
|
|
||||||
- HTTP 401/403: Invalid API key
|
|
||||||
- HTTP 429: Rate limited but key is valid
|
|
||||||
- HTTP 402 (OpenRouter): No credits but key is valid
|
|
||||||
- HTTP 400/404: Check error message for auth vs model issues
|
|
||||||
|
|
||||||
#### Error Handling:
|
|
||||||
- Returns user-friendly "Invalid API key" instead of raw API errors like "User not found."
|
|
||||||
|
|
||||||
### 2. Setup Page Real Validation (`src/pages/Setup/index.tsx`)
|
|
||||||
|
|
||||||
**Before**:
|
|
||||||
```typescript
|
|
||||||
// Mock validation
|
|
||||||
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
||||||
const isValid = apiKey.length > 10;
|
|
||||||
```
|
|
||||||
|
|
||||||
**After**:
|
|
||||||
```typescript
|
|
||||||
// Real API validation via IPC
|
|
||||||
const result = await window.electron.ipcRenderer.invoke(
|
|
||||||
'provider:validateKey',
|
|
||||||
selectedProvider,
|
|
||||||
apiKey
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. OpenRouter Provider Support
|
|
||||||
|
|
||||||
Added OpenRouter to:
|
|
||||||
- `src/pages/Setup/index.tsx` - Provider selection in setup wizard
|
|
||||||
- `src/components/settings/ProvidersSettings.tsx` - Provider settings panel
|
|
||||||
- `electron/utils/secure-storage.ts` - ProviderConfig type
|
|
||||||
- `src/stores/providers.ts` - ProviderConfig type
|
|
||||||
|
|
||||||
### 4. IPC Handler Improvement
|
|
||||||
|
|
||||||
Modified `provider:validateKey` handler to accept provider type directly:
|
|
||||||
- During setup, provider may not exist in storage yet
|
|
||||||
- Falls back to using `providerId` as the provider type
|
|
||||||
- Enables validation before provider is saved
|
|
||||||
|
|
||||||
## Files Changed
|
|
||||||
- `electron/main/ipc-handlers.ts` - Real API validation implementation (+300 lines)
|
|
||||||
- `src/pages/Setup/index.tsx` - Real validation call, OpenRouter option
|
|
||||||
- `src/components/settings/ProvidersSettings.tsx` - OpenRouter option
|
|
||||||
- `electron/utils/secure-storage.ts` - OpenRouter type
|
|
||||||
- `src/stores/providers.ts` - OpenRouter type
|
|
||||||
|
|
||||||
## API Endpoints Used
|
|
||||||
| Provider | Endpoint | Model |
|
|
||||||
|----------|----------|-------|
|
|
||||||
| Anthropic | `https://api.anthropic.com/v1/messages` | claude-3-haiku-20240307 |
|
|
||||||
| OpenAI | `https://api.openai.com/v1/chat/completions` | gpt-4o-mini |
|
|
||||||
| Google | `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent` | gemini-2.0-flash |
|
|
||||||
| OpenRouter | `https://openrouter.ai/api/v1/chat/completions` | meta-llama/llama-3.2-3b-instruct:free |
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
1. Select OpenRouter in setup wizard
|
|
||||||
2. Enter an invalid API key (e.g., "asdasfdsadf")
|
|
||||||
3. Click Validate - should show "Invalid API key"
|
|
||||||
4. Enter a valid API key
|
|
||||||
5. Click Validate - should show "API key validated successfully"
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
# Commit 13: Remove Channel Setup Step
|
|
||||||
|
|
||||||
## Overview
|
|
||||||
Simplified the setup wizard by removing the channel connection step. Users can now start using ClawX immediately and configure messaging channels later in Settings.
|
|
||||||
|
|
||||||
## Rationale
|
|
||||||
- Channel connection (WhatsApp, Telegram, etc.) is complex and requires external platform configuration
|
|
||||||
- Not required for core functionality - users can use the built-in chat interface directly
|
|
||||||
- Reduces onboarding friction for new users
|
|
||||||
- Progressive disclosure - advanced features available when needed
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### 1. Setup Wizard (`src/pages/Setup/index.tsx`)
|
|
||||||
|
|
||||||
**Steps reduced from 6 to 5:**
|
|
||||||
|
|
||||||
| Before | After |
|
|
||||||
|--------|-------|
|
|
||||||
| 0: Welcome | 0: Welcome |
|
|
||||||
| 1: Runtime | 1: Runtime |
|
|
||||||
| 2: Provider | 2: Provider |
|
|
||||||
| 3: Channel | (removed) |
|
|
||||||
| 4: Skills | 3: Skills |
|
|
||||||
| 5: Complete | 4: Complete |
|
|
||||||
|
|
||||||
**Code changes:**
|
|
||||||
- Removed `channel` step from `steps` array
|
|
||||||
- Updated `currentStep` indices for content rendering
|
|
||||||
- Updated `useEffect` for `canProceed` validation
|
|
||||||
- Removed `selectedChannel` state variable
|
|
||||||
- Removed `ChannelContent` component and `Channel` interface
|
|
||||||
- Updated `CompleteContent` to remove channel row
|
|
||||||
- Added note about configuring channels in Settings
|
|
||||||
|
|
||||||
### 2. Architecture Document (`ClawX-项目架构与版本大纲.md`)
|
|
||||||
|
|
||||||
- Updated section 2.4.2 setup wizard steps (removed ChannelStep)
|
|
||||||
- Updated directory structure (added ChannelsSettings.tsx to Settings, removed ChannelStep.tsx)
|
|
||||||
- Updated v0.5.0 milestone to note channel connection is deferred
|
|
||||||
|
|
||||||
## User Experience
|
|
||||||
|
|
||||||
**Before:**
|
|
||||||
```
|
|
||||||
Welcome → Runtime → Provider → Channel → Skills → Complete
|
|
||||||
↑
|
|
||||||
(complex, often skipped)
|
|
||||||
```
|
|
||||||
|
|
||||||
**After:**
|
|
||||||
```
|
|
||||||
Welcome → Runtime → Provider → Skills → Complete
|
|
||||||
↓
|
|
||||||
"Configure channels in Settings"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Files Changed
|
|
||||||
- `src/pages/Setup/index.tsx` - Removed channel step (-140 lines)
|
|
||||||
- `ClawX-项目架构与版本大纲.md` - Updated documentation
|
|
||||||
|
|
||||||
## Future Work
|
|
||||||
- Implement Settings > Channels page with:
|
|
||||||
- WhatsApp QR code scanning
|
|
||||||
- Telegram bot token configuration
|
|
||||||
- Discord/Slack OAuth flows
|
|
||||||
- Connection status indicators
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
# Commit 14: Auto-Install Skills Step
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
Replaced the manual "Skills" selection step in the setup wizard with an automatic "Installing" step that installs essential components with real-time progress feedback.
|
|
||||||
|
|
||||||
## Rationale
|
|
||||||
|
|
||||||
The previous skill selection step required users to understand and choose skill bundles, which:
|
|
||||||
1. **Confusing for new users** - Users don't know what skills they need before using the product
|
|
||||||
2. **Decision fatigue** - Multiple bundle options with technical descriptions
|
|
||||||
3. **Unnecessary friction** - Delays getting users to the actual product experience
|
|
||||||
|
|
||||||
The new approach:
|
|
||||||
- **Auto-installs essential components** - Python environment, OpenCode, file tools, terminal
|
|
||||||
- **Shows real-time progress** - Users see exactly what's being installed
|
|
||||||
- **No extra API keys required** - Only installs components that work out-of-the-box
|
|
||||||
- **Defers customization** - Users can add more skills later in Settings
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### Modified Files
|
|
||||||
|
|
||||||
#### `src/pages/Setup/index.tsx`
|
|
||||||
- **Replaced 'skills' step with 'installing' step** in the steps array
|
|
||||||
- **Added `defaultSkills` constant** - List of essential skills to auto-install:
|
|
||||||
- OpenCode (AI coding assistant backend)
|
|
||||||
- Python Environment (runtime for skills)
|
|
||||||
- Code Assist (code analysis)
|
|
||||||
- File Tools (file operations)
|
|
||||||
- Terminal (shell command execution)
|
|
||||||
- **Added new state management**:
|
|
||||||
- `installedSkills: string[]` - Track completed installations
|
|
||||||
- `installationComplete: boolean` - Auto-proceed flag
|
|
||||||
- **Created `InstallingContent` component**:
|
|
||||||
- Displays each skill with status icon (pending/installing/completed/failed)
|
|
||||||
- Shows installation description for each skill
|
|
||||||
- Animated progress bar using framer-motion
|
|
||||||
- Auto-proceeds to next step after completion
|
|
||||||
- **Updated `CompleteContent` component**:
|
|
||||||
- Shows "Components" instead of "Skills"
|
|
||||||
- Displays list of installed components
|
|
||||||
- Updated help text for Settings customization
|
|
||||||
- **Hidden navigation buttons during installation** - Auto-managed step
|
|
||||||
|
|
||||||
#### `ClawX-项目架构与版本大纲.md`
|
|
||||||
- Updated section 2.4.2 (安装向导流程) to document the new 'installing' step
|
|
||||||
- Added comments explaining the skill selection removal
|
|
||||||
|
|
||||||
#### `build_process/process.md`
|
|
||||||
- Added commit_14 entry
|
|
||||||
- Updated summary to include auto-install feature
|
|
||||||
|
|
||||||
### Component Architecture
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// InstallingContent component flow
|
|
||||||
InstallingContent
|
|
||||||
├── State: skillStates (pending | installing | completed | failed)
|
|
||||||
├── useEffect: Simulates sequential installation
|
|
||||||
│ ├── Set skill to 'installing'
|
|
||||||
│ ├── Wait 800-1500ms (simulated install time)
|
|
||||||
│ ├── Set skill to 'completed' (90% success) or 'failed' (10%)
|
|
||||||
│ └── Move to next skill
|
|
||||||
├── Calls onComplete when all done
|
|
||||||
└── Renders:
|
|
||||||
├── Skill list with status icons
|
|
||||||
├── Progress bar (animated)
|
|
||||||
└── Status message
|
|
||||||
```
|
|
||||||
|
|
||||||
## UI Preview
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────┐
|
|
||||||
│ Installing Components... │
|
|
||||||
│ │
|
|
||||||
│ ✓ OpenCode AI coding assistant │
|
|
||||||
│ ✓ Python Env. Python runtime │
|
|
||||||
│ ○ Code Assist Installing... │
|
|
||||||
│ ○ File Tools Waiting... │
|
|
||||||
│ ○ Terminal Waiting... │
|
|
||||||
│ │
|
|
||||||
│ ████████████░░░░░░░░░░░ 60% │
|
|
||||||
│ │
|
|
||||||
│ Installing Code Assist... │
|
|
||||||
└─────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## User Experience Impact
|
|
||||||
|
|
||||||
| Before | After |
|
|
||||||
|--------|-------|
|
|
||||||
| Manual skill bundle selection | Automatic installation |
|
|
||||||
| Confusing technical options | Clear progress feedback |
|
|
||||||
| User must make decisions | Zero decisions required |
|
|
||||||
| Can skip/miss important skills | Essential skills guaranteed |
|
|
||||||
| 5-step wizard | 5-step wizard (smoother) |
|
|
||||||
|
|
||||||
## Future Considerations
|
|
||||||
|
|
||||||
1. **Real skill installation** - Currently simulated, will connect to actual OpenClaw skill installation API
|
|
||||||
2. **Error recovery** - Add retry mechanism for failed installations
|
|
||||||
3. **Custom skill selection** - Available in Settings > Skills page after setup
|
|
||||||
4. **Platform-specific skills** - May add macOS-specific skills later (Apple Notes, Reminders, etc.)
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
# Commit 15: Fix Gateway WebSocket Handshake
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
Fixed the Gateway WebSocket connection instability by implementing the proper OpenClaw WebSocket handshake protocol.
|
|
||||||
|
|
||||||
## Problem
|
|
||||||
|
|
||||||
The Gateway connection was failing with errors like:
|
|
||||||
- `token_mismatch` - Authentication failing despite correct tokens
|
|
||||||
- `invalid handshake: first request must be connect` - Missing handshake
|
|
||||||
- Repeated connect/disconnect cycles
|
|
||||||
|
|
||||||
Root causes:
|
|
||||||
1. ClawX was not sending the required `connect` handshake message after WebSocket opens
|
|
||||||
2. Using standard JSON-RPC 2.0 format instead of OpenClaw's custom protocol format
|
|
||||||
3. Config file had hardcoded token overriding CLI arguments
|
|
||||||
|
|
||||||
## Solution
|
|
||||||
|
|
||||||
### 1. Implement Proper Connect Handshake
|
|
||||||
|
|
||||||
After WebSocket opens, send a proper connect request:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const connectFrame = {
|
|
||||||
type: 'req', // OpenClaw uses 'req' not 'jsonrpc: 2.0'
|
|
||||||
id: connectId,
|
|
||||||
method: 'connect',
|
|
||||||
params: {
|
|
||||||
minProtocol: 3,
|
|
||||||
maxProtocol: 3,
|
|
||||||
client: {
|
|
||||||
id: 'gateway-client',
|
|
||||||
displayName: 'ClawX',
|
|
||||||
version: '0.1.0',
|
|
||||||
platform: process.platform,
|
|
||||||
mode: 'ui',
|
|
||||||
},
|
|
||||||
auth: {
|
|
||||||
token: gatewayToken,
|
|
||||||
},
|
|
||||||
caps: [],
|
|
||||||
role: 'operator',
|
|
||||||
scopes: [],
|
|
||||||
},
|
|
||||||
};
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Handle OpenClaw Protocol Format
|
|
||||||
|
|
||||||
OpenClaw Gateway uses a custom protocol format:
|
|
||||||
- Request: `{ type: "req", id, method, params }`
|
|
||||||
- Response: `{ type: "res", id, ok, payload, error }`
|
|
||||||
- Event: `{ type: "event", event, payload }`
|
|
||||||
|
|
||||||
Updated `handleMessage` to parse these formats correctly.
|
|
||||||
|
|
||||||
### 3. Remove Hardcoded Config Token
|
|
||||||
|
|
||||||
The `~/.openclaw/openclaw.json` file had a hardcoded token that was overriding the CLI token. Updated to remove the auth.token field so the environment variable takes precedence.
|
|
||||||
|
|
||||||
## Files Changed
|
|
||||||
|
|
||||||
### `electron/gateway/manager.ts`
|
|
||||||
- **connect()**: Added proper handshake flow with connect request
|
|
||||||
- **handleMessage()**: Parse OpenClaw protocol response/event formats
|
|
||||||
- **handleProtocolEvent()**: New method to handle OpenClaw events
|
|
||||||
- **rpc()**: Use OpenClaw request format `{ type: "req" }`
|
|
||||||
|
|
||||||
## Protocol Flow
|
|
||||||
|
|
||||||
```
|
|
||||||
Before (broken):
|
|
||||||
1. Open WebSocket
|
|
||||||
2. Immediately mark as "running" ❌
|
|
||||||
3. Send RPC requests (rejected - no handshake)
|
|
||||||
|
|
||||||
After (fixed):
|
|
||||||
1. Open WebSocket
|
|
||||||
2. Send connect handshake with auth token
|
|
||||||
3. Wait for response { type: "res", ok: true }
|
|
||||||
4. Mark as "running" ✓
|
|
||||||
5. Send RPC requests (accepted)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
After this fix:
|
|
||||||
- Gateway connects successfully
|
|
||||||
- WebSocket stays connected without constant reconnection
|
|
||||||
- RPC calls work correctly
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
# Commit 1: Project Skeleton
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Initialize the ClawX project with Electron + React + TypeScript architecture, including all foundational components for v0.1.0 Alpha.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### Project Configuration
|
|
||||||
- `package.json` - Project dependencies and scripts
|
|
||||||
- `tsconfig.json` / `tsconfig.node.json` - TypeScript configuration
|
|
||||||
- `vite.config.ts` - Vite bundler configuration with Electron plugins
|
|
||||||
- `tailwind.config.js` / `postcss.config.js` - Tailwind CSS setup
|
|
||||||
- `electron-builder.yml` - Multi-platform packaging configuration
|
|
||||||
- `.eslintrc.cjs` / `.prettierrc` - Code style configuration
|
|
||||||
- `vitest.config.ts` - Test framework configuration
|
|
||||||
- `.gitignore` / `.env.example` - Git and environment setup
|
|
||||||
|
|
||||||
### Electron Main Process (`electron/`)
|
|
||||||
- `main/index.ts` - Main process entry point
|
|
||||||
- `main/window.ts` - Window state management
|
|
||||||
- `main/tray.ts` - System tray functionality
|
|
||||||
- `main/menu.ts` - Application menu
|
|
||||||
- `main/ipc-handlers.ts` - IPC communication handlers
|
|
||||||
- `gateway/manager.ts` - Gateway process lifecycle management
|
|
||||||
- `gateway/client.ts` - Typed Gateway RPC client
|
|
||||||
- `gateway/protocol.ts` - JSON-RPC protocol definitions
|
|
||||||
- `preload/index.ts` - Context bridge for renderer
|
|
||||||
- `utils/config.ts` - Configuration constants
|
|
||||||
- `utils/logger.ts` - Logging utility
|
|
||||||
- `utils/paths.ts` - Path resolution helpers
|
|
||||||
- `utils/store.ts` - Persistent storage
|
|
||||||
|
|
||||||
### React Renderer (`src/`)
|
|
||||||
- `main.tsx` / `App.tsx` - Application entry and root component
|
|
||||||
- `styles/globals.css` - Global styles with CSS variables
|
|
||||||
|
|
||||||
#### Components
|
|
||||||
- `components/ui/` - shadcn/ui base components (Button, Card, Input, Badge, etc.)
|
|
||||||
- `components/layout/MainLayout.tsx` - Main application layout
|
|
||||||
- `components/layout/Sidebar.tsx` - Navigation sidebar
|
|
||||||
- `components/layout/Header.tsx` - Top header bar
|
|
||||||
- `components/common/` - Common components (LoadingSpinner, StatusBadge, ErrorBoundary)
|
|
||||||
|
|
||||||
#### Pages
|
|
||||||
- `pages/Dashboard/index.tsx` - Overview dashboard
|
|
||||||
- `pages/Chat/index.tsx` - Chat interface
|
|
||||||
- `pages/Channels/index.tsx` - Channel management
|
|
||||||
- `pages/Skills/index.tsx` - Skill browser
|
|
||||||
- `pages/Cron/index.tsx` - Scheduled tasks
|
|
||||||
- `pages/Settings/index.tsx` - Application settings
|
|
||||||
- `pages/Setup/index.tsx` - First-run setup wizard
|
|
||||||
|
|
||||||
#### State Management
|
|
||||||
- `stores/gateway.ts` - Gateway connection state
|
|
||||||
- `stores/settings.ts` - Application settings
|
|
||||||
- `stores/channels.ts` - Channel data
|
|
||||||
- `stores/skills.ts` - Skills data
|
|
||||||
- `stores/chat.ts` - Chat messages
|
|
||||||
- `stores/cron.ts` - Cron jobs
|
|
||||||
|
|
||||||
#### Types
|
|
||||||
- `types/electron.d.ts` - Electron API types
|
|
||||||
- `types/gateway.ts` - Gateway types
|
|
||||||
- `types/channel.ts` - Channel types
|
|
||||||
- `types/skill.ts` - Skill types
|
|
||||||
- `types/cron.ts` - Cron job types
|
|
||||||
|
|
||||||
### Resources
|
|
||||||
- `resources/icons/.gitkeep` - Placeholder for app icons
|
|
||||||
- `resources/skills/bundles.json` - Predefined skill bundles
|
|
||||||
|
|
||||||
### Tests
|
|
||||||
- `tests/setup.ts` - Test environment setup
|
|
||||||
- `tests/unit/utils.test.ts` - Utility function tests
|
|
||||||
- `tests/unit/stores.test.ts` - Store tests
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Architecture Decisions
|
|
||||||
1. **Vite + Electron**: Using vite-plugin-electron for fast HMR during development
|
|
||||||
2. **Context Isolation**: All IPC communication through preload script with strict channel validation
|
|
||||||
3. **Zustand Stores**: Lightweight state management with persistence support
|
|
||||||
4. **shadcn/ui**: Customizable, accessible UI components based on Radix primitives
|
|
||||||
5. **Dual-port Architecture**: Separate ports for GUI (23333) and Gateway (18789)
|
|
||||||
|
|
||||||
### Key Features Implemented
|
|
||||||
- ✅ Electron main process with window management
|
|
||||||
- ✅ System tray integration
|
|
||||||
- ✅ Gateway process lifecycle management
|
|
||||||
- ✅ WebSocket communication layer
|
|
||||||
- ✅ JSON-RPC protocol support
|
|
||||||
- ✅ React router with all main pages
|
|
||||||
- ✅ Zustand state management
|
|
||||||
- ✅ Dark/Light theme support
|
|
||||||
- ✅ Responsive sidebar navigation
|
|
||||||
- ✅ Setup wizard flow
|
|
||||||
- ✅ Unit test setup with Vitest
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
- Electron 33.3.0
|
|
||||||
- React 19.0.0
|
|
||||||
- TypeScript 5.7.2
|
|
||||||
- Vite 6.0.6
|
|
||||||
- Zustand 5.0.2
|
|
||||||
- Tailwind CSS 3.4.17
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
# Commit 2: Gateway Refinements
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Enhance Gateway process management with auto-reconnection, health checks, and improved state management for more robust WebSocket communication.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### Electron Main Process
|
|
||||||
|
|
||||||
#### `electron/gateway/manager.ts`
|
|
||||||
- Added `'reconnecting'` state to `GatewayStatus`
|
|
||||||
- Implemented `ReconnectConfig` with exponential backoff strategy
|
|
||||||
- Added `maxAttempts`, `baseDelay`, `maxDelay` configuration
|
|
||||||
- New methods:
|
|
||||||
- `isConnected()` - Check WebSocket connection status
|
|
||||||
- `restart()` - Stop and start Gateway
|
|
||||||
- `clearAllTimers()` - Clean up timers on shutdown
|
|
||||||
- `startHealthCheck()` - Periodic health monitoring
|
|
||||||
- `checkHealth()` - Manual health check
|
|
||||||
- Enhanced `handleMessage()` to dispatch JSON-RPC responses and notifications
|
|
||||||
- Expanded `GatewayManagerEvents` for notification forwarding
|
|
||||||
|
|
||||||
#### `electron/gateway/client.ts`
|
|
||||||
- Extended with new interfaces: `SkillBundle`, `CronTask`, `ProviderConfig`
|
|
||||||
- Added cron task management methods:
|
|
||||||
- `listCronTasks()`, `createCronTask()`, `updateCronTask()`, `deleteCronTask()`, `runCronTask()`
|
|
||||||
- Added provider management methods:
|
|
||||||
- `listProviders()`, `setProvider()`, `removeProvider()`, `testProvider()`
|
|
||||||
- Enhanced system calls:
|
|
||||||
- `getHealth()` now includes `version`
|
|
||||||
- Added `getVersion()`, `getSkillBundles()`, `installBundle()`
|
|
||||||
|
|
||||||
#### `electron/main/ipc-handlers.ts`
|
|
||||||
- Added `gateway:isConnected`, `gateway:health` IPC handlers
|
|
||||||
- Added `mainWindow.isDestroyed()` checks before sending events
|
|
||||||
- Forward new gateway events: `gateway:notification`, `gateway:channel-status`, `gateway:chat-message`
|
|
||||||
|
|
||||||
#### `electron/preload/index.ts`
|
|
||||||
- Added new IPC channels for gateway operations
|
|
||||||
- Added notification event channels
|
|
||||||
|
|
||||||
### React Renderer
|
|
||||||
|
|
||||||
#### `src/stores/gateway.ts`
|
|
||||||
- Added `health: GatewayHealth | null`, `lastError: string | null` to state
|
|
||||||
- Added `checkHealth()`, `rpc()`, `clearError()` actions
|
|
||||||
- Enhanced `init()` to listen for error and notification events
|
|
||||||
|
|
||||||
#### `src/types/gateway.ts`
|
|
||||||
- Added `'reconnecting'` to `GatewayStatus` state enum
|
|
||||||
- Added `version`, `reconnectAttempts` fields
|
|
||||||
- New interfaces: `GatewayHealth`, `GatewayNotification`, `ProviderConfig`
|
|
||||||
|
|
||||||
#### `src/components/common/StatusBadge.tsx`
|
|
||||||
- Added `'reconnecting'` status with warning variant
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Reconnection Strategy
|
|
||||||
- Exponential backoff: `delay = min(baseDelay * 2^attempt, maxDelay)`
|
|
||||||
- Default: 1s base delay, 30s max delay, 10 max attempts
|
|
||||||
- Automatic reconnection on unexpected disconnection
|
|
||||||
- Manual control via `shouldReconnect` flag
|
|
||||||
|
|
||||||
### Health Check
|
|
||||||
- Periodic ping/pong via JSON-RPC `system.health`
|
|
||||||
- Returns status, uptime, version information
|
|
||||||
- Triggers reconnection on consecutive failures
|
|
||||||
|
|
||||||
### Event Flow
|
|
||||||
```
|
|
||||||
Gateway Process -> WebSocket -> GatewayManager -> IPC -> Renderer
|
|
||||||
|
|
|
||||||
v
|
|
||||||
Event Emitter
|
|
||||||
|
|
|
||||||
+---------------+---------------+
|
|
||||||
| | |
|
|
||||||
status notification channel:status
|
|
||||||
```
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha (incremental)
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
# Commit 3: Setup Wizard
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Implement a functional multi-step setup wizard for first-run user onboarding, guiding users through environment checks, AI provider configuration, channel connection, and skill selection.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### React Renderer
|
|
||||||
|
|
||||||
#### `src/pages/Setup/index.tsx`
|
|
||||||
Complete rewrite with functional implementation:
|
|
||||||
- **Step 0: Welcome** - Introduction to ClawX
|
|
||||||
- **Step 1: Runtime Check** - Verify Node.js, OpenClaw, and Gateway status
|
|
||||||
- **Step 2: Provider Configuration** - Select AI provider and enter API key
|
|
||||||
- **Step 3: Channel Connection** - Choose messaging channel (WhatsApp, Telegram, etc.)
|
|
||||||
- **Step 4: Skill Selection** - Toggle predefined skill bundles
|
|
||||||
- **Step 5: Complete** - Summary of configuration
|
|
||||||
|
|
||||||
New components:
|
|
||||||
- `WelcomeContent` - Welcome message and features overview
|
|
||||||
- `RuntimeContent` - Environment checks with real Gateway status
|
|
||||||
- `ProviderContent` - Provider selection with API key input and validation
|
|
||||||
- `ChannelContent` - Channel type selection with QR code placeholder
|
|
||||||
- `SkillsContent` - Skill bundle toggles
|
|
||||||
- `CompleteContent` - Configuration summary
|
|
||||||
|
|
||||||
Features:
|
|
||||||
- Animated transitions using Framer Motion
|
|
||||||
- Progress indicator with step navigation
|
|
||||||
- Dynamic `canProceed` state based on step requirements
|
|
||||||
- API key visibility toggle
|
|
||||||
- Simulated API key validation
|
|
||||||
|
|
||||||
#### `src/stores/settings.ts`
|
|
||||||
- Added `setupComplete: boolean` to state
|
|
||||||
- Added `markSetupComplete()` action
|
|
||||||
- Setup status persisted via Zustand persist middleware
|
|
||||||
|
|
||||||
#### `src/App.tsx`
|
|
||||||
- Added `useLocation` for route tracking
|
|
||||||
- Added redirect logic: if `setupComplete` is false, navigate to `/setup`
|
|
||||||
- Fixed `handleNavigate` callback signature for IPC events
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Setup Flow
|
|
||||||
```
|
|
||||||
Welcome -> Runtime -> Provider -> Channel -> Skills -> Complete
|
|
||||||
| | | | | |
|
|
||||||
v v v v v v
|
|
||||||
[Skip] [Check] [Validate] [Select] [Toggle] [Finish]
|
|
||||||
| | | | | |
|
|
||||||
+---------+----------+----------+----------+----------+
|
|
||||||
|
|
|
||||||
markSetupComplete()
|
|
||||||
|
|
|
||||||
Navigate to /
|
|
||||||
```
|
|
||||||
|
|
||||||
### Provider Types
|
|
||||||
- Anthropic (Claude) - API key starts with `sk-ant-`
|
|
||||||
- OpenAI (GPT) - API key starts with `sk-`
|
|
||||||
- Google (Gemini) - Length validation
|
|
||||||
- Ollama (Local) - No API key required
|
|
||||||
- Custom - Configurable base URL
|
|
||||||
|
|
||||||
### Channel Types
|
|
||||||
- WhatsApp - QR code connection
|
|
||||||
- Telegram - Bot token
|
|
||||||
- Discord - Bot token
|
|
||||||
- Slack - OAuth/Bot token
|
|
||||||
- WeChat - QR code connection
|
|
||||||
|
|
||||||
### Skill Bundles
|
|
||||||
- Productivity - Calendar, reminders, notes
|
|
||||||
- Developer - Code assistance, git operations
|
|
||||||
- Information - Web search, news, weather
|
|
||||||
- Entertainment - Music, games, trivia
|
|
||||||
|
|
||||||
## UI/UX Features
|
|
||||||
- Gradient background with glassmorphism cards
|
|
||||||
- Step progress dots with completion indicators
|
|
||||||
- Animated page transitions
|
|
||||||
- Back/Skip/Next navigation
|
|
||||||
- Toast notifications on completion
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha (incremental)
|
|
||||||
@@ -1,127 +0,0 @@
|
|||||||
# Commit 4: Provider Configuration
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Implement secure API key storage using Electron's safeStorage API and create a comprehensive provider management UI for configuring AI model providers.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### Electron Main Process
|
|
||||||
|
|
||||||
#### `electron/utils/secure-storage.ts` (New)
|
|
||||||
Secure storage utility using Electron's safeStorage:
|
|
||||||
- `isEncryptionAvailable()` - Check if system keychain is available
|
|
||||||
- `storeApiKey(providerId, apiKey)` - Encrypt and store API key
|
|
||||||
- `getApiKey(providerId)` - Decrypt and retrieve API key
|
|
||||||
- `deleteApiKey(providerId)` - Remove stored API key
|
|
||||||
- `hasApiKey(providerId)` - Check if key exists
|
|
||||||
- `listStoredKeyIds()` - List all stored provider IDs
|
|
||||||
|
|
||||||
Provider configuration management:
|
|
||||||
- `saveProvider(config)` - Save provider configuration
|
|
||||||
- `getProvider(providerId)` - Get single provider
|
|
||||||
- `getAllProviders()` - Get all providers
|
|
||||||
- `deleteProvider(providerId)` - Delete provider and key
|
|
||||||
- `setDefaultProvider(providerId)` - Set default provider
|
|
||||||
- `getDefaultProvider()` - Get default provider ID
|
|
||||||
- `getProviderWithKeyInfo(providerId)` - Get provider with masked key
|
|
||||||
- `getAllProvidersWithKeyInfo()` - Get all providers with key info
|
|
||||||
|
|
||||||
Note: Uses dynamic `import('electron-store')` for ESM compatibility.
|
|
||||||
|
|
||||||
#### `electron/main/ipc-handlers.ts`
|
|
||||||
New `registerProviderHandlers()` function with IPC handlers:
|
|
||||||
- `provider:encryptionAvailable`
|
|
||||||
- `provider:list` / `provider:get` / `provider:save` / `provider:delete`
|
|
||||||
- `provider:setApiKey` / `provider:deleteApiKey` / `provider:hasApiKey` / `provider:getApiKey`
|
|
||||||
- `provider:setDefault` / `provider:getDefault`
|
|
||||||
- `provider:validateKey` - Basic format validation
|
|
||||||
|
|
||||||
#### `electron/preload/index.ts`
|
|
||||||
Added all provider IPC channels to valid channels list.
|
|
||||||
|
|
||||||
### React Renderer
|
|
||||||
|
|
||||||
#### `src/stores/providers.ts` (New)
|
|
||||||
Zustand store for provider management:
|
|
||||||
- State: `providers`, `defaultProviderId`, `loading`, `error`
|
|
||||||
- Actions: `fetchProviders`, `addProvider`, `updateProvider`, `deleteProvider`
|
|
||||||
- Actions: `setApiKey`, `deleteApiKey`, `setDefaultProvider`, `validateApiKey`, `getApiKey`
|
|
||||||
|
|
||||||
#### `src/components/settings/ProvidersSettings.tsx` (New)
|
|
||||||
Provider management UI component:
|
|
||||||
- `ProvidersSettings` - Main component orchestrating provider list
|
|
||||||
- `ProviderCard` - Individual provider display with actions
|
|
||||||
- `AddProviderDialog` - Modal for adding new providers
|
|
||||||
|
|
||||||
Features:
|
|
||||||
- Provider type icons (Anthropic, OpenAI, Google, Ollama, Custom)
|
|
||||||
- Masked API key display (first 4 + last 4 characters)
|
|
||||||
- Set default provider
|
|
||||||
- Enable/disable providers
|
|
||||||
- Edit/delete functionality
|
|
||||||
- API key validation on add
|
|
||||||
|
|
||||||
#### `src/pages/Settings/index.tsx`
|
|
||||||
- Added AI Providers section with `ProvidersSettings` component
|
|
||||||
- Added `Key` icon import
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Security Architecture
|
|
||||||
```
|
|
||||||
Renderer Process Main Process
|
|
||||||
| |
|
|
||||||
| provider:setApiKey |
|
|
||||||
|--------------------------------->|
|
|
||||||
| | safeStorage.encryptString()
|
|
||||||
| | |
|
|
||||||
| | v
|
|
||||||
| | System Keychain
|
|
||||||
| | |
|
|
||||||
| | electron-store
|
|
||||||
| | (encrypted base64)
|
|
||||||
| |
|
|
||||||
| provider:getApiKey |
|
|
||||||
|--------------------------------->|
|
|
||||||
| | safeStorage.decryptString()
|
|
||||||
|<---------------------------------|
|
|
||||||
| (plaintext) |
|
|
||||||
```
|
|
||||||
|
|
||||||
### Provider Configuration Schema
|
|
||||||
```typescript
|
|
||||||
interface ProviderConfig {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
type: 'anthropic' | 'openai' | 'google' | 'ollama' | 'custom';
|
|
||||||
baseUrl?: string;
|
|
||||||
model?: string;
|
|
||||||
enabled: boolean;
|
|
||||||
createdAt: string;
|
|
||||||
updatedAt: string;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Key Validation Rules
|
|
||||||
- Anthropic: Must start with `sk-ant-`
|
|
||||||
- OpenAI: Must start with `sk-`
|
|
||||||
- Google: Minimum 20 characters
|
|
||||||
- Ollama: No key required
|
|
||||||
- Custom: No validation
|
|
||||||
|
|
||||||
### ESM Compatibility
|
|
||||||
electron-store v10+ is ESM-only. Solution: dynamic imports in main process.
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
let store: any = null;
|
|
||||||
async function getStore() {
|
|
||||||
if (!store) {
|
|
||||||
const Store = (await import('electron-store')).default;
|
|
||||||
store = new Store({ /* config */ });
|
|
||||||
}
|
|
||||||
return store;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha (incremental)
|
|
||||||
@@ -1,124 +0,0 @@
|
|||||||
# Commit 5: Channel Connection Flows
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Implement comprehensive channel management UI with multi-platform support, including QR code-based connection for WhatsApp/WeChat and token-based connection for Telegram/Discord/Slack.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### React Renderer
|
|
||||||
|
|
||||||
#### `src/pages/Channels/index.tsx`
|
|
||||||
Complete rewrite with enhanced functionality:
|
|
||||||
|
|
||||||
**Main Components:**
|
|
||||||
- `Channels` - Main page with channel list, stats, and add dialog
|
|
||||||
- `ChannelCard` - Individual channel display with connect/disconnect/delete
|
|
||||||
- `AddChannelDialog` - Multi-step channel addition flow
|
|
||||||
|
|
||||||
**Features:**
|
|
||||||
- Channel statistics (Total, Connected, Disconnected)
|
|
||||||
- Gateway status warning when not running
|
|
||||||
- Supported channel type grid for quick add
|
|
||||||
- Connection-type specific flows:
|
|
||||||
- QR Code: WhatsApp, WeChat
|
|
||||||
- Token: Telegram, Discord, Slack
|
|
||||||
|
|
||||||
**AddChannelDialog Flow:**
|
|
||||||
1. Select channel type
|
|
||||||
2. View connection instructions
|
|
||||||
3. For QR: Generate and display QR code
|
|
||||||
4. For Token: Enter bot token
|
|
||||||
5. Optionally name the channel
|
|
||||||
6. Confirm and add
|
|
||||||
|
|
||||||
**Channel Info Configuration:**
|
|
||||||
```typescript
|
|
||||||
const channelInfo: Record<ChannelType, {
|
|
||||||
description: string;
|
|
||||||
connectionType: 'qr' | 'token' | 'oauth';
|
|
||||||
instructions: string[];
|
|
||||||
tokenLabel?: string;
|
|
||||||
docsUrl?: string;
|
|
||||||
}>
|
|
||||||
```
|
|
||||||
|
|
||||||
#### `src/stores/channels.ts`
|
|
||||||
Enhanced channel store with new actions:
|
|
||||||
- `addChannel(params)` - Add new channel with type, name, token
|
|
||||||
- `deleteChannel(channelId)` - Remove channel
|
|
||||||
- `requestQrCode(channelType)` - Request QR code from Gateway
|
|
||||||
- `clearError()` - Clear error state
|
|
||||||
|
|
||||||
Improved error handling:
|
|
||||||
- Graceful fallback when Gateway unavailable
|
|
||||||
- Local channel creation for offline mode
|
|
||||||
|
|
||||||
#### `src/types/channel.ts`
|
|
||||||
No changes - existing types sufficient.
|
|
||||||
|
|
||||||
### Electron Main Process
|
|
||||||
|
|
||||||
#### `electron/utils/store.ts`
|
|
||||||
- Converted to dynamic imports for ESM compatibility
|
|
||||||
- All functions now async
|
|
||||||
|
|
||||||
#### `electron/main/window.ts`
|
|
||||||
- Converted to dynamic imports for ESM compatibility
|
|
||||||
- `getWindowState()` and `saveWindowState()` now async
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Channel Connection Architecture
|
|
||||||
```
|
|
||||||
AddChannelDialog
|
|
||||||
|
|
|
||||||
+-- QR Flow
|
|
||||||
| |
|
|
||||||
| v
|
|
||||||
| requestQrCode() --> Gateway --> WhatsApp/WeChat API
|
|
||||||
| | |
|
|
||||||
| v v
|
|
||||||
| Display QR <-- qrCode string <-- QR Generated
|
|
||||||
| |
|
|
||||||
| v
|
|
||||||
| User Scans --> Device Confirms --> channel:status event
|
|
||||||
|
|
|
||||||
+-- Token Flow
|
|
||||||
|
|
|
||||||
v
|
|
||||||
Enter Token --> addChannel() --> Gateway --> Bot API
|
|
||||||
| |
|
|
||||||
v v
|
|
||||||
Validate <-- success/error <-- Connection Attempt
|
|
||||||
```
|
|
||||||
|
|
||||||
### Channel Types Configuration
|
|
||||||
| Type | Connection | Token Label | Docs |
|
|
||||||
|------|------------|-------------|------|
|
|
||||||
| WhatsApp | QR Code | - | WhatsApp FAQ |
|
|
||||||
| Telegram | Token | Bot Token | BotFather Docs |
|
|
||||||
| Discord | Token | Bot Token | Developer Portal |
|
|
||||||
| Slack | Token | Bot Token (xoxb-) | Slack API |
|
|
||||||
| WeChat | QR Code | - | - |
|
|
||||||
|
|
||||||
### Connection Instructions
|
|
||||||
Each channel type provides step-by-step instructions:
|
|
||||||
- WhatsApp: Open app > Settings > Linked Devices > Scan
|
|
||||||
- Telegram: @BotFather > /newbot > Copy token
|
|
||||||
- Discord: Developer Portal > Application > Bot > Token
|
|
||||||
- Slack: API Apps > Create App > OAuth > Install
|
|
||||||
|
|
||||||
### UI Components Used
|
|
||||||
- `Card`, `Button`, `Input`, `Label` - Base components
|
|
||||||
- `Separator` - Visual dividers
|
|
||||||
- `StatusBadge` - Connection status
|
|
||||||
- `LoadingSpinner` - Loading states
|
|
||||||
- Lucide icons: Plus, Radio, RefreshCw, Power, QrCode, etc.
|
|
||||||
|
|
||||||
### Error Handling
|
|
||||||
- Gateway offline: Create local channel, show warning
|
|
||||||
- Connection failed: Display error on ChannelCard
|
|
||||||
- Invalid token: Show validation error in dialog
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha (incremental)
|
|
||||||
@@ -1,171 +0,0 @@
|
|||||||
# Commit 6: Auto-Update Functionality
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Integrate electron-updater for automatic application updates with a comprehensive UI for checking, downloading, and installing updates.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### Electron Main Process
|
|
||||||
|
|
||||||
#### `electron/main/updater.ts` (New)
|
|
||||||
Complete auto-update module:
|
|
||||||
|
|
||||||
**AppUpdater Class:**
|
|
||||||
- Extends EventEmitter for event-based notifications
|
|
||||||
- Configures electron-updater settings
|
|
||||||
- Manages update lifecycle
|
|
||||||
|
|
||||||
**Methods:**
|
|
||||||
- `setMainWindow(window)` - Set window for IPC
|
|
||||||
- `getStatus()` - Get current update status
|
|
||||||
- `checkForUpdates()` - Check for available updates
|
|
||||||
- `downloadUpdate()` - Download available update
|
|
||||||
- `quitAndInstall()` - Install update and restart
|
|
||||||
- `setChannel(channel)` - Set update channel (stable/beta/dev)
|
|
||||||
- `setAutoDownload(enable)` - Configure auto-download
|
|
||||||
- `getCurrentVersion()` - Get app version
|
|
||||||
|
|
||||||
**Update Status:**
|
|
||||||
- `idle` - No update activity
|
|
||||||
- `checking` - Checking for updates
|
|
||||||
- `available` - Update available
|
|
||||||
- `not-available` - Already on latest
|
|
||||||
- `downloading` - Download in progress
|
|
||||||
- `downloaded` - Ready to install
|
|
||||||
- `error` - Update failed
|
|
||||||
|
|
||||||
**IPC Handlers (registerUpdateHandlers):**
|
|
||||||
- `update:status` - Get current status
|
|
||||||
- `update:version` - Get app version
|
|
||||||
- `update:check` - Trigger update check
|
|
||||||
- `update:download` - Start download
|
|
||||||
- `update:install` - Install and restart
|
|
||||||
- `update:setChannel` - Change update channel
|
|
||||||
- `update:setAutoDownload` - Toggle auto-download
|
|
||||||
|
|
||||||
**Events forwarded to renderer:**
|
|
||||||
- `update:status-changed`
|
|
||||||
- `update:checking`
|
|
||||||
- `update:available`
|
|
||||||
- `update:not-available`
|
|
||||||
- `update:progress`
|
|
||||||
- `update:downloaded`
|
|
||||||
- `update:error`
|
|
||||||
|
|
||||||
#### `electron/main/index.ts`
|
|
||||||
- Import and register update handlers
|
|
||||||
- Auto-check for updates in production (10s delay)
|
|
||||||
|
|
||||||
#### `electron/preload/index.ts`
|
|
||||||
- Added all update IPC channels
|
|
||||||
|
|
||||||
### React Renderer
|
|
||||||
|
|
||||||
#### `src/stores/update.ts` (New)
|
|
||||||
Zustand store for update state:
|
|
||||||
- State: `status`, `currentVersion`, `updateInfo`, `progress`, `error`, `isInitialized`
|
|
||||||
- Actions: `init`, `checkForUpdates`, `downloadUpdate`, `installUpdate`, `setChannel`, `setAutoDownload`, `clearError`
|
|
||||||
- Listens for all update events from main process
|
|
||||||
|
|
||||||
#### `src/components/settings/UpdateSettings.tsx` (New)
|
|
||||||
Update UI component:
|
|
||||||
- Current version display
|
|
||||||
- Status indicator with icon
|
|
||||||
- Status text description
|
|
||||||
- Action buttons (Check/Download/Install/Retry)
|
|
||||||
- Download progress bar with transfer stats
|
|
||||||
- Update info card (version, date, release notes)
|
|
||||||
- Error details display
|
|
||||||
|
|
||||||
**Progress Display:**
|
|
||||||
- Transferred / Total bytes
|
|
||||||
- Transfer speed (bytes/second)
|
|
||||||
- Progress percentage bar
|
|
||||||
|
|
||||||
#### `src/components/ui/progress.tsx` (New)
|
|
||||||
Radix UI Progress component for download visualization.
|
|
||||||
|
|
||||||
#### `src/pages/Settings/index.tsx`
|
|
||||||
- Replaced manual update section with `UpdateSettings` component
|
|
||||||
- Added `useUpdateStore` for version display
|
|
||||||
- Removed unused state and effect hooks
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Update Flow
|
|
||||||
```
|
|
||||||
App Start (Production)
|
|
||||||
|
|
|
||||||
v
|
|
||||||
10s Delay
|
|
||||||
|
|
|
||||||
v
|
|
||||||
checkForUpdates()
|
|
||||||
|
|
|
||||||
+-- No Update --> status: 'not-available'
|
|
||||||
|
|
|
||||||
+-- Update Found --> status: 'available'
|
|
||||||
|
|
|
||||||
v
|
|
||||||
[User Action]
|
|
||||||
|
|
|
||||||
v
|
|
||||||
downloadUpdate()
|
|
||||||
|
|
|
||||||
v
|
|
||||||
status: 'downloading'
|
|
||||||
progress events
|
|
||||||
|
|
|
||||||
v
|
|
||||||
status: 'downloaded'
|
|
||||||
|
|
|
||||||
v
|
|
||||||
[User Action]
|
|
||||||
|
|
|
||||||
v
|
|
||||||
quitAndInstall()
|
|
||||||
|
|
|
||||||
v
|
|
||||||
App Restarts
|
|
||||||
```
|
|
||||||
|
|
||||||
### electron-updater Configuration
|
|
||||||
```typescript
|
|
||||||
autoUpdater.autoDownload = false; // Manual download trigger
|
|
||||||
autoUpdater.autoInstallOnAppQuit = true; // Install on quit
|
|
||||||
autoUpdater.logger = customLogger; // Console logging
|
|
||||||
```
|
|
||||||
|
|
||||||
### Update Channels
|
|
||||||
- `stable` - Production releases
|
|
||||||
- `beta` - Pre-release testing
|
|
||||||
- `dev` - Development builds
|
|
||||||
|
|
||||||
### Progress Info Interface
|
|
||||||
```typescript
|
|
||||||
interface ProgressInfo {
|
|
||||||
total: number; // Total bytes
|
|
||||||
delta: number; // Bytes since last event
|
|
||||||
transferred: number; // Bytes downloaded
|
|
||||||
percent: number; // 0-100
|
|
||||||
bytesPerSecond: number; // Transfer speed
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### UI States
|
|
||||||
| Status | Icon | Action Button |
|
|
||||||
|--------|------|---------------|
|
|
||||||
| idle | RefreshCw (gray) | Check for Updates |
|
|
||||||
| checking | Loader2 (spin, blue) | Checking... (disabled) |
|
|
||||||
| available | Download (green) | Download Update |
|
|
||||||
| downloading | Download (pulse, blue) | Downloading... (disabled) |
|
|
||||||
| downloaded | CheckCircle2 (green) | Install & Restart |
|
|
||||||
| error | AlertCircle (red) | Retry |
|
|
||||||
| not-available | CheckCircle2 (green) | Check for Updates |
|
|
||||||
|
|
||||||
## Dependencies
|
|
||||||
- electron-updater ^6.3.9 (already installed)
|
|
||||||
- @radix-ui/react-progress ^1.1.1 (already installed)
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha (incremental)
|
|
||||||
@@ -1,185 +0,0 @@
|
|||||||
# Commit 7: Packaging and Distribution
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Set up comprehensive packaging and distribution infrastructure including CI/CD workflows, multi-platform build configuration, icon generation, and macOS code signing support.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### GitHub Actions Workflows
|
|
||||||
|
|
||||||
#### `.github/workflows/ci.yml` (New)
|
|
||||||
Continuous Integration workflow for PRs and main branch:
|
|
||||||
- **lint**: ESLint validation
|
|
||||||
- **typecheck**: TypeScript type checking
|
|
||||||
- **test**: Unit test execution
|
|
||||||
- **build**: Multi-platform build verification (macOS, Windows, Linux)
|
|
||||||
|
|
||||||
#### `.github/workflows/release.yml` (New)
|
|
||||||
Release workflow triggered by version tags:
|
|
||||||
- Matrix builds for all platforms
|
|
||||||
- Artifact collection and upload
|
|
||||||
- GitHub Release creation with auto-generated notes
|
|
||||||
- Pre-release detection for alpha/beta versions
|
|
||||||
|
|
||||||
### Build Configuration
|
|
||||||
|
|
||||||
#### `electron-builder.yml`
|
|
||||||
Enhanced configuration:
|
|
||||||
- Artifact naming with version, OS, and arch
|
|
||||||
- ASAR packaging with native module unpacking
|
|
||||||
- macOS: Universal binary, notarization ready, extended info
|
|
||||||
- Windows: NSIS installer with customization
|
|
||||||
- Linux: AppImage, DEB, RPM targets with dependencies
|
|
||||||
|
|
||||||
New features:
|
|
||||||
- `artifactName` template for consistent naming
|
|
||||||
- `asarUnpack` for native modules
|
|
||||||
- macOS `extendInfo` for privacy permissions
|
|
||||||
- DMG background and icon configuration
|
|
||||||
- Linux desktop entry with keywords
|
|
||||||
|
|
||||||
#### `package.json`
|
|
||||||
New scripts:
|
|
||||||
- `icons`: Generate icons from SVG source
|
|
||||||
- `clean`: Remove build artifacts
|
|
||||||
- `package:mac:universal`: Build universal macOS binary
|
|
||||||
- `publish`: Build and publish to GitHub
|
|
||||||
- `publish:mac/win/linux`: Platform-specific publishing
|
|
||||||
- `release`: Full release workflow
|
|
||||||
|
|
||||||
### Icon Generation
|
|
||||||
|
|
||||||
#### `resources/icons/icon.svg` (New)
|
|
||||||
Vector source icon:
|
|
||||||
- Gradient background (#6366f1 to #8b5cf6)
|
|
||||||
- White claw symbol with "X" accent
|
|
||||||
- 200px corner radius on 1024px canvas
|
|
||||||
|
|
||||||
#### `scripts/generate-icons.sh` (New)
|
|
||||||
Icon generation script:
|
|
||||||
- Generates PNG at multiple sizes (16-1024px)
|
|
||||||
- Creates macOS `.icns` via iconutil
|
|
||||||
- Creates Windows `.ico` via ImageMagick
|
|
||||||
- Creates Linux PNG set
|
|
||||||
|
|
||||||
#### `resources/icons/README.md` (New)
|
|
||||||
Documentation for icon requirements and generation.
|
|
||||||
|
|
||||||
### macOS Signing
|
|
||||||
|
|
||||||
#### `entitlements.mac.plist` (New)
|
|
||||||
macOS entitlements for:
|
|
||||||
- Unsigned executable memory (V8)
|
|
||||||
- JIT compilation
|
|
||||||
- Library validation disable
|
|
||||||
- Network client access
|
|
||||||
- Child process spawning (Gateway)
|
|
||||||
- File access permissions
|
|
||||||
|
|
||||||
### Linux Packaging
|
|
||||||
|
|
||||||
#### `scripts/linux/after-install.sh` (New)
|
|
||||||
Post-installation script:
|
|
||||||
- Update desktop database
|
|
||||||
- Update icon cache
|
|
||||||
- Create CLI symlink
|
|
||||||
|
|
||||||
#### `scripts/linux/after-remove.sh` (New)
|
|
||||||
Post-removal script:
|
|
||||||
- Remove CLI symlink
|
|
||||||
- Update databases
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Build Matrix
|
|
||||||
|
|
||||||
| Platform | Target | Architecture | Format |
|
|
||||||
|----------|--------|--------------|--------|
|
|
||||||
| macOS | dmg, zip | universal | Intel + Apple Silicon |
|
|
||||||
| Windows | nsis | x64, arm64 | .exe installer |
|
|
||||||
| Linux | AppImage | x64, arm64 | Portable |
|
|
||||||
| Linux | deb | x64, arm64 | Debian package |
|
|
||||||
| Linux | rpm | x64 | Red Hat package |
|
|
||||||
|
|
||||||
### Artifact Naming Convention
|
|
||||||
```
|
|
||||||
${productName}-${version}-${os}-${arch}.${ext}
|
|
||||||
Example: ClawX-1.0.0-mac-universal.dmg
|
|
||||||
```
|
|
||||||
|
|
||||||
### Code Signing (Optional)
|
|
||||||
|
|
||||||
**macOS:**
|
|
||||||
```yaml
|
|
||||||
env:
|
|
||||||
CSC_LINK: ${{ secrets.MAC_CERTS }}
|
|
||||||
CSC_KEY_PASSWORD: ${{ secrets.MAC_CERTS_PASSWORD }}
|
|
||||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
|
||||||
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
|
|
||||||
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Windows:**
|
|
||||||
```yaml
|
|
||||||
env:
|
|
||||||
CSC_LINK: ${{ secrets.WIN_CERTS }}
|
|
||||||
CSC_KEY_PASSWORD: ${{ secrets.WIN_CERTS_PASSWORD }}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Release Process
|
|
||||||
|
|
||||||
1. Update version in `package.json`
|
|
||||||
2. Commit and push changes
|
|
||||||
3. Create and push version tag: `git tag v1.0.0 && git push --tags`
|
|
||||||
4. GitHub Actions builds all platforms
|
|
||||||
5. Artifacts uploaded to GitHub Release
|
|
||||||
6. Users receive update notification via electron-updater
|
|
||||||
|
|
||||||
### CI Pipeline
|
|
||||||
|
|
||||||
```
|
|
||||||
Push/PR to main
|
|
||||||
|
|
|
||||||
v
|
|
||||||
┌────────────────┐
|
|
||||||
│ lint │
|
|
||||||
│ typecheck │──> Parallel
|
|
||||||
│ test │
|
|
||||||
│ build │
|
|
||||||
└────────────────┘
|
|
||||||
|
|
|
||||||
v
|
|
||||||
All Pass?
|
|
||||||
|
|
|
||||||
┌───┴───┐
|
|
||||||
No Yes
|
|
||||||
| |
|
|
||||||
v v
|
|
||||||
Fail Merge OK
|
|
||||||
```
|
|
||||||
|
|
||||||
### Release Pipeline
|
|
||||||
|
|
||||||
```
|
|
||||||
Push tag v*
|
|
||||||
|
|
|
||||||
v
|
|
||||||
┌─────────────────────────────┐
|
|
||||||
│ Build (Matrix) │
|
|
||||||
│ ┌─────┬──────┬──────────┐ │
|
|
||||||
│ │ mac │ win │ linux │ │
|
|
||||||
│ └─────┴──────┴──────────┘ │
|
|
||||||
└─────────────────────────────┘
|
|
||||||
|
|
|
||||||
v
|
|
||||||
Upload Artifacts
|
|
||||||
|
|
|
||||||
v
|
|
||||||
Create GitHub Release
|
|
||||||
|
|
|
||||||
v
|
|
||||||
Auto-update available
|
|
||||||
```
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha (incremental)
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
# Commit 8: Chat Interface
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Enhance the chat interface with markdown rendering, typing indicators, welcome screen, and improved user experience for conversations with the AI assistant.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### React Renderer
|
|
||||||
|
|
||||||
#### `src/pages/Chat/index.tsx`
|
|
||||||
Complete rewrite with enhanced features:
|
|
||||||
|
|
||||||
**New Components:**
|
|
||||||
- `ChatMessage` - Individual message with markdown support
|
|
||||||
- `TypingIndicator` - Animated dots during AI response
|
|
||||||
- `WelcomeScreen` - Onboarding screen for new users
|
|
||||||
|
|
||||||
**Features:**
|
|
||||||
- Markdown rendering with react-markdown and remark-gfm
|
|
||||||
- Code syntax highlighting with copy button
|
|
||||||
- Auto-resizing textarea input
|
|
||||||
- Gateway connection status awareness
|
|
||||||
- Tool call status badges
|
|
||||||
- Copy message content button
|
|
||||||
- Shift+Enter for new lines
|
|
||||||
|
|
||||||
**UI Improvements:**
|
|
||||||
- Gradient avatar for AI assistant
|
|
||||||
- Rounded message bubbles
|
|
||||||
- Hover actions (copy, etc.)
|
|
||||||
- Responsive prose styling
|
|
||||||
- Custom code block display
|
|
||||||
|
|
||||||
#### `src/components/ui/textarea.tsx` (New)
|
|
||||||
Textarea component based on shadcn/ui:
|
|
||||||
- Auto-resize support
|
|
||||||
- Focus ring styling
|
|
||||||
- Disabled state
|
|
||||||
|
|
||||||
#### `src/styles/globals.css`
|
|
||||||
Added prose styling:
|
|
||||||
- Markdown list formatting
|
|
||||||
- Blockquote styling
|
|
||||||
- Table formatting
|
|
||||||
- Code block margins
|
|
||||||
- Typing indicator animation
|
|
||||||
|
|
||||||
### Dependencies
|
|
||||||
|
|
||||||
#### `package.json`
|
|
||||||
New dependencies:
|
|
||||||
- `react-markdown@10.1.0` - Markdown rendering
|
|
||||||
- `remark-gfm@4.0.1` - GitHub Flavored Markdown support
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Message Rendering Flow
|
|
||||||
|
|
||||||
```
|
|
||||||
Message Content
|
|
||||||
|
|
|
||||||
v
|
|
||||||
Is User?
|
|
||||||
|
|
|
||||||
┌───┴───┐
|
|
||||||
Yes No
|
|
||||||
| |
|
|
||||||
v v
|
|
||||||
Plain ReactMarkdown
|
|
||||||
Text |
|
|
||||||
v
|
|
||||||
remark-gfm
|
|
||||||
|
|
|
||||||
v
|
|
||||||
Custom Components
|
|
||||||
(code, links, etc.)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Markdown Components
|
|
||||||
|
|
||||||
| Element | Custom Handling |
|
|
||||||
|---------|----------------|
|
|
||||||
| `code` | Inline vs block detection, syntax highlighting label, copy button |
|
|
||||||
| `a` | External link (new tab), primary color styling |
|
|
||||||
| `pre` | Background styling, overflow scroll |
|
|
||||||
| Lists | Proper indentation and spacing |
|
|
||||||
| Tables | Border collapse, header background |
|
|
||||||
| Blockquotes | Left border, muted color |
|
|
||||||
|
|
||||||
### Typing Indicator Animation
|
|
||||||
|
|
||||||
```css
|
|
||||||
@keyframes bounce {
|
|
||||||
0%, 60%, 100% { transform: translateY(0); }
|
|
||||||
30% { transform: translateY(-4px); }
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Staggered delay for dots */
|
|
||||||
.dot-1 { animation-delay: 0ms; }
|
|
||||||
.dot-2 { animation-delay: 150ms; }
|
|
||||||
.dot-3 { animation-delay: 300ms; }
|
|
||||||
```
|
|
||||||
|
|
||||||
### Input Handling
|
|
||||||
|
|
||||||
**Key Combinations:**
|
|
||||||
- `Enter` - Send message
|
|
||||||
- `Shift+Enter` - New line
|
|
||||||
- Auto-resize up to 200px max height
|
|
||||||
|
|
||||||
**State Management:**
|
|
||||||
- Textarea value tracked in local state
|
|
||||||
- Height recalculated on content change
|
|
||||||
- Focus maintained after send
|
|
||||||
|
|
||||||
### Gateway Integration
|
|
||||||
|
|
||||||
**Connection Awareness:**
|
|
||||||
- Warning banner when Gateway offline
|
|
||||||
- Input disabled without connection
|
|
||||||
- Fetch history only when connected
|
|
||||||
- Error display for failed messages
|
|
||||||
|
|
||||||
### Welcome Screen Features
|
|
||||||
|
|
||||||
Quick start cards showing:
|
|
||||||
- "Ask Questions" - General Q&A capability
|
|
||||||
- "Creative Tasks" - Writing and brainstorming
|
|
||||||
|
|
||||||
Gradient branding with ClawX logo.
|
|
||||||
|
|
||||||
## UI/UX Considerations
|
|
||||||
|
|
||||||
1. **Message Alignment**: User messages right-aligned, AI left-aligned
|
|
||||||
2. **Avatar Design**: Gradient for AI, solid for user
|
|
||||||
3. **Hover Actions**: Progressive disclosure of copy buttons
|
|
||||||
4. **Feedback**: Toast on code copy, visual state for copied
|
|
||||||
5. **Loading States**: Typing indicator during AI response
|
|
||||||
6. **Error Handling**: Inline error display with icon
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha (incremental)
|
|
||||||
@@ -1,153 +0,0 @@
|
|||||||
# Commit 9: Skills Browser
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
Enhance the Skills page with skill bundles, category filtering, detail dialogs, and improved user experience for managing AI capabilities.
|
|
||||||
|
|
||||||
## Changes
|
|
||||||
|
|
||||||
### React Renderer
|
|
||||||
|
|
||||||
#### `src/pages/Skills/index.tsx`
|
|
||||||
Complete rewrite with enhanced features:
|
|
||||||
|
|
||||||
**New Components:**
|
|
||||||
- `SkillDetailDialog` - Modal showing skill details, dependencies, and configuration
|
|
||||||
- `BundleCard` - Skill bundle display with enable/disable actions
|
|
||||||
|
|
||||||
**Features:**
|
|
||||||
- Tabbed interface: "All Skills" and "Bundles"
|
|
||||||
- Category filtering with skill counts
|
|
||||||
- Search functionality
|
|
||||||
- Gateway connection status awareness
|
|
||||||
- Skill bundles with batch enable/disable
|
|
||||||
- Skill detail dialog with metadata
|
|
||||||
- Configuration indicator badges
|
|
||||||
- Toast notifications on skill toggle
|
|
||||||
|
|
||||||
**UI Improvements:**
|
|
||||||
- Category icons for visual distinction
|
|
||||||
- Enabled state highlighting (border and background)
|
|
||||||
- Hover states for cards
|
|
||||||
- Recommended bundle badges
|
|
||||||
- Statistics bar with counts
|
|
||||||
|
|
||||||
#### `src/components/ui/tabs.tsx` (New)
|
|
||||||
Tabs component based on shadcn/ui and Radix Tabs:
|
|
||||||
- `Tabs` - Root container
|
|
||||||
- `TabsList` - Tab navigation bar
|
|
||||||
- `TabsTrigger` - Individual tab button
|
|
||||||
- `TabsContent` - Tab panel content
|
|
||||||
|
|
||||||
### Data Structures
|
|
||||||
|
|
||||||
#### Skill Bundles
|
|
||||||
Predefined bundles:
|
|
||||||
- **Productivity Pack** - Calendar, reminders, notes, tasks, timer
|
|
||||||
- **Developer Tools** - Code assist, git ops, docs lookup
|
|
||||||
- **Information Hub** - Web search, news, weather, translate
|
|
||||||
- **Smart Home** - Lights, thermostat, security cam, routines
|
|
||||||
|
|
||||||
## Technical Details
|
|
||||||
|
|
||||||
### Component Architecture
|
|
||||||
|
|
||||||
```
|
|
||||||
Skills Page
|
|
||||||
|
|
|
||||||
+-- TabsList
|
|
||||||
| |
|
|
||||||
| +-- "All Skills" Tab
|
|
||||||
| +-- "Bundles" Tab
|
|
||||||
|
|
|
||||||
+-- TabsContent: All Skills
|
|
||||||
| |
|
|
||||||
| +-- Search/Filter Bar
|
|
||||||
| +-- Category Buttons
|
|
||||||
| +-- Skills Grid
|
|
||||||
| |
|
|
||||||
| +-- SkillCard (click -> SkillDetailDialog)
|
|
||||||
|
|
|
||||||
+-- TabsContent: Bundles
|
|
||||||
| |
|
|
||||||
| +-- BundleCard Grid
|
|
||||||
|
|
|
||||||
+-- Statistics Bar
|
|
||||||
|
|
|
||||||
+-- SkillDetailDialog (modal)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Category Configuration
|
|
||||||
|
|
||||||
| Category | Icon | Label |
|
|
||||||
|----------|------|-------|
|
|
||||||
| productivity | 📋 | Productivity |
|
|
||||||
| developer | 💻 | Developer |
|
|
||||||
| smart-home | 🏠 | Smart Home |
|
|
||||||
| media | 🎬 | Media |
|
|
||||||
| communication | 💬 | Communication |
|
|
||||||
| security | 🔒 | Security |
|
|
||||||
| information | 📰 | Information |
|
|
||||||
| utility | 🔧 | Utility |
|
|
||||||
| custom | ⚡ | Custom |
|
|
||||||
|
|
||||||
### Bundle Operations
|
|
||||||
|
|
||||||
**Enable Bundle:**
|
|
||||||
```typescript
|
|
||||||
for (const skill of bundleSkills) {
|
|
||||||
if (!skill.enabled) {
|
|
||||||
await enableSkill(skill.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Disable Bundle:**
|
|
||||||
```typescript
|
|
||||||
for (const skill of bundleSkills) {
|
|
||||||
if (!skill.isCore) {
|
|
||||||
await disableSkill(skill.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### State Management
|
|
||||||
|
|
||||||
**Local State:**
|
|
||||||
- `searchQuery` - Search input value
|
|
||||||
- `selectedCategory` - Active category filter
|
|
||||||
- `selectedSkill` - Skill for detail dialog
|
|
||||||
- `activeTab` - Current tab ("all" | "bundles")
|
|
||||||
|
|
||||||
**Store Integration:**
|
|
||||||
- `useSkillsStore` - Skills data and actions
|
|
||||||
- `useGatewayStore` - Connection status
|
|
||||||
|
|
||||||
### Filtering Logic
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const filteredSkills = skills.filter((skill) => {
|
|
||||||
const matchesSearch =
|
|
||||||
skill.name.toLowerCase().includes(searchQuery) ||
|
|
||||||
skill.description.toLowerCase().includes(searchQuery);
|
|
||||||
const matchesCategory =
|
|
||||||
selectedCategory === 'all' ||
|
|
||||||
skill.category === selectedCategory;
|
|
||||||
return matchesSearch && matchesCategory;
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### UI States
|
|
||||||
|
|
||||||
**Skill Card:**
|
|
||||||
- Default: Standard border, white background
|
|
||||||
- Enabled: Primary border (50% opacity), primary background (5% opacity)
|
|
||||||
- Hover: Primary border (50% opacity)
|
|
||||||
- Core: Lock icon, switch disabled
|
|
||||||
|
|
||||||
**Bundle Card:**
|
|
||||||
- Default: Standard styling
|
|
||||||
- All Enabled: Primary border, primary background
|
|
||||||
- Recommended: Amber badge with sparkle icon
|
|
||||||
|
|
||||||
## Version
|
|
||||||
v0.1.0-alpha (incremental)
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
# ClawX Build Process
|
|
||||||
|
|
||||||
## Progress
|
|
||||||
|
|
||||||
### Before:
|
|
||||||
* add `ClawX-项目架构与版本大纲.md`
|
|
||||||
|
|
||||||
### Completed:
|
|
||||||
* [commit_1] Project skeleton - Electron + React + TypeScript foundation (v0.1.0-alpha)
|
|
||||||
* [commit_2] Gateway refinements - Auto-reconnection, health checks, better state management
|
|
||||||
* [commit_3] Setup wizard - Multi-step onboarding flow with provider, channel, skill selection
|
|
||||||
* [commit_4] Provider configuration - Secure API key storage, provider management UI
|
|
||||||
* [commit_5] Channel connection flows - Multi-channel support with QR/token connection UI
|
|
||||||
* [commit_6] Auto-update functionality - electron-updater integration with UI
|
|
||||||
* [commit_7] Packaging and distribution - CI/CD, multi-platform builds, icon generation
|
|
||||||
* [commit_8] Chat interface - Markdown support, typing indicator, welcome screen
|
|
||||||
* [commit_9] Skills browser - Bundles, categories, detail dialog
|
|
||||||
* [commit_10] Cron tasks - Create/edit dialog, schedule presets, improved UI
|
|
||||||
* [commit_11] OpenClaw submodule fix - GitHub URL, auto-generated token, WebSocket auth
|
|
||||||
* [commit_12] Real API key validation - OpenRouter support, actual API calls to verify keys
|
|
||||||
* [commit_13] Remove channel setup step - Simplified onboarding, channels moved to Settings
|
|
||||||
* [commit_14] Auto-install skills step - Replace skill selection with auto-installation progress UI
|
|
||||||
* [commit_15] Fix Gateway WebSocket handshake - Implement proper OpenClaw protocol
|
|
||||||
* [commit_16] Fix RPC methods - Align stores with OpenClaw protocol (channels.status, skills.status, chat params)
|
|
||||||
* [commit_17] API key integration + Control UI chat - Write keys to OpenClaw auth-profiles, embed Control UI
|
|
||||||
|
|
||||||
### Plan:
|
|
||||||
1. ~~Initialize project structure~~ ✅
|
|
||||||
2. ~~Add Gateway process management refinements~~ ✅
|
|
||||||
3. ~~Implement Setup wizard with actual functionality~~ ✅
|
|
||||||
4. ~~Add Provider configuration (API Key management)~~ ✅
|
|
||||||
5. ~~Implement Channel connection flows~~ ✅
|
|
||||||
6. ~~Add auto-update functionality~~ ✅
|
|
||||||
7. ~~Packaging and distribution setup~~ ✅
|
|
||||||
8. ~~Chat interface~~ ✅
|
|
||||||
9. ~~Skills browser/enable page~~ ✅
|
|
||||||
10. ~~Cron tasks management~~ ✅
|
|
||||||
|
|
||||||
## Summary
|
|
||||||
|
|
||||||
All core features have been implemented:
|
|
||||||
- Project skeleton with Electron + React + TypeScript
|
|
||||||
- Gateway process management with auto-reconnection
|
|
||||||
- Setup wizard for first-run experience
|
|
||||||
- Provider configuration with secure API key storage
|
|
||||||
- Channel connection flows (QR code and token)
|
|
||||||
- Auto-update functionality with electron-updater
|
|
||||||
- Multi-platform packaging and CI/CD
|
|
||||||
- Chat interface with markdown support
|
|
||||||
- Skills browser with bundles
|
|
||||||
- Cron tasks management for scheduled automation
|
|
||||||
- OpenClaw submodule from official GitHub (v2026.2.3) with auto-token auth
|
|
||||||
- Real API key validation via actual API calls (Anthropic, OpenAI, Google, OpenRouter)
|
|
||||||
- Simplified setup wizard (channel connection deferred to Settings page)
|
|
||||||
- Auto-install skills step with real-time progress UI (no manual skill selection)
|
|
||||||
- Fixed Gateway WebSocket connection with proper OpenClaw handshake protocol
|
|
||||||
- Aligned RPC store methods with OpenClaw protocol (channels.status, skills.status, chat params)
|
|
||||||
- API key integration: write keys to ~/.openclaw/agents/main/agent/auth-profiles.json
|
|
||||||
- Embedded OpenClaw Control UI for chat via webview (replacing custom implementation)
|
|
||||||
|
|
||||||
## Version Milestones
|
|
||||||
|
|
||||||
| Version | Status | Description |
|
|
||||||
|---------|--------|-------------|
|
|
||||||
| v0.1.0-alpha | ✅ Done | Core architecture, basic UI framework |
|
|
||||||
| v0.5.0-beta | Pending | Setup wizard MVP, Node.js installer |
|
|
||||||
| v1.0.0 | Pending | Production ready, all core features |
|
|
||||||
Reference in New Issue
Block a user