64 Commits

Author SHA1 Message Date
Your Name
344ef9d001 haha 2026-02-20 20:07:14 +08:00
Your Name
320c84125e haha 2026-02-20 20:03:09 +08:00
zhixian
97a4b1ae12 chore: add Google Analytics to landing page
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-20 10:56:45 +09:00
zhixian
695597690c fix: update landing page nav height, discord link, replace Download with @zhixianio
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-20 09:24:21 +09:00
zhixian
ffcdcd22b2 feat: move Check for Updates to Settings, add sidebar links, customize title
- Move ClawPal self-update from Home page and sidebar to Settings page
  as a "Current Version" card showing version + check/update button
- Set window title to "ClawPal by zhixian"
- Add Website · @zhixian links at bottom of sidebar

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 22:34:52 +09:00
zhixian
7138e97e87 feat: remote rollback support, fix analyze sessions, set app product name
- Add remote_preview_rollback and remote_rollback Tauri commands
- Enable rollback UI for remote instances in History page
- Fix remote_analyze_sessions SSH script: JSON-escape agent/session names,
  fix comma logic, improve grep error resilience
- Set productName to "ClawPal" in tauri.conf.json (was defaulting to lowercase)

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 21:11:00 +09:00
zhixian
d6f7bad09c chore: bump version to 0.1.3
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 20:21:58 +09:00
zhixian
fdbfe0936f feat: per-agent model switching on Home page, fix recipe persona pre-fill
- Add per-agent model Select dropdown in Home page agent cards
- Register set_agent_model command and add remote_set_agent_model for SSH
- Add setAgentModel/remoteSetAgentModel API bindings
- Fix set_agent_model_value to preserve object model format (update primary)
- Pre-populate recipe textarea fields from existing config values (Cook.tsx)

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 20:21:21 +09:00
zhixian
66c259fffb chore: bump version to 0.1.2
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 20:00:46 +09:00
zhixian
8747d5bf21 fix: app update check in all modes, add Check for Updates menu, clean upgrade output
- App self-update check no longer skipped in remote mode
- Added "Check for Updates" button in sidebar
- Strip ANSI escape codes from upgrade output
- Collapse upgrade log behind "Show details" on success
- Updated Discord link and added icons to landing page buttons
- Recorded deployment docs in agents.md

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 19:59:35 +09:00
zhixian
e26b53a910 feat: add Join Discord button to landing page
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 19:13:31 +09:00
zhixian
fc58e64342 chore: bump version to 0.1.1
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 19:07:30 +09:00
zhixian
92e1b7e4c8 feat: add remote backup support (create, list, restore, delete)
Remote instances now get the same backup experience as local:
- 4 new SSH-based Rust commands for remote backup operations
- UpgradeDialog always runs backup step for both local and remote
- Home page Backups section visible and functional for remote instances
- Show button hidden for remote (no local path to open)

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 19:03:20 +09:00
zhixian
b7799627ea feat: in-app OpenClaw upgrade dialog with backup flow
Replace the old "Backup & Upgrade" button (which opened GitHub releases)
with a proper multi-step upgrade dialog: confirm → backup → run upgrade
command → done. Works for both local and remote (SSH) instances.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 17:47:59 +09:00
zhixian
bed34f9d69 fix: chat scroll, add sidebar logo, WSL2 docs
- Fix chat panel not scrolling by adding overflow-hidden to ScrollArea
- Add 36x36 app logo next to "ClawPal" title in sidebar
- Add WSL2 SSH setup guide to README

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 16:01:05 +09:00
zhixian
e7eb99380e Delete CNAME 2026-02-19 14:09:58 +08:00
zhixian
4a1f0bd317 Create CNAME 2026-02-19 14:06:00 +08:00
zhixian
ac9c1647f7 feat: add in-app auto-update via Tauri updater plugin
Integrates tauri-plugin-updater and tauri-plugin-process to enable
ClawPal self-updates. The Home page now checks for app updates and
shows a download progress bar with an "Update & Restart" button.
CI workflow wired to sign release artifacts with TAURI_SIGNING_PRIVATE_KEY.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 14:47:16 +09:00
zhixian
11fab41b86 feat: macOS code signing, SSH auth fixes, UX improvements
- Configure macOS code signing + notarization in CI (certificate import,
  API key, cleanup steps)
