@mquan/portal 0.0.1

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 (116) hide show
  1. package/README.md +168 -0
  2. package/dist/src/api.d.ts +5 -0
  3. package/dist/src/api.js +357 -0
  4. package/dist/src/api.js.map +1 -0
  5. package/dist/src/cli.d.ts +17 -0
  6. package/dist/src/cli.js +618 -0
  7. package/dist/src/cli.js.map +1 -0
  8. package/dist/src/daemon-lifecycle.d.ts +24 -0
  9. package/dist/src/daemon-lifecycle.js +107 -0
  10. package/dist/src/daemon-lifecycle.js.map +1 -0
  11. package/dist/src/daemon.d.ts +17 -0
  12. package/dist/src/daemon.js +90 -0
  13. package/dist/src/daemon.js.map +1 -0
  14. package/dist/src/doctor.d.ts +14 -0
  15. package/dist/src/doctor.js +51 -0
  16. package/dist/src/doctor.js.map +1 -0
  17. package/dist/src/entrypoint.d.ts +2 -0
  18. package/dist/src/entrypoint.js +14 -0
  19. package/dist/src/entrypoint.js.map +1 -0
  20. package/dist/src/index.d.ts +5 -0
  21. package/dist/src/index.js +5 -0
  22. package/dist/src/index.js.map +1 -0
  23. package/dist/src/launch.d.ts +41 -0
  24. package/dist/src/launch.js +186 -0
  25. package/dist/src/launch.js.map +1 -0
  26. package/dist/src/mcp.d.ts +9 -0
  27. package/dist/src/mcp.js +132 -0
  28. package/dist/src/mcp.js.map +1 -0
  29. package/dist/src/network/client.d.ts +67 -0
  30. package/dist/src/network/client.js +540 -0
  31. package/dist/src/network/client.js.map +1 -0
  32. package/dist/src/network/coordinator.d.ts +83 -0
  33. package/dist/src/network/coordinator.js +225 -0
  34. package/dist/src/network/coordinator.js.map +1 -0
  35. package/dist/src/network/protocol.d.ts +1352 -0
  36. package/dist/src/network/protocol.js +360 -0
  37. package/dist/src/network/protocol.js.map +1 -0
  38. package/dist/src/network/server.d.ts +28 -0
  39. package/dist/src/network/server.js +474 -0
  40. package/dist/src/network/server.js.map +1 -0
  41. package/dist/src/network/tasks.d.ts +65 -0
  42. package/dist/src/network/tasks.js +276 -0
  43. package/dist/src/network/tasks.js.map +1 -0
  44. package/dist/src/portal-index.d.ts +21 -0
  45. package/dist/src/portal-index.js +140 -0
  46. package/dist/src/portal-index.js.map +1 -0
  47. package/dist/src/provider/claude-managed.d.ts +34 -0
  48. package/dist/src/provider/claude-managed.js +125 -0
  49. package/dist/src/provider/claude-managed.js.map +1 -0
  50. package/dist/src/provider/claude.d.ts +24 -0
  51. package/dist/src/provider/claude.js +114 -0
  52. package/dist/src/provider/claude.js.map +1 -0
  53. package/dist/src/provider/codex/app-server-client.d.ts +43 -0
  54. package/dist/src/provider/codex/app-server-client.js +143 -0
  55. package/dist/src/provider/codex/app-server-client.js.map +1 -0
  56. package/dist/src/provider/codex/index.d.ts +3 -0
  57. package/dist/src/provider/codex/index.js +4 -0
  58. package/dist/src/provider/codex/index.js.map +1 -0
  59. package/dist/src/provider/codex/managed-runner.d.ts +12 -0
  60. package/dist/src/provider/codex/managed-runner.js +162 -0
  61. package/dist/src/provider/codex/managed-runner.js.map +1 -0
  62. package/dist/src/provider/codex/probe.d.ts +2 -0
  63. package/dist/src/provider/codex/probe.js +33 -0
  64. package/dist/src/provider/codex/probe.js.map +1 -0
  65. package/dist/src/provider/codex/protocol.d.ts +193 -0
  66. package/dist/src/provider/codex/protocol.js +10 -0
  67. package/dist/src/provider/codex/protocol.js.map +1 -0
  68. package/dist/src/provider/codex/provider.d.ts +35 -0
  69. package/dist/src/provider/codex/provider.js +289 -0
  70. package/dist/src/provider/codex/provider.js.map +1 -0
  71. package/dist/src/provider/codex/remote-app-server.d.ts +16 -0
  72. package/dist/src/provider/codex/remote-app-server.js +80 -0
  73. package/dist/src/provider/codex/remote-app-server.js.map +1 -0
  74. package/dist/src/provider/codex/websocket-client.d.ts +40 -0
  75. package/dist/src/provider/codex/websocket-client.js +174 -0
  76. package/dist/src/provider/codex/websocket-client.js.map +1 -0
  77. package/dist/src/provider/types.d.ts +35 -0
  78. package/dist/src/provider/types.js +2 -0
  79. package/dist/src/provider/types.js.map +1 -0
  80. package/dist/src/recall/embedding.d.ts +28 -0
  81. package/dist/src/recall/embedding.js +142 -0
  82. package/dist/src/recall/embedding.js.map +1 -0
  83. package/dist/src/recall/types.d.ts +35 -0
  84. package/dist/src/recall/types.js +2 -0
  85. package/dist/src/recall/types.js.map +1 -0
  86. package/dist/src/rpc/client.d.ts +6 -0
  87. package/dist/src/rpc/client.js +58 -0
  88. package/dist/src/rpc/client.js.map +1 -0
  89. package/dist/src/rpc/protocol.d.ts +21 -0
  90. package/dist/src/rpc/protocol.js +11 -0
  91. package/dist/src/rpc/protocol.js.map +1 -0
  92. package/dist/src/rpc/server.d.ts +12 -0
  93. package/dist/src/rpc/server.js +154 -0
  94. package/dist/src/rpc/server.js.map +1 -0
  95. package/dist/src/runtime/paths.d.ts +8 -0
  96. package/dist/src/runtime/paths.js +18 -0
  97. package/dist/src/runtime/paths.js.map +1 -0
  98. package/dist/src/service.d.ts +127 -0
  99. package/dist/src/service.js +637 -0
  100. package/dist/src/service.js.map +1 -0
  101. package/dist/src/session-profile.d.ts +39 -0
  102. package/dist/src/session-profile.js +186 -0
  103. package/dist/src/session-profile.js.map +1 -0
  104. package/dist/src/storage/database.d.ts +9 -0
  105. package/dist/src/storage/database.js +354 -0
  106. package/dist/src/storage/database.js.map +1 -0
  107. package/dist/src/storage/repository.d.ts +275 -0
  108. package/dist/src/storage/repository.js +1291 -0
  109. package/dist/src/storage/repository.js.map +1 -0
  110. package/dist/src/version.d.ts +1 -0
  111. package/dist/src/version.js +2 -0
  112. package/dist/src/version.js.map +1 -0
  113. package/docs/architecture-plan.md +191 -0
  114. package/docs/mvp-plan.md +111 -0
  115. package/docs/remote-demo.md +346 -0
  116. package/package.json +47 -0
