Inkdown
Start writing

Claude-Code

62 filesยท4 subfolders

Shared Workspace

Claude-Code
codex

02-state-management

Shared from "Claude-Code" on Inkdown

State Management Architecture

Overview

Claude Code uses a centralized store pattern for state management, similar to Zustand or Redux but custom-built. State is immutable and updates flow through a single pipeline.

Plain text
0000_start_here_index_and_recommended_reading_order.md
0100_project_overview_tech_stack_runtime_modes_and_folder_map.md
0200_startup_flow_entry_points_and_cold_start_sequence.md
0300_codebase_modules_layers_state_models_and_schemas.md
0400_system_architecture_and_design_rationale.md
0500_interactive_repl_request_flow_end_to_end.md
0600_headless_sdk_and_print_mode_request_flow_end_to_end.md
0700_mcp_integration_connection_and_tool_call_flow.md
0800_external_services_sdks_storage_and_local_dependencies.md
0900_environment_variables_settings_feature_flags_and_failure_modes.md
1000_non_obvious_patterns_gotchas_and_debugging_traps.md
1100_full_codebase_file_inventory_grouped_by_directory.md
kimi
00-overview.md
01-entrypoints.md
02-state-management.md
03-query-system.md
04-tools-system.md
05-tasks-system.md
06-ui-components.md
07-bridge-remote.md
08-services.md
09-skills-plugins.md
10-commands.md
11-testing-architecture.md
12-permission-system.md
13-build-system.md
14-ink-internals.md
15-git-internals.md
16-context-compaction.md
17-vim-mode.md
18-mailbox-notifications.md
19-session-persistence.md
20-hooks-system.md
21-error-recovery.md
README.md
qwen
00-overview.md
01-entry-points.md
02-query-engine.md
03-tools-and-tasks.md
04-commands-and-skills.md
05-state-management.md
06-ink-rendering.md
07-bridge-remote.md
08-mcp-services.md
09-services-overview.md
10-multi-agent.md
11-system-prompt-constants.md
12-tool-interface.md
13-memory-system.md
14-buddy-companion.md
15-keybindings.md
16-stop-hooks.md
17-vim-mode.md
18-upstreamproxy.md
19-cost-tracking-history.md
20-contexts-styles-onboarding.md
21-hooks.md
22-screens.md
tweets-explain
claude-code-memory-analysis.md
compact
memory-system
agentic-architecture

Core State Files

FilePurpose
state/AppStateStore.tsState type definitions + default state
state/AppState.tsxReact provider + useAppState hook
state/store.tsStore implementation (subscribe/getState/setState)
bootstrap/state.tsPre-React bootstrap state

AppState Structure

TypeScript

Store Implementation

The Store Pattern
TypeScript
Why Not Redux/Zustand?

Custom store provides:

  • Full control over update semantics
  • Deep immutable types for safety
  • Synchronous updates (no async middleware complexity)
  • React-agnostic core (works in non-React contexts like headless)

Using State in Components

Reading State: useAppState
TypeScript
Updating State: useSetAppState
TypeScript
Store Access (Non-React)
TypeScript

Deep Immutability

Claude Code uses DeepImmutable types for safety:

TypeScript

This prevents accidental mutations at compile time.


Message State (Conversation History)

Messages are the primary source of truth for conversation state.

Message Types
TypeScript
Message Pipeline
Plain text

Task State

Background tasks have their own state machine:

TypeScript
Task State Flow
Plain text
Why Disk-Backed?

Tasks write output to files on disk (outputFile), not memory:

  • Prevents memory bloat from long-running tasks
  • Survives process restarts
  • Can be streamed incrementally

Permission State

TypeScript
Permission Modes
ModeDescription
defaultAsk for dangerous tools
autoAllow after automated safety checks
bypassAllow everything (use with caution!)

MCP State

Model Context Protocol servers have state:

TypeScript

MCP tools are merged into the main tool list dynamically.


Speculation State

Smart suggestions use a speculation system:

TypeScript

This lets Claude "think ahead" and pre-compute responses.


State Persistence

Session Storage
TypeScript

Conversations are saved to ~/.claude/sessions/{sessionId}.jsonl

Settings Storage
TypeScript

Stored in ~/.claude/config.json


State Update Patterns

1. Simple Update
TypeScript
2. Nested Update
TypeScript
3. Task Update
TypeScript
4. Message Append
TypeScript

State Flow Diagram

Plain text

Common State-Related Bugs

1. Stale Closures
TypeScript
2. Mutation in Update
TypeScript
3. Selector Creating Objects
TypeScript

Key Takeaways

  1. Single Store: All state in one tree, one source of truth
  2. Immutable Updates: Always create new objects/arrays
  3. Selective Subscriptions: Use specific selectors to avoid re-renders
  4. Disk-Backed Tasks: Long output goes to files, not memory
  5. Messages Are Primary: Conversation state == message array
  6. Deep Immutable Types: Compile-time protection against mutations

Related Documentation

  • Query System - How state flows to/from API
  • Tools System - How tools update state
  • Tasks System - Background task state