Skip to content

Event Types ​

kayak-lab defines 58 event types across 13 categories. Every event conforms to the BaseEvent interface.

BaseEvent ​

typescript
interface BaseEvent {
  event_id: string;           // UUID
  session_id: string;         // Session this event belongs to
  sequence_number: number;    // Monotonically increasing within session
  timestamp: string;          // ISO 8601
  event_type: EventType;      // One of the 58 event types
  schema_version: number;     // Schema version for migration
  payload: Record<string, unknown>;  // Event-specific data
  metadata: {
    source: string;           // Origin component
    correlation_id?: string;  // Links related events
    user_id?: string;         // User who triggered this
  };
}

Session Events ​

Lifecycle events for agent sessions.

EventPayloadDescription
session.created{ state: "active", description? }New session started
session.resumed{ state: "active" }Paused session resumed
session.paused{ state: "paused" }Active session paused
session.completed{ state: "completed" }Session finished successfully
session.failed{ state: "failed", error? }Session failed with error
session.cancelled{ state: "cancelled" }Session cancelled by user
session.attestation{ session_id, timestamp, duration_ms, models, total_cost_usd, ... }Session attestation with cost tracking and performance metrics

State Transitions ​

Agent Events ​

Agent loop execution events.

EventPayloadDescription
agent.thinking{ reasoning }Agent is reasoning about input
agent.decision{ decision, rationale }Agent decided on an action
agent.tool_invocation{ tool_name, arguments }Agent is invoking a tool

Tool Events ​

Tool execution tracking.

EventPayloadDescription
tool.execution.started{ tool_call_id, tool_name, arguments }Tool execution began
tool.execution.completed{ tool_call_id, result, duration_ms }Tool execution succeeded
tool.execution.failed{ tool_call_id, error, duration_ms }Tool execution failed

Model Events ​

Model provider interaction.

EventPayloadDescription
model.request{ messages, model?, temperature? }Request sent to model
model.response{ content, tool_calls, finish_reason }Model response received
model.stream.delta{ content?, tool_calls?, finish_reason? }Streaming delta chunk

UI Events ​

User interaction events.

EventPayloadDescription
ui.user.input{ text, source }User sent input to agent
ui.display.update{ content, format }Agent updated display
ui.action{ action, parameters }User triggered an action

Policy Events ​

Policy enforcement (planned).

EventPayloadDescription
policy.approval{ action, approver }Action approved by policy
policy.denial{ action, reason }Action denied by policy
policy.constraint{ constraint, scope }Policy constraint applied

Context Events ​

Context management.

EventPayloadDescription
context.window.updated{ messages_added, messages_trimmed }Context window modified
context.state.changed{ key, old_value, new_value }Context state changed

Self-Observation Events ​

Agent self-awareness and pattern detection.

EventPayloadDescription
agent.self_observed{ observation_type, data, source_session_id }Agent observed its own behavior
agent.pattern_detected{ pattern_id, confidence, description, session_ids }Agent detected a recurring pattern

Tool Calling Protocol Events ​

Structured tool invocation and results through the new tool calling protocol.

EventPayloadDescription
tool.call.invocationToolInvocationPayloadTool call initiated by the agent
tool.call.resultToolResultPayloadTool call result returned

Tool Authoring Events ​

Tool creation, proposal, and review lifecycle.

EventPayloadDescription
tool.authored.proposedToolAuthoredPayloadNew tool proposed for review
tool.authored.createdToolAuthoredPayloadTool accepted and created
tool.authored.rejectedToolAuthoredPayloadTool proposal rejected

Tool Self-Improvement Events ​

Automated tool optimization and improvement suggestions.

EventPayloadDescription
tool.improvement.suggestedToolImprovementPayloadImprovement suggestion generated
tool.improvement.auto_createdToolImprovementPayloadImprovement auto-accepted and tool created
tool.improvement.auto_improvedToolImprovementPayloadExisting tool auto-improved

MCP Events ​

Model Context Protocol client and server lifecycle events.