- Set signingIdentity in tauri.conf.json for local builds
- Fix SSH auth: try default key paths (id_ed25519, id_rsa, id_ecdsa)
  before falling back to agent, matching OpenSSH behavior
- Fix SSH agent in GUI apps: fall back to launchctl getenv when
  SSH_AUTH_SOCK is not set
- Show SSH connection errors via toast instead of silent console.error
- Error toasts persist until manually dismissed
- Add loading indicators for Discord channels, model profiles, and
  update checks
- Fix update check: query npm registry via HTTP instead of local npm CLI
- Hide Windows console window in release builds
- Upload portable Windows exe in CI release workflow

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 14:31:48 +09:00
zhixian
77994cab6b fix: gate SSH agent auth behind #[cfg(unix)] for Windows compat
AgentClient::connect_env() uses Unix domain sockets and is unavailable
on Windows. Add a #[cfg(not(unix))] stub that returns an error message.

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 11:47:26 +09:00
zhixian
9717a64310 feat: add cross-platform release pipeline and app icons
- Update tauri.conf.json with multi-platform bundle config (macOS unsigned, Windows unsigned)
- Add app icon (1024x1024 source) and generate all required sizes (png, icns, ico)
- Add generate-icons.sh script for regenerating icons from source PNG
- Add GitHub Actions release workflow for 4-target parallel builds (macOS ARM/x64, Linux, Windows)
- Simplify release.sh with tag-based publish instructions

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 11:27:13 +09:00
zhixian
3b0a776a9f fix: comprehensive remote/local parity review fixes
- Add RemoteSystemStatus & Binding types for type safety (no more unsafe casts)
- Add dedicated password field to SshHost (was reusing keyPath)
- Fix remote_read_raw_config to return String instead of parsed JSON Value
- Fix remote_list_history timestamps: convert Unix epoch to ISO 8601
- Add !isConnected guards: Chat send, Home delete agent, App apply changes
- Fix History fallthrough to local API when remote but disconnected
- Fix Doctor: runDoctorCmd rejects when remote+disconnected, listBackups
  skips fetch for remote, remove dead memoryFiles/totalMemoryBytes code
- Fix Channels: add isRemote guard to refresh handlers, remove local
  Binding interface in favor of shared type, remove unsafe casts
- Fix Chat: reset agentId on instance switch, add isConnected to deps
- Fix App.tsx: narrow connectionStatus dependency to isConnected only
- Use shared formatBytes from utils instead of local copy in Doctor
- CreateAgentDialog uses useInstance() context instead of props

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 10:28:46 +09:00
zhixian
3eacff3acd feat: achieve full remote/local feature parity across all pages
- Remote config dirty state: baseline/diff/apply/discard mechanism
  matching local behavior (RemoteConfigBaselines managed state)
- Remote update check: fallback to npm registry query via reqwest
  when `openclaw update status` unavailable on remote
- Discord guild names: resolve via Discord REST API using bot token
  from config, fixing guild IDs showing as names
- InstanceContext: add discordGuildChannels to prevent local/remote
  data mixing (replaces prop drilling through Cook/ParamForm)
- Remote agent creation: resolve profile ID to provider/model string
  before writing to config
- Remote profile creation: auto-reuse API key from same-provider
  existing profile; show auth suggestion in Settings UI
- Instance-aware: Chat, actions, ParamForm, Channels, Doctor,
  History, Home, Settings all branch on isRemote/isConnected
- Remote commands: chat, session management, model profiles,
  config baseline, Discord guild channels, update check

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-19 01:26:51 +09:00
zhixian
55e7fea15e feat: add SSH frontend — types, API, Tab Bar, App integration, remote Home
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 21:23:50 +09:00
zhixian
4da9e2bd03 feat: add SSH CRUD, connection, exec, SFTP, and remote status commands
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 21:19:15 +09:00
zhixian
3e71459f85 feat: add SSH connection pool module with exec and SFTP primitives
Implements SshConnectionPool with connect/disconnect/is_connected/exec/
sftp_read/sftp_write/sftp_list/sftp_remove methods using russh async SSH.
Supports key-based and ssh-agent authentication. Accepts all host keys
for now (TODO Phase 3).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 21:16:28 +09:00
zhixian
592ad4a95c chore: add russh SSH/SFTP dependencies
Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-18 21:01:48 +09:00
zhixian
cbc929ddb1 docs: add SSH remote openclaw management design
Design document for managing remote openclaw instances via SSH/SFTP
from ClawPal. Covers architecture, connection management, phased
implementation plan (3 phases from MVP connectivity to full parity).

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-18 20:47:19 +09:00
zhixian
b81d2636f4 feat: add session analysis and management to Doctor page
- Add analyze_sessions backend command that scans all agent sessions,
  classifies them as empty/low_value/valuable based on message count,
  age, and file size
