SYMBOL INDEX (319 symbols across 33 files) FILE: src/main/claude/control-plane.ts constant MAX_QUEUE_DEPTH (line 16) | const MAX_QUEUE_DEPTH = 32 function log (line 18) | function log(msg: string): void { type QueuedRequest (line 22) | interface QueuedRequest { type InflightRequest (line 33) | interface InflightRequest { class ControlPlane (line 58) | class ControlPlane extends EventEmitter { method constructor (line 79) | constructor(interactivePty = false) { method _wirePtyEvents (line 291) | private _wirePtyEvents(): void { method createTab (line 432) | createTab(): string { method initSession (line 453) | initSession(tabId: string): void { method resetTabSession (line 474) | resetTabSession(tabId: string): void { method setPermissionMode (line 485) | setPermissionMode(mode: 'ask' | 'auto'): void { method closeTab (line 490) | closeTab(tabId: string): void { method submitPrompt (line 533) | async submitPrompt( method _dispatch (line 587) | private async _dispatch(tabId: string, requestId: string, options: Run... method cancel (line 655) | cancel(requestId: string): boolean { method cancelTab (line 677) | cancelTab(tabId: string): boolean { method retry (line 689) | async retry(tabId: string, requestId: string, options: RunOptions): Pr... method respondToPermission (line 704) | respondToPermission(tabId: string, questionId: string, optionId: strin... method getHealth (line 732) | getHealth(): HealthReport { method getTabStatus (line 757) | getTabStatus(tabId: string): TabRegistryEntry | undefined { method getEnrichedError (line 761) | getEnrichedError(requestId: string, exitCode: number | null): Enriched... method _processQueue (line 770) | private _processQueue(tabId: string): void { method _findTabByRequest (line 791) | private _findTabByRequest(requestId: string): string | null { method _setTabStatus (line 803) | private _setTabStatus(tabId: string, newStatus: TabStatus): void { method shutdown (line 817) | shutdown(): void { FILE: src/main/claude/event-normalizer.ts function normalize (line 20) | function normalize(raw: ClaudeEvent): NormalizedEvent[] { function normalizeSystem (line 46) | function normalizeSystem(event: InitEvent): NormalizedEvent[] { function normalizeStreamEvent (line 60) | function normalizeStreamEvent(event: StreamEvent): NormalizedEvent[] { function normalizeAssistant (line 111) | function normalizeAssistant(event: AssistantEvent): NormalizedEvent[] { function normalizeResult (line 118) | function normalizeResult(event: ResultEvent): NormalizedEvent[] { function normalizeRateLimit (line 147) | function normalizeRateLimit(event: RateLimitEvent): NormalizedEvent[] { function normalizePermission (line 159) | function normalizePermission(event: PermissionEvent): NormalizedEvent[] { FILE: src/main/claude/pty-run-manager.ts constant LOG_FILE (line 35) | const LOG_FILE = join(homedir(), '.clui-debug.log') constant MAX_RING_LINES (line 36) | const MAX_RING_LINES = 100 constant PTY_BUFFER_SIZE (line 37) | const PTY_BUFFER_SIZE = 50 // rolling window of cleaned lines for parser... constant PERMISSION_TIMEOUT_MS (line 38) | const PERMISSION_TIMEOUT_MS = 5 * 60 * 1000 // 5 minutes constant QUIESCENCE_MS (line 39) | const QUIESCENCE_MS = 2000 function log (line 41) | function log(msg: string): void { function stripAnsi (line 51) | function stripAnsi(str: string): string { type ParsedPermission (line 62) | interface ParsedPermission { function detectPermissionPrompt (line 73) | function detectPermissionPrompt(lines: string[]): ParsedPermission | null { function extractSessionId (line 166) | function extractSessionId(text: string): string | null { function isInputPrompt (line 180) | function isInputPrompt(line: string): boolean { function isUiChrome (line 188) | function isUiChrome(line: string): boolean { function parseToolCallLine (line 219) | function parseToolCallLine(line: string): { toolName: string; input: str... type PtyRunHandle (line 231) | interface PtyRunHandle { class PtyRunManager (line 275) | class PtyRunManager extends EventEmitter { method constructor (line 280) | constructor() { method _ensureSpawnHelperExecutable (line 291) | private _ensureSpawnHelperExecutable(): void { method _findClaudeBinary (line 313) | private _findClaudeBinary(): string { method _getEnv (line 338) | private _getEnv(): NodeJS.ProcessEnv { method startRun (line 348) | startRun(requestId: string, options: RunOptions): PtyRunHandle { method _processLine (line 514) | private _processLine(requestId: string, handle: PtyRunHandle, rawLine:... method _checkQuiescenceCompletion (line 607) | private _checkQuiescenceCompletion(requestId: string, handle: PtyRunHa... method _scheduleTextFlush (line 640) | private _scheduleTextFlush(requestId: string, handle: PtyRunHandle): v... method _flushText (line 651) | private _flushText(requestId: string, handle: PtyRunHandle): void { method _checkPermissionInBuffer (line 670) | private _checkPermissionInBuffer(requestId: string, handle: PtyRunHand... method respondToPermission (line 730) | respondToPermission(requestId: string, _questionId: string, optionId: ... method cancel (line 805) | cancel(requestId: string): boolean { method writeToStdin (line 838) | writeToStdin(requestId: string, message: string): boolean { method getEnrichedError (line 854) | getEnrichedError(requestId: string, exitCode: number | null): Enriched... method isRunning (line 868) | isRunning(requestId: string): boolean { method getHandle (line 872) | getHandle(requestId: string): PtyRunHandle | undefined { method getActiveRunIds (line 876) | getActiveRunIds(): string[] { method _ringPush (line 880) | private _ringPush(buffer: string[], line: string): void { method _ringPushBuffer (line 885) | private _ringPushBuffer(buffer: string[], line: string): void { FILE: src/main/claude/run-manager.ts constant MAX_RING_LINES (line 11) | const MAX_RING_LINES = 100 constant DEBUG (line 12) | const DEBUG = process.env.CLUI_DEBUG === '1' constant CLUI_SYSTEM_HINT (line 16) | const CLUI_SYSTEM_HINT = [ constant SAFE_TOOLS (line 44) | const SAFE_TOOLS = [ constant DEFAULT_ALLOWED_TOOLS (line 54) | const DEFAULT_ALLOWED_TOOLS = [ function log (line 59) | function log(msg: string): void { type RunHandle (line 63) | interface RunHandle { class RunManager (line 91) | class RunManager extends EventEmitter { method constructor (line 97) | constructor() { method _findClaudeBinary (line 103) | private _findClaudeBinary(): string { method _getEnv (line 128) | private _getEnv(): NodeJS.ProcessEnv { method startRun (line 138) | startRun(requestId: string, options: RunOptions): RunHandle { method writeToStdin (line 323) | writeToStdin(requestId: string, message: object): boolean { method cancel (line 337) | cancel(requestId: string): boolean { method getEnrichedError (line 360) | getEnrichedError(requestId: string, exitCode: number | null): Enriched... method isRunning (line 374) | isRunning(requestId: string): boolean { method getHandle (line 378) | getHandle(requestId: string): RunHandle | undefined { method getActiveRunIds (line 382) | getActiveRunIds(): string[] { method _ringPush (line 386) | private _ringPush(buffer: string[], line: string): void { FILE: src/main/cli-env.ts function appendPathEntries (line 5) | function appendPathEntries(target: string[], seen: Set, rawPath:... function getCliPath (line 15) | function getCliPath(): string { function getCliEnv (line 47) | function getCliEnv(extraEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv { FILE: src/main/hooks/permission-server.ts constant PERMISSION_TIMEOUT_MS (line 28) | const PERMISSION_TIMEOUT_MS = 5 * 60 * 1000 // 5 minutes constant DEFAULT_PORT (line 29) | const DEFAULT_PORT = 19836 constant MAX_BODY_SIZE (line 30) | const MAX_BODY_SIZE = 1024 * 1024 // 1MB constant DEBUG (line 32) | const DEBUG = process.env.CLUI_DEBUG === '1' constant PERMISSION_REQUIRED_TOOLS (line 38) | const PERMISSION_REQUIRED_TOOLS = ['Bash', 'Edit', 'Write', 'MultiEdit'] constant SAFE_BASH_COMMANDS (line 42) | const SAFE_BASH_COMMANDS = new Set([ constant GIT_MUTATING_SUBCOMMANDS (line 70) | const GIT_MUTATING_SUBCOMMANDS = new Set([ constant CLAUDE_MUTATING_SUBCOMMANDS (line 78) | const CLAUDE_MUTATING_SUBCOMMANDS = new Set([ function isSafeBashCommand (line 83) | function isSafeBashCommand(command: unknown): boolean { constant HOOK_MATCHER (line 140) | const HOOK_MATCHER = `^(${PERMISSION_REQUIRED_TOOLS.join('|')}|mcp__.*)$` constant SENSITIVE_FIELD_RE (line 143) | const SENSITIVE_FIELD_RE = /token|password|secret|key|auth|credential|ap... constant VALID_ALLOW_DECISIONS (line 147) | const VALID_ALLOW_DECISIONS = new Set(['allow', 'allow-session', 'allow-... constant VALID_DECISIONS (line 148) | const VALID_DECISIONS = new Set([...VALID_ALLOW_DECISIONS, 'deny']) function log (line 150) | function log(msg: string): void { function extractDomain (line 155) | function extractDomain(url: unknown): string | null { function denyResponse (line 165) | function denyResponse(reason: string) { function allowResponse (line 176) | function allowResponse(reason: string) { type HookToolRequest (line 186) | interface HookToolRequest { type PermissionDecision (line 197) | interface PermissionDecision { type PermissionOption (line 202) | interface PermissionOption { type PendingRequest (line 208) | interface PendingRequest { type RunRegistration (line 216) | interface RunRegistration { class PermissionServer (line 228) | class PermissionServer extends EventEmitter { method constructor (line 246) | constructor(port = DEFAULT_PORT) { method start (line 252) | async start(): Promise { method stop (line 280) | stop(): void { method getPort (line 301) | getPort(): number | null { method registerRun (line 311) | registerRun(tabId: string, requestId: string, sessionId: string | null... method unregisterRun (line 321) | unregisterRun(runToken: string): void { method respondToPermission (line 351) | respondToPermission(questionId: string, decision: string, reason?: str... method getOptionsForTool (line 401) | getOptionsForTool(toolName: string, toolInput?: Record): Record { FILE: src/main/logger.ts constant LOG_FILE (line 5) | const LOG_FILE = join(homedir(), '.clui-debug.log') constant FLUSH_INTERVAL_MS (line 6) | const FLUSH_INTERVAL_MS = 500 constant MAX_BUFFER_SIZE (line 7) | const MAX_BUFFER_SIZE = 64 function flush (line 15) | function flush(): void { function ensureTimer (line 24) | function ensureTimer(): void { function log (line 32) | function log(tag: string, msg: string): void { function flushLogs (line 42) | function flushLogs(): void { FILE: src/main/marketplace/catalog.ts constant SAFE_PLUGIN_NAME (line 13) | const SAFE_PLUGIN_NAME = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/ constant SAFE_REPO (line 15) | const SAFE_REPO = /^[a-zA-Z0-9_.-]+\/[a-zA-Z0-9_.-]+$/ function validatePluginName (line 17) | function validatePluginName(name: string): boolean { function validateRepo (line 21) | function validateRepo(repo: string): boolean { function validateSourcePath (line 25) | function validateSourcePath(p: string): boolean { function assertSkillDirContained (line 31) | function assertSkillDirContained(skillsDir: string, base: string): void { function log (line 38) | function log(msg: string): void { constant SOURCES (line 44) | const SOURCES = [ constant CACHE_TTL (line 54) | const CACHE_TTL = 5 * 60 * 1000 // 5 minutes function fetchCatalog (line 61) | async function fetchCatalog(forceRefresh?: boolean): Promise<{ plugins: ... function listInstalled (line 231) | async function listInstalled(): Promise { function installPlugin (line 271) | async function installPlugin( function uninstallPlugin (line 335) | async function uninstallPlugin( function netFetch (line 357) | function netFetch(url: string): Promise<{ ok: boolean; status: number; b... function parseSkillFrontmatter (line 377) | function parseSkillFrontmatter(content: string): { name: string; descrip... constant TAG_RULES (line 407) | const TAG_RULES: Array<{ tag: string; patterns: RegExp }> = [ function deriveSemanticTags (line 428) | function deriveSemanticTags(name: string, description: string, skillPath... function execAsync (line 440) | function execAsync(cmd: string, args: string[], timeout: number): Promis... FILE: src/main/process-manager.ts constant LOG_FILE (line 10) | const LOG_FILE = join(homedir(), '.clui-debug.log') function log (line 12) | function log(msg: string): void { type RunHandle (line 17) | interface RunHandle { class ProcessManager (line 27) | class ProcessManager extends EventEmitter { method constructor (line 31) | constructor() { method findClaudeBinary (line 38) | private findClaudeBinary(): string { method startRun (line 69) | startRun(options: RunOptions): RunHandle { method cancelRun (line 170) | cancelRun(runId: string): boolean { method isRunning (line 186) | isRunning(runId: string): boolean { method getActiveRunIds (line 190) | getActiveRunIds(): string[] { FILE: src/main/skills/installer.ts constant BUNDLED_SKILLS_DIR (line 19) | const BUNDLED_SKILLS_DIR = join(__dirname, '../../skills') constant SKILLS_DIR (line 21) | const SKILLS_DIR = join(homedir(), '.claude', 'skills') constant VERSION_FILE (line 22) | const VERSION_FILE = '.clui-version' type SkillState (line 24) | type SkillState = 'pending' | 'downloading' | 'validating' | 'installed'... type SkillStatus (line 26) | interface SkillStatus { type VersionMeta (line 33) | interface VersionMeta { function log (line 40) | function log(msg: string): void { function readVersionFile (line 46) | function readVersionFile(skillDir: string): VersionMeta | null { function writeVersionFile (line 56) | function writeVersionFile(skillDir: string, entry: SkillEntry): void { function validateSkill (line 68) | function validateSkill(dir: string, requiredFiles: string[]): string | n... function installGithubSkill (line 77) | async function installGithubSkill( function installBundledSkill (line 142) | async function installBundledSkill( function installSkill (line 193) | async function installSkill( function ensureSkills (line 242) | async function ensureSkills( FILE: src/main/skills/manifest.ts type SkillEntry (line 11) | interface SkillEntry { constant SKILLS (line 21) | const SKILLS: SkillEntry[] = [ FILE: src/main/stream-parser.ts class StreamParser (line 9) | class StreamParser extends EventEmitter { method feed (line 16) | feed(chunk: string): void { method flush (line 38) | flush(): void { method fromStream (line 54) | static fromStream(stream: Readable): StreamParser { FILE: src/preload/index.ts type CluiAPI (line 5) | interface CluiAPI { FILE: src/renderer/App.tsx constant TRANSITION (line 15) | const TRANSITION = { duration: 0.26, ease: [0.4, 0, 0.1, 1] as const } function App (line 17) | function App() { FILE: src/renderer/components/AttachmentChips.tsx constant FILE_ICONS (line 7) | const FILE_ICONS: Record = { function AttachmentChips (line 20) | function AttachmentChips({ FILE: src/renderer/components/ConversationView.tsx constant INITIAL_RENDER_CAP (line 18) | const INITIAL_RENDER_CAP = 100 constant PAGE_SIZE (line 19) | const PAGE_SIZE = 100 constant REMARK_PLUGINS (line 20) | const REMARK_PLUGINS = [remarkGfm] // Hoisted — prevents re-parse on eve... type GroupedItem (line 24) | type GroupedItem = function groupMessages (line 32) | function groupMessages(messages: Message[]): GroupedItem[] { function ConversationView (line 59) | function ConversationView() { function EmptyState (line 286) | function EmptyState() { function CopyButton (line 324) | function CopyButton({ text }: { text: string }) { function InterruptButton (line 359) | function InterruptButton({ tabId }: { tabId: string }) { function UserMessage (line 391) | function UserMessage({ message, skipMotion }: { message: Message; skipMo... function QueuedMessage (line 425) | function QueuedMessage({ content }: { content: string }) { function TableScrollWrapper (line 454) | function TableScrollWrapper({ children }: { children: React.ReactNode }) { function ImageCard (line 512) | function ImageCard({ src, alt, colors }: { src?: string; alt?: string; c... function toolSummary (line 622) | function toolSummary(tools: Message[]): string { function getToolDescriptionFromParsed (line 632) | function getToolDescriptionFromParsed(name: string, parsed: Record { function mixToMono (line 620) | function mixToMono(buffer: AudioBuffer): Float32Array { function resampleLinear (line 634) | function resampleLinear(input: Float32Array, inRate: number, outRate: nu... function normalizePcm (line 649) | function normalizePcm(samples: Float32Array): Float32Array { function rmsLevel (line 663) | function rmsLevel(samples: Float32Array): number { function encodeWav (line 670) | function encodeWav(samples: Float32Array, sampleRate: number): ArrayBuff... function writeString (line 696) | function writeString(view: DataView, offset: number, str: string) { function bufferToBase64 (line 700) | function bufferToBase64(buffer: ArrayBuffer): string { FILE: src/renderer/components/MarketplacePanel.tsx function MarketplacePanel (line 8) | function MarketplacePanel() { function PluginCard (line 278) | function PluginCard({ plugin, status, colors, expanded, onToggleExpand, ... function StatusButton (line 533) | function StatusButton({ status, colors, onClick, onUninstall }: { function Tag (line 612) | function Tag({ label, colors, emphasis }: { function LoadingState (line 639) | function LoadingState({ colors }: { colors: ReturnType... function ErrorState (line 666) | function ErrorState({ error, colors, onRetry }: { function EmptyState (line 692) | function EmptyState({ colors }: { colors: ReturnType }) { FILE: src/renderer/components/PermissionCard.tsx type Props (line 8) | interface Props { constant TOOL_ICONS (line 14) | const TOOL_ICONS: Record = { function getToolIcon (line 22) | function getToolIcon(name: string) { constant SENSITIVE_FIELD_RE (line 26) | const SENSITIVE_FIELD_RE = /token|password|secret|key|auth|credential|ap... function formatInput (line 28) | function formatInput(input?: Record): string | null { function PermissionCard (line 47) | function PermissionCard({ tabId, permission, queueLength = 1 }: Props) { FILE: src/renderer/components/PermissionDeniedCard.tsx type Props (line 6) | interface Props { function PermissionDeniedCard (line 13) | function PermissionDeniedCard({ tools, sessionId, projectPath, onDismiss... FILE: src/renderer/components/PopoverLayer.tsx function usePopoverLayer (line 13) | function usePopoverLayer(): HTMLDivElement | null { function PopoverLayerProvider (line 17) | function PopoverLayerProvider({ children }: { children: React.ReactNode ... FILE: src/renderer/components/SettingsPopover.tsx function RowToggle (line 10) | function RowToggle({ function SettingsPopover (line 46) | function SettingsPopover() { FILE: src/renderer/components/SlashCommandMenu.tsx type SlashCommand (line 10) | interface SlashCommand { constant SLASH_COMMANDS (line 16) | const SLASH_COMMANDS: SlashCommand[] = [ type Props (line 25) | interface Props { function getFilteredCommands (line 33) | function getFilteredCommands(filter: string): SlashCommand[] { function getFilteredCommandsWithExtras (line 37) | function getFilteredCommandsWithExtras(filter: string, extraCommands: Sl... function SlashCommandMenu (line 48) | function SlashCommandMenu({ filter, selectedIndex, onSelect, anchorRect,... FILE: src/renderer/components/StatusBar.tsx function ModelPicker (line 11) | function ModelPicker() { function PermissionModePicker (line 132) | function PermissionModePicker() { function compactPath (line 253) | function compactPath(fullPath: string): string { function StatusBar (line 259) | function StatusBar() { FILE: src/renderer/components/TabStrip.tsx function StatusDot (line 10) | function StatusDot({ status, hasUnread, hasPermission }: { status: TabSt... function TabStrip (line 39) | function TabStrip() { FILE: src/renderer/env.d.ts type Window (line 9) | interface Window { FILE: src/renderer/hooks/useClaudeEvents.ts function useClaudeEvents (line 12) | function useClaudeEvents() { FILE: src/renderer/hooks/useHealthReconciliation.ts constant HEALTH_POLL_INTERVAL_MS (line 4) | const HEALTH_POLL_INTERVAL_MS = 1500 function useHealthReconciliation (line 13) | function useHealthReconciliation() { FILE: src/renderer/stores/sessionStore.ts constant AVAILABLE_MODELS (line 8) | const AVAILABLE_MODELS = [ function normalizeModelId (line 14) | function normalizeModelId(modelId: string): string { function getModelDisplayLabel (line 19) | function getModelDisplayLabel(modelId: string): string { type StaticInfo (line 44) | interface StaticInfo { type State (line 52) | interface State { function playNotificationIfHidden (line 113) | async function playNotificationIfHidden(): Promise { function makeLocalTab (line 124) | function makeLocalTab(): TabState { FILE: src/renderer/theme.ts type ColorPalette (line 277) | type ColorPalette = { [K in keyof typeof darkColors]: string } type ThemeMode (line 281) | type ThemeMode = 'system' | 'light' | 'dark' type ThemeState (line 283) | interface ThemeState { function camelToKebab (line 299) | function camelToKebab(s: string): string { function syncTokensToCss (line 304) | function syncTokensToCss(tokens: ColorPalette): void { function applyTheme (line 311) | function applyTheme(isDark: boolean): void { constant SETTINGS_KEY (line 317) | const SETTINGS_KEY = 'clui-settings' function loadSettings (line 319) | function loadSettings(): { themeMode: ThemeMode; soundEnabled: boolean; ... function saveSettings (line 334) | function saveSettings(s: { themeMode: ThemeMode; soundEnabled: boolean; ... function useColors (line 379) | function useColors(): ColorPalette { function getColors (line 385) | function getColors(isDark: boolean): ColorPalette { FILE: src/shared/types.ts type InitEvent (line 3) | interface InitEvent { type StreamEvent (line 20) | interface StreamEvent { type StreamSubEvent (line 28) | type StreamSubEvent = type ContentBlock (line 36) | interface ContentBlock { type ContentDelta (line 44) | type ContentDelta = type AssistantEvent (line 48) | interface AssistantEvent { type AssistantMessagePayload (line 56) | interface AssistantMessagePayload { type RateLimitEvent (line 65) | interface RateLimitEvent { type ResultEvent (line 76) | interface ResultEvent { type UsageData (line 95) | interface UsageData { type PermissionEvent (line 103) | interface PermissionEvent { type ClaudeEvent (line 113) | type ClaudeEvent = InitEvent | StreamEvent | AssistantEvent | RateLimitE... type UnknownEvent (line 115) | interface UnknownEvent { type TabStatus (line 122) | type TabStatus = 'connecting' | 'idle' | 'running' | 'completed' | 'fail... type PermissionRequest (line 124) | interface PermissionRequest { type Attachment (line 132) | interface Attachment { type TabState (line 144) | interface TabState { type Message (line 175) | interface Message { type RunResult (line 185) | interface RunResult { type NormalizedEvent (line 195) | type NormalizedEvent = type RunOptions (line 211) | interface RunOptions { type TabRegistryEntry (line 228) | interface TabRegistryEntry { type HealthReport (line 239) | interface HealthReport { type EnrichedError (line 250) | interface EnrichedError { type SessionMeta (line 263) | interface SessionMeta { type SessionLoadMessage (line 271) | interface SessionLoadMessage { type PluginStatus (line 280) | type PluginStatus = 'not_installed' | 'checking' | 'installing' | 'insta... type CatalogPlugin (line 282) | interface CatalogPlugin { constant IPC (line 299) | const IPC = {