EventPayloadDescription
mcp.connected{ server_name, transport_type }MCP server connection established
mcp.disconnected{ server_name, reason? }MCP server disconnected
mcp.tools_discovered{ server_name, tools: Tool[] }Tools discovered from MCP server
mcp.tool.invocation{ tool_name, parameters, server_name }MCP tool invocation started
mcp.tool.result{ tool_name, result, duration_ms, success }MCP tool invocation result
mcp.server.started{ server_name, transport_type }MCP server started
mcp.server.stopped{ server_name, reason? }MCP server stopped
mcp.server.tool.invocation{ tool_name, parameters, server_name }MCP server-side tool invocation
mcp.server.tool.result{ tool_name, result, duration_ms, success }MCP server-side tool result
mcp.tool.registered{ tool_name, server_name }MCP tool registered in registry
mcp.tool.unregistered{ tool_name, server_name }MCP tool unregistered from registry
mcp.tool.state_changed{ tool_name, old_state, new_state }MCP tool state changed
mcp.search{ query, filters }MCP tool search initiated
mcp.search.result{ query, results }MCP tool search results returned
mcp.error{ error, server_name?, operation }MCP error occurred

Memory Events ​

Memory subsystem operations and retrieval events.

EventPayloadDescription
memory.operation{ operation, memory_id?, backend }Memory operation initiated
memory.stored{ memory_id, backend, timestamp }Memory stored successfully
memory.fallback{ memory_id, primary_backend, fallback_backend }Memory fell back to secondary backend
memory.retrieved{ memory_id, query, score }Memory retrieved by query
memory.updated{ memory_id, field, old_value, new_value }Memory updated
memory.type{ memory_id, memory_type }Memory type classified
memory.shared{ memory_id, from_session, to_session }Memory shared between sessions
memory.search{ query, filters }Memory search initiated
memory.search.result{ query, results_count }Memory search results returned

Payload Interfaces ​

ToolInvocationPayload ​

typescript
interface ToolInvocationPayload {
  tool_name: string;
  parameters: Record<string, unknown>;
  tool_call_id: string;
  [key: string]: unknown;
}

ToolResultPayload ​

typescript
interface ToolResultPayload {
  tool_name: string;
  tool_call_id: string;
  exit_code: number;
  stdout: string;
  stderr: string;
  duration_ms: number;
  success: boolean;
  [key: string]: unknown;
}

ToolAuthoredPayload ​

typescript
interface ToolAuthoredPayload {
  tool_name: string;
  description: string;
  reason?: string;         // Rejection reason (rejected events only)
  [key: string]: unknown;
}

ToolImprovementPayload ​

typescript
interface ToolImprovementPayload {
  tool_name: string;
  description: string;
  [key: string]: unknown;
}

Using Event Types ​

Type Guards ​

typescript
import { isSessionEvent, isToolEvent, isModelEvent, isToolCallingEvent, isToolAuthoredEvent, isToolImprovementEvent } from "./src/types/events.ts";

if (isSessionEvent(event)) {
  // event.payload is typed as session event payload
}

if (isToolEvent(event)) {
  // event.payload is typed as tool event payload
}

if (isToolCallingEvent(event)) {
  // event.payload is typed as tool.call.invocation or tool.call.result
}

if (isToolAuthoredEvent(event)) {
  // event.payload is typed as tool.authored.* event
}

if (isToolImprovementEvent(event)) {
  // event.payload is typed as tool.improvement.* event
}

Filtering ​

typescript
const protocol = new ProjectionProtocol(stream);

// Subscribe only to tool events
const sub = protocol.subscribe(sessionId, (event) => {
  console.log(`Tool: ${event.payload.tool_name}`);
}, {
  filter: {
    event_types: [
      "tool.execution.started",
      "tool.execution.completed",
      "tool.execution.failed",
    ],
  },
});

Schema Versioning ​

All events carry a schema_version field. When event schemas change:

  1. Additive changes (new optional fields) — bump minor version, backward compatible
  2. Breaking changes (removed/renamed fields) — bump major version, requires migration

Current schema version: 1

Released under the ISC License.