SNA

React hooks

useAgent, useSessionManager, useResponsiveChat의 입력과 반환값.

React hooks

React hook은 SNA HTTP API를 직접 사용합니다. 기본적으로 SnaProviderapiUrlsessionId를 읽지만, custom routing이 필요한 host는 hook option으로 override할 수 있습니다.

useAgent(options?)

Signature

declare function useAgent(options?: {
  sessionId?: string;
  baseUrl?: string;
  provider?: string;
  permissionMode?: string;
  reasoningLevel?: 0 | 1 | 2 | 3 | 4 | 5;
  providerOptions?: Record<string, unknown>;
  onEvent?: (event: AgentEvent) => void;
  onThinking?: (event: AgentEvent) => void;
  onAssistant?: (event: AgentEvent) => void;
  onToolResult?: (event: AgentEvent) => void;
  onComplete?: (event: AgentEvent) => void;
  onError?: (event: AgentEvent) => void;
  onInit?: (event: AgentEvent) => void;
}): UseAgentResult;

Returns

{
  connected: boolean;
  alive: boolean;
  start: (prompt?: string) => Promise<any>;
  send: (message: string) => Promise<any>;
  kill: () => Promise<void>;
  completion: (opts: {
    prompt: string;
    model?: string;
    systemPrompt?: string;
    reasoningLevel?: 0 | 1 | 2 | 3 | 4 | 5;
    providerOptions?: Record<string, unknown>;
  }) => Promise<any>;
}

Options

FieldDefault설명
sessionIdcontext sessionId연결할 agent session입니다.
baseUrl${apiUrl}/agentagent HTTP API base URL입니다.
providerclaude-codestart/completion에 사용할 runtime id입니다.
permissionModeruntime defaulttool permission mode입니다.
reasoningLevelruntime defaultruntime-neutral reasoning effort입니다.
providerOptionsnone런타임별 option입니다. Codex의 serviceTier, profile, config 등을 전달합니다.

동작

항목설명
Event transport/agent/events?session=<id>&since=<cursor>EventSource를 엽니다.
Cursor 처리먼저 /agent/status를 읽고 현재 event count부터 시작하므로 initial mount에서 과거 event를 건너뜁니다.
ReconnectSSE error가 발생하면 stream을 닫고 3000ms 뒤 다시 연결합니다.
Runtime defaultprovider 기본값은 claude-code입니다.
Session defaultsessionIdSnaContext에서 오며, SnaProvider의 기본값은 default입니다.
alive초기화 중 /agent/status로 설정하고, start 또는 send가 local에서 성공하면 optimistic하게 true로 둡니다.

Methods

MethodHTTP routeNotes
start(prompt?)POST /agent/start?session=<id>provider, prompt, permissionMode, reasoningLevel, providerOptions를 보냅니다.
send(message)POST /agent/send?session=<id>Plain text message를 보냅니다. 이 hook은 image attachment를 노출하지 않으므로 multimodal send는 SnaClient.agent.send를 사용하십시오.
kill()POST /agent/kill?session=<id>Runtime을 중지하고 alivefalse로 설정합니다.
completion(opts)POST /agent/completionHook의 provider와 reasoning default를 사용해 stateless completion request를 보냅니다.

Event callbacks

onEvent는 parsed AgentEvent를 모두 받습니다. 더 좁은 callback은 event type별 convenience filter입니다.

CallbackEvent type
onInitinit
onThinkingthinking
onAssistantassistant
onToolResulttool_result
onCompletecomplete
onErrorerror

이 hook은 SnaClient를 감싸지 않고 WebSocket subscription도 사용하지 않습니다. Permission push handling, runOnceStream, message history pagination, WebSocket reconnect resubscription이 필요하면 @sna-sdk/client를 사용하십시오.

useSessionManager(pollInterval?)

Signature

declare function useSessionManager(pollInterval?: number): UseSessionManagerResult;

Returns:

{
  sessions: SessionInfo[];
  loading: boolean;
  createSession: (opts?: { label?: string; cwd?: string }) => Promise<string | null>;
  killSession: (id: string) => Promise<void>;
  deleteSession: (id: string) => Promise<void>;
  refresh: () => Promise<void>;
}

pollInterval 기본값은 3000이며 polling을 끄려면 0을 전달합니다.

MethodRouteNotes
refresh()GET /agent/sessionsSerialized response가 바뀐 경우에만 local state를 교체합니다.
createSession(opts?)POST /agent/sessions{ label?, cwd? }를 받고 새 session ID 또는 null을 반환합니다.
killSession(id)POST /agent/kill?session=<id>Agent process를 중지하지만 session record는 유지합니다.
deleteSession(id)DELETE /agent/sessions/<id>Server에 요청해 session record를 삭제합니다.

단순 React state가 필요하면 이 hook을 사용하십시오. WebSocket snapshot, metadata update, 더 엄격한 command acknowledgement가 필요하면 SnaClient.sessions를 사용하십시오.

useResponsiveChat()

Signature

declare function useResponsiveChat(): { mode: "side-by-side" | "overlay" | "fullscreen" };
WidthModeMeaning
>= 1024pxside-by-sidemain content 옆에 chat panel을 둡니다.
768px - 1023pxoverlaycontent 위에 chat panel을 띄웁니다.
< 768pxfullscreenchat이 viewport 전체를 덮습니다.

목차