diff --git a/apps/web/components/claude/claude-header.tsx b/apps/web/components/claude/claude-header.tsx
index e4767cc..db8508f 100644
--- a/apps/web/components/claude/claude-header.tsx
+++ b/apps/web/components/claude/claude-header.tsx
@@ -20,7 +20,7 @@ const LOGO_BITS = [
"000010100001010000",
];
-export const ClaudeLogo = ({
+const ClaudeLogo = ({
scale = 4,
color = ROSE,
className,
diff --git a/apps/web/components/claude/claude-message.tsx b/apps/web/components/claude/claude-message.tsx
deleted file mode 100644
index fcb1c99..0000000
--- a/apps/web/components/claude/claude-message.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { cn } from "@/lib/utils";
-
-/**
- * ClaudeMessage — a conversation turn. User turns render as Claude Code's
- * full-width prompt row (`❯` + one cell of space, dark background across the
- * row, white text); assistant turns are plain text.
- */
-export const ClaudeMessage = ({
- messageRole = "assistant",
- className,
- children,
-}: {
- messageRole?: "user" | "assistant";
- className?: string;
- children: React.ReactNode;
-}) => {
- if (messageRole === "user") {
- return (
-
-
- ❯
-
- {/* one terminal cell between caret and text — a trailing space inside
- a flex child collapses, so use an explicit width */}
-
-
- {children}
-
-
- );
- }
- return (
-
- {children}
-
- );
-};
diff --git a/apps/web/components/claude/claude-permission.tsx b/apps/web/components/claude/claude-permission.tsx
deleted file mode 100644
index 2251beb..0000000
--- a/apps/web/components/claude/claude-permission.tsx
+++ /dev/null
@@ -1,107 +0,0 @@
-/* eslint-disable jsx-a11y/prefer-tag-over-role */
-"use client";
-
-import type { KeyboardEvent } from "react";
-import { useState } from "react";
-
-import { cn } from "@/lib/utils";
-
-/**
- * ClaudePermission — Claude Code's "Do you want to proceed?" approval box.
- *
- * In the terminal it's a numbered list you drive with arrow keys; here it's a
- * real radiogroup — arrow keys move selection, Enter/Space choose, and each
- * option is a proper radio for assistive tech.
- */
-const ROSE = "#cd694a";
-
-const DEFAULT_OPTIONS = [
- "Yes",
- "Yes, and don't ask again this session",
- "No, and tell Claude what to do (esc)",
-];
-
-export const ClaudePermission = ({
- title = "Bash command",
- command = "rm -rf node_modules",
- question = "Do you want to proceed?",
- options = DEFAULT_OPTIONS,
- defaultSelected = 0,
- onChooseAction,
- className,
-}: {
- title?: string;
- command?: string;
- question?: string;
- options?: string[];
- defaultSelected?: number;
- onChooseAction?: (index: number) => void;
- className?: string;
-}) => {
- const [sel, setSel] = useState(defaultSelected);
-
- const onKey = (e: KeyboardEvent, i: number) => {
- if (e.key === "ArrowDown" || e.key === "ArrowUp") {
- e.preventDefault();
- const next =
- e.key === "ArrowDown"
- ? (i + 1) % options.length
- : (i - 1 + options.length) % options.length;
- setSel(next);
- (e.currentTarget.parentElement?.children[next] as HTMLElement)?.focus();
- } else if (e.key === "Enter" || e.key === " ") {
- e.preventDefault();
- setSel(i);
- onChooseAction?.(i);
- }
- };
-
- return (
-
- );
-};
diff --git a/apps/web/components/claude/claude-prompt.tsx b/apps/web/components/claude/claude-prompt.tsx
deleted file mode 100644
index 7a8822c..0000000
--- a/apps/web/components/claude/claude-prompt.tsx
+++ /dev/null
@@ -1,181 +0,0 @@
-"use client";
-
-import type { ChangeEventHandler, KeyboardEventHandler } from "react";
-
-import { cn } from "@/lib/utils";
-
-/**
- * ClaudePrompt — Claude Code's input composer.
- *
- * Dual CSS rules around a real text input (❯ prefix), effort chip above, and a
- * mode line below. Mode colors/glyphs match shift+tab captures:
- * auto ⏵⏵ gold
- * manual ⏸ gray
- * accept-edits ⏵⏵ lavender
- * plan ⏸ teal
- *
- * Effort chips match `/effort` captures (glyph fills as effort rises):
- * low ○ · medium ◐ · high ● · xhigh ◉ · max ◈ · ultracode ✦
- * Ultracode also paints the prompt rules as a rainbow cycle.
- */
-export type ClaudeMode = "auto" | "manual" | "accept-edits" | "plan";
-
-export type ClaudeEffort =
- | "low"
- | "medium"
- | "high"
- | "xhigh"
- | "max"
- | "ultracode";
-
-const FG = "#c0caf5";
-const GRAY = "#949494";
-// 38;5;244
-const RULE = "#808080";
-
-/** Ultracode prompt-rule cycle from live captures (38;5;146→182→210→216→222→151). */
-const ULTRACODE_RAINBOW =
- "linear-gradient(90deg,#afafd7,#d7afd7,#ff87af,#ffaf87,#ffd787,#afd787,#afafd7)";
-
-const MODES: Record<
- ClaudeMode,
- { glyph: string; label: string; color: string; hint: string }
-> = {
- "accept-edits": {
- // 38;5;147
- color: "#afafd7",
- glyph: "⏵⏵",
- hint: "(shift+tab to cycle) · ← for agents",
- label: "accept edits on",
- },
- auto: {
- // 38;5;220
- color: "#ffd700",
- glyph: "⏵⏵",
- hint: "(shift+tab to cycle) · ← for agents",
- label: "auto mode on",
- },
- manual: {
- color: GRAY,
- glyph: "⏸",
- hint: "· ? for shortcuts · ← for agents",
- label: "manual mode on",
- },
- plan: {
- // 38;5;73
- color: "#5fafaf",
- glyph: "⏸",
- hint: "(shift+tab to cycle) · ← for agents",
- label: "plan mode on",
- },
-};
-
-const EFFORTS: Record<
- ClaudeEffort,
- { glyph: string; label: string; rainbow?: boolean }
-> = {
- high: { glyph: "●", label: "high · /effort" },
- low: { glyph: "○", label: "low · /effort" },
- max: { glyph: "◈", label: "max · /effort" },
- medium: { glyph: "◐", label: "medium · /effort" },
- ultracode: {
- glyph: "✦",
- label:
- "ultracode · xhigh effort + dynamic workflows for maximum thoroughness",
- rainbow: true,
- },
- xhigh: { glyph: "◉", label: "xhigh · /effort" },
-};
-
-export const ClaudePrompt = ({
- value,
- defaultValue = "",
- onChangeAction,
- onKeyDownAction,
- placeholder = "",
- mode = "auto",
- effort = "xhigh",
- className,
- inputClassName,
-}: {
- value?: string;
- defaultValue?: string;
- onChangeAction?: ChangeEventHandler;
- onKeyDownAction?: KeyboardEventHandler;
- placeholder?: string;
- mode?: ClaudeMode;
- /** Effort chip above the prompt. Pass `false` to hide. */
- effort?: ClaudeEffort | false;
- className?: string;
- inputClassName?: string;
-}) => {
- const m = MODES[mode];
- const e = effort === false ? null : EFFORTS[effort];
- const controlled = value !== undefined;
- const rainbow = Boolean(e?.rainbow);
-
- return (
-