EdgeStream
@edge-stream/agent-messages
The agent messages package provides TypeScript types, topic constants, and pipeline hooks for Octopus agent chat messages — streaming tokens, tool calls, and turn completions over the agent.* namespace.
Installation
pnpm add @edge-stream/agent-messages
Key Exports
import {
AgentMessagePlugin, // IMessagePlugin implementation
AgentTopics, // topic constants
TokenStreamDecoderHook, // assembles streaming tokens into complete text
// TypeScript interfaces
type AgentTokenMessage,
type AgentTurnStartedMessage,
type AgentTurnCompletedMessage,
type AgentToolCallStartedMessage,
type AgentToolCallCompletedMessage,
type AgentErrorMessage,
} from '@edge-stream/agent-messages';
Topic Constants
import { AgentTopics } from '@edge-stream/agent-messages';
AgentTopics.TURN_STARTED // 'agent.chat.turnStarted'
AgentTopics.TOKEN // 'agent.chat.token'
AgentTopics.TURN_COMPLETED // 'agent.chat.turnCompleted'
AgentTopics.TOOL_CALL_STARTED // 'agent.chat.toolCallStarted'
AgentTopics.TOOL_CALL_COMPLETED // 'agent.chat.toolCallCompleted'
AgentTopics.ERROR // 'agent.chat.error'
AgentTopics.NAMESPACE_PATTERN // 'agent.*'
TokenStreamDecoderHook
The package includes a specialized hook that assembles streaming tokens into a coherent text buffer before delivery to subscribers — ideal for chat UIs that want the complete assembled text rather than individual tokens:
import { TokenStreamDecoderHook } from '@edge-stream/agent-messages';
const chatServer = stream.server('chat')!;
// TokenStreamDecoderHook:
// - Accumulates tokens per (sessionId, turnId)
// - On token: appends to buffer, delivers partial text to subscribers
// - On isLast=true: delivers complete assembled text, clears buffer
chatServer.incomingPipeline.addHook(new TokenStreamDecoderHook());
Setup
import { AgentMessagePlugin, AgentTopics, TokenStreamDecoderHook } from '@edge-stream/agent-messages';
const plugin = new AgentMessagePlugin();
// Register default hooks
plugin.createDefaultHooks().forEach(hook =>
chatServer.incomingPipeline.addHook(hook)
);
// Or add TokenStreamDecoderHook manually
chatServer.incomingPipeline.addHook(new TokenStreamDecoderHook());
// Type-safe subscription
stream.subscribe<AgentTokenMessage>('chat', AgentTopics.TOKEN, (envelope) => {
const { token, turnId, isLast } = envelope.body;
chatStore.appendToken(turnId, token, isLast);
});