@agent-relay/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,171 @@
1
+ # @agent-relay/sdk
2
+
3
+ Dead simple agent-to-agent communication.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @agent-relay/sdk @agent-relay/daemon
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { createRelay } from '@agent-relay/sdk';
15
+
16
+ // Start a relay (in-process daemon - no setup required)
17
+ const relay = await createRelay();
18
+
19
+ // Create agents
20
+ const alice = await relay.client('Alice');
21
+ const bob = await relay.client('Bob');
22
+
23
+ // Bob listens for messages
24
+ bob.onMessage = (from, { body }) => {
25
+ console.log(`${from}: ${body}`);
26
+ };
27
+
28
+ // Alice sends a message
29
+ alice.sendMessage('Bob', 'Hello!');
30
+
31
+ // When done
32
+ await relay.stop();
33
+ ```
34
+
35
+ That's it. No daemon to start, no config files, no setup.
36
+
37
+ ## Even Simpler: Two Agents
38
+
39
+ ```typescript
40
+ import { createPair } from '@agent-relay/sdk';
41
+
42
+ const { alice, bob, stop } = await createPair('alice', 'bob');
43
+
44
+ bob.onMessage = (from, { body }) => console.log(`${from}: ${body}`);
45
+ alice.sendMessage('bob', 'Hey!');
46
+
47
+ await stop();
48
+ ```
49
+
50
+ ## Features
51
+
52
+ | Feature | Description |
53
+ |---------|-------------|
54
+ | **Zero config** | Just import and go |
55
+ | **Auto-reconnect** | Handles disconnections automatically |
56
+ | **Message deduplication** | No duplicate deliveries |
57
+ | **Sync messaging** | Wait for acknowledgment |
58
+ | **Broadcast** | Send to all agents with `*` |
59
+ | **Channels** | Group messaging with `#channel` |
60
+
61
+ ## API Reference
62
+
63
+ ### createRelay(config?)
64
+
65
+ Creates a standalone relay with an in-process daemon.
66
+
67
+ ```typescript
68
+ const relay = await createRelay({
69
+ socketPath: '/tmp/my-relay.sock', // Optional custom socket
70
+ quiet: true, // Suppress logs (default: true)
71
+ });
72
+
73
+ // Create clients
74
+ const agent = await relay.client('MyAgent');
75
+
76
+ // Stop everything
77
+ await relay.stop();
78
+ ```
79
+
80
+ ### createPair(name1, name2, config?)
81
+
82
+ Shortcut to create two connected agents.
83
+
84
+ ```typescript
85
+ const { alice, bob, stop } = await createPair('alice', 'bob');
86
+ ```
87
+
88
+ ### RelayClient
89
+
90
+ The client for agent communication.
91
+
92
+ ```typescript
93
+ // Send messages
94
+ client.sendMessage('OtherAgent', 'Hello!');
95
+ client.sendMessage('#general', 'Channel message');
96
+ client.sendMessage('*', 'Broadcast to everyone');
97
+
98
+ // Wait for acknowledgment
99
+ const ack = await client.sendAndWait('OtherAgent', 'Important message');
100
+
101
+ // Receive messages
102
+ client.onMessage = (from, payload, messageId, meta, originalTo) => {
103
+ console.log(`${from}: ${payload.body}`);
104
+
105
+ // Check if broadcast
106
+ if (originalTo === '*') {
107
+ console.log('This was a broadcast');
108
+ }
109
+ };
110
+
111
+ // Connection state changes
112
+ client.onStateChange = (state) => {
113
+ // 'DISCONNECTED' | 'CONNECTING' | 'HANDSHAKING' | 'READY' | 'BACKOFF'
114
+ };
115
+
116
+ // Disconnect
117
+ client.disconnect();
118
+ ```
119
+
120
+ ## Using with External Daemon
121
+
122
+ If you're running `agent-relay up` separately (e.g., for the dashboard), use the client directly:
123
+
124
+ ```typescript
125
+ import { RelayClient } from '@agent-relay/sdk';
126
+
127
+ const client = new RelayClient({
128
+ agentName: 'MyAgent',
129
+ socketPath: '/tmp/agent-relay.sock',
130
+ });
131
+
132
+ await client.connect();
133
+ client.sendMessage('OtherAgent', 'Hello!');
134
+ ```
135
+
136
+ ## Advanced: Channels
137
+
138
+ ```typescript
139
+ // Join a channel
140
+ client.joinChannel('#general');
141
+
142
+ // Send to channel
143
+ client.sendChannelMessage('#general', 'Hello team!');
144
+
145
+ // Receive channel messages
146
+ client.onChannelMessage = (from, channel, body, envelope) => {
147
+ console.log(`[${channel}] ${from}: ${body}`);
148
+ };
149
+
150
+ // Leave channel
151
+ client.leaveChannel('#general');
152
+ ```
153
+
154
+ ## Advanced: Shadow Agents
155
+
156
+ Monitor another agent's communication:
157
+
158
+ ```typescript
159
+ // Bind as shadow to see all messages to/from PrimaryAgent
160
+ client.bindAsShadow('PrimaryAgent', {
161
+ receiveIncoming: true,
162
+ receiveOutgoing: true,
163
+ });
164
+
165
+ // Unbind
166
+ client.unbindAsShadow('PrimaryAgent');
167
+ ```
168
+
169
+ ## License
170
+
171
+ MIT
@@ -0,0 +1,181 @@
1
+ /**
2
+ * RelayClient - Agent Relay SDK Client
3
+ * @agent-relay/sdk
4
+ *
5
+ * Lightweight client for agent-to-agent communication via Agent Relay daemon.
6
+ */
7
+ import { type Envelope, type SendPayload, type SendMeta, type AckPayload, type PayloadKind, type SpeakOnTrigger, type EntityType, type ChannelMessagePayload, type MessageAttachment } from './protocol/types.js';
8
+ export type ClientState = 'DISCONNECTED' | 'CONNECTING' | 'HANDSHAKING' | 'READY' | 'BACKOFF';
9
+ export interface SyncOptions {
10
+ timeoutMs?: number;
11
+ kind?: PayloadKind;
12
+ data?: Record<string, unknown>;
13
+ thread?: string;
14
+ }
15
+ export interface ClientConfig {
16
+ /** Daemon socket path (default: /tmp/agent-relay.sock) */
17
+ socketPath: string;
18
+ /** Agent name */
19
+ agentName: string;
20
+ /** Entity type: 'agent' (default) or 'user' */
21
+ entityType?: EntityType;
22
+ /** CLI identifier (claude, codex, gemini, etc.) */
23
+ cli?: string;
24
+ /** Program identifier */
25
+ program?: string;
26
+ /** Model identifier */
27
+ model?: string;
28
+ /** Task description */
29
+ task?: string;
30
+ /** Working directory */
31
+ workingDirectory?: string;
32
+ /** Display name for human users */
33
+ displayName?: string;
34
+ /** Avatar URL for human users */
35
+ avatarUrl?: string;
36
+ /** Suppress console logging */
37
+ quiet?: boolean;
38
+ /** Auto-reconnect on disconnect */
39
+ reconnect: boolean;
40
+ /** Max reconnect attempts */
41
+ maxReconnectAttempts: number;
42
+ /** Initial reconnect delay (ms) */
43
+ reconnectDelayMs: number;
44
+ /** Max reconnect delay (ms) */
45
+ reconnectMaxDelayMs: number;
46
+ }
47
+ /**
48
+ * RelayClient for agent-to-agent communication.
49
+ */
50
+ export declare class RelayClient {
51
+ private config;
52
+ private socket?;
53
+ private parser;
54
+ private _state;
55
+ private sessionId?;
56
+ private resumeToken?;
57
+ private reconnectAttempts;
58
+ private reconnectDelay;
59
+ private reconnectTimer?;
60
+ private _destroyed;
61
+ private dedupeCache;
62
+ private writeQueue;
63
+ private writeScheduled;
64
+ private pendingSyncAcks;
65
+ onMessage?: (from: string, payload: SendPayload, messageId: string, meta?: SendMeta, originalTo?: string) => void;
66
+ /**
67
+ * Callback for channel messages.
68
+ */
69
+ onChannelMessage?: (from: string, channel: string, body: string, envelope: Envelope<ChannelMessagePayload>) => void;
70
+ onStateChange?: (state: ClientState) => void;
71
+ onError?: (error: Error) => void;
72
+ constructor(config?: Partial<ClientConfig>);
73
+ get state(): ClientState;
74
+ get agentName(): string;
75
+ get currentSessionId(): string | undefined;
76
+ /**
77
+ * Connect to the relay daemon.
78
+ */
79
+ connect(): Promise<void>;
80
+ /**
81
+ * Disconnect from the relay daemon.
82
+ */
83
+ disconnect(): void;
84
+ /**
85
+ * Permanently destroy the client.
86
+ */
87
+ destroy(): void;
88
+ /**
89
+ * Send a message to another agent.
90
+ */
91
+ sendMessage(to: string, body: string, kind?: PayloadKind, data?: Record<string, unknown>, thread?: string, meta?: SendMeta): boolean;
92
+ /**
93
+ * Send an ACK for a delivered message.
94
+ */
95
+ sendAck(payload: AckPayload): boolean;
96
+ /**
97
+ * Send a message and wait for ACK response.
98
+ */
99
+ sendAndWait(to: string, body: string, options?: SyncOptions): Promise<AckPayload>;
100
+ /**
101
+ * Broadcast a message to all agents.
102
+ */
103
+ broadcast(body: string, kind?: PayloadKind, data?: Record<string, unknown>): boolean;
104
+ /**
105
+ * Subscribe to a topic.
106
+ */
107
+ subscribe(topic: string): boolean;
108
+ /**
109
+ * Unsubscribe from a topic.
110
+ */
111
+ unsubscribe(topic: string): boolean;
112
+ /**
113
+ * Bind as a shadow to a primary agent.
114
+ */
115
+ bindAsShadow(primaryAgent: string, options?: {
116
+ speakOn?: SpeakOnTrigger[];
117
+ receiveIncoming?: boolean;
118
+ receiveOutgoing?: boolean;
119
+ }): boolean;
120
+ /**
121
+ * Unbind from a primary agent.
122
+ */
123
+ unbindAsShadow(primaryAgent: string): boolean;
124
+ /**
125
+ * Send log output to the daemon for dashboard streaming.
126
+ */
127
+ sendLog(data: string): boolean;
128
+ /**
129
+ * Join a channel.
130
+ * @param channel - Channel name (e.g., '#general', 'dm:alice:bob')
131
+ * @param displayName - Optional display name for this member
132
+ */
133
+ joinChannel(channel: string, displayName?: string): boolean;
134
+ /**
135
+ * Admin join: Add any member to a channel (does not require member to be connected).
136
+ * @param channel - Channel name
137
+ * @param member - Name of the member to add
138
+ */
139
+ adminJoinChannel(channel: string, member: string): boolean;
140
+ /**
141
+ * Leave a channel.
142
+ * @param channel - Channel name to leave
143
+ * @param reason - Optional reason for leaving
144
+ */
145
+ leaveChannel(channel: string, reason?: string): boolean;
146
+ /**
147
+ * Admin remove: Remove any member from a channel.
148
+ * @param channel - Channel name
149
+ * @param member - Name of the member to remove
150
+ */
151
+ adminRemoveMember(channel: string, member: string): boolean;
152
+ /**
153
+ * Send a message to a channel.
154
+ * @param channel - Channel name
155
+ * @param body - Message content
156
+ * @param options - Optional thread, mentions, attachments
157
+ */
158
+ sendChannelMessage(channel: string, body: string, options?: {
159
+ thread?: string;
160
+ mentions?: string[];
161
+ attachments?: MessageAttachment[];
162
+ data?: Record<string, unknown>;
163
+ }): boolean;
164
+ private setState;
165
+ private sendHello;
166
+ private send;
167
+ private flushWrites;
168
+ private handleData;
169
+ private processFrame;
170
+ private handleWelcome;
171
+ private handleDeliver;
172
+ private handleChannelMessage;
173
+ private handleAck;
174
+ private handlePing;
175
+ private handleErrorFrame;
176
+ private handleDisconnect;
177
+ private handleError;
178
+ private rejectPendingSyncAcks;
179
+ private scheduleReconnect;
180
+ }
181
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}