- Add delete_sessions_by_ids command with support for both sessions
  and sessions_archive directories
- Add preview_session command to view full session message content
- Doctor page now has Analyze button (primary color) showing two-level
  view: agent summary with category badges, expandable session details
  with checkboxes for batch deletion
- Session IDs are clickable to preview conversation content in a dialog
- Delete/Deselect buttons placed next to clean buttons for easy access
- Optimistic UI updates on deletion without requiring re-analysis
- All heavy I/O commands run via spawn_blocking to avoid UI freezes
- Add Doctor route to App navigation sidebar
- Hide Memory section from Doctor page

Generated with [Claude Code](https://claude.ai/code)
via [Happy](https://happy.engineering)

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Happy <yesreply@happy.engineering>
2026-02-18 20:04:27 +09:00
zhixian
2208f33177 feat: UI/UX overhaul — shared CreateAgentDialog, multi-platform Channels, skeleton loading, inline Chat panel
- Extract shared CreateAgentDialog with progressive disclosure (independent agent expands identity/persona fields)
- Redesign Channels page: self-contained, groups all channel types (Discord, Telegram, Feishu, QBot) with per-group refresh
- Add skeleton loading states for Home page agents and backups
- Replace Chat Sheet overlay with inline aside panel that pushes main content
- Add RecipeCard compact mode for Home page, with visible tag backgrounds
- Upgrade toast system to support multi-toast stacking with close buttons
- Unify SelectTrigger heights to size="sm" across all pages
- Add "Done" button to Cook completion card
- Replace ~25 silent .catch(() => {}) with console.error or user-visible feedback
- Fix create_agent to inherit default workspace for non-independent agents
- Register list_channels_minimal backend command for frontend access
- Remove unused globalLoading state and refreshDiscord from App.tsx

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 02:10:45 +09:00
zhixian
45e8e4d99b fix: prevent hang on gateway restart, fix delete_agent binding loss, add health check grace period
- Add 30s timeout to gateway restart command to prevent UI from hanging indefinitely
- Change delete_agent to reset bindings to "main" instead of removing them, preventing loss of channel binding entries
- Add health status grace period: show "Checking..." badge while gateway is restarting, retry every 2s up to 5 times before showing "Unhealthy"

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 00:27:52 +09:00
zhixian
82bf38b2b2 feat: add toast feedback for Apply Changes and Discard operations
Show "Gateway restarted successfully" or error after Apply Changes,
and "Changes discarded" after Discard. Toast auto-dismisses after 3s.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:48:12 +09:00
zhixian
065b726e65 fix: show restart hint after any config-modifying steps, not just config_patch
create_agent, bind_channel, setup_identity all modify openclaw.json
and need a gateway restart. Previously the hint only showed when
config_patch steps ran.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:45:02 +09:00
zhixian
b04b9c01b6 fix: detect skippable steps by checking individual template vars
Previously checked if the entire resolved arg was empty, which missed
cases like patchTemplate where {{persona}} resolves to empty but the
overall JSON string is not empty. Now checks each {{param}} reference
individually — if any referenced param is empty, the step is skipped.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:40:07 +09:00
zhixian
99c505c179 fix: model_profile uses profile ID, fix boolean conversion for empty strings
- model_profile Select value changed from provider/model string to
  profile ID (backend expects ID, not display string)
- renderArgs no longer converts empty string to false; only explicit
  "true"/"false" become booleans. Fixes name/emoji being passed as
  boolean false to setup_agent_identity
- Boolean params default to "false" instead of empty string

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:35:58 +09:00
zhixian
01d131f977 feat: add model param to dedicated-channel-agent recipe
Model is required with a default of "use global default". Adds
defaultValue support to RecipeParam so params can have initial values.
Model profile selector now includes a "Use global default" option.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:32:10 +09:00
zhixian
a9c7e8876a fix: remove duplicate back-to-recipes button from App.tsx
The button was rendered outside Cook.tsx in the App shell. Cook.tsx
already has a back arrow in the title area.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:28:15 +09:00
zhixian
1a97705f2b feat: add dependsOn for conditional params, boolean checkbox support
Add "Create independent agent" checkbox that toggles visibility of
name/emoji/persona fields. Params with dependsOn are hidden when the
referenced boolean is unchecked, and their steps are auto-skipped.
Template substitution now converts "true"/"false" to native booleans.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:23:10 +09:00
zhixian
a373a7c068 fix: make name/emoji/persona optional, auto-skip empty steps, back button
- Make name, emoji, persona params optional in dedicated-channel-agent
- Auto-skip steps whose template args resolve to empty strings
- Move "Back to Recipes" to a back arrow next to the title

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 23:18:20 +09:00
zhixian
dbf1e69937 chore: clean up state.ts, remove unused recipe/preview state
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:46:47 +09:00
zhixian
ccd46577c5 refactor: update RecipeCard, Recipes, Home for steps-based recipes
Show step count instead of impactCategory, simplify Recipes.tsx
state management, fix chat.ts preview_change tool.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:46:09 +09:00
zhixian
07fb88438c feat: rewrite Cook as step-by-step wizard
4-phase wizard: fill params → confirm steps → execute → done.
Supports retry/skip on failure, shows step status in real-time.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:45:00 +09:00
zhixian
ccfbc384b0 feat: add action registry for step-based recipe execution
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:44:20 +09:00
zhixian
1c96af57f1 refactor: update TS types for steps-based recipes, remove dead code
Add RecipeStep interface, update Recipe (remove patchTemplate/
impactCategory/impactSummary/action), replace previewApply/applyRecipe
with applyConfigPatch, delete recipe_catalog.ts.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:43:51 +09:00
zhixian
1c636c35fd refactor: update Recipe to use steps, add apply_config_patch command
Replace patchTemplate/impactCategory/impactSummary with steps-based
recipe format. Remove preview_apply/apply_recipe commands, add
apply_config_patch for inline merge patches.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:43:12 +09:00
zhixian
07267c08ee docs: recipe engine redesign — composable steps with wizard UI
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 22:35:04 +09:00
zhixian
99dbe35d46 feat: global chat drawer, setup-agent recipe, profile sync, UX improvements
- Chat as collapsible right-side Sheet drawer, accessible from all pages
- Replace default-model-switch recipe with setup-agent identity recipe
- Add setup_agent_identity backend command (writes IDENTITY.md)
- Add "agent" param type to ParamForm for agent picker dropdown
- Custom action support in Cook flow (non-config-patch recipes)
- Profile save/delete in Settings now syncs to other pages via configVersion
- Move Backups section from Doctor to Settings
- Hide Doctor tab from sidebar navigation
- History preview now opens in Dialog instead of inline at page bottom
- Simplify History.tsx from useReducer to useState

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 21:40:10 +09:00
zhixian
3286ae3af1 feat: Discord guild/channel pickers, apply flow, agent identity
- Replace raw guild_id/channel_id text inputs with dropdown pickers
  showing human-readable names from openclaw config
- Add persistent file-level cache for Discord channel data with
  dedicated Channels tab and refresh button
- Read agent name/emoji from IDENTITY.md in workspace directories
- Rename Install→Cook throughout UI
- Add step-by-step apply flow: apply config → restart gateway → done
- Add global loading overlay for blocking operations
- Use react-diff-viewer-continued for config diff preview
- Fix validation bugs (Option<usize> null handling, discord type bypass)
- Fix serde camelCase on PreviewResult/ApplyResult structs
- Make slow commands async (refresh_discord, restart_gateway)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 18:37:28 +09:00
zhixian
1fbf266034 fix: replace Popover+Command combobox with simple autocomplete
The Radix Popover-based ComboboxField didn't work in Tauri's webview
(clicks had no effect). Replaced with a plain Input + absolute-
positioned dropdown list that uses only standard DOM events — no
Radix Portal, no cmdk dependency, no asChild composition issues.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 14:01:50 +09:00
zhixian
fcee6de2b4 fix: combobox trigger submitting form instead of opening popover
The ComboboxField's Button inside the <form> defaulted to
type="submit", causing form submission on click. Added explicit
type="button" so it opens the dropdown instead.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 13:56:01 +09:00