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.
@@ -0,0 +1,82 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { type BusRole } from "./protocol.js";
3
+ export interface CursorStore {
4
+ load(): Promise<number | null>;
5
+ save(cursor: number): Promise<void>;
6
+ }
7
+ export interface BusClientOptions {
8
+ url: string;
9
+ role: BusRole;
10
+ componentId: string;
11
+ agentId?: string;
12
+ instanceId: string;
13
+ token?: string;
14
+ capabilities?: string[];
15
+ tags?: string[];
16
+ machine?: string;
17
+ meta?: Record<string, unknown>;
18
+ reconnect?: {
19
+ initialMs?: number;
20
+ maxMs?: number;
21
+ jitterMs?: number;
22
+ };
23
+ heartbeatIntervalMs?: number;
24
+ cursorStore?: CursorStore;
25
+ reconcile?: () => Promise<void>;
26
+ }
27
+ export interface BusClientEvents {
28
+ connected: () => void;
29
+ disconnected: (reason: string) => void;
30
+ reconnecting: (attempt: number, delayMs: number) => void;
31
+ registered: (epoch: number, cursor: number) => void;
32
+ event: (eventType: string, data: Record<string, unknown>, seq: number) => void;
33
+ command: (commandType: string, params: Record<string, unknown>, commandId: string) => void;
34
+ error: (code: string, message: string) => void;
35
+ "message.new": (message: unknown) => void;
36
+ "agent.status": (data: {
37
+ id: string;
38
+ status: string;
39
+ previousStatus?: string;
40
+ }) => void;
41
+ "task.changed": (task: unknown) => void;
42
+ }
43
+ export declare class RelayBusClient extends EventEmitter {
44
+ private readonly options;
45
+ private ws;
46
+ private registeredEpoch;
47
+ private lastCursor;
48
+ private serverCursor;
49
+ private closed;
50
+ private connecting;
51
+ private heartbeat?;
52
+ private readonly reconnect;
53
+ private readonly cursorStore;
54
+ private readonly subscriptions;
55
+ private readonly pending;
56
+ constructor(options: BusClientOptions);
57
+ get connected(): boolean;
58
+ get epoch(): number;
59
+ get cursor(): number;
60
+ connect(): Promise<void>;
61
+ close(): Promise<void>;
62
+ status(update: {
63
+ agentStatus: string;
64
+ ready?: boolean;
65
+ meta?: Record<string, unknown>;
66
+ }): void;
67
+ command(type: string, target: string, params: Record<string, unknown>): Promise<unknown>;
68
+ subscribe(events: string[], scopes?: string[]): Promise<void>;
69
+ on<K extends keyof BusClientEvents>(event: K, listener: BusClientEvents[K]): this;
70
+ off<K extends keyof BusClientEvents>(event: K, listener: BusClientEvents[K]): this;
71
+ once<K extends keyof BusClientEvents>(event: K, listener: BusClientEvents[K]): this;
72
+ private connectLoop;
73
+ private openOnce;
74
+ private sendRegister;
75
+ private handleMessage;
76
+ private handleEvent;
77
+ private startHeartbeat;
78
+ private stopHeartbeat;
79
+ private send;
80
+ private wsUrl;
81
+ }
82
+ //# sourceMappingURL=bus-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus-client.d.ts","sourceRoot":"","sources":["../src/bus-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,277 @@
1
+ import { EventEmitter } from "node:events";
2
+ import {} from "./protocol.js";
3
+ import { ReconnectionManager } from "./reconnect.js";
4
+ class MemoryCursorStore {
5
+ value = null;
6
+ async load() {
7
+ return this.value;
8
+ }
9
+ async save(cursor) {
10
+ this.value = cursor;
11
+ }
12
+ }
13
+ export class RelayBusClient extends EventEmitter {
14
+ options;
15
+ ws = null;
16
+ registeredEpoch = 0;
17
+ lastCursor = 0;
18
+ serverCursor = 0;
19
+ closed = false;
20
+ connecting = null;
21
+ heartbeat;
22
+ reconnect;
23
+ cursorStore;
24
+ subscriptions = new Set(["message.*", "agent.status", "task.*"]);
25
+ pending = new Map();
26
+ constructor(options) {
27
+ super();
28
+ this.options = options;
29
+ this.reconnect = new ReconnectionManager({
30
+ initialMs: options.reconnect?.initialMs,
31
+ maxMs: options.reconnect?.maxMs,
32
+ jitterMs: options.reconnect?.jitterMs,
33
+ });
34
+ this.cursorStore = options.cursorStore ?? new MemoryCursorStore();
35
+ }
36
+ get connected() {
37
+ return this.ws?.readyState === WebSocket.OPEN && this.registeredEpoch > 0;
38
+ }
39
+ get epoch() {
40
+ return this.registeredEpoch;
41
+ }
42
+ get cursor() {
43
+ return this.lastCursor;
44
+ }
45
+ async connect() {
46
+ if (this.connecting)
47
+ return this.connecting;
48
+ this.closed = false;
49
+ this.connecting = this.connectLoop().finally(() => {
50
+ this.connecting = null;
51
+ });
52
+ return this.connecting;
53
+ }
54
+ async close() {
55
+ this.closed = true;
56
+ this.stopHeartbeat();
57
+ this.reconnect.cancel();
58
+ for (const pending of this.pending.values())
59
+ pending.reject(new Error("bus client closed"));
60
+ this.pending.clear();
61
+ if (this.ws && this.ws.readyState <= WebSocket.OPEN)
62
+ this.ws.close();
63
+ this.ws = null;
64
+ }
65
+ status(update) {
66
+ this.send({
67
+ type: "status",
68
+ payload: {
69
+ agentStatus: update.agentStatus,
70
+ ready: update.ready,
71
+ meta: update.meta,
72
+ },
73
+ });
74
+ }
75
+ command(type, target, params) {
76
+ const id = crypto.randomUUID();
77
+ this.send({ type: "command", id, payload: { commandType: type, target, params } });
78
+ return new Promise((resolve, reject) => {
79
+ this.pending.set(id, { resolve, reject });
80
+ });
81
+ }
82
+ async subscribe(events, scopes) {
83
+ for (const event of events)
84
+ this.subscriptions.add(event);
85
+ const id = crypto.randomUUID();
86
+ this.send({ type: "subscribe", id, payload: { events, scopes } });
87
+ await Promise.resolve();
88
+ }
89
+ on(event, listener) {
90
+ return super.on(event, listener);
91
+ }
92
+ off(event, listener) {
93
+ return super.off(event, listener);
94
+ }
95
+ once(event, listener) {
96
+ return super.once(event, listener);
97
+ }
98
+ async connectLoop() {
99
+ while (!this.closed) {
100
+ try {
101
+ await this.openOnce();
102
+ this.reconnect.reset();
103
+ return;
104
+ }
105
+ catch (error) {
106
+ if (this.closed)
107
+ throw error;
108
+ const delayMs = this.reconnect.nextDelay();
109
+ this.emit("reconnecting", this.reconnect.attempt, delayMs);
110
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
111
+ }
112
+ }
113
+ }
114
+ async openOnce() {
115
+ const cursor = await this.cursorStore.load();
116
+ if (cursor !== null)
117
+ this.lastCursor = cursor;
118
+ await new Promise((resolve, reject) => {
119
+ const ws = new WebSocket(this.wsUrl());
120
+ this.ws = ws;
121
+ let resolved = false;
122
+ ws.onopen = () => {
123
+ this.emit("connected");
124
+ this.sendRegister();
125
+ };
126
+ ws.onmessage = (message) => {
127
+ void this.handleMessage(message.data, () => {
128
+ if (!resolved) {
129
+ resolved = true;
130
+ resolve();
131
+ }
132
+ });
133
+ };
134
+ ws.onerror = () => {
135
+ if (!resolved)
136
+ reject(new Error("bus connection failed"));
137
+ };
138
+ ws.onclose = (event) => {
139
+ this.stopHeartbeat();
140
+ this.registeredEpoch = 0;
141
+ const reason = event.reason || `closed:${event.code}`;
142
+ this.emit("disconnected", reason);
143
+ if (!resolved) {
144
+ resolved = true;
145
+ reject(new Error(reason));
146
+ return;
147
+ }
148
+ if (!this.closed)
149
+ void this.connect();
150
+ };
151
+ });
152
+ }
153
+ sendRegister() {
154
+ this.send({
155
+ type: "register",
156
+ id: crypto.randomUUID(),
157
+ payload: {
158
+ role: this.options.role,
159
+ componentId: this.options.componentId,
160
+ agentId: this.options.agentId,
161
+ instanceId: this.options.instanceId,
162
+ capabilities: this.options.capabilities ?? [],
163
+ tags: this.options.tags ?? [],
164
+ machine: this.options.machine ?? "unknown",
165
+ meta: this.options.meta ?? {},
166
+ },
167
+ });
168
+ }
169
+ async handleMessage(data, onRegistered) {
170
+ let frame;
171
+ try {
172
+ frame = JSON.parse(typeof data === "string" ? data : String(data));
173
+ }
174
+ catch {
175
+ this.emit("error", "INVALID_JSON", "server sent invalid JSON");
176
+ return;
177
+ }
178
+ if (frame.type === "registered") {
179
+ const payload = frame.payload;
180
+ const resumeFrom = this.lastCursor;
181
+ this.registeredEpoch = payload.epoch;
182
+ this.serverCursor = payload.cursor;
183
+ this.emit("registered", payload.epoch, payload.cursor);
184
+ this.send({ type: "subscribe", id: crypto.randomUUID(), payload: { events: [...this.subscriptions] } });
185
+ if (resumeFrom > 0 && resumeFrom < payload.cursor) {
186
+ this.send({ type: "resume", id: crypto.randomUUID(), payload: { since: resumeFrom } });
187
+ }
188
+ else {
189
+ this.lastCursor = payload.cursor;
190
+ await this.cursorStore.save(this.lastCursor);
191
+ }
192
+ this.startHeartbeat();
193
+ onRegistered();
194
+ return;
195
+ }
196
+ if (frame.type === "event") {
197
+ await this.handleEvent(frame.payload);
198
+ return;
199
+ }
200
+ if (frame.type === "resumed") {
201
+ for (const event of frame.payload.events)
202
+ await this.handleEvent(event);
203
+ return;
204
+ }
205
+ if (frame.type === "command.result") {
206
+ const pending = this.pending.get(frame.payload.commandId);
207
+ if (!pending)
208
+ return;
209
+ this.pending.delete(frame.payload.commandId);
210
+ if (frame.payload.status === "succeeded")
211
+ pending.resolve(frame.payload.result ?? null);
212
+ else
213
+ pending.reject(new Error(frame.payload.error || frame.payload.status));
214
+ return;
215
+ }
216
+ if (frame.type === "error") {
217
+ const error = frame;
218
+ if (error.payload.code === "REPLAY_GAP") {
219
+ await this.options.reconcile?.();
220
+ this.lastCursor = this.serverCursor;
221
+ await this.cursorStore.save(this.lastCursor);
222
+ }
223
+ this.emit("error", error.payload.code, error.payload.message);
224
+ if (error.payload.frameId) {
225
+ const pending = this.pending.get(error.payload.frameId);
226
+ if (pending) {
227
+ this.pending.delete(error.payload.frameId);
228
+ pending.reject(new Error(error.payload.message));
229
+ }
230
+ }
231
+ }
232
+ }
233
+ async handleEvent(event) {
234
+ this.lastCursor = Math.max(this.lastCursor, event.seq);
235
+ await this.cursorStore.save(this.lastCursor);
236
+ this.emit("event", event.eventType, event.data, event.seq);
237
+ if (event.eventType === "command.requested") {
238
+ const command = isRecord(event.data.command) ? event.data.command : undefined;
239
+ if (command) {
240
+ const commandType = typeof command.type === "string" ? command.type : "";
241
+ const commandId = typeof command.id === "string" ? command.id : "";
242
+ const params = isRecord(command.params) ? command.params : {};
243
+ this.emit("command", commandType, params, commandId);
244
+ }
245
+ }
246
+ this.emit(event.eventType, event.data);
247
+ if (event.eventType.startsWith("task."))
248
+ this.emit("task.changed", event.data);
249
+ }
250
+ startHeartbeat() {
251
+ this.stopHeartbeat();
252
+ this.heartbeat = setInterval(() => {
253
+ this.send({ type: "heartbeat", payload: { status: "online" } });
254
+ }, this.options.heartbeatIntervalMs ?? 30_000);
255
+ }
256
+ stopHeartbeat() {
257
+ if (this.heartbeat)
258
+ clearInterval(this.heartbeat);
259
+ this.heartbeat = undefined;
260
+ }
261
+ send(frame) {
262
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
263
+ return;
264
+ this.ws.send(JSON.stringify(frame));
265
+ }
266
+ wsUrl() {
267
+ const url = new URL(this.options.url);
268
+ const token = this.options.token ?? process.env.AGENT_RELAY_TOKEN;
269
+ if (token && !url.searchParams.has("token"))
270
+ url.searchParams.set("token", token);
271
+ return url.toString();
272
+ }
273
+ }
274
+ function isRecord(value) {
275
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
276
+ }
277
+ //# sourceMappingURL=bus-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus-client.js","sourceRoot":"","sources":["../src/bus-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { AgentCard, PollQuery, RegisterAgentInput, SendMessageInput, Message } from "./types.js";
2
+ export interface HttpClientOptions {
3
+ baseUrl: string;
4
+ token?: string;
5
+ timeout?: number;
6
+ }
7
+ export declare class RelayHttpError extends Error {
8
+ readonly method: string;
9
+ readonly path: string;
10
+ readonly status: number;
11
+ readonly statusText: string;
12
+ readonly body: string;
13
+ constructor(method: string, path: string, status: number, statusText: string, body: string);
14
+ }
15
+ export declare class RelayHttpClient {
16
+ private readonly baseUrl;
17
+ private readonly token?;
18
+ private readonly timeout;
19
+ constructor(options: HttpClientOptions);
20
+ registerAgent(input: RegisterAgentInput): Promise<AgentCard>;
21
+ getAgent(id: string): Promise<AgentCard | null>;
22
+ listAgents(filter?: {
23
+ tag?: string;
24
+ machine?: string;
25
+ status?: string;
26
+ }): Promise<AgentCard[]>;
27
+ heartbeat(agentId: string): Promise<void>;
28
+ setStatus(agentId: string, status: string): Promise<void>;
29
+ setReady(agentId: string, ready: boolean): Promise<void>;
30
+ setLabel(agentId: string, label: string | null): Promise<void>;
31
+ deleteAgent(agentId: string): Promise<void>;
32
+ sendMessage(input: SendMessageInput): Promise<Message>;
33
+ pollMessages(query: PollQuery): Promise<Message[]>;
34
+ getMessage(id: number): Promise<Message | null>;
35
+ getThread(messageId: number): Promise<Message[]>;
36
+ claimMessage(messageId: number, agentId: string): Promise<boolean>;
37
+ markRead(messageId: number, agentId: string): Promise<void>;
38
+ deleteMessage(messageId: number): Promise<void>;
39
+ getCursor(): Promise<{
40
+ latestId: number;
41
+ }>;
42
+ private json;
43
+ private jsonUrl;
44
+ private request;
45
+ private parseResponse;
46
+ private headers;
47
+ private url;
48
+ }
49
+ //# sourceMappingURL=http-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEtG,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,KAAK;IAErC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAJZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM;CAIxB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,iBAAiB;IAMtC,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IAItD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAMrD,UAAU,CAAC,MAAM,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAQ5F,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjD,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAW5C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IAOrD,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAI1C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASlE,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,SAAS,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAI1C,OAAO,CAAC,IAAI;YAIE,OAAO;YAKP,OAAO;YAeP,aAAa;IAS3B,OAAO,CAAC,OAAO;IAKf,OAAO,CAAC,GAAG;CAGZ"}
@@ -0,0 +1,143 @@
1
+ export class RelayHttpError extends Error {
2
+ method;
3
+ path;
4
+ status;
5
+ statusText;
6
+ body;
7
+ constructor(method, path, status, statusText, body) {
8
+ super(`relay ${method} ${path} failed: ${status}`);
9
+ this.method = method;
10
+ this.path = path;
11
+ this.status = status;
12
+ this.statusText = statusText;
13
+ this.body = body;
14
+ }
15
+ }
16
+ export class RelayHttpClient {
17
+ baseUrl;
18
+ token;
19
+ timeout;
20
+ constructor(options) {
21
+ this.baseUrl = options.baseUrl.replace(/\/+$/, "");
22
+ this.token = options.token;
23
+ this.timeout = options.timeout ?? 10_000;
24
+ }
25
+ registerAgent(input) {
26
+ return this.json("POST", "/api/agents", input);
27
+ }
28
+ async getAgent(id) {
29
+ const response = await this.request("GET", `/api/agents/${encodeURIComponent(id)}`);
30
+ if (response.status === 404)
31
+ return null;
32
+ return this.parseResponse(response, "GET", `/api/agents/${id}`);
33
+ }
34
+ listAgents(filter = {}) {
35
+ const url = this.url("/api/agents");
36
+ for (const [key, value] of Object.entries(filter)) {
37
+ if (value)
38
+ url.searchParams.set(key, value);
39
+ }
40
+ return this.jsonUrl("GET", url);
41
+ }
42
+ async heartbeat(agentId) {
43
+ await this.json("POST", `/api/agents/${encodeURIComponent(agentId)}/heartbeat`);
44
+ }
45
+ async setStatus(agentId, status) {
46
+ await this.json("PATCH", `/api/agents/${encodeURIComponent(agentId)}/status`, { status });
47
+ }
48
+ async setReady(agentId, ready) {
49
+ await this.json("PATCH", `/api/agents/${encodeURIComponent(agentId)}/ready`, { ready });
50
+ }
51
+ async setLabel(agentId, label) {
52
+ await this.json("PATCH", `/api/agents/${encodeURIComponent(agentId)}/label`, { label });
53
+ }
54
+ async deleteAgent(agentId) {
55
+ await this.json("DELETE", `/api/agents/${encodeURIComponent(agentId)}`);
56
+ }
57
+ sendMessage(input) {
58
+ return this.json("POST", "/api/messages", input);
59
+ }
60
+ pollMessages(query) {
61
+ const url = this.url("/api/messages");
62
+ url.searchParams.set("for", query.for);
63
+ if (query.since !== undefined)
64
+ url.searchParams.set("since", String(query.since));
65
+ if (query.sinceId !== undefined)
66
+ url.searchParams.set("sinceId", String(query.sinceId));
67
+ if (query.unread !== undefined)
68
+ url.searchParams.set("unread", String(query.unread));
69
+ if (query.channel)
70
+ url.searchParams.set("channel", query.channel);
71
+ if (query.limit !== undefined)
72
+ url.searchParams.set("limit", String(query.limit));
73
+ return this.jsonUrl("GET", url);
74
+ }
75
+ async getMessage(id) {
76
+ const path = `/api/messages/${id}`;
77
+ const response = await this.request("GET", path);
78
+ if (response.status === 404)
79
+ return null;
80
+ return this.parseResponse(response, "GET", path);
81
+ }
82
+ getThread(messageId) {
83
+ return this.json("GET", `/api/messages/${messageId}/thread`);
84
+ }
85
+ async claimMessage(messageId, agentId) {
86
+ const path = `/api/messages/${messageId}/claim`;
87
+ const response = await this.request("POST", path, { agentId });
88
+ if (response.ok)
89
+ return true;
90
+ if ([400, 404, 409].includes(response.status))
91
+ return false;
92
+ await this.parseResponse(response, "POST", path);
93
+ return false;
94
+ }
95
+ async markRead(messageId, agentId) {
96
+ await this.json("PATCH", `/api/messages/${messageId}`, { readBy: agentId });
97
+ }
98
+ async deleteMessage(messageId) {
99
+ await this.json("DELETE", `/api/messages/${messageId}`);
100
+ }
101
+ getCursor() {
102
+ return this.json("GET", "/api/messages/cursor");
103
+ }
104
+ json(method, path, body) {
105
+ return this.jsonUrl(method, this.url(path), body);
106
+ }
107
+ async jsonUrl(method, url, body) {
108
+ const response = await this.request(method, url, body);
109
+ return this.parseResponse(response, method, url.pathname);
110
+ }
111
+ async request(method, pathOrUrl, body) {
112
+ const controller = new AbortController();
113
+ const timeout = setTimeout(() => controller.abort(), this.timeout);
114
+ try {
115
+ return await fetch(pathOrUrl instanceof URL ? pathOrUrl : this.url(pathOrUrl), {
116
+ method,
117
+ headers: this.headers(body === undefined ? undefined : { "Content-Type": "application/json" }),
118
+ body: body === undefined ? undefined : JSON.stringify(body),
119
+ signal: controller.signal,
120
+ });
121
+ }
122
+ finally {
123
+ clearTimeout(timeout);
124
+ }
125
+ }
126
+ async parseResponse(response, method, path) {
127
+ if (!response.ok) {
128
+ const text = await response.text();
129
+ throw new RelayHttpError(method, path, response.status, response.statusText, text);
130
+ }
131
+ if (response.status === 204)
132
+ return null;
133
+ return response.json().catch(() => null);
134
+ }
135
+ headers(base = {}) {
136
+ const token = this.token ?? process.env.AGENT_RELAY_TOKEN;
137
+ return token ? { ...base, "X-Agent-Relay-Token": token } : base;
138
+ }
139
+ url(path) {
140
+ return new URL(path, this.baseUrl);
141
+ }
142
+ }
143
+ //# sourceMappingURL=http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-client.js","sourceRoot":"","sources":["../src/http-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from "./types.js";
2
+ export * from "./protocol.js";
3
+ export * from "./reconnect.js";
4
+ export * from "./http-client.js";
5
+ export * from "./bus-client.js";
6
+ export * from "./provider-base.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from "./types.js";
2
+ export * from "./protocol.js";
3
+ export * from "./reconnect.js";
4
+ export * from "./http-client.js";
5
+ export * from "./bus-client.js";
6
+ export * from "./provider-base.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC"}