Core Package
The @dexwox-labs/a2a-core
package provides the foundational types, utilities, and protocol definitions for the A2A Node SDK.
Overview
The core package includes essential components for A2A protocol implementation:
- Protocol Types - Core interfaces and types for A2A communication
- Error Classes - Specialized error types for A2A operations
- Validation - Zod schemas for runtime validation
- Utilities - Helper functions for working with A2A data
Installation
npm install @dexwox-labs/a2a-core
# or
npm install @dexwox-labs/a2a-node # includes all packages
Core Types
AgentCard
AgentCard - Describes an agent’s metadata and capabilities.
interface AgentCard {
id: string; // Unique agent identifier
name: string; // Human-readable name
description?: string; // Agent description
version: string; // Agent version
capabilities: string[]; // List of capabilities
endpoint: string; // Agent endpoint URL
metadata?: Record<string, any>; // Additional metadata
}
Task
Task - Represents a unit of work for agents to process.
interface Task {
id: string; // Unique task identifier
name: string; // Task name/type
description?: string; // Task description
status: TaskStatus; // Current status
input?: any; // Task input data
result?: any; // Task result (when completed)
error?: string; // Error message (when failed)
artifacts?: Artifact[]; // Generated artifacts
createdAt: string; // ISO 8601 timestamp
updatedAt: string; // ISO 8601 timestamp
transitions?: TaskTransition[]; // Status history
}
type TaskStatus = 'submitted' | 'working' | 'completed' | 'failed' | 'canceled';
Message
Message - Represents communication between agents.
interface Message {
id: string; // Unique message identifier
conversationId?: string; // Conversation grouping
senderId: string; // Sender agent ID
recipientId: string; // Recipient agent ID
parts: MessagePart[]; // Message content parts
timestamp: string; // ISO 8601 timestamp
metadata?: Record<string, any>; // Additional metadata
}
TaskTransition
TaskTransition - Records task state changes.
interface TaskTransition {
status: TaskStatus; // New status
description?: string; // Transition description
timestamp: string; // ISO 8601 timestamp
metadata?: Record<string, any>; // Additional metadata
}
Error Classes
The core package provides specialized error classes for different A2A operations:
A2AError
A2AError - Base error class for all A2A-related errors.
class A2AError extends Error {
constructor(
public code: string,
message: string,
public details?: any
) {
super(message);
this.name = 'A2AError';
}
}
Task Errors
- TaskNotFoundError - Task with specified ID not found
- TaskAlreadyCompletedError - Task is already completed
- TaskCanceledError - Task was canceled
- TaskFailedError - Task execution failed
- InvalidTaskStateError - Invalid task state transition
Usage Example
import {
A2AError,
TaskNotFoundError,
TaskFailedError
} from '@dexwox-labs/a2a-core';
try {
await processTask(taskId);
} catch (error) {
if (error instanceof TaskNotFoundError) {
console.log('Task not found:', error.taskId);
} else if (error instanceof TaskFailedError) {
console.log('Task failed:', error.message);
} else if (error instanceof A2AError) {
console.log('A2A Error:', error.code, error.message);
} else {
console.log('Unexpected error:', error);
}
}
Error Codes
Task Error Codes
TaskErrorCode - Enumeration of task-related error codes.
enum TaskErrorCode {
TASK_NOT_FOUND = 'TASK_NOT_FOUND',
TASK_ALREADY_COMPLETED = 'TASK_ALREADY_COMPLETED',
TASK_ALREADY_CANCELED = 'TASK_ALREADY_CANCELED',
INVALID_TASK_STATE = 'INVALID_TASK_STATE',
TASK_TIMEOUT = 'TASK_TIMEOUT',
TASK_EXECUTION_FAILED = 'TASK_EXECUTION_FAILED'
}
Message Error Codes
MessageErrorCode - Enumeration of message-related error codes.
enum MessageErrorCode {
AGENT_NOT_FOUND = 'AGENT_NOT_FOUND',
INVALID_MESSAGE_FORMAT = 'INVALID_MESSAGE_FORMAT',
MESSAGE_TOO_LARGE = 'MESSAGE_TOO_LARGE',
RATE_LIMIT_EXCEEDED = 'RATE_LIMIT_EXCEEDED'
}
Artifact Error Codes
ArtifactErrorCode - Enumeration of artifact-related error codes.
enum ArtifactErrorCode {
ARTIFACT_NOT_FOUND = 'ARTIFACT_NOT_FOUND',
ARTIFACT_TOO_LARGE = 'ARTIFACT_TOO_LARGE',
INVALID_ARTIFACT_TYPE = 'INVALID_ARTIFACT_TYPE',
ARTIFACT_PROCESSING_FAILED = 'ARTIFACT_PROCESSING_FAILED'
}
Validation
The core package uses Zod for runtime validation of A2A protocol data.
Schema Validation
import { z } from 'zod';
// Agent Card validation
const AgentCardSchema = z.object({
id: z.string().min(1),
name: z.string().min(1),
description: z.string().optional(),
version: z.string().min(1),
capabilities: z.array(z.string()),
endpoint: z.string().url(),
metadata: z.record(z.any()).optional()
});
// Task validation
const TaskSchema = z.object({
id: z.string().min(1),
name: z.string().min(1),
description: z.string().optional(),
status: z.enum(['submitted', 'working', 'completed', 'failed', 'canceled']),
input: z.any().optional(),
result: z.any().optional(),
error: z.string().optional(),
artifacts: z.array(ArtifactSchema).optional(),
createdAt: z.string().datetime(),
updatedAt: z.string().datetime(),
transitions: z.array(TaskTransitionSchema).optional()
});
// Message validation
const MessageSchema = z.object({
id: z.string().min(1),
conversationId: z.string().optional(),
senderId: z.string().min(1),
recipientId: z.string().min(1),
parts: z.array(MessagePartSchema),
timestamp: z.string().datetime(),
metadata: z.record(z.any()).optional()
});
Validation Usage
import { AgentCardSchema, TaskSchema, MessageSchema } from '@dexwox-labs/a2a-core';
// Validate agent card
try {
const validAgentCard = AgentCardSchema.parse(agentCardData);
console.log('Valid agent card:', validAgentCard);
} catch (error) {
console.error('Invalid agent card:', error.errors);
}
// Validate task
try {
const validTask = TaskSchema.parse(taskData);
console.log('Valid task:', validTask);
} catch (error) {
console.error('Invalid task:', error.errors);
}
// Validate message
try {
const validMessage = MessageSchema.parse(messageData);
console.log('Valid message:', validMessage);
} catch (error) {
console.error('Invalid message:', error.errors);
}
Utilities
Message Utilities
import { createTextMessage, createFileMessage, createDataMessage } from '@dexwox-labs/a2a-core';
// Create different types of message parts
const textPart = createTextMessage('Hello, world!');
const filePart = createFileMessage(fileBuffer, 'image/png', 'screenshot.png');
const dataPart = createDataMessage({ temperature: 72, humidity: 45 });
// Combine into a message
const messageParts = [textPart, filePart, dataPart];
Task Utilities
import { createTask, updateTaskStatus, isTaskComplete } from '@dexwox-labs/a2a-core';
// Create a new task
const task = createTask({
name: 'process-data',
description: 'Process the uploaded data file',
input: { fileId: 'file-123' }
});
// Update task status
const updatedTask = updateTaskStatus(task, 'working');
// Check if task is complete
if (isTaskComplete(task)) {
console.log('Task completed with result:', task.result);
}
Validation Utilities
import { validateAgentCard, validateTask, validateMessage } from '@dexwox-labs/a2a-core';
// Validate data with utility functions
const isValidAgent = validateAgentCard(agentData);
const isValidTask = validateTask(taskData);
const isValidMessage = validateMessage(messageData);
// These functions return boolean values for quick validation
if (!isValidAgent) {
throw new Error('Invalid agent card format');
}
Type Guards
import {
isAgentCard,
isTask,
isMessage,
isTaskComplete,
isTaskFailed
} from '@dexwox-labs/a2a-core';
// Type guards for runtime type checking
function processData(data: unknown) {
if (isAgentCard(data)) {
// TypeScript knows data is AgentCard
console.log('Agent:', data.name);
} else if (isTask(data)) {
// TypeScript knows data is Task
console.log('Task:', data.name, data.status);
if (isTaskComplete(data)) {
console.log('Result:', data.result);
} else if (isTaskFailed(data)) {
console.log('Error:', data.error);
}
} else if (isMessage(data)) {
// TypeScript knows data is Message
console.log('Message from:', data.senderId);
}
}
Constants
import {
DEFAULT_TASK_TIMEOUT,
MAX_MESSAGE_SIZE,
SUPPORTED_ARTIFACT_TYPES,
PROTOCOL_VERSION
} from '@dexwox-labs/a2a-core';
// Use predefined constants
const taskConfig = {
timeout: DEFAULT_TASK_TIMEOUT, // 300000 (5 minutes)
maxRetries: 3
};
const messageConfig = {
maxSize: MAX_MESSAGE_SIZE, // 10MB
supportedTypes: SUPPORTED_ARTIFACT_TYPES
};
console.log('A2A Protocol Version:', PROTOCOL_VERSION); // "1.0"
Advanced Usage
Custom Error Classes
import { A2AError } from '@dexwox-labs/a2a-core';
class CustomAgentError extends A2AError {
constructor(message: string, public agentId: string) {
super('CUSTOM_AGENT_ERROR', message, { agentId });
this.name = 'CustomAgentError';
}
}
// Usage
throw new CustomAgentError('Agent configuration invalid', 'agent-123');
Schema Extensions
import { z } from 'zod';
import { AgentCardSchema } from '@dexwox-labs/a2a-core';
// Extend base schemas for custom requirements
const ExtendedAgentCardSchema = AgentCardSchema.extend({
customField: z.string().optional(),
priority: z.number().min(1).max(10).default(5)
});
// Use extended schema
const customAgentCard = ExtendedAgentCardSchema.parse(agentData);
Next Steps
- Client Package - Learn about client implementations
- Server Package - Learn about server implementations
- Protocol Specification - Understanding the A2A protocol
- Examples - See real-world implementations