@agent-relay/sdk 3.2.2 → 3.2.4

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.
Files changed (117) hide show
  1. package/bin/agent-relay-broker-darwin-arm64 +0 -0
  2. package/bin/agent-relay-broker-darwin-x64 +0 -0
  3. package/bin/agent-relay-broker-linux-arm64 +0 -0
  4. package/bin/agent-relay-broker-linux-x64 +0 -0
  5. package/dist/client.d.ts +66 -0
  6. package/dist/client.d.ts.map +1 -1
  7. package/dist/client.js +230 -0
  8. package/dist/client.js.map +1 -1
  9. package/dist/communicate/a2a-bridge.d.ts +25 -0
  10. package/dist/communicate/a2a-bridge.d.ts.map +1 -0
  11. package/dist/communicate/a2a-bridge.js +89 -0
  12. package/dist/communicate/a2a-bridge.js.map +1 -0
  13. package/dist/communicate/a2a-server.d.ts +31 -0
  14. package/dist/communicate/a2a-server.d.ts.map +1 -0
  15. package/dist/communicate/a2a-server.js +220 -0
  16. package/dist/communicate/a2a-server.js.map +1 -0
  17. package/dist/communicate/a2a-transport.d.ts +48 -0
  18. package/dist/communicate/a2a-transport.d.ts.map +1 -0
  19. package/dist/communicate/a2a-transport.js +302 -0
  20. package/dist/communicate/a2a-transport.js.map +1 -0
  21. package/dist/communicate/a2a-types.d.ts +107 -0
  22. package/dist/communicate/a2a-types.d.ts.map +1 -0
  23. package/dist/communicate/a2a-types.js +209 -0
  24. package/dist/communicate/a2a-types.js.map +1 -0
  25. package/dist/communicate/adapters/claude-sdk.d.ts +28 -0
  26. package/dist/communicate/adapters/claude-sdk.d.ts.map +1 -0
  27. package/dist/communicate/adapters/claude-sdk.js +47 -0
  28. package/dist/communicate/adapters/claude-sdk.js.map +1 -0
  29. package/dist/communicate/adapters/crewai.d.ts +42 -0
  30. package/dist/communicate/adapters/crewai.d.ts.map +1 -0
  31. package/dist/communicate/adapters/crewai.js +95 -0
  32. package/dist/communicate/adapters/crewai.js.map +1 -0
  33. package/dist/communicate/adapters/google-adk.d.ts +53 -0
  34. package/dist/communicate/adapters/google-adk.d.ts.map +1 -0
  35. package/dist/communicate/adapters/google-adk.js +77 -0
  36. package/dist/communicate/adapters/google-adk.js.map +1 -0
  37. package/dist/communicate/adapters/index.d.ts +7 -0
  38. package/dist/communicate/adapters/index.d.ts.map +1 -0
  39. package/dist/communicate/adapters/index.js +7 -0
  40. package/dist/communicate/adapters/index.js.map +1 -0
  41. package/dist/communicate/adapters/langgraph.d.ts +40 -0
  42. package/dist/communicate/adapters/langgraph.d.ts.map +1 -0
  43. package/dist/communicate/adapters/langgraph.js +77 -0
  44. package/dist/communicate/adapters/langgraph.js.map +1 -0
  45. package/dist/communicate/adapters/openai-agents.d.ts +25 -0
  46. package/dist/communicate/adapters/openai-agents.d.ts.map +1 -0
  47. package/dist/communicate/adapters/openai-agents.js +70 -0
  48. package/dist/communicate/adapters/openai-agents.js.map +1 -0
  49. package/dist/communicate/adapters/pi.d.ts +45 -0
  50. package/dist/communicate/adapters/pi.d.ts.map +1 -0
  51. package/dist/communicate/adapters/pi.js +59 -0
  52. package/dist/communicate/adapters/pi.js.map +1 -0
  53. package/dist/communicate/core.d.ts +58 -0
  54. package/dist/communicate/core.d.ts.map +1 -0
  55. package/dist/communicate/core.js +128 -0
  56. package/dist/communicate/core.js.map +1 -0
  57. package/dist/communicate/index.d.ts +4 -0
  58. package/dist/communicate/index.d.ts.map +1 -0
  59. package/dist/communicate/index.js +4 -0
  60. package/dist/communicate/index.js.map +1 -0
  61. package/dist/communicate/transport.d.ts +36 -0
  62. package/dist/communicate/transport.d.ts.map +1 -0
  63. package/dist/communicate/transport.js +371 -0
  64. package/dist/communicate/transport.js.map +1 -0
  65. package/dist/communicate/types.d.ts +58 -0
  66. package/dist/communicate/types.d.ts.map +1 -0
  67. package/dist/communicate/types.js +66 -0
  68. package/dist/communicate/types.js.map +1 -0
  69. package/dist/workflows/builder.d.ts +35 -5
  70. package/dist/workflows/builder.d.ts.map +1 -1
  71. package/dist/workflows/builder.js +81 -7
  72. package/dist/workflows/builder.js.map +1 -1
  73. package/dist/workflows/cli.js +14 -1
  74. package/dist/workflows/cli.js.map +1 -1
  75. package/dist/workflows/runner.d.ts +10 -2
  76. package/dist/workflows/runner.d.ts.map +1 -1
  77. package/dist/workflows/runner.js +95 -1
  78. package/dist/workflows/runner.js.map +1 -1
  79. package/dist/workflows/types.d.ts +11 -0
  80. package/dist/workflows/types.d.ts.map +1 -1
  81. package/package.json +48 -2
  82. package/dist/__tests__/completion-pipeline.test.d.ts +0 -14
  83. package/dist/__tests__/completion-pipeline.test.d.ts.map +0 -1
  84. package/dist/__tests__/completion-pipeline.test.js +0 -1476
  85. package/dist/__tests__/completion-pipeline.test.js.map +0 -1
  86. package/dist/__tests__/contract-fixtures.test.d.ts +0 -2
  87. package/dist/__tests__/contract-fixtures.test.d.ts.map +0 -1
  88. package/dist/__tests__/contract-fixtures.test.js +0 -152
  89. package/dist/__tests__/contract-fixtures.test.js.map +0 -1
  90. package/dist/__tests__/e2e-owner-review.test.d.ts +0 -16
  91. package/dist/__tests__/e2e-owner-review.test.d.ts.map +0 -1
  92. package/dist/__tests__/e2e-owner-review.test.js +0 -640
  93. package/dist/__tests__/e2e-owner-review.test.js.map +0 -1
  94. package/dist/__tests__/facade.test.d.ts +0 -2
  95. package/dist/__tests__/facade.test.d.ts.map +0 -1
  96. package/dist/__tests__/facade.test.js +0 -305
  97. package/dist/__tests__/facade.test.js.map +0 -1
  98. package/dist/__tests__/integration.test.d.ts +0 -2
  99. package/dist/__tests__/integration.test.d.ts.map +0 -1
  100. package/dist/__tests__/integration.test.js +0 -205
  101. package/dist/__tests__/integration.test.js.map +0 -1
  102. package/dist/__tests__/pty.test.d.ts +0 -2
  103. package/dist/__tests__/pty.test.d.ts.map +0 -1
  104. package/dist/__tests__/pty.test.js +0 -20
  105. package/dist/__tests__/pty.test.js.map +0 -1
  106. package/dist/__tests__/quickstart.test.d.ts +0 -2
  107. package/dist/__tests__/quickstart.test.d.ts.map +0 -1
  108. package/dist/__tests__/quickstart.test.js +0 -176
  109. package/dist/__tests__/quickstart.test.js.map +0 -1
  110. package/dist/__tests__/spawn-from-env.test.d.ts +0 -2
  111. package/dist/__tests__/spawn-from-env.test.d.ts.map +0 -1
  112. package/dist/__tests__/spawn-from-env.test.js +0 -222
  113. package/dist/__tests__/spawn-from-env.test.js.map +0 -1
  114. package/dist/__tests__/unit.test.d.ts +0 -2
  115. package/dist/__tests__/unit.test.d.ts.map +0 -1
  116. package/dist/__tests__/unit.test.js +0 -357
  117. package/dist/__tests__/unit.test.js.map +0 -1
