SNA

React Components と Store

Bundled UI component と chat store export です。

React Components と Store

完成済みの chat panel を使う場合、または SNA primitive から独自 panel を組み立てる場合に使うサーフェスです。

サーフェス目的
SnaChatUIagent auto-start を含む floating chat UI です。Props: children, defaultOpen?, dangerouslySkipPermissions?
ChatPanelmain chat panel shell です。
ChatHeaderpanel header です。
MessageBubblemessage renderer です。
ChatInputinput composer です。
ToolUseCardtool-use visualization です。
ThinkingCardthinking block renderer です。
TypingIndicatorassistant progress indicator です。
ResizeHandleside-by-side panel resize handle です。
useChatStorechat UI state と保存済み message hydration を扱う Zustand store です。

SnaChatUI は peer dependency として @radix-ui/react-tooltip を必要とし、SnaProvider の下で render する必要があります。

Import paths

import { SnaChatUI } from "@sna-sdk/react/components/sna-chat-ui";
import { ChatPanel, ChatInput, MessageBubble } from "@sna-sdk/react/components/chat";
import { useChatStore } from "@sna-sdk/react/stores/chat-store";

SnaChatUI

SnaChatUI は application content を包み、built-in panel layout を管理します。

<SnaProvider connection={sna.connection}>
  <SnaChatUI defaultOpen={false}>
    <App />
  </SnaChatUI>
</SnaProvider>
PropDefault説明
childrenrequiredMain application content。Desktop side-by-side mode では chat panel の横に配置されます。
defaultOpenfalselocalStorage["sna-chat-panel"] がまだない場合の initial open state。
dangerouslySkipPermissionsfalseAgent を permissionMode: "bypassPermissions" で開始します。信頼できる local flow だけで使ってください。

Runtime behavior:

項目説明
Agent startupMount 時に runtime id claude-codePOST /agent/start?session=<runtime session> を呼びます。
Loading stateStartup request が resolve または fail するまで full-screen connecting overlay を表示します。
Open stateuseChatStore.isOpen を使います。Panel が閉じている場合は floating button が出ます。
Keyboard shortcutCmd/Ctrl + . で panel を toggle します。
LayoutuseResponsiveChat を使います。Desktop は side-by-side、tablet は overlay、mobile は fullscreen です。
Tooltip providerChildren を @radix-ui/react-tooltip provider で包みます。

Composable chat components

Host が独自 shell、routing、control を持ちたい場合は lower-level component を使ってください。

Component責務
ChatPanelSession 用 full panel composition。
ChatHeaderSession header と panel control。
ChatInputMessage 送信用 text input composer。
MessageBubbleUser、assistant、status、error、thinking、tool、tool result message を render します。
ToolUseCardTool input/output metadata を表示します。
ThinkingCardThinking block を表示します。
ResizeHandleSide-by-side panel width を調整します。
TooltipChat UI が使う tooltip primitive wrapper。

useChatStore

Chat store は UI state と session ごとの message cache を所有します。

State/action説明
isOpen, setOpen, togglePanel open state。
width, setWidthDesktop panel width。320 から 520 の範囲に clamp されます。
activeSessionId, setActiveSession現在の chat session。Session を切り替えると message を lazy-load します。
sessionsSession ごとの message と processed event ID。
initSession, removeSessionLocal store state を作り、chat session create/delete を server に mirror します。default session は削除できません。
addMessage, clearMessagesLocal message を更新します。Clear は server-side message deletion も要求します。
markEventProcessedCursor を基準に streamed event を dedupe し、set が大きくなると古い値を減らします。
hydrate/chat/sessions から chat session metadata を取得します。Message は lazy-load されます。
fetchSessionMessages/chat/sessions/<id>/messages を session ごとに 1 回取得します。

SnaProvider は store API URL を設定し、デフォルトで hydrate() を呼びます。Bundled chat store が不要で hook や custom UI だけを使う場合は、SnaProviderhydrate={false} を渡してください。

目次