mirror of
https://github.com/NanmiCoder/cc-haha
synced 2026-07-18 13:23:33 +08:00
The desktop app now keeps the composer stable while turns are active, reduces low-signal tool noise in the transcript, restores project context under the composer after session creation, and relies on the CLI's own permission requests instead of injecting broader desktop-side Bash asks. This also brings in the supporting desktop app source tree and the server routes/session metadata needed for git info, filesystem browsing, session resume, slash commands, and SDK-backed permission bridging so the UI can operate as a coherent feature instead of a partial patch. Constraint: Desktop transcript needs to stay usable during long multi-tool sessions without hiding file-change diffs Constraint: Permission prompts must mirror CLI behavior closely enough that read-only commands do not get desktop-only prompts Rejected: Keep rendering Read/Bash bodies inline | too noisy and unlike the intended transcript model Rejected: Commit only the touched desktop files | would leave the newly introduced desktop app incomplete in git history Confidence: medium Scope-risk: broad Reversibility: messy Directive: Treat non-writing tools as summary-first transcript events; do not re-expand them by default without validating the UX against long sessions Tested: cd desktop && bun run lint Tested: cd desktop && bun run test -- --run Tested: bun test src/server/__tests__/conversations.test.ts Not-tested: Manual visual regression against the exact screenshots in a live desktop session Not-tested: Full root TypeScript check (repository still has unrelated extracted-native parse failures)
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import type { ReactNode } from 'react'
|
|
|
|
type Props = {
|
|
title?: string
|
|
children: ReactNode
|
|
className?: string
|
|
}
|
|
|
|
/**
|
|
* macOS-style terminal window decoration with traffic light buttons.
|
|
* Reusable wrapper for Bash commands, tool results, and code viewers.
|
|
*/
|
|
export function TerminalChrome({ title, children, className = '' }: Props) {
|
|
return (
|
|
<div className={`overflow-hidden rounded-2xl border border-[var(--color-outline-variant)]/20 bg-[var(--color-surface-dim)] ${className}`}>
|
|
{/* Title bar with traffic lights */}
|
|
<div className="flex items-center gap-2 border-b border-[#1a1a1a] bg-[#2d2d2d] px-3 py-2">
|
|
<div className="flex gap-1.5">
|
|
<div className="w-2.5 h-2.5 rounded-full bg-[#ff5f57]" />
|
|
<div className="w-2.5 h-2.5 rounded-full bg-[#febc2e]" />
|
|
<div className="w-2.5 h-2.5 rounded-full bg-[#28c840]" />
|
|
</div>
|
|
{title && (
|
|
<span className="ml-2 truncate font-[var(--font-mono)] text-[10px] text-[#999]">
|
|
{title}
|
|
</span>
|
|
)}
|
|
</div>
|
|
{/* Content */}
|
|
<div className="bg-[#1e1e1e] text-[#d4d4d4]">
|
|
{children}
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|