AppState 全局状态
概述
AppState 是 Claude Code 的中央状态容器,包含 UI 状态、工具配置、MCP 连接、任务状态等所有运行时信息。
Source:
src/state/AppStateStore.ts(454 行),src/state/AppState.tsx(200 行)
AppState 类型
AppState 包含两类字段:
深层不可变字段
typescript
// Source: src/state/AppStateStore.ts:89-158
{
settings: SettingsJson
verbose: boolean
mainLoopModel: ModelSetting | null
statusLineText: string | undefined
isBriefOnly: boolean
toolPermissionContext: ToolPermissionContext
kairosEnabled: boolean
// 视图状态
expandedView: 'none' | 'tasks' | 'teammates'
viewSelectionMode: 'none' | 'selecting-agent' | 'viewing-agent'
footerSelection: FooterItem | null
// 远程会话
remoteSessionUrl?: string
remoteConnectionStatus?: string
remoteBackgroundTaskCount?: number
}可变字段
typescript
// Source: src/state/AppStateStore.ts:159-452
{
// 任务系统
tasks: { [taskId: string]: TaskState }
foregroundedTaskId?: string
// 代理名称注册
agentNameRegistry: Map<string, AgentId>
// MCP 服务器
mcp: {
clients: MCPServerConnection[]
tools: Tool[]
commands: Command[]
resources: MCPResource[]
}
// 插件
plugins: {
enabled: Plugin[]
disabled: Plugin[]
commands: Command[]
errors: string[]
}
// 推测执行
speculation: SpeculationState
// Computer Use
computerUseMcpState?: {
appAllowlist: string[]
grantedApps: string[]
screenshotDims: { width: number; height: number }
}
// 收件箱
inbox: {
messages: InboxMessage[]
}
}Provider 与 Hooks
Source:
src/state/AppState.tsx
AppStateProvider
tsx
const AppStateProvider = ({ initialState, onChangeAppState, children }) => {
const [store] = useState(() => createStore(initialState, onChangeAppState));
return (
<AppStoreContext.Provider value={store}>
{children}
</AppStoreContext.Provider>
);
};useAppState — 读取状态
typescript
// 选择性订阅,只在选中值变化时重渲染
function useAppState<R>(selector: (state: AppState) => R): R {
const store = useContext(AppStoreContext);
return useSyncExternalStore(
store.subscribe,
() => selector(store.getState()),
() => selector(store.getState()),
);
}使用 useSyncExternalStore(React 18+)实现外部 store 集成,selector 基于 Object.is 判断是否需要重渲染。
useSetAppState — 写入状态
typescript
function useSetAppState(): (updater: (prev: AppState) => AppState) => void {
const store = useContext(AppStoreContext);
return store.setState;
// 只写入不订阅,组件不因状态变化而重渲染
}useAppStateMaybeOutsideOfProvider
typescript
function useAppStateMaybeOutsideOfProvider<R>(
selector: (state: AppState) => R
): R | undefined {
// 安全版本 — Provider 未挂载时返回 undefined
// 使用 NOOP_SUBSCRIBE 作为降级
}