@@ -0,0 +1,540 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { PROTOCOL_LIMITS, PROTOCOL_VERSION, clientMessageSchema, parseNetworkMessage, } from "./protocol.js";
3
+ /**
4
+ * Reusable client transport for the Portal relay protocol.
5
+ *
6
+ * A connection is usable only after the versioned hello exchange succeeds.
7
+ * Requests in flight when a socket drops are rejected (never silently
8
+ * replayed); later requests wait for the reconnect handshake.
9
+ */
10
+ export class RemoteNetworkClient {
11
+ url;
12
+ #options;
13
+ #messageHandlers = new Set();
14
+ #envelopeHandlers = new Set();
15
+ #stateHandlers = new Set();
16
+ #errorHandlers = new Set();
17
+ #pendingRequests = new Map();
18
+ #pendingEnvelopes = new Map();
19
+ #envelopeRequests = new Map();
20
+ #envelopeMetadata = new Map();
21
+ #socket = null;
22
+ #state = "connecting";
23
+ #connectPromise = null;
24
+ #connectResolve = null;
25
+ #connectReject = null;
26
+ #helloTimer = null;
27
+ #reconnectTimer = null;
28
+ #reconnectAttempts = 0;
29
+ #frameQueue = Promise.resolve();
30
+ #serverHello = null;
31
+ #closed = false;
32
+ constructor(url, options) {
33
+ this.url = normalizeRemoteServerUrl(url);
34
+ this.#options = {
35
+ ...options,
36
+ connectTimeoutMs: options.connectTimeoutMs ?? 10_000,
37
+ requestTimeoutMs: options.requestTimeoutMs ?? 10_000,
38
+ reconnect: options.reconnect ?? true,
39
+ reconnectDelayMs: options.reconnectDelayMs ?? 250,
40
+ maximumReconnectDelayMs: options.maximumReconnectDelayMs ?? 5_000,
41
+ };
42
+ }
43
+ static async connect(url, options) {
44
+ const client = new RemoteNetworkClient(url, options);
45
+ await client.#startConnection(false);
46
+ return client;
47
+ }
48
+ get state() {
49
+ return this.#state;
50
+ }
51
+ get serverHello() {
52
+ return this.#serverHello;
53
+ }
54
+ onMessage(handler) {
55
+ return subscribe(this.#messageHandlers, handler);
56
+ }
57
+ onEnvelope(handler) {
58
+ return subscribe(this.#envelopeHandlers, handler);
59
+ }
60
+ onStateChange(handler) {
61
+ return subscribe(this.#stateHandlers, handler);
62
+ }
63
+ onError(handler) {
64
+ return subscribe(this.#errorHandlers, handler);
65
+ }
66
+ async register(input) {
67
+ const response = await this.#request("agent.registered", (requestId) => ({
68
+ protocolVersion: PROTOCOL_VERSION,
69
+ type: "agent.register",
70
+ requestId,
71
+ ...input,
72
+ }));
73
+ return response.agent;
74
+ }
75
+ async renew(input) {
76
+ const response = await this.#request("agent.renewed", (requestId) => ({
77
+ protocolVersion: PROTOCOL_VERSION,
78
+ type: "agent.renew",
79
+ requestId,
80
+ ...input,
81
+ }));
82
+ return response.agent;
83
+ }
84
+ async unregister(routeId) {
85
+ await this.#request("agent.unregistered", (requestId) => ({
86
+ protocolVersion: PROTOCOL_VERSION,
87
+ type: "agent.unregister",
88
+ requestId,
89
+ routeId,
90
+ }));
91
+ }
92
+ async discover(input = {}) {
93
+ const response = await this.#request("agent.presence", (requestId) => ({
94
+ protocolVersion: PROTOCOL_VERSION,
95
+ type: "agent.discover",
96
+ requestId,
97
+ ...input,
98
+ limit: input.limit ?? 20,
99
+ }));
100
+ return response.agents;
101
+ }
102
+ async sendEnvelope(envelope) {
103
+ await this.#awaitConnected();
104
+ if (this.#pendingEnvelopes.has(envelope.envelopeId)) {
105
+ throw new Error(`envelope is already awaiting acknowledgement: ${envelope.envelopeId}`);
106
+ }
107
+ return new Promise((resolve, reject) => {
108
+ const requestId = this.#requestId();
109
+ const timer = this.#requestTimer(() => {
110
+ this.#pendingEnvelopes.delete(envelope.envelopeId);
111
+ this.#envelopeRequests.delete(requestId);
112
+ this.#envelopeMetadata.delete(envelope.envelopeId);
113
+ reject(new Error(`remote envelope acknowledgement timed out: ${envelope.envelopeId}`));
114
+ });
115
+ this.#pendingEnvelopes.set(envelope.envelopeId, {
116
+ expectedType: "envelope.acknowledged",
117
+ timer,
118
+ resolve,
119
+ reject,
120
+ });
121
+ this.#envelopeRequests.set(requestId, envelope.envelopeId);
122
+ this.#envelopeMetadata.set(envelope.envelopeId, { requestId, eventId: envelope.event.eventId });
123
+ try {
124
+ this.#sendOnSocket({
125
+ protocolVersion: PROTOCOL_VERSION,
126
+ type: "envelope.send",
127
+ requestId,
128
+ envelope,
129
+ });
130
+ }
131
+ catch (error) {
132
+ this.#pendingEnvelopes.delete(envelope.envelopeId);
133
+ this.#envelopeRequests.delete(requestId);
134
+ this.#envelopeMetadata.delete(envelope.envelopeId);
135
+ clearTimeout(timer);
136
+ reject(asError(error));
137
+ }
138
+ });
139
+ }
140
+ async acknowledge(input) {
141
+ await this.#request("envelope.acknowledge.accepted", (requestId) => ({
142
+ protocolVersion: PROTOCOL_VERSION,
143
+ type: "envelope.acknowledge",
144
+ requestId,
145
+ ...input,
146
+ }));
147
+ }
148
+ async send(message) {
149
+ const parsed = clientMessageSchema.parse(message);
150
+ await this.#awaitConnected();
151
+ this.#sendOnSocket(parsed);
152
+ }
153
+ async close() {
154
+ if (this.#closed)
155
+ return;
156
+ this.#closed = true;
157
+ this.#setState("closed");
158
+ if (this.#reconnectTimer !== null)
159
+ clearTimeout(this.#reconnectTimer);
160
+ this.#reconnectTimer = null;
161
+ if (this.#helloTimer !== null)
162
+ clearTimeout(this.#helloTimer);
163
+ this.#helloTimer = null;
164
+ this.#rejectConnect(new Error("remote WebSocket client closed"));
165
+ this.#failPending(new Error("remote WebSocket client closed"));
166
+ const socket = this.#socket;
167
+ this.#socket = null;
168
+ socket?.close(1000, "client closed");
169
+ this.#messageHandlers.clear();
170
+ this.#envelopeHandlers.clear();
171
+ this.#stateHandlers.clear();
172
+ this.#errorHandlers.clear();
173
+ }
174
+ async #request(expectedType, createMessage) {
175
+ await this.#awaitConnected();
176
+ const requestId = this.#requestId();
177
+ return new Promise((resolve, reject) => {
178
+ const timer = this.#requestTimer(() => {
179
+ this.#pendingRequests.delete(requestId);
180
+ reject(new Error(`remote request timed out: ${expectedType}`));
181
+ });
182
+ this.#pendingRequests.set(requestId, {
183
+ expectedType,
184
+ timer,
185
+ resolve: resolve,
186
+ reject,
187
+ });
188
+ try {
189
+ this.#sendOnSocket(createMessage(requestId));
190
+ }
191
+ catch (error) {
192
+ this.#pendingRequests.delete(requestId);
193
+ clearTimeout(timer);
194
+ reject(asError(error));
195
+ }
196
+ });
197
+ }
198
+ async #startConnection(reconnecting) {
199
+ if (this.#closed)
200
+ throw new Error("remote WebSocket client is closed");
201
+ if (this.#connectPromise !== null)
202
+ return this.#connectPromise;
203
+ this.#setState(reconnecting ? "reconnecting" : "connecting");
204
+ this.#connectPromise = new Promise((resolve, reject) => {
205
+ this.#connectResolve = resolve;
206
+ this.#connectReject = reject;
207
+ });
208
+ const promise = this.#connectPromise;
209
+ let socket;
210
+ try {
211
+ socket = (this.#options.webSocketFactory ?? defaultWebSocketFactory)(this.url);
212
+ this.#socket = socket;
213
+ }
214
+ catch (error) {
215
+ this.#rejectConnect(asError(error));
216
+ return promise;
217
+ }
218
+ socket.addEventListener("open", () => this.#handleOpen(socket), { once: true });
219
+ socket.addEventListener("message", (event) => {
220
+ this.#frameQueue = this.#frameQueue.then(() => this.#handleFrame(socket, event.data)).catch((error) => this.#emitError(asError(error)));
221
+ });
222
+ socket.addEventListener("error", () => this.#handleDisconnect(socket, new Error("remote WebSocket failed")));
223
+ socket.addEventListener("close", () => this.#handleDisconnect(socket, new Error("remote WebSocket closed")));
224
+ this.#helloTimer = setTimeout(() => {
225
+ if (socket !== this.#socket || this.#state === "connected")
226
+ return;
227
+ this.#handleDisconnect(socket, new Error("remote WebSocket hello timed out"));
228
+ socket.close(1000, "hello timeout");
229
+ }, this.#options.connectTimeoutMs);
230
+ this.#helloTimer.unref();
231
+ return promise;
232
+ }
233
+ #handleOpen(socket) {
234
+ if (socket !== this.#socket || this.#closed)
235
+ return;
236
+ const hello = {
237
+ protocolVersion: PROTOCOL_VERSION,
238
+ type: "client.hello",
239
+ clientId: this.#options.clientId,
240
+ installationId: this.#options.installationId,
241
+ sentAt: (this.#options.now ?? (() => new Date()))().toISOString(),
242
+ };
243
+ try {
244
+ this.#sendOnSocket(hello);
245
+ }
246
+ catch (error) {
247
+ this.#handleDisconnect(socket, asError(error));
248
+ }
249
+ }
250
+ async #handleFrame(socket, data) {
251
+ if (socket !== this.#socket || this.#closed)
252
+ return;
253
+ let message;
254
+ try {
255
+ const text = await frameText(data);
256
+ const parsed = parseNetworkMessage(text);
257
+ if (!isServerMessage(parsed))
258
+ throw new Error(`relay sent a client message: ${parsed.type}`);
259
+ message = parsed;
260
+ }
261
+ catch (error) {
262
+ this.#emitError(asError(error));
263
+ return;
264
+ }
265
+ if (this.#state !== "connected" && message.type !== "server.hello" && message.type !== "protocol.error") {
266
+ const error = new Error(`relay sent ${message.type} before server.hello`);
267
+ this.#emitError(error);
268
+ this.#handleDisconnect(socket, error);
269
+ socket.close(1002, "handshake required");
270
+ return;
271
+ }
272
+ if (this.#state === "connected" && message.type === "server.hello") {
273
+ const error = new Error("relay sent duplicate server.hello");
274
+ this.#emitError(error);
275
+ this.#handleDisconnect(socket, error);
276
+ socket.close(1002, "duplicate hello");
277
+ return;
278
+ }
279
+ if (message.type === "server.hello") {
280
+ this.#acceptHello(message);
281
+ }
282
+ else if (message.type === "protocol.error") {
283
+ this.#handleProtocolError(message);
284
+ }
285
+ else if ("requestId" in message) {
286
+ this.#settleRequest(message);
287
+ }
288
+ else if (message.type === "envelope.acknowledged") {
289
+ this.#settleEnvelope(message);
290
+ }
291
+ else if (message.type === "envelope.delivery") {
292
+ for (const handler of [...this.#envelopeHandlers])
293
+ void Promise.resolve(handler(message.envelope)).catch((error) => this.#emitError(asError(error)));
294
+ }
295
+ for (const handler of [...this.#messageHandlers])
296
+ void Promise.resolve(handler(message)).catch((error) => this.#emitError(asError(error)));
297
+ }
298
+ #acceptHello(hello) {
299
+ if (this.#state === "connected")
300
+ return;
301
+ if (this.#helloTimer !== null)
302
+ clearTimeout(this.#helloTimer);
303
+ this.#helloTimer = null;
304
+ this.#reconnectAttempts = 0;
305
+ this.#serverHello = hello;
306
+ this.#setState("connected");
307
+ this.#connectResolve?.();
308
+ this.#clearConnect();
309
+ }
310
+ #handleProtocolError(error) {
311
+ const protocolError = new Error(`remote protocol error (${error.code}): ${error.message}`);
312
+ if (error.requestId !== undefined) {
313
+ const pending = this.#pendingRequests.get(error.requestId);
314
+ if (pending !== undefined) {
315
+ this.#pendingRequests.delete(error.requestId);
316
+ clearTimeout(pending.timer);
317
+ pending.reject(protocolError);
318
+ return;
319
+ }
320
+ const envelopeId = this.#envelopeRequests.get(error.requestId);
321
+ if (envelopeId !== undefined) {
322
+ this.#envelopeRequests.delete(error.requestId);
323
+ this.#envelopeMetadata.delete(envelopeId);
324
+ const envelope = this.#pendingEnvelopes.get(envelopeId);
325
+ if (envelope !== undefined) {
326
+ this.#pendingEnvelopes.delete(envelopeId);
327
+ clearTimeout(envelope.timer);
328
+ envelope.reject(protocolError);
329
+ return;
330
+ }
331
+ }
332
+ }
333
+ if (this.#state !== "connected" && this.#socket !== null) {
334
+ const socket = this.#socket;
335
+ this.#handleDisconnect(socket, protocolError);
336
+ socket.close(1002, "protocol error");
337
+ }
338
+ this.#emitError(protocolError);
339
+ }
340
+ #settleRequest(message) {
341
+ const pending = this.#pendingRequests.get(message.requestId);
342
+ if (pending === undefined)
343
+ return;
344
+ this.#pendingRequests.delete(message.requestId);
345
+ clearTimeout(pending.timer);
346
+ if (pending.expectedType !== message.type) {
347
+ pending.reject(new Error(`unexpected remote response ${message.type}; expected ${pending.expectedType}`));
348
+ return;
349
+ }
350
+ pending.resolve(message);
351
+ }
352
+ #settleEnvelope(message) {
353
+ const pending = this.#pendingEnvelopes.get(message.envelopeId);
354
+ if (pending === undefined)
355
+ return;
356
+ const metadata = this.#envelopeMetadata.get(message.envelopeId);
357
+ if (metadata === undefined || metadata.eventId !== message.eventId) {
358
+ this.#emitError(new Error(`envelope acknowledgement event does not match: ${message.envelopeId}`));
359
+ return;
360
+ }
361
+ this.#envelopeRequests.delete(metadata.requestId);
362
+ this.#envelopeMetadata.delete(message.envelopeId);
363
+ this.#pendingEnvelopes.delete(message.envelopeId);
364
+ clearTimeout(pending.timer);
365
+ pending.resolve(message);
366
+ }
367
+ #handleDisconnect(socket, error) {
368
+ if (socket !== this.#socket || this.#closed)
369
+ return;
370
+ this.#socket = null;
371
+ this.#serverHello = null;
372
+ if (this.#helloTimer !== null)
373
+ clearTimeout(this.#helloTimer);
374
+ this.#helloTimer = null;
375
+ const wasInitialConnection = this.#state === "connecting";
376
+ this.#rejectConnect(error);
377
+ this.#failPending(error);
378
+ this.#emitError(error);
379
+ if (wasInitialConnection || !this.#options.reconnect) {
380
+ this.#setState("closed");
381
+ this.#closed = true;
382
+ return;
383
+ }
384
+ this.#scheduleReconnect();
385
+ }
386
+ #scheduleReconnect() {
387
+ if (this.#closed || this.#reconnectTimer !== null)
388
+ return;
389
+ this.#setState("reconnecting");
390
+ const delay = Math.min(this.#options.reconnectDelayMs * 2 ** this.#reconnectAttempts, this.#options.maximumReconnectDelayMs);
391
+ this.#reconnectAttempts += 1;
392
+ this.#reconnectTimer = setTimeout(() => {
393
+ this.#reconnectTimer = null;
394
+ void this.#startConnection(true).catch((error) => {
395
+ if (this.#closed)
396
+ return;
397
+ this.#emitError(asError(error));
398
+ this.#scheduleReconnect();
399
+ });
400
+ }, delay);
401
+ this.#reconnectTimer.unref();
402
+ }
403
+ async #awaitConnected() {
404
+ if (this.#closed)
405
+ throw new Error("remote WebSocket client is closed");
406
+ if (this.#state === "connected" && this.#socket !== null)
407
+ return;
408
+ if (this.#connectPromise !== null)
409
+ return this.#connectPromise;
410
+ return this.#startConnection(this.#state === "reconnecting");
411
+ }
412
+ #sendOnSocket(message) {
413
+ const socket = this.#socket;
414
+ if (socket === null || socket.readyState !== 1)
415
+ throw new Error("remote WebSocket is not open");
416
+ const encoded = JSON.stringify(clientMessageSchema.parse(message));
417
+ if (Buffer.byteLength(encoded, "utf8") > PROTOCOL_LIMITS.encodedMessageBytes) {
418
+ throw new Error("remote message exceeds protocol limit");
419
+ }
420
+ socket.send(encoded);
421
+ }
422
+ #requestId() {
423
+ const requestId = (this.#options.requestIdFactory ?? randomUUID)();
424
+ if (this.#pendingRequests.has(requestId) || this.#envelopeRequests.has(requestId)) {
425
+ throw new Error(`remote request ID is already in flight: ${requestId}`);
426
+ }
427
+ return requestId;
428
+ }
429
+ #requestTimer(onTimeout) {
430
+ const timer = setTimeout(onTimeout, this.#options.requestTimeoutMs);
431
+ timer.unref();
432
+ return timer;
433
+ }
434
+ #rejectConnect(error) {
435
+ this.#connectReject?.(error);
436
+ this.#clearConnect();
437
+ }
438
+ #clearConnect() {
439
+ this.#connectPromise = null;
440
+ this.#connectResolve = null;
441
+ this.#connectReject = null;
442
+ }
443
+ #failPending(error) {
444
+ for (const pending of this.#pendingRequests.values()) {
445
+ clearTimeout(pending.timer);
446
+ pending.reject(error);
447
+ }
448
+ this.#pendingRequests.clear();
449
+ for (const pending of this.#pendingEnvelopes.values()) {
450
+ clearTimeout(pending.timer);
451
+ pending.reject(error);
452
+ }
453
+ this.#pendingEnvelopes.clear();
454
+ this.#envelopeRequests.clear();
455
+ this.#envelopeMetadata.clear();
456
+ }
457
+ #setState(state) {
458
+ if (this.#state === state)
459
+ return;
460
+ this.#state = state;
461
+ for (const handler of [...this.#stateHandlers]) {
462
+ try {
463
+ handler(state);
464
+ }
465
+ catch (error) {
466
+ this.#emitError(asError(error));
467
+ }
468
+ }
469
+ }
470
+ #emitError(error) {
471
+ for (const handler of [...this.#errorHandlers]) {
472
+ try {
473
+ handler(error);
474
+ }
475
+ catch {
476
+ // Error observers must not destabilize the transport.
477
+ }
478
+ }
479
+ }
480
+ }
481
+ export function normalizeRemoteServerUrl(input) {
482
+ let url;
483
+ try {
484
+ url = new URL(input.trim());
485
+ }
486
+ catch {
487
+ throw new TypeError(`invalid remote server URL: ${input}`);
488
+ }
489
+ if (url.username.length > 0 || url.password.length > 0) {
490
+ throw new TypeError("remote server URL must not contain credentials");
491
+ }
492
+ if (url.protocol === "http:")
493
+ url.protocol = "ws:";
494
+ else if (url.protocol === "https:")
495
+ url.protocol = "wss:";
496
+ else if (url.protocol !== "ws:" && url.protocol !== "wss:") {
497
+ throw new TypeError("remote server URL must use http, https, ws, or wss");
498
+ }
499
+ url.hash = "";
500
+ if (url.pathname === "/" || url.pathname.length === 0)
501
+ url.pathname = "/ws";
502
+ else if (url.pathname.length > 1 && url.pathname.endsWith("/"))
503
+ url.pathname = url.pathname.slice(0, -1);
504
+ return url.toString();
505
+ }
506
+ function defaultWebSocketFactory(url) {
507
+ return new WebSocket(url);
508
+ }
509
+ function subscribe(listeners, listener) {
510
+ listeners.add(listener);
511
+ let active = true;
512
+ return () => {
513
+ if (!active)
514
+ return;
515
+ active = false;
516
+ listeners.delete(listener);
517
+ };
518
+ }
519
+ async function frameText(data) {
520
+ if (typeof data === "string")
521
+ return data;
522
+ if (data instanceof ArrayBuffer)
523
+ return Buffer.from(data).toString("utf8");
524
+ if (ArrayBuffer.isView(data))
525
+ return Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString("utf8");
526
+ if (typeof Blob !== "undefined" && data instanceof Blob)
527
+ return data.text();
528
+ throw new Error("remote WebSocket frame must contain UTF-8 text");
529
+ }
530
+ function isServerMessage(message) {
531
+ return message.type === "server.hello" || message.type === "agent.registered" ||
532
+ message.type === "agent.renewed" || message.type === "agent.unregistered" ||
533
+ message.type === "agent.presence" || message.type === "envelope.delivery" ||
534
+ message.type === "envelope.acknowledge.accepted" ||
535
+ message.type === "envelope.acknowledged" || message.type === "protocol.error";
536
+ }
537
+ function asError(value) {
538
+ return value instanceof Error ? value : new Error(String(value));
539
+ }
540
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/network/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import { type RemoteClientState } from "./client.js";
2
+ import type { AgentPresence, Envelope, EnvelopeAcknowledge, EnvelopeAcknowledged } from "./protocol.js";
3
+ export interface AdvertiseRemoteAgentInput {
4
+ serverUrl: string;
5
+ sessionId: string;
6
+ agentName: string;
7
+ provider: "codex" | "claude";
8
+ description: string;
9
+ capabilities?: Array<"message" | "task">;
10
+ state?: "available" | "busy";
11
+ }
12
+ export interface RemotePeer extends AgentPresence {
13
+ serverUrl: string;
14
+ authenticated: false;
15
+ }
16
+ export interface RemoteClientApi {
17
+ readonly state: RemoteClientState;
18
+ register(input: {
19
+ sessionId: string;
20
+ agentName: string;
21
+ provider: "codex" | "claude";
22
+ description: string;
23
+ capabilities: Array<"message" | "task">;
24
+ state: "available" | "busy";
25
+ leaseSeconds: number;
26
+ }): Promise<AgentPresence>;
27
+ renew(input: {
28
+ routeId: string;
29
+ state?: "available" | "busy";
30
+ leaseSeconds: number;
31
+ }): Promise<AgentPresence>;
32
+ unregister(routeId: string): Promise<void>;
33
+ discover(input?: {
34
+ query?: string;
35
+ capability?: "message" | "task";
36
+ limit?: number;
37
+ }): Promise<AgentPresence[]>;
38
+ sendEnvelope(envelope: Envelope): Promise<EnvelopeAcknowledged>;
39
+ acknowledge(input: Omit<EnvelopeAcknowledge, "protocolVersion" | "type" | "requestId">): Promise<void>;
40
+ onEnvelope(handler: (envelope: Envelope) => void | Promise<void>): () => void;
41
+ onStateChange(handler: (state: RemoteClientState) => void): () => void;
42
+ onError(handler: (error: Error) => void): () => void;
43
+ close(): Promise<void>;
44
+ }
45
+ export interface RemoteCoordinatorOptions {
46
+ installationId?: string;
47
+ clientId?: string;
48
+ leaseSeconds?: number;
49
+ clientFactory?: (url: string, options: {
50
+ clientId: string;
51
+ installationId: string;
52
+ }) => Promise<RemoteClientApi>;
53
+ onEnvelope?: (serverUrl: string, envelope: Envelope) => void | Promise<void>;
54
+ onError?: (serverUrl: string, error: Error) => void;
55
+ }
56
+ /** Multiplexes explicitly advertised local sessions over one client per relay URL. */
57
+ export declare class RemoteCoordinator {
58
+ #private;
59
+ readonly installationId: string;
60
+ readonly clientId: string;
61
+ readonly leaseSeconds: number;
62
+ constructor(options?: RemoteCoordinatorOptions);
63
+ advertise(input: AdvertiseRemoteAgentInput): Promise<RemotePeer>;
64
+ unadvertise(serverUrl: string, sessionId: string): Promise<void>;
65
+ discover(serverUrl: string, input?: {
66
+ query?: string;
67
+ capability?: "message" | "task";
68
+ limit?: number;
69
+ }, excludeSessionId?: string): Promise<RemotePeer[]>;
70
+ serverForSession(sessionId: string): string | null;
71
+ discoverForSession(sessionId: string, input?: {
72
+ query?: string;
73
+ capability?: "message" | "task";
74
+ limit?: number;
75
+ }): Promise<RemotePeer[]>;
76
+ sendEnvelope(serverUrl: string, envelope: Envelope): Promise<EnvelopeAcknowledged>;
77
+ onEnvelope(handler: (serverUrl: string, envelope: Envelope) => void | Promise<void>): () => void;
78
+ localRoute(serverUrl: string, sessionId: string): Promise<AgentPresence | null>;
79
+ localSessionForRoute(serverUrl: string, routeId: string): Promise<string | null>;
80
+ peerByRoute(serverUrl: string, routeId: string): Promise<RemotePeer | null>;
81
+ acknowledge(serverUrl: string, input: Omit<EnvelopeAcknowledge, "protocolVersion" | "type" | "requestId">): Promise<void>;
82
+ close(): Promise<void>;
83
+ }