@@ -0,0 +1,128 @@
1
+ import { RelayTransport } from './transport.js';
2
+ import { resolveRelayConfig, } from './types.js';
3
+ const MAX_PENDING_MESSAGES = 10_000;
4
+ /**
5
+ * Core relay client for inter-agent communication.
6
+ *
7
+ * Lazily connects on first API call. Buffers incoming WebSocket messages
8
+ * for {@link inbox} when no callbacks are registered.
9
+ */
10
+ export class Relay {
11
+ agentName;
12
+ config;
13
+ transport;
14
+ pending = [];
15
+ callbacks = new Set();
16
+ connectPromise;
17
+ connected = false;
18
+ exitHandler;
19
+ constructor(agentName, config = {}) {
20
+ this.agentName = agentName;
21
+ this.config = resolveRelayConfig(config);
22
+ this.transport = new RelayTransport(agentName, this.config);
23
+ this.transport.onWsMessage((message) => this.handleTransportMessage(message));
24
+ if (this.config.autoCleanup) {
25
+ this.exitHandler = () => {
26
+ void this.close();
27
+ };
28
+ process.once('beforeExit', this.exitHandler);
29
+ process.once('SIGTERM', this.exitHandler);
30
+ process.once('SIGINT', this.exitHandler);
31
+ }
32
+ }
33
+ /**
34
+ * Send a direct message to another agent.
35
+ * @param to - Recipient agent name.
36
+ * @param text - Message content.
37
+ */
38
+ async send(to, text) {
39
+ await this.ensureConnected();
40
+ await this.transport.sendDm(to, text);
41
+ }
42
+ /**
43
+ * Post a message to a channel.
44
+ * @param channel - Target channel name.
45
+ * @param text - Message content.
46
+ */
47
+ async post(channel, text) {
48
+ await this.ensureConnected();
49
+ await this.transport.postMessage(channel, text);
50
+ }
51
+ /**
52
+ * Reply to a specific message in a thread.
53
+ * @param messageId - ID of the message to reply to.
54
+ * @param text - Reply content.
55
+ */
56
+ async reply(messageId, text) {
57
+ await this.ensureConnected();
58
+ await this.transport.reply(messageId, text);
59
+ }
60
+ /**
61
+ * Drain and return all buffered messages, clearing the buffer.
62
+ * @returns Array of buffered messages.
63
+ */
64
+ async inbox() {
65
+ await this.ensureConnected();
66
+ const messages = [...this.pending];
67
+ this.pending = [];
68
+ return messages;
69
+ }
70
+ /**
71
+ * Register a callback for incoming messages.
72
+ * @param callback - Invoked for each received message.
73
+ * @returns Unsubscribe function.
74
+ */
75
+ onMessage(callback) {
76
+ this.callbacks.add(callback);
77
+ void this.ensureConnected();
78
+ return () => {
79
+ this.callbacks.delete(callback);
80
+ };
81
+ }
82
+ /**
83
+ * List currently online agents.
84
+ * @returns Array of agent names.
85
+ */
86
+ async agents() {
87
+ await this.ensureConnected();
88
+ return this.transport.listAgents();
89
+ }
90
+ /** Unregister the agent, close the WebSocket, and clean up. */
91
+ async close() {
92
+ if (this.exitHandler) {
93
+ process.removeListener('beforeExit', this.exitHandler);
94
+ process.removeListener('SIGTERM', this.exitHandler);
95
+ process.removeListener('SIGINT', this.exitHandler);
96
+ }
97
+ this.connected = false;
98
+ this.connectPromise = undefined;
99
+ await this.transport.disconnect();
100
+ }
101
+ async ensureConnected() {
102
+ if (this.connected) {
103
+ return;
104
+ }
105
+ if (!this.connectPromise) {
106
+ this.connectPromise = this.transport.connect().then(() => {
107
+ this.connected = true;
108
+ }, (err) => {
109
+ // Clear cached promise so the next call can retry
110
+ this.connectPromise = undefined;
111
+ throw err;
112
+ });
113
+ }
114
+ await this.connectPromise;
115
+ }
116
+ async handleTransportMessage(message) {
117
+ // Always buffer the message (spec: "both" case — callbacks AND inbox)
118
+ if (this.pending.length >= MAX_PENDING_MESSAGES) {
119
+ this.pending.shift();
120
+ process.emitWarning('Relay pending buffer exceeded 10,000 messages; dropping oldest message.', 'RelayWarning');
121
+ }
122
+ this.pending.push(message);
123
+ for (const callback of [...this.callbacks]) {
124
+ await callback(message);
125
+ }
126
+ }
127
+ }
128
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/communicate/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export { Relay } from './core.js';
3
+ export { onPiRelay, onClaudeRelay } from './adapters/index.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/communicate/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types.js';
2
+ export { Relay } from './core.js';
3
+ export { onPiRelay, onClaudeRelay } from './adapters/index.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/communicate/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type Message, type MessageCallback, type RelayConfig } from './types.js';
2
+ export declare class RelayTransport {
3
+ readonly agentName: string;
4
+ readonly config: import("./types.js").ResolvedRelayConfig;
5
+ agentId?: string;
6
+ token?: string;
7
+ private ws?;
8
+ private messageCallback?;
9
+ private closing;
10
+ private reconnectDelayMs;
11
+ private reconnectTimer?;
12
+ private wsConnectPromise?;
13
+ constructor(agentName: string, config?: RelayConfig);
14
+ connect(): Promise<void>;
15
+ disconnect(): Promise<void>;
16
+ onWsMessage(callback: MessageCallback): void;
17
+ registerAgent(): Promise<string>;
18
+ unregisterAgent(): Promise<void>;
19
+ sendDm(to: string, text: string): Promise<string>;
20
+ postMessage(channel: string, text: string): Promise<string>;
21
+ reply(messageId: string, text: string): Promise<string>;
22
+ checkInbox(): Promise<Message[]>;
23
+ listAgents(): Promise<string[]>;
24
+ private ensureRegistered;
25
+ private requireConfig;
26
+ private sendHttpAsAgent;
27
+ private sendHttp;
28
+ private connectWebSocket;
29
+ private wsBaseUrl;
30
+ private scheduleReconnect;
31
+ private clearReconnectTimer;
32
+ private dispatchWsPayload;
33
+ private messageFromPayload;
34
+ private errorMessage;
35
+ }
36
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/communicate/transport.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EACpB,KAAK,WAAW,EAKjB,MAAM,YAAY,CAAC;AAOpB,qBAAa,cAAc;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,2CAAC;IAEhB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,gBAAgB,CAAC,CAAgB;gBAE7B,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,WAAgB;IAKjD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAOxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BjC,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAItC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;IAwChC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAWhC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOjD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAW3D,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWvD,UAAU,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IA2BhC,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YASvB,gBAAgB;IAO9B,OAAO,CAAC,aAAa;YAcP,eAAe;YAiEf,QAAQ;YAiER,gBAAgB;IAsD9B,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,mBAAmB;YAOb,iBAAiB;IAkB/B,OAAO,CAAC,kBAAkB;YAyBZ,YAAY;CAY3B"}
@@ -0,0 +1,371 @@
1
+ import { setTimeout as sleep } from 'node:timers/promises';
2
+ import { WebSocket } from 'ws';
3
+ import { RelayAuthError, RelayConfigError, RelayConnectionError, resolveRelayConfig, } from './types.js';
4
+ const HTTP_RETRY_ATTEMPTS = 3;
5
+ const WS_RECONNECT_MAX_DELAY_MS = 30_000;
6
+ export class RelayTransport {
7
+ agentName;
8
+ config;
9
+ agentId;
10
+ token;
11
+ ws;
12
+ messageCallback;
13
+ closing = false;
14
+ reconnectDelayMs = 1_000;
15
+ reconnectTimer;
16
+ wsConnectPromise;
17
+ constructor(agentName, config = {}) {
18
+ this.agentName = agentName;
19
+ this.config = resolveRelayConfig(config);
20
+ }
21
+ async connect() {
22
+ this.requireConfig({ requireWorkspace: true });
23
+ this.closing = false;
24
+ await this.registerAgent();
25
+ await this.connectWebSocket();
26
+ }
27
+ async disconnect() {
28
+ this.closing = true;
29
+ this.clearReconnectTimer();
30
+ const socket = this.ws;
31
+ this.ws = undefined;
32
+ this.wsConnectPromise = undefined;
33
+ if (socket && socket.readyState !== WebSocket.CLOSED) {
34
+ await Promise.race([
35
+ new Promise((resolve) => {
36
+ socket.once('close', () => resolve());
37
+ socket.close();
38
+ }),
39
+ new Promise((resolve) => setTimeout(resolve, 2_000)),
40
+ ]);
41
+ }
42
+ if (this.agentId) {
43
+ try {
44
+ await this.unregisterAgent();
45
+ }
46
+ catch {
47
+ // Best-effort cleanup.
48
+ }
49
+ }
50
+ this.closing = false;
51
+ }
52
+ onWsMessage(callback) {
53
+ this.messageCallback = callback;
54
+ }
55
+ async registerAgent() {
56
+ this.requireConfig({ requireWorkspace: true });
57
+ if (this.agentId && this.token) {
58
+ return this.agentId;
59
+ }
60
+ let payload;
61
+ try {
62
+ payload = await this.sendHttp('POST', '/v1/agents', { name: this.agentName, type: 'agent' });
63
+ }
64
+ catch (error) {
65
+ if (error instanceof RelayConnectionError && error.statusCode === 409) {
66
+ const agentPayload = await this.sendHttp('GET', `/v1/agents/${encodeURIComponent(this.agentName)}`);
67
+ const agentData = agentPayload.data ?? agentPayload;
68
+ this.agentId = String(agentData.id);
69
+ const rotatePayload = await this.sendHttp('POST', `/v1/agents/${encodeURIComponent(this.agentName)}/rotate-token`);
70
+ const rotateData = rotatePayload.data ?? rotatePayload;
71
+ this.token = String(rotateData.token);
72
+ return this.agentId;
73
+ }
74
+ throw error;
75
+ }
76
+ const data = payload.data ?? payload;
77
+ this.agentId = String(data.id);
78
+ this.token = String(data.token);
79
+ return this.agentId;
80
+ }
81
+ async unregisterAgent() {
82
+ if (!this.agentId || !this.token) {
83
+ return;
84
+ }
85
+ this.agentId = undefined;
86
+ const agentToken = this.token;
87
+ this.token = undefined;
88
+ await this.sendHttpAsAgent('POST', '/v1/agents/disconnect', undefined, agentToken);
89
+ }
90
+ async sendDm(to, text) {
91
+ await this.ensureRegistered();
92
+ const payload = await this.sendHttpAsAgent('POST', '/v1/dm', { to, text });
93
+ const data = payload.data ?? payload;
94
+ return String(data.id ?? data.message_id ?? '');
95
+ }
96
+ async postMessage(channel, text) {
97
+ await this.ensureRegistered();
98
+ const payload = await this.sendHttpAsAgent('POST', `/v1/channels/${encodeURIComponent(channel)}/messages`, { text });
99
+ const data = payload.data ?? payload;
100
+ return String(data.id ?? data.message_id ?? '');
101
+ }
102
+ async reply(messageId, text) {
103
+ await this.ensureRegistered();
104
+ const payload = await this.sendHttpAsAgent('POST', `/v1/messages/${encodeURIComponent(messageId)}/replies`, { text });
105
+ const data = payload.data ?? payload;
106
+ return String(data.id ?? data.message_id ?? '');
107
+ }
108
+ async checkInbox() {
109
+ await this.ensureRegistered();
110
+ const payload = await this.sendHttpAsAgent('GET', '/v1/inbox');
111
+ const data = payload.data ?? payload;
112
+ const messages = [];
113
+ for (const mention of (data.mentions ?? [])) {
114
+ messages.push(this.messageFromPayload(mention));
115
+ }
116
+ for (const dm of (data.unread_dms ?? [])) {
117
+ const last = dm.last_message;
118
+ if (last?.text) {
119
+ messages.push({
120
+ sender: String(dm.from ?? dm.agent_name ?? 'unknown'),
121
+ text: String(last.text),
122
+ channel: undefined,
123
+ threadId: typeof dm.conversation_id === 'string' ? dm.conversation_id : undefined,
124
+ timestamp: typeof last.created_at === 'string' ? undefined : last.created_at,
125
+ messageId: typeof last.id === 'string' ? last.id : undefined,
126
+ });
127
+ }
128
+ }
129
+ return messages;
130
+ }
131
+ async listAgents() {
132
+ const payload = await this.sendHttp('GET', '/v1/agents');
133
+ const data = payload.data ?? payload.agents ?? [];
134
+ if (Array.isArray(data)) {
135
+ return data.map((a) => (typeof a === 'string' ? a : String(a.name ?? a)));
136
+ }
137
+ return [];
138
+ }
139
+ async ensureRegistered() {
140
+ if (this.agentId && this.token) {
141
+ return;
142
+ }
143
+ await this.registerAgent();
144
+ }
145
+ requireConfig(options = {}) {
146
+ if (!this.config.apiKey) {
147
+ throw new RelayConfigError('Missing RELAY_API_KEY. Set the environment variable or pass apiKey to RelayConfig.');
148
+ }
149
+ if (options.requireWorkspace && !this.config.workspace) {
150
+ throw new RelayConfigError('Missing RELAY_WORKSPACE. Set the environment variable or pass workspace to RelayConfig.');
151
+ }
152
+ }
153
+ async sendHttpAsAgent(method, path, payload, overrideToken) {
154
+ this.requireConfig();
155
+ const agentToken = overrideToken ?? this.token;
156
+ if (!agentToken) {
157
+ throw new RelayConfigError('Agent not registered; no agent token available.');
158
+ }
159
+ const url = `${this.config.baseUrl}${path}`;
160
+ const headers = {
161
+ authorization: `Bearer ${agentToken}`,
162
+ };
163
+ if (payload !== undefined) {
164
+ headers['content-type'] = 'application/json';
165
+ }
166
+ for (let attempt = 1; attempt <= HTTP_RETRY_ATTEMPTS; attempt += 1) {
167
+ let response;
168
+ try {
169
+ response = await fetch(url, {
170
+ method,
171
+ headers,
172
+ body: payload === undefined ? undefined : JSON.stringify(payload),
173
+ });
174
+ }
175
+ catch (error) {
176
+ if (attempt < HTTP_RETRY_ATTEMPTS) {
177
+ await sleep(Math.min(2 ** (attempt - 1) * 1_000, WS_RECONNECT_MAX_DELAY_MS));
178
+ continue;
179
+ }
180
+ throw new RelayConnectionError(0, error instanceof Error ? error.message : String(error));
181
+ }
182
+ if (response.status === 401) {
183
+ throw new RelayAuthError(await this.errorMessage(response));
184
+ }
185
+ if (response.status >= 500 && response.status <= 599) {
186
+ const message = await this.errorMessage(response);
187
+ if (attempt < HTTP_RETRY_ATTEMPTS) {
188
+ await sleep(Math.min(2 ** (attempt - 1) * 1_000, WS_RECONNECT_MAX_DELAY_MS));
189
+ continue;
190
+ }
191
+ throw new RelayConnectionError(response.status, message);
192
+ }
193
+ if (response.status >= 400) {
194
+ throw new RelayConnectionError(response.status, await this.errorMessage(response));
195
+ }
196
+ if (response.status === 204) {
197
+ return undefined;
198
+ }
199
+ const contentType = response.headers.get('content-type') ?? '';
200
+ if (contentType.includes('application/json')) {
201
+ return (await response.json());
202
+ }
203
+ return (await response.text());
204
+ }
205
+ throw new RelayConnectionError(500, 'Unexpected transport retry failure');
206
+ }
207
+ async sendHttp(method, path, payload) {
208
+ this.requireConfig();
209
+ const url = `${this.config.baseUrl}${path}`;
210
+ const headers = {
211
+ authorization: `Bearer ${this.config.apiKey}`,
212
+ };
213
+ if (payload !== undefined) {
214
+ headers['content-type'] = 'application/json';
215
+ }
216
+ for (let attempt = 1; attempt <= HTTP_RETRY_ATTEMPTS; attempt += 1) {
217
+ let response;
218
+ try {
219
+ response = await fetch(url, {
220
+ method,
221
+ headers,
222
+ body: payload === undefined ? undefined : JSON.stringify(payload),
223
+ });
224
+ }
225
+ catch (error) {
226
+ if (attempt < HTTP_RETRY_ATTEMPTS) {
227
+ await sleep(Math.min(2 ** (attempt - 1) * 1_000, WS_RECONNECT_MAX_DELAY_MS));
228
+ continue;
229
+ }
230
+ throw new RelayConnectionError(0, error instanceof Error ? error.message : String(error));
231
+ }
232
+ if (response.status === 401) {
233
+ throw new RelayAuthError(await this.errorMessage(response));
234
+ }
235
+ if (response.status >= 500 && response.status <= 599) {
236
+ const message = await this.errorMessage(response);
237
+ if (attempt < HTTP_RETRY_ATTEMPTS) {
238
+ await sleep(Math.min(2 ** (attempt - 1) * 1_000, WS_RECONNECT_MAX_DELAY_MS));
239
+ continue;
240
+ }
241
+ throw new RelayConnectionError(response.status, message);
242
+ }
243
+ if (response.status >= 400) {
244
+ throw new RelayConnectionError(response.status, await this.errorMessage(response));
245
+ }
246
+ if (response.status === 204) {
247
+ return undefined;
248
+ }
249
+ const contentType = response.headers.get('content-type') ?? '';
250
+ if (contentType.includes('application/json')) {
251
+ return (await response.json());
252
+ }
253
+ return (await response.text());
254
+ }
255
+ throw new RelayConnectionError(500, 'Unexpected transport retry failure');
256
+ }
257
+ async connectWebSocket() {
258
+ await this.ensureRegistered();
259
+ if (this.ws && (this.ws.readyState === WebSocket.OPEN || this.ws.readyState === WebSocket.CONNECTING)) {
260
+ return;
261
+ }
262
+ if (this.wsConnectPromise) {
263
+ return this.wsConnectPromise;
264
+ }
265
+ const url = `${this.wsBaseUrl()}/v1/ws?token=${encodeURIComponent(this.token ?? '')}`;
266
+ const socket = new WebSocket(url);
267
+ this.wsConnectPromise = new Promise((resolve, reject) => {
268
+ let settled = false;
269
+ socket.once('open', () => {
270
+ settled = true;
271
+ this.ws = socket;
272
+ this.reconnectDelayMs = 1_000;
273
+ resolve();
274
+ });
275
+ socket.once('error', (error) => {
276
+ if (!settled) {
277
+ settled = true;
278
+ reject(error);
279
+ }
280
+ });
281
+ }).finally(() => {
282
+ this.wsConnectPromise = undefined;
283
+ });
284
+ socket.on('message', (raw) => {
285
+ void this.dispatchWsPayload(raw.toString());
286
+ });
287
+ socket.on('close', () => {
288
+ if (this.ws === socket) {
289
+ this.ws = undefined;
290
+ }
291
+ if (!this.closing) {
292
+ this.scheduleReconnect();
293
+ }
294
+ });
295
+ socket.on('error', () => {
296
+ // The close handler manages reconnects for established sockets.
297
+ });
298
+ await this.wsConnectPromise;
299
+ }
300
+ wsBaseUrl() {
301
+ if (this.config.baseUrl.startsWith('https://')) {
302
+ return `wss://${this.config.baseUrl.slice('https://'.length)}`;
303
+ }
304
+ if (this.config.baseUrl.startsWith('http://')) {
305
+ return `ws://${this.config.baseUrl.slice('http://'.length)}`;
306
+ }
307
+ return this.config.baseUrl;
308
+ }
309
+ scheduleReconnect() {
310
+ if (this.reconnectTimer || this.closing) {
311
+ return;
312
+ }
313
+ const delayMs = this.reconnectDelayMs;
314
+ this.reconnectDelayMs = Math.min(this.reconnectDelayMs * 2, WS_RECONNECT_MAX_DELAY_MS);
315
+ this.reconnectTimer = setTimeout(() => {
316
+ this.reconnectTimer = undefined;
317
+ void this.connectWebSocket().catch(() => {
318
+ this.scheduleReconnect();
319
+ });
320
+ }, delayMs);
321
+ }
322
+ clearReconnectTimer() {
323
+ if (this.reconnectTimer) {
324
+ clearTimeout(this.reconnectTimer);
325
+ this.reconnectTimer = undefined;
326
+ }
327
+ }
328
+ async dispatchWsPayload(rawPayload) {
329
+ const payload = JSON.parse(rawPayload);
330
+ if (payload.type === 'ping') {
331
+ this.ws?.send(JSON.stringify({ type: 'pong' }));
332
+ return;
333
+ }
334
+ const messageEvents = new Set([
335
+ 'message.created', 'dm.received', 'direct_message.received',
336
+ 'thread.reply', 'message', 'group_dm.received',
337
+ ]);
338
+ if (!messageEvents.has(payload.type) || !this.messageCallback) {
339
+ return;
340
+ }
341
+ await this.messageCallback(this.messageFromPayload(payload));
342
+ }
343
+ messageFromPayload(payload) {
344
+ const m = (typeof payload.message === 'object' && payload.message !== null)
345
+ ? payload.message
346
+ : payload;
347
+ const sender = String(m.sender ?? m.agent_name ?? m.from ?? m.agentName
348
+ ?? payload.agent_name ?? payload.from ?? 'unknown');
349
+ const text = String(m.text ?? '');
350
+ const channel = String(m.channel ?? m.channel_name ?? m.channelName ?? payload.channel ?? payload.channel_name ?? '') || undefined;
351
+ const threadId = String(m.thread_id ?? m.threadId ?? m.conversation_id ?? m.conversationId ?? payload.thread_id ?? '') || undefined;
352
+ const rawTs = m.timestamp ?? m.created_at ?? m.createdAt ?? payload.timestamp;
353
+ const timestamp = typeof rawTs === 'number' ? rawTs : undefined;
354
+ const messageId = String(m.id ?? m.message_id ?? m.messageId ?? payload.message_id ?? '') || undefined;
355
+ return { sender, text, channel, threadId, timestamp, messageId };
356
+ }
357
+ async errorMessage(response) {
358
+ const text = await response.text().catch(() => '');
359
+ try {
360
+ const payload = JSON.parse(text);
361
+ if (typeof payload.error === 'object' && payload.error?.message) {
362
+ return payload.error.message;
363
+ }
364
+ return payload.message ?? response.statusText ?? 'Request failed';
365
+ }
366
+ catch {
367
+ return text || response.statusText || 'Request failed';
368
+ }
369
+ }
370
+ }
371
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/communicate/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export declare const DEFAULT_RELAY_BASE_URL = "https://api.relaycast.dev";
2
+ /** An incoming relay message. All fields except `sender` and `text` are optional. */
3
+ export interface Message {
4
+ readonly sender: string;
5
+ readonly text: string;
6
+ readonly channel?: string;
7
+ readonly threadId?: string;
8
+ readonly timestamp?: number;
9
+ readonly messageId?: string;
10
+ }
11
+ /** Callback invoked when a message is received. */
12
+ export type MessageCallback = (message: Message) => void | Promise<void>;
13
+ /** User-supplied relay configuration. All fields are optional and fall back to env vars or defaults. */
14
+ export interface RelayConfig {
15
+ workspace?: string;
16
+ apiKey?: string;
17
+ baseUrl?: string;
18
+ channels?: string[];
19
+ pollIntervalMs?: number;
20
+ autoCleanup?: boolean;
21
+ }
22
+ export interface ResolvedRelayConfig {
23
+ workspace?: string;
24
+ apiKey?: string;
25
+ baseUrl: string;
26
+ channels: string[];
27
+ pollIntervalMs: number;
28
+ autoCleanup: boolean;
29
+ }
30
+ export declare class RelayConnectionError extends Error {
31
+ readonly statusCode: number;
32
+ constructor(statusCode: number, message: string);
33
+ }
34
+ export declare class RelayConfigError extends Error {
35
+ constructor(message: string);
36
+ }
37
+ export declare class RelayAuthError extends RelayConnectionError {
38
+ constructor(message?: string, statusCode?: number);
39
+ }
40
+ /**
41
+ * Resolve a partial config into a fully-populated config with env-var fallbacks.
42
+ * @param config - Partial user config.
43
+ * @returns Resolved config with all defaults applied.
44
+ */
45
+ export declare function resolveRelayConfig(config?: RelayConfig): ResolvedRelayConfig;
46
+ /**
47
+ * Format a single message for display in agent instructions.
48
+ * @param message - The relay message to format.
49
+ * @returns Human-readable message string.
50
+ */
51
+ export declare function formatRelayMessage(message: Message): string;
52
+ /**
53
+ * Format an array of messages for display in agent instructions.
54
+ * @param messages - The relay messages to format.
55
+ * @returns Human-readable inbox summary.
56
+ */
57
+ export declare function formatRelayInbox(messages: Message[]): string;
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/communicate/types.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,8BAA8B,CAAC;AAElE,qFAAqF;AACrF,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,mDAAmD;AACnD,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzE,wGAAwG;AACxG,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEhB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAKhD;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,cAAe,SAAQ,oBAAoB;gBAC1C,OAAO,SAAiB,EAAE,UAAU,SAAM;CAIvD;AAWD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,WAAgB,GAAG,mBAAmB,CAShF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAI3D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAM5D"}