Desktop denials answered the CLI with `interrupt: true`, which permissionPromptToolResultToPermissionDecision turns into toolUseContext.abortController.abort(). query.ts then hits its post-tool abort check, yields the interruption marker and returns `aborted_tools` -- the denial was written to the transcript, but no follow-up request was ever made. The model never learned it had been denied and never got to reply, so a rejected tool ended the turn in silence. #1051 named the root cause directly, and it was not a missing abort: the denial text was 'User denied via UI', a debug string the model cannot act on, where upstream sends REJECT_MESSAGE ("... STOP what you are doing and wait for the user to tell you how to proceed."). Aborting suppressed the reported symptom -- the model could not go looking for a workaround because it was never asked again -- while leaving in place a denial it still could not read. Send the copy the CLI itself uses and the instruction lands where it belongs. ExitPlanMode carries the opposite meaning: rejecting a plan is "keep planning", so it must not receive REJECT_MESSAGE's STOP. It now gets copy saying the plan was rejected and should be revised, in place of that same debug string. Deliberately not PLAN_REJECTION_PREFIX -- its contract is the prefix followed by the full plan text, and both renderers already read the plan from the tool input (the CLI's renderToolUseRejectedMessage, the desktop's extractPlanPreview), so reusing it would only echo the model's own plan back into context. Plan feedback gets the same framing instead of being passed through bare, where "add rollback steps" reads as a go-ahead. REJECT_MESSAGE and REJECT_MESSAGE_WITH_REASON_PREFIX move to the dependency-free constants/messages.ts so the server can share the CLI's exact wording without pulling utils/messages.ts and its analytics deps into the sidecar. utils/messages.ts re-exports them, leaving existing callers untouched. Verified end to end against a mock upstream driving the real server and a real CLI subprocess: the model is asked a second time, that request carries the denial as tool_result, and the model replies. Restoring `interrupt: true` leaves the upstream with a single request and no closing reply, which is the reported symptom. A denied Write reaches the filesystem in neither case. permissionPromptToolResultToPermissionDecision had no coverage at the point where it decides to abort; it does now.
Claude Code Haha
A Claude Code build repaired from the source leaked from Anthropic's npm registry on 2026-03-31. Claude Code Haha is now primarily a desktop Claude Code workspace for macOS, Windows, and Linux: sessions, projects, branch / Worktree launch, right-side file changes, code diffs, permission review, provider setup, Computer Use, H5 remote access, IM integration, and scheduled tasks in one app.
Desktop Preview · Install · Highlights · Sponsorship · More Docs
Desktop Preview
The Claude Code Haha desktop app brings sessions, multi-project navigation, branch / Worktree controls, right-side file changes, code diffs, permission review, provider setup, and remote access into one graphical workspace for daily development flows beyond the terminal.
![]() Desktop Workspace |
![]() Right-side Changes & Worktree |
![]() Code Editing & Diff View |
![]() Permission Review & AI Questions |
![]() H5 Remote Access |
![]() Token Usage |
![]() Computer Use |
![]() Scheduled Tasks |
Install the Desktop App
- Download the macOS / Windows / Linux desktop installer from Releases.
- On first launch, configure your model provider, API key, and default model in Settings.
- Public macOS releases require signing and notarization. Draft or unsigned temporary builds may still need one-time manual approval. Unsigned Windows installers may show SmartScreen; click "More info" -> "Run anyway". See the desktop installation guide.
Run the CLI from Source
For users who want to debug the underlying CLI, server, or local development flow:
bun install
cp .env.example .env
./bin/claude-haha
See environment variables and global usage for more configuration options.
Desktop Highlights
- Multi-session workspace: tabs, project switching, terminal entry, and session history in one place.
- Branch / Worktree launch: choose a repository branch and decide whether to use the current working tree or an isolated Worktree.
- Right-side file changes: review changed files, added/removed lines, and current workspace state while chatting.
- Visual code changes: inspect edits, file writes, and diffs directly in the desktop app.
- Permission review: approve risky commands, tool calls, and model follow-up questions in the GUI.
- Multi-provider setup: configure Anthropic-compatible APIs, third-party models, WebSearch fallback, and local options.
- Skill Marketplace: discover, preview, install, and manage third-party skills from ClawHub / SkillHub in the desktop app.
- Session Activity Panel: review tasks, background tasks, SubAgents, team activity, and sources in one side panel.
- Computer Use: let the agent take screenshots, click, type, and control desktop apps after authorization.
- H5 remote access: open the current desktop session from a phone or another device with a one-time token.
- IM integration: chat, switch projects, and approve actions through Telegram / Feishu / WeChat / DingTalk.
- Scheduled tasks and usage stats: create planned tasks and track local token usage trends.
More Documentation
| Document | Description |
|---|---|
| Environment Variables | Full env var reference and configuration methods |
| Third-Party Models | Using OpenAI / DeepSeek / Ollama and other non-Anthropic models |
| Contributing | Local tests, live model baselines, PR gates, and release gates |
| Memory System | Cross-session persistent memory usage and implementation |
| Multi-Agent System | Agent orchestration, parallel tasks and Teams collaboration |
| Skills System | Extensible capability plugins, custom workflows and conditional activation |
| IM Integration | Remote chat, project switching, and permission approval via Telegram / Feishu / WeChat / DingTalk |
| Computer Use | Desktop control (screenshots, mouse, keyboard) — Architecture |
| Desktop App | Electron + React GUI client — Quick Start | Architecture | Installation |
| Global Usage | Run claude-haha from any directory |
| FAQ | Common error troubleshooting |
| Source Fixes | Fixes compared with the original leaked source |
| Project Structure | Code directory structure |
Sponsorship & Partnership
This project is maintained in the author's spare time. Corporate or individual sponsorships are welcome to support ongoing development. Custom features, integrations, and business partnerships are also open for discussion.
| Sponsor | Description |
|---|---|
|
接口AI |
Thanks to JieKou AI for sponsoring this project. JieKou AI provides official model resources with stable, high-performance API access. Subscription bundles are priced at 20% off the official rate; new users who register through this link and bind GitHub can claim a $3 coupon. |
|
|
Thanks to ShengSuanYun for sponsoring this project. ShengSuanYun is an industrial-grade AI task parallel execution platform for AI Native Teams, aggregating Claude, ChatGPT, Gemini, and other LLM, image, and video model capacity through direct, non-reverse-engineered access. Its platform SLA reaches 99.7%, with service status available online. It also supports dedicated enterprise gateways, cost and permission controls, smart routing, security protection, BYOK, usage-based billing, upcoming tokens plans, and invoicing. New users registering through this link can receive 10 yuan in model credits plus a 10% first top-up bonus. |
|
|
Thanks to TeamoRouter for sponsoring this project. TeamoRouter is an enterprise-grade Agentic LLM gateway for developers, AI teams, and businesses. Without any subscription, it lets you use Claude Code, Codex, Gemini CLI, and other popular AI agents through a single unified API, with API pricing at discounts of up to 90%. It aggregates hundreds of official model providers and trusted infrastructure partners — including OpenAI, Anthropic, Vertex, Azure, and AWS Bedrock — each verified for 100% Agent protocol compatibility, cache performance, and request traceability, delivering near-official TTFT, a 99.6% SLA, throughput up to 5,000 QPM, and industry-leading cache hit rates rather than reverse-engineered endpoints. It also offers centralized billing, team management, BYOK, smart routing, usage analytics, and dedicated support, and Teamo Desktop lets you use these AI agents with one-click setup. New users who register through this link receive 10% off their first top-up. |
📧 Contact: relakkes@gmail.com
☕ Buy Me a Coffee
If this project helps you, consider buying me a coffee — every bit of support keeps this project going ❤️
![]() WeChat Pay |
![]() Alipay |
Buy Me a Coffee |
Tech Stack
| Category | Technology |
|---|---|
| Language | TypeScript |
| Desktop app | Electron |
| Desktop UI | React + Vite |
| Local runtime | Bun |
| Terminal UI | React + Ink |
| CLI parsing | Commander.js |
| API | Anthropic SDK |
| Protocols | MCP, LSP |
Thanks
Thanks to the following open-source projects and community practices for reference and inspiration:
- React: frontend engineering and component-based UI ecosystem.
- Electron: cross-platform desktop app capabilities and engineering practices.
- cc-switch: reference for model provider configuration.
⭐ Star History
If this project helps you, please support it with a ⭐ Star so more people can discover Claude Code Haha.
Disclaimer
This repository is based on the Claude Code source leaked from the Anthropic npm registry on 2026-03-31. All original source code copyrights belong to Anthropic. It is provided for learning and research purposes only.










