@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,360 @@
1
+ import { z } from "zod";
2
+ export const PROTOCOL_VERSION = 1;
3
+ export const PROTOCOL_LIMITS = Object.freeze({
4
+ encodedMessageBytes: 64 * 1024,
5
+ idCharacters: 128,
6
+ agentNameCharacters: 64,
7
+ descriptionCharacters: 280,
8
+ discoveryQueryCharacters: 256,
9
+ objectiveCharacters: 4 * 1024,
10
+ contextCharacters: 16 * 1024,
11
+ expectedResultCharacters: 2 * 1024,
12
+ eventBodyCharacters: 32 * 1024,
13
+ errorCharacters: 2 * 1024,
14
+ artifactReferenceCharacters: 2 * 1024,
15
+ artifactReferences: 16,
16
+ capabilities: 16,
17
+ presenceResults: 100,
18
+ minimumHeartbeatSeconds: 5,
19
+ maximumHeartbeatSeconds: 60,
20
+ minimumLeaseSeconds: 15,
21
+ maximumLeaseSeconds: 120,
22
+ maximumTaskTtlMilliseconds: 24 * 60 * 60 * 1_000,
23
+ });
24
+ export class NetworkProtocolError extends Error {
25
+ code;
26
+ details;
27
+ constructor(code, message, details) {
28
+ super(message);
29
+ this.code = code;
30
+ this.details = details;
31
+ this.name = "NetworkProtocolError";
32
+ }
33
+ }
34
+ const protocolShape = { protocolVersion: z.literal(PROTOCOL_VERSION) };
35
+ const idSchema = z.string().trim().min(1).max(PROTOCOL_LIMITS.idCharacters)
36
+ .regex(/^[A-Za-z0-9][A-Za-z0-9._:-]*$/, "must be an opaque protocol identifier");
37
+ const timestampSchema = z.string().datetime({ offset: true });
38
+ const agentNameSchema = z.string().trim().min(1).max(PROTOCOL_LIMITS.agentNameCharacters);
39
+ const descriptionSchema = z.string().trim().min(1).max(PROTOCOL_LIMITS.descriptionCharacters);
40
+ const heartbeatSecondsSchema = z.number().int()
41
+ .min(PROTOCOL_LIMITS.minimumHeartbeatSeconds)
42
+ .max(PROTOCOL_LIMITS.maximumHeartbeatSeconds);
43
+ const leaseSecondsSchema = z.number().int()
44
+ .min(PROTOCOL_LIMITS.minimumLeaseSeconds)
45
+ .max(PROTOCOL_LIMITS.maximumLeaseSeconds);
46
+ export const providerSchema = z.enum(["codex", "claude"]);
47
+ export const capabilitySchema = z.enum(["message", "task"]);
48
+ export const presenceStateSchema = z.enum(["available", "busy"]);
49
+ export const taskEventKindSchema = z.enum([
50
+ "offer",
51
+ "accepted",
52
+ "declined",
53
+ "running",
54
+ "progress",
55
+ "question",
56
+ "answer",
57
+ "completed",
58
+ "failed",
59
+ ]);
60
+ export const taskStateSchema = z.enum([
61
+ "offered",
62
+ "accepted",
63
+ "declined",
64
+ "running",
65
+ "completed",
66
+ "failed",
67
+ ]);
68
+ const registrationShape = {
69
+ sessionId: idSchema,
70
+ agentName: agentNameSchema,
71
+ provider: providerSchema,
72
+ description: descriptionSchema,
73
+ capabilities: z.array(capabilitySchema).min(1).max(PROTOCOL_LIMITS.capabilities),
74
+ state: presenceStateSchema,
75
+ };
76
+ export const agentPresenceSchema = z.object({
77
+ routeId: idSchema,
78
+ ...registrationShape,
79
+ expiresAt: timestampSchema,
80
+ }).strict();
81
+ export const clientHelloSchema = z.object({
82
+ ...protocolShape,
83
+ type: z.literal("client.hello"),
84
+ clientId: idSchema,
85
+ installationId: idSchema,
86
+ sentAt: timestampSchema,
87
+ }).strict();
88
+ export const serverHelloSchema = z.object({
89
+ ...protocolShape,
90
+ type: z.literal("server.hello"),
91
+ connectionId: idSchema,
92
+ heartbeatIntervalSeconds: heartbeatSecondsSchema,
93
+ sentAt: timestampSchema,
94
+ }).strict();
95
+ export const agentRegisterSchema = z.object({
96
+ ...protocolShape,
97
+ type: z.literal("agent.register"),
98
+ requestId: idSchema,
99
+ ...registrationShape,
100
+ leaseSeconds: leaseSecondsSchema,
101
+ }).strict();
102
+ export const agentRegisteredSchema = z.object({
103
+ ...protocolShape,
104
+ type: z.literal("agent.registered"),
105
+ requestId: idSchema,
106
+ agent: agentPresenceSchema,
107
+ }).strict();
108
+ export const agentRenewSchema = z.object({
109
+ ...protocolShape,
110
+ type: z.literal("agent.renew"),
111
+ requestId: idSchema,
112
+ routeId: idSchema,
113
+ state: presenceStateSchema.optional(),
114
+ leaseSeconds: leaseSecondsSchema,
115
+ }).strict();
116
+ export const agentRenewedSchema = z.object({
117
+ ...protocolShape,
118
+ type: z.literal("agent.renewed"),
119
+ requestId: idSchema,
120
+ agent: agentPresenceSchema,
121
+ }).strict();
122
+ export const agentUnregisterSchema = z.object({
123
+ ...protocolShape,
124
+ type: z.literal("agent.unregister"),
125
+ requestId: idSchema,
126
+ routeId: idSchema,
127
+ }).strict();
128
+ export const agentUnregisteredSchema = z.object({
129
+ ...protocolShape,
130
+ type: z.literal("agent.unregistered"),
131
+ requestId: idSchema,
132
+ routeId: idSchema,
133
+ }).strict();
134
+ export const agentDiscoverSchema = z.object({
135
+ ...protocolShape,
136
+ type: z.literal("agent.discover"),
137
+ requestId: idSchema,
138
+ query: z.string().trim().min(1).max(PROTOCOL_LIMITS.discoveryQueryCharacters).optional(),
139
+ capability: capabilitySchema.optional(),
140
+ limit: z.number().int().min(1).max(PROTOCOL_LIMITS.presenceResults).default(20),
141
+ }).strict();
142
+ export const agentPresenceResultSchema = z.object({
143
+ ...protocolShape,
144
+ type: z.literal("agent.presence"),
145
+ requestId: idSchema,
146
+ agents: z.array(agentPresenceSchema).max(PROTOCOL_LIMITS.presenceResults),
147
+ }).strict();
148
+ const taskEventBaseShape = {
149
+ eventId: idSchema,
150
+ taskId: idSchema,
151
+ createdAt: timestampSchema,
152
+ };
153
+ const bodySchema = z.string().trim().min(1).max(PROTOCOL_LIMITS.eventBodyCharacters);
154
+ export const taskOfferEventSchema = z.object({
155
+ ...taskEventBaseShape,
156
+ kind: z.literal("offer"),
157
+ state: z.literal("offered"),
158
+ objective: z.string().trim().min(1).max(PROTOCOL_LIMITS.objectiveCharacters),
159
+ context: z.string().trim().min(1).max(PROTOCOL_LIMITS.contextCharacters).optional(),
160
+ expectedResult: z.string().trim().min(1).max(PROTOCOL_LIMITS.expectedResultCharacters).optional(),
161
+ }).strict();
162
+ export const taskAcceptedEventSchema = z.object({
163
+ ...taskEventBaseShape,
164
+ kind: z.literal("accepted"),
165
+ state: z.literal("accepted"),
166
+ message: bodySchema.optional(),
167
+ }).strict();
168
+ export const taskDeclinedEventSchema = z.object({
169
+ ...taskEventBaseShape,
170
+ kind: z.literal("declined"),
171
+ state: z.literal("declined"),
172
+ reason: bodySchema.optional(),
173
+ }).strict();
174
+ export const taskRunningEventSchema = z.object({
175
+ ...taskEventBaseShape,
176
+ kind: z.literal("running"),
177
+ state: z.literal("running"),
178
+ message: bodySchema.optional(),
179
+ }).strict();
180
+ export const taskProgressEventSchema = z.object({
181
+ ...taskEventBaseShape,
182
+ kind: z.literal("progress"),
183
+ state: z.literal("running"),
184
+ message: bodySchema,
185
+ }).strict();
186
+ export const taskQuestionEventSchema = z.object({
187
+ ...taskEventBaseShape,
188
+ kind: z.literal("question"),
189
+ state: z.literal("running"),
190
+ question: bodySchema,
191
+ }).strict();
192
+ export const taskAnswerEventSchema = z.object({
193
+ ...taskEventBaseShape,
194
+ kind: z.literal("answer"),
195
+ state: z.literal("running"),
196
+ answer: bodySchema,
197
+ }).strict();
198
+ export const taskCompletedEventSchema = z.object({
199
+ ...taskEventBaseShape,
200
+ kind: z.literal("completed"),
201
+ state: z.literal("completed"),
202
+ result: bodySchema,
203
+ artifactReferences: z.array(z.string().trim().min(1).max(PROTOCOL_LIMITS.artifactReferenceCharacters)).max(PROTOCOL_LIMITS.artifactReferences).optional(),
204
+ }).strict();
205
+ export const taskFailedEventSchema = z.object({
206
+ ...taskEventBaseShape,
207
+ kind: z.literal("failed"),
208
+ state: z.literal("failed"),
209
+ error: z.string().trim().min(1).max(PROTOCOL_LIMITS.errorCharacters),
210
+ }).strict();
211
+ export const taskEventSchema = z.discriminatedUnion("kind", [
212
+ taskOfferEventSchema,
213
+ taskAcceptedEventSchema,
214
+ taskDeclinedEventSchema,
215
+ taskRunningEventSchema,
216
+ taskProgressEventSchema,
217
+ taskQuestionEventSchema,
218
+ taskAnswerEventSchema,
219
+ taskCompletedEventSchema,
220
+ taskFailedEventSchema,
221
+ ]);
222
+ export const envelopeSchema = z.object({
223
+ envelopeId: idSchema,
224
+ senderRouteId: idSchema,
225
+ targetRouteId: idSchema,
226
+ sentAt: timestampSchema,
227
+ expiresAt: timestampSchema,
228
+ event: taskEventSchema,
229
+ }).strict().superRefine((envelope, context) => {
230
+ const sentAt = Date.parse(envelope.sentAt);
231
+ const expiresAt = Date.parse(envelope.expiresAt);
232
+ if (expiresAt <= sentAt) {
233
+ context.addIssue({ code: "custom", path: ["expiresAt"], message: "must be after sentAt" });
234
+ }
235
+ else if (expiresAt - sentAt > PROTOCOL_LIMITS.maximumTaskTtlMilliseconds) {
236
+ context.addIssue({
237
+ code: "custom",
238
+ path: ["expiresAt"],
239
+ message: "task expiry exceeds the maximum TTL",
240
+ });
241
+ }
242
+ });
243
+ export const envelopeSendSchema = z.object({
244
+ ...protocolShape,
245
+ type: z.literal("envelope.send"),
246
+ requestId: idSchema,
247
+ envelope: envelopeSchema,
248
+ }).strict();
249
+ export const envelopeDeliverySchema = z.object({
250
+ ...protocolShape,
251
+ type: z.literal("envelope.delivery"),
252
+ envelope: envelopeSchema,
253
+ }).strict();
254
+ export const envelopeAcknowledgeSchema = z.object({
255
+ ...protocolShape,
256
+ type: z.literal("envelope.acknowledge"),
257
+ requestId: idSchema,
258
+ targetRouteId: idSchema,
259
+ envelopeId: idSchema,
260
+ eventId: idSchema,
261
+ status: z.enum(["received", "rejected"]),
262
+ receivedAt: timestampSchema,
263
+ error: z.string().trim().min(1).max(PROTOCOL_LIMITS.errorCharacters).optional(),
264
+ }).strict().superRefine((acknowledgement, context) => {
265
+ if (acknowledgement.status === "rejected" && acknowledgement.error === undefined) {
266
+ context.addIssue({ code: "custom", path: ["error"], message: "is required when rejected" });
267
+ }
268
+ if (acknowledgement.status === "received" && acknowledgement.error !== undefined) {
269
+ context.addIssue({ code: "custom", path: ["error"], message: "is not allowed when received" });
270
+ }
271
+ });
272
+ export const envelopeAcknowledgeAcceptedSchema = z.object({
273
+ ...protocolShape,
274
+ type: z.literal("envelope.acknowledge.accepted"),
275
+ requestId: idSchema,
276
+ envelopeId: idSchema,
277
+ eventId: idSchema,
278
+ }).strict();
279
+ export const envelopeAcknowledgedSchema = z.object({
280
+ ...protocolShape,
281
+ type: z.literal("envelope.acknowledged"),
282
+ envelopeId: idSchema,
283
+ eventId: idSchema,
284
+ status: z.enum(["received", "rejected"]),
285
+ receivedAt: timestampSchema,
286
+ error: z.string().trim().min(1).max(PROTOCOL_LIMITS.errorCharacters).optional(),
287
+ }).strict();
288
+ export const protocolErrorSchema = z.object({
289
+ ...protocolShape,
290
+ type: z.literal("protocol.error"),
291
+ requestId: idSchema.optional(),
292
+ code: z.enum([
293
+ "protocol_mismatch",
294
+ "malformed_message",
295
+ "message_too_large",
296
+ "handshake_required",
297
+ "invalid_state",
298
+ "not_connected",
299
+ "route_not_found",
300
+ "route_not_owned",
301
+ "envelope_expired",
302
+ "envelope_conflict",
303
+ "internal_error",
304
+ ]),
305
+ message: z.string().trim().min(1).max(PROTOCOL_LIMITS.errorCharacters),
306
+ supportedVersion: z.literal(PROTOCOL_VERSION).optional(),
307
+ }).strict();
308
+ export const clientMessageSchema = z.discriminatedUnion("type", [
309
+ clientHelloSchema,
310
+ agentRegisterSchema,
311
+ agentRenewSchema,
312
+ agentUnregisterSchema,
313
+ agentDiscoverSchema,
314
+ envelopeSendSchema,
315
+ envelopeAcknowledgeSchema,
316
+ ]);
317
+ export const serverMessageSchema = z.discriminatedUnion("type", [
318
+ serverHelloSchema,
319
+ agentRegisteredSchema,
320
+ agentRenewedSchema,
321
+ agentUnregisteredSchema,
322
+ agentPresenceResultSchema,
323
+ envelopeDeliverySchema,
324
+ envelopeAcknowledgeAcceptedSchema,
325
+ envelopeAcknowledgedSchema,
326
+ protocolErrorSchema,
327
+ ]);
328
+ export const networkMessageSchema = z.union([clientMessageSchema, serverMessageSchema]);
329
+ /** M0 compatibility rule: peers communicate only when protocol versions are exactly equal. */
330
+ export function isProtocolVersionCompatible(peerVersion) {
331
+ return peerVersion === PROTOCOL_VERSION;
332
+ }
333
+ /** Parse a decoded object or a UTF-8 JSON WebSocket frame with uniform wire errors. */
334
+ export function parseNetworkMessage(input) {
335
+ let decoded = input;
336
+ if (typeof input === "string") {
337
+ if (Buffer.byteLength(input, "utf8") > PROTOCOL_LIMITS.encodedMessageBytes) {
338
+ throw new NetworkProtocolError("message_too_large", "encoded message exceeds protocol limit");
339
+ }
340
+ try {
341
+ decoded = JSON.parse(input);
342
+ }
343
+ catch (error) {
344
+ throw new NetworkProtocolError("malformed_message", "message is not valid JSON", error);
345
+ }
346
+ }
347
+ if (isRecord(decoded) && typeof decoded.protocolVersion === "number"
348
+ && !isProtocolVersionCompatible(decoded.protocolVersion)) {
349
+ throw new NetworkProtocolError("protocol_mismatch", `unsupported protocol version ${decoded.protocolVersion}; expected ${PROTOCOL_VERSION}`);
350
+ }
351
+ const result = networkMessageSchema.safeParse(decoded);
352
+ if (!result.success) {
353
+ throw new NetworkProtocolError("malformed_message", "message does not match the protocol", result.error);
354
+ }
355
+ return result.data;
356
+ }
357
+ function isRecord(value) {
358
+ return typeof value === "object" && value !== null && !Array.isArray(value);
359
+ }
360
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../../src/network/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface RelayServerOptions {
2
+ host?: string;
3
+ port?: number;
4
+ heartbeatIntervalSeconds?: number;
5
+ sweepIntervalMs?: number;
6
+ now?: () => Date;
7
+ idFactory?: () => string;
8
+ }
9
+ export interface RelayServerAddress {
10
+ host: string;
11
+ port: number;
12
+ httpUrl: string;
13
+ webSocketUrl: string;
14
+ }
15
+ /** In-memory demo registry and relay. Restarting it intentionally clears all state. */
16
+ export declare class PortalRelayServer {
17
+ #private;
18
+ readonly host: string;
19
+ readonly port: number;
20
+ readonly heartbeatIntervalSeconds: number;
21
+ constructor(options?: RelayServerOptions);
22
+ get address(): RelayServerAddress | null;
23
+ get connectionCount(): number;
24
+ get agentCount(): number;
25
+ start(): Promise<RelayServerAddress>;
26
+ close(): Promise<void>;
27
+ sweepExpiredPresence(): void;
28
+ }