Portal Community

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);
});