- 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>
- 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>
- 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>
- 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>
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>
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>
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>
- 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>
- 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>
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>
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>
- 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>
- 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>
- 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>
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>
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>
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>
- 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>
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>
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>
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>
- 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>
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>
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>
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>
- 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>
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>
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>