- Fix terminal default fontSize from 6px to 14px across all references
- Add terminal tool to shell AI via ChatEngine with tool_call streaming
- Fix provider key detection (apiKey → api_key, baseURL → base_url)
- Add mimo provider migration and validation endpoint
- Bump version to 0.4.0
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
Add MiMo-V2.5-Pro from Xiaomi Token Plan as a new AI provider with
base URL https://token-plan-ams.xiaomimimo.com/v1. The /model change
command now switches between MiniMax and MiMo only. ZAI is always
placed last in the fallback chain as the provider of ultimate resort.
Config panel shows MiniMax and MiMo cards.
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- Add proper disposal tracking to prevent memory leaks
- Move terminal buffer from localStorage to sessionStorage
- Restore buffer immediately after first WS message
- Fix clear detection logic and error handling
- Add signal parameter support for abortable fetch requests
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Move defer cleanup after async goroutine setup to prevent premature closure
- Remove unused Password field from terminal sessions struct
- Fix line calculation in clear detection using viewportY instead of baseY
- Add onStateChange callback to connectWebSocket for connection state
- Add tabId parameter to sendToTerminal for targeted tab control
- Simplify ShellAIMessage to use specific tab for command sending
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Delay buffer restoration by 300ms to avoid race condition with WebSocket init
- Read current line from terminal buffer on Enter (reliable) instead of keystroke tracking
- Fix streaming to emit full content instead of word-by-word chunks
- Fix WebSocket readyState check in sendToTerminal
- Extract and deduplicate AI message sending logic
- Fix localStorage cleanup on tab close
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Handle all quota types in providersQuota, not just TIME_LIMIT
- Extract model name from model field or type field
- Use explicit limit value when available
- Add vertical center alignment to quota card content
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Fix AI terminal not initializing (wait for shell col visibility, remove offsetHeight guard)
- Add Shift+Tab to cycle between shell terminals
- Handle unclosed code blocks in renderContent (Shell + Studio)
- Filter irrelevant commands from history (short/non-alpha backend + expanded frontend exclude list)
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- Add dedicated AI Terminal tab (non-deletable) shared between user and AI
- Add Z.AI quota display on dashboard via /api/monitor/usage/quota/limit
- Add /model change command in Studio to toggle MiniMax/ZAI
- Apply Studio formatting (formatText, renderContent) to Shell AI messages
- Add render tick refresh for Shell (1s streaming, 5s idle)
- Add analysis viewer modal (Eye button) in Shell panel
- Fix multi-shell tab creation with retry init and settings ref
- Persist shell tabs to localStorage
- Fix line spacing in Studio (line-height 1.7→1.5, cleanup stray <br/>)
- Redirect Config updates to AI terminal via custom events
- Fix CI: delete existing release before recreating
- Bump version to 0.3.4
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- New ShellConvStore with persistent history (shell_conversation.json)
- 100k token limit — input grays out, must /clear to continue
- Commands limited to /clear and /help only
- Shell AI has NO tools — read-only analysis, never executes code
- "Analyste Système" panel with system analysis button
- System analysis uses Studio AI to write system_analysis.md,
prepended as context on every conversation start
- Code blocks show "Copier" and "Terminal" buttons to copy or
send code directly to the active terminal via WebSocket
- Token bar shows usage with warning at 80%
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- Add visual indicator when messages are collapsed (folder icon)
- Add animation to token bar during compression (pulse effect)
- Token bar becomes more compact after compression with "· compressé" label
- Button "voir plus" to expand collapsed messages
- Add 24px spacing at end of feed to avoid last message clipping
- Simplify provider display: show name only, badge "active" instead of key status
- Dashboard: show provider name only without model suffix
- Studio /model: show just provider name, not model
- Z.AI (GLM): mark as crush-only, no external quota check
- Claude: check /usr/bin/claude installation instead of API
💘 Generated with Crush
- Config tabs now have bottom padding for visual spacing
- Profile panel dynamically renders all config fields (strings, bools,
arrays, nested objects) — new struct fields appear automatically
- handleSaveProfile uses generic JSON merge via deepMerge, so any
new Profile field works without handler changes
- RenderFields recursively renders config sections with edit/view modes
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
Add /summarize command, token usage bar, and summary endpoint.
Add JSON tags to config/platform/scanner structs for API serialization.
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Rewrite dashboard from 4 tabs to single grid view with 5s auto-refresh
- Add live CPU/RAM/Network SVG graphs with rolling 30-point history
- Add backend /api/system/metrics reading /proc/stat, /proc/meminfo, /proc/net/dev
- Add backend /api/providers/quota for MiniMax and Z.AI quota monitoring
- Add backend /api/recent-commands reading bash/zsh history
- Add backend /api/running-processes filtering editors/IDEs/languages
- Add sudo/root indicator (⚡ ROOT) in footer when running as root
- Remove duplicate Ctrl+1-4 shortcut from page-specific footer (keep only right side)
- Add Ctrl+R shortcut on dashboard for metrics-only refresh
- Make API key mandatory in onboarding, auto-scan editors via AI chat
- Remove manual editor input, only show AI-detected editors
- Bump version to 0.3.3
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- New API endpoints: /providers/quota, /recent-commands, /running-processes
- New grid-based dashboard layout with cards for tools, quota, processes, commands
- Improved OnboardingWizard with required API key validation and scanning feedback
- Auto-initialize config on first run
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Add ChatEngine for deduplicated chat logic (handlers_chat/shell_chat)
- Add SendWithToolsStream for real-time streaming responses
- Add /help, /plan, /export, /model commands in Studio
- Fix XSS: sanitize HTML after markdown rendering
- Add ConversationStoreMulti for multi-conversation support
- Add Anthropic headers (x-api-key, anthropic-version)
- Add fallback logging when provider switch occurs
- Add API handler tests (handlers_test.go)
- Polish Studio: max-height 200px, word-break on tool args
- Update CLI version to show full info (version, go, platform)
🤖 Generated with Crush
Assisted-by: MiniMax-M2.5 via Crush <crush@charm.land>
- Fix cleanThinkingTags to use proper regex instead of naive ReplaceAll
- Send conversation history (last 20 messages + summary) to AI instead of single message
- Store tool results alongside tool calls so history shows complete execution info
- Stream words instead of characters for smoother SSE rendering
- Add stop button to cancel in-progress AI requests (AbortController)
- Fix markdown rendering: add h2 support, use div for bullets
- Add i18n keys for cancel/stop (EN + FR)
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- Replace old tool-call regex with proper agent registry
- Add streaming chat via SSE (handleStreamChat / handleNonStreamChat)
- Add internal/agent package with tool definitions and execution
- Add orchestrator with system prompt and tool scaffolding
- Add internal/agent/ directory
- Studio.jsx: streaming chat with thinking indicator and tool result rendering
- global.css: chat bubble styles, streaming animation, thinking dots
- handlers_chat.go: full rewrite using new agent/orchestrator architecture
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Add apikey step in onboarding wizard (optional, with validation)
- Add ScanEditors() in scanner package detecting vim/nvim/code/emacs/nano/helix/subl/zed
- Add GET /api/editors endpoint
- Editor step now has scan button to detect installed editors via backend
- MiniMax API key is saved to provider config if provided
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Add resetConfig and applyStarshipTheme to frontend api client
- Register handleResetConfig and handleApplyStarshipTheme in server mux
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Add PanelSystem with reset config and apply starship theme (charm/zerotwo/default)
- Add OnboardingWizard that activates when profile is empty on first run
- Fix <thing> tag parsing in Shell AI messages (wait for </thing> before rendering)
- Add /api/config/reset and /api/starship/apply-theme endpoints
- Wire wizard trigger in App.jsx based on profile completeness
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
The version was incorrectly bumped to 3.2 instead of 0.3.2.
This follows the existing semver pattern (v0.2.0, v0.2.1, v0.3.1).
💾 Generated with Crush
Assisted-by: GLM-5-Turbo via Crush <crush@charm.land>
The `len(shell) <= 1` guard was too aggressive and provided no diagnostic info.
Now trims whitespace, resolves path in all cases, falls back to /bin/sh, and
logs detailed context for debugging. Also enable WebSocket proxying in Vite dev.
The ThinkingBlock component existed but was dead code — the backend
silently discarded all <think chunks. Now emits thinking SSE events
so the UI can display AI reflections in real-time.
\xe2\x98\x85 Generated with Crush
Assisted-by: GLM-5-Turbo via Crush <crush@charm.land>
Changes:
- Hide <think> tags from user in Studio chat
- Add tool call detection [TOOL_CALL:{...}] in AI responses
- Execute crush tool when requested by AI
- Show loading animation while AI is thinking
The AI can now:
1. Respond directly to user
2. Request tool execution via [TOOL_CALL:{"tool":"crush","task":"..."}]
The system automatically executes the tool and includes results.
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
Reject shell paths with length <= 1 to prevent errors when user
input is accidentally sent as init message.
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Fix shell execution to avoid --login flag causing issues on some shells
- Improve terminal initialization timing with requestAnimationFrame
- Force display visibility on xterm instances via CSS
- Ensure container has proper min-height and overflow handling
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
Break down the 627-line handlers.go into specialized modules:
- handlers_chat.go: chat and streaming endpoints
- handlers_config.go: configuration endpoints
- handlers_common.go: shared utilities
- handlers_info.go: info and status endpoints
- handlers_terminal.go: terminal/shell endpoints
- handlers_tools.go: tool-related endpoints
Also includes config improvements, orchestrator enhancements, and
web component updates.
💘 Generated with Crush
Assisted-by: MiniMax-M2.7 via Crush <crush@charm.land>
- Fix detectShell() to return full paths via LookPath (was returning bare
names causing exec error on some systems)
- Add shell path validation before pty.Start to prevent crashes
- Simplify CLI: remove all subcommands, keep only desktop launch with --port
- Restore missing Studio shared CSS (code blocks, input area, animations)
- Replace Config vertical sidebar with horizontal nav-tabs matching main layout
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- Add POST /api/providers/validate backend endpoint that sends a test
request to the provider's chat/completions API to verify the key
- Add validateProvider to frontend API client
- Redesign PanelProviders: show token input inline with Validate button,
display valid/invalid badge after validation, Save only appears after
successful validation
- Add i18n keys (EN/FR) for validation flow
💾 Generated with Crush
Assisted-by: GLM-5-Turbo via Crush <crush@charm.land>
feat(shell): real terminal with xterm.js + PTY over WebSocket
Replace fake shell input with a full PTY-backed terminal using xterm.js.
Apps like btop, vim, htop now work. AI chat panel is always visible.
Backend:
- Add WebSocket handler /api/ws/terminal with creack/pty
- Allocate real pseudo-terminal with TERM=xterm-256color
- Bidirectional I/O + dynamic resize via pty.Setsize
- Skip JSON headers on /api/ws/* paths for WebSocket upgrade
Frontend:
- Integrate xterm.js with FitAddon and WebLinksAddon
- Cyberpunk color theme matching app design
- ResizeObserver for automatic terminal resizing
- AI assistant panel always visible (340px, no toggle)
- Connection status indicator (green/red dot)
Dependencies:
- Go: github.com/gorilla/websocket, github.com/creack/pty/v2
- npm: @xterm/xterm, @xterm/addon-fit, @xterm/addon-web-links
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
Add full internationalization system with React context, French/English
translations, and AZERTY/QWERTY keyboard layout support. Dashboard now
uses a tabbed layout (Tools, Notifications, Workflows). Config page exposes
language and keyboard preferences persisted via new /api/preferences endpoint.
💕 Generated with Crush
Assisted-by: GLM-5-Turbo via Crush <crush@charm.land>
- Merge muyue + muyue-desktop into one binary (13MB)
- `muyue` starts TUI, `muyue desktop` launches web UI in browser
- Move frontend from cmd/muyue-desktop/frontend/ to web/ (standard Go layout)
- Add web/embed.go with //go:embed all:dist for frontend assets
- Add internal/desktop/ package (server, browser open, SPA routing, signals)
- Split internal/api/api.go into server.go + handlers.go
- Add internal/desktop/desktop.go with SPA fallback and --port/--no-open flags
- Clean package.json: remove unused @xterm/xterm, switch to ESM
- Fix vite.config.js proxy to use port 8095 for dev mode
- Add Makefile targets: frontend, desktop, dev-desktop
- Update all CI workflows: single binary build, web/ paths
- Remove cmd/muyue-desktop/ entirely
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
New desktop application that launches a local HTTP server with embedded
React frontend. Opens in the user's browser automatically.
Architecture:
- internal/api/: REST API exposing all internal/ packages to frontend
- cmd/muyue-desktop/: entry point, serves embedded frontend + API
- cmd/muyue-desktop/frontend/: React + Vite SPA
Frontend features:
- 4 tabs: Dashboard, Studio, Shell, Config
- Cyberpunk red theme with CSS custom properties
- Theme system: 4 built-in themes (Cyberpunk Red, Pink, Midnight Blue, Matrix Green)
- Terminal with command execution via API
- Chat interface with sidebar (agents, workflows, commands)
- Live clock, status indicators, update badges
- Glitch/scanline/fade animations between tabs
- xterm.js included for future full terminal integration
Backend API endpoints:
- GET /api/info, /api/system, /api/tools, /api/config
- GET /api/providers, /api/skills, /api/lsp, /api/mcp, /api/updates
- POST /api/scan, /api/install, /api/terminal, /api/mcp/configure
Build: cd cmd/muyue-desktop/frontend && npm run build && go build ./cmd/muyue-desktop/
Binary: ~11MB single binary with embedded frontend
Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
Co-authored-by: Augustin <muyue@legion-muyue.fr>
Reviewed-on: #2
- Document 4-tab layout (Dashboard, Studio, Shell, Config)
- Add keyboard shortcuts table for new tabs
- Update version references from 0.2.0 to 0.2.1
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- Add develop branch for integration
- Replace single ci.yml with 3 workflows: ci-pr (PR checks), ci-develop (beta releases), ci-main (stable releases)
- Add prerelease support in version.go (ldflags injection)
- Add tests for prerelease version formatting
- Document full GitFlow process, versioning, and contributing guide in README
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
Split monolithic app.go into focused modules (dashboard, chat, workflow,
config, agents, terminal, commands, handlers). Add proper error handling
for installer commands, proxy pipes, and MCP config parsing. Fix daemon
channel buffer, cap orchestrator history, compile think regex once, and
set HTTP timeouts on preview server. Improve CI with Go module caching,
dependency download step, and test stage with race detection.
😘 Generated with Crush
Assisted-by: GLM-5-Turbo via Crush <crush@charm.land>
- Remove Tab/Shift+Tab for tab switching (use only Ctrl+T)
- Tab key now inserts tab character in chat/terminal input
- Filter <think...> blocks from AI responses (MiniMax etc.)
- Filter << >> reasoning blocks from AI responses
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- Remove WithMouseCellMotion to allow text selection in terminal
- Dashboard now uses 2-column layout (left: system/tools, right: actions/status)
- More compact dashboard with better space usage
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>
- Fix Ctrl+M → Ctrl+T (Ctrl+M is Enter in terminals)
- Simplify header to single line: muyue v0.2.0 · Dashboard
- Add Terminal tab with shell command execution
- Run commands, cd, clear, ctrl+c to kill process
- Shows CWD and command history
- 6 tabs now: Dashboard, Chat, Workflow, Terminal, Agents, Config
💘 Generated with Crush
Assisted-by: GLM-5.1 via Crush <crush@charm.land>