Data Models
All TypeScript interfaces used across the Estuary SDK.
Session
SessionInfo
Returned by connect() and emitted with the connected event.
interface SessionInfo {
sessionId: string; // Unique session identifier
conversationId: string; // Persistent conversation ID for this player-character pair
characterId: string; // The character (agent) ID
playerId: string; // The player identifier
}
Responses
BotResponse
Emitted by the botResponse event. Represents a streaming text response from the character.
interface BotResponse {
text: string; // Accumulated response text so far
isFinal: boolean; // true when the response is complete
partial: string; // Text content of just this chunk
messageId: string; // Unique message identifier
chunkIndex: number; // Sequential chunk index (starts at 0)
isInterjection: boolean; // true if proactive (not a reply to user input)
}
BotVoice
Emitted by the botVoice event. Contains a chunk of voice audio (WebSocket transport) or playback metadata (LiveKit transport).
interface BotVoice {
audio?: string; // Base64-encoded PCM audio data. Omitted for LiveKit metadata events.
messageId: string; // Message this audio belongs to
chunkIndex: number; // Sequential audio chunk index
isFinal?: boolean; // true if this is the last audio chunk
isLivekit?: boolean; // true when this is a LiveKit metadata event (audio is omitted; the
// bytes flow over the WebRTC track instead)
}
For the LiveKit transport, bot_voice events arrive as metadata-only (no audio field). The actual audio bytes are streamed as a WebRTC media track and played by the browser directly. Always guard against voice.audio being undefined if you handle this event yourself.
SttResponse
Emitted by the sttResponse event. Contains speech-to-text transcription.
interface SttResponse {
text: string; // Transcribed text
isFinal: boolean; // true if this is the final transcription
}
Events
InterruptData
Emitted by the interrupt event when a response is interrupted.
interface InterruptData {
messageId?: string; // ID of the interrupted message
reason?: string; // Reason for interruption
interruptedAt?: string; // ISO timestamp of the interruption
}
QuotaExceededData
Emitted by the quotaExceeded event.
interface QuotaExceededData {
message: string; // Human-readable quota message
current: number; // Current usage count
limit: number; // Usage limit
remaining: number; // Remaining quota
tier: string; // Account tier
}
CameraCaptureRequest
Emitted by the cameraCaptureRequest event when the server requests a camera image.
interface CameraCaptureRequest {
requestId: string; // ID to include when responding with sendCameraImage()
text?: string; // Optional prompt text from the server
}
CharacterAction
Emitted by the characterAction event. Represents a parsed action tag from a bot response.
interface CharacterAction {
name: string; // Action name (e.g., "navigate", "emote")
params: Record<string, string>; // All other tag attributes as key-value pairs
messageId: string; // Message ID of the bot response that contained this action
}
MemoryUpdatedEvent
Emitted by the memoryUpdated event when the server extracts memories from a conversation turn. Requires realtimeMemory: true in config.
interface MemoryUpdatedEvent {
agentId: string; // Character (agent) ID
playerId: string; // Player ID
memoriesExtracted: number; // Number of memories extracted this turn
factsExtracted: number; // Number of core facts extracted this turn
conversationId: string; // Conversation ID
newMemories: MemoryData[]; // Array of newly extracted memory objects
timestamp: string; // ISO timestamp
}
MemoryData
Individual memory object returned by the memory API and in MemoryUpdatedEvent.newMemories.
interface MemoryData {
id: string; // Unique memory ID
userId: string; // Owning user ID
agentId: string; // Character (agent) ID
playerId: string; // Player ID
content: string; // Memory content text
memoryType: string; // Type of memory (e.g., "episodic", "semantic")
confidence: number; // Confidence score (0-1)
status: string; // Memory status (e.g., "active")
sourceConversationId: string; // Conversation that produced this memory
sourceQuote?: string; // Original quote from conversation
source?: string; // Origin tag (e.g., extraction source)
topic?: string; // Primary memory topic
secondaryTopics?: string[]; // Additional topics
lastAccessedAt?: string | null; // ISO timestamp of last access
accessCount?: number; // Number of times this memory was retrieved
extractedAt?: string | null; // ISO timestamp of extraction
createdAt?: string | null; // ISO timestamp of creation
updatedAt?: string | null; // ISO timestamp of last update
}
LiveKitTokenResponse
Token data used internally by the LiveKit voice manager.
interface LiveKitTokenResponse {
token: string; // LiveKit access token
url: string; // LiveKit server URL
room: string; // Room name
}
Character
CharacterInfo
Returned by client.getCharacter().
interface CharacterInfo {
id: string;
name: string;
tagline: string | null;
avatar: string | null; // Avatar image URL
modelUrl: string | null; // 3D model (e.g., GLB) URL
modelPreviewUrl: string | null; // Preview render of the 3D model
modelStatus: string | null; // Generation/processing status
sourceImageUrl: string | null; // Source image used for generation
}
Sharing
ShareOpenResponse
Returned by EstuaryClient.openShare(). Contains everything needed to construct a session-token-authenticated client.
interface ShareOpenResponse {
sessionToken: string; // Pass to EstuaryConfig.sessionToken (starts with "sst_")
characterId: string; // Pass to EstuaryConfig.characterId
playerId: string; // Pass to EstuaryConfig.playerId
serverUrl: string; // Pass to EstuaryConfig.serverUrl
character: CharacterInfo & { personality?: string | null }; // Character details for UI
}
Memory Types
MemoryListOptions
Options for client.memory.getMemories().
interface MemoryListOptions {
memoryType?: string; // Filter by memory type
status?: string; // Filter by status (e.g., 'active')
limit?: number; // Max results to return
offset?: number; // Pagination offset
sortBy?: 'created_at' | 'confidence' | 'last_accessed_at'; // Sort field
sortOrder?: 'asc' | 'desc'; // Sort direction
}
MemoryListResponse
Response from client.memory.getMemories().
interface MemoryListResponse {
memories: MemoryData[]; // Array of memory objects
total: number; // Total matching memories
limit: number; // Limit applied
offset: number; // Offset applied
}
MemoryTimelineOptions
Options for client.memory.getTimeline().
interface MemoryTimelineOptions {
startDate?: string; // ISO date string for range start
endDate?: string; // ISO date string for range end
groupBy?: 'day' | 'week' | 'month'; // Grouping period
}
MemoryTimelineResponse
Response from client.memory.getTimeline().
interface MemoryTimelineResponse {
timeline: {
date: string;
memories: MemoryData[];
}[];
totalMemories: number; // Total memories across all groups
groupBy: string; // Grouping used
}
MemoryGraphOptions
Options for client.memory.getGraph().
interface MemoryGraphOptions {
includeEntities?: boolean; // Include entity nodes
includeCharacterMemories?: boolean; // Include character's own memories
}
MemoryGraphNode
interface MemoryGraphNode {
id: string;
type: 'user' | 'cluster' | 'memory' | 'entity';
label?: string;
// Cluster fields
level?: number;
memoryCount?: number;
typeDistribution?: Record<string, number>;
expanded?: boolean;
parentClusterId?: string | null;
childClusterIds?: string[];
labelPending?: boolean;
// Memory fields
memoryType?: string;
content?: string;
confidence?: number;
clusterId?: string;
sourceQuote?: string | null;
sourceConversationId?: string | null;
createdAt?: string | null;
accessCount?: number;
// Entity fields
entityType?: string | null;
name?: string;
mentionCount?: number;
extraData?: Record<string, string>;
}
MemoryGraphEdge
interface MemoryGraphEdge {
source: string; // Source node id
target: string; // Target node id
type: 'has_cluster' | 'contains' | 'mentions' | 'relationship';
relationshipType?: string;
label?: string | null;
confidence?: number;
}
MemoryGraphResponse
Response from client.memory.getGraph().
interface MemoryGraphResponse {
nodes: MemoryGraphNode[];
edges: MemoryGraphEdge[];
stats: {
totalMemories: number;
totalEntities: number;
clusterCount: number;
clusters: Record<string, number>; // Memories per cluster id
};
stale?: boolean; // true if a fresh graph build is in progress
}
MemorySearchOptions
Options for client.memory.search().
interface MemorySearchOptions {
query: string; // Natural language search query
limit?: number; // Max results
}
MemorySearchResponse
Response from client.memory.search().
interface MemorySearchResponse {
results: {
memory: MemoryData; // The matching memory
score: number; // Relevance score
similarityScore: number; // Semantic similarity score
}[];
query: string; // Original query
total: number; // Total matches
}
CoreFact
Individual core-fact object.
interface CoreFact {
id: string;
userId: string;
agentId: string;
playerId: string;
factKey: string; // Stable key (e.g., "favorite_color")
factValue: string; // Current value (e.g., "blue")
sourceMemoryId?: string | null; // Memory this fact was distilled from
createdAt?: string | null;
updatedAt?: string | null;
}
CoreFactsResponse
Response from client.memory.getCoreFacts().
interface CoreFactsResponse {
coreFacts: CoreFact[];
}
MemoryStatsResponse
Response from client.memory.getStats().
interface MemoryStatsResponse {
totalActive: number; // Active memories
totalSuperseded: number; // Memories replaced by newer info
totalDecayed: number; // Memories that have decayed out
byType: Record<string, number>; // Active count per memory type
coreFacts: number; // Total core facts
}