@fatagnus/dink-sdk 2.0.3 → 2.3.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.
@@ -1,17 +1,91 @@
1
- import type { CenterConfig, EdgeInfo, DiscoverOptions, CallOptions, Subscription, ServiceCaller } from '../types.js';
1
+ import type { CenterConfig, EdgeInfo, DiscoverOptions, CallOptions, Subscription, ServiceCaller, ConnectionQuality } from '../types.js';
2
+ import type { ServiceDescriptor, MethodDescriptor } from '../introspect.js';
2
3
  export declare class CenterClient implements ServiceCaller {
3
4
  private config;
4
5
  private nc;
5
6
  private appId;
7
+ private connectionState;
8
+ private lastLatencyMs;
9
+ private lastPingAt;
10
+ private latencyHistory;
11
+ private messagesSent;
12
+ private messagesReceived;
13
+ private statsStartedAt;
14
+ private qualityCallbacks;
15
+ private qualityConfig;
16
+ private pingTimer;
6
17
  constructor(config: CenterConfig);
7
18
  connect(): Promise<void>;
8
19
  close(): Promise<void>;
9
20
  isConnected(): boolean;
21
+ /**
22
+ * Get current connection quality metrics.
23
+ */
24
+ getConnectionQuality(): ConnectionQuality;
25
+ /**
26
+ * Subscribe to connection quality changes.
27
+ * @param callback - Function called with updated quality metrics
28
+ * @returns Unsubscribe function
29
+ */
30
+ onConnectionQualityChange(callback: (quality: ConnectionQuality) => void): () => void;
31
+ /**
32
+ * Ping the server and return round-trip latency in milliseconds.
33
+ */
34
+ ping(): Promise<number>;
35
+ private setConnectionState;
36
+ private calculateQualityLevel;
37
+ private calculateAvgLatency;
38
+ private buildQualitySnapshot;
39
+ private emitQualityChange;
40
+ private setupConnectionHandlers;
41
+ private startPingTimer;
42
+ private stopPingTimer;
10
43
  discoverEdges(opts?: DiscoverOptions): Promise<EdgeInfo[]>;
11
44
  listEdges(): Promise<EdgeInfo[]>;
12
45
  call<Req, Resp>(edgeId: string, service: string, method: string, req: Req, opts?: CallOptions): Promise<Resp>;
13
46
  subscribe<Req, Resp>(edgeId: string, service: string, method: string, req: Req, handler: (resp: Resp) => void): Promise<Subscription>;
14
47
  private delay;
15
48
  private getAuthHeaders;
49
+ /**
50
+ * Describe a service by name, returning its ServiceDescriptor.
51
+ * @param serviceName - The name or ID of the service to describe
52
+ * @returns Promise resolving to the ServiceDescriptor
53
+ */
54
+ describeService(serviceName: string): Promise<ServiceDescriptor>;
55
+ /**
56
+ * Describe a specific method of a service, returning its MethodDescriptor.
57
+ * @param serviceName - The name or ID of the service
58
+ * @param methodName - The name of the method to describe
59
+ * @returns Promise resolving to the MethodDescriptor
60
+ */
61
+ describeMethod(serviceName: string, methodName: string): Promise<MethodDescriptor>;
62
+ /**
63
+ * Get LLM-friendly context (llm.txt format) for specified services.
64
+ * @param serviceNames - A single service name or array of service names
65
+ * @returns Promise resolving to llm.txt formatted string
66
+ */
67
+ getLLMContext(serviceNames: string | string[]): Promise<string>;
68
+ /**
69
+ * Get LLM-friendly context (llm.txt format) for all registered services.
70
+ * @returns Promise resolving to llm.txt formatted string
71
+ */
72
+ getAllLLMContext(): Promise<string>;
73
+ /**
74
+ * List all services with their full ServiceDescriptors.
75
+ * @returns Promise resolving to array of ServiceDescriptors
76
+ */
77
+ listServicesWithDescriptions(): Promise<ServiceDescriptor[]>;
78
+ /**
79
+ * Internal helper to list services from the API.
80
+ */
81
+ private listServicesInternal;
82
+ /**
83
+ * Internal helper to get descriptors for a list of services.
84
+ */
85
+ private getDescriptorsForServices;
86
+ /**
87
+ * Internal helper to format ServiceDescriptors as llm.txt.
88
+ */
89
+ private formatAsLLMTxt;
16
90
  }
17
91
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/center/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIrH,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,YAAY;IAU1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAexB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,WAAW,IAAI,OAAO;IAIhB,aAAa,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0C9D,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA2BhC,IAAI,CAAC,GAAG,EAAE,IAAI,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,IAAI,CAAC;IAiCV,SAAS,CAAC,GAAG,EAAE,IAAI,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAC5B,OAAO,CAAC,YAAY,CAAC;IA4CxB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,cAAc;CAQvB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/center/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAoE,MAAM,aAAa,CAAC;AAC1M,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAW5E,qBAAa,YAAa,YAAW,aAAa;IAChD,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,KAAK,CAAS;IAGtB,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,gBAAgB,CAAmD;IAC3E,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,SAAS,CAA+C;gBAEpD,MAAM,EAAE,YAAY;IAW1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,oBAAoB,IAAI,iBAAiB;IAIzC;;;;OAIG;IACH,yBAAyB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI;IASrF;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAsB7B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,uBAAuB;IAoB/B,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;IAOf,aAAa,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA0C9D,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA2BhC,IAAI,CAAC,GAAG,EAAE,IAAI,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,IAAI,GAAE,WAAgB,GACrB,OAAO,CAAC,IAAI,CAAC;IAoDV,SAAS,CAAC,GAAG,EAAE,IAAI,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,GAC5B,OAAO,CAAC,YAAY,CAAC;IAyDxB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,cAAc;IAatB;;;;OAIG;IACG,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4BtE;;;;;OAKG;IACG,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+BxF;;;;OAIG;IACG,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBrE;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAUzC;;;OAGG;IACG,4BAA4B,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IASlE;;OAEG;YACW,oBAAoB;IAoBlC;;OAEG;YACW,yBAAyB;IAsBvC;;OAEG;IACH,OAAO,CAAC,cAAc;CAgEvB"}
@@ -1,9 +1,26 @@
1
1
  import { connect, StringCodec, createInbox, headers } from 'nats';
2
2
  const sc = StringCodec();
3
+ // Default quality thresholds
4
+ const DEFAULT_PING_INTERVAL_MS = 30000;
5
+ const DEFAULT_EXCELLENT_LATENCY_MS = 50;
6
+ const DEFAULT_GOOD_LATENCY_MS = 150;
7
+ const DEFAULT_FAIR_LATENCY_MS = 300;
8
+ const MAX_LATENCY_HISTORY = 10;
3
9
  export class CenterClient {
4
10
  config;
5
11
  nc = null;
6
12
  appId;
13
+ // Connection quality tracking
14
+ connectionState = 'disconnected';
15
+ lastLatencyMs = null;
16
+ lastPingAt = null;
17
+ latencyHistory = [];
18
+ messagesSent = 0;
19
+ messagesReceived = 0;
20
+ statsStartedAt = Date.now();
21
+ qualityCallbacks = new Set();
22
+ qualityConfig;
23
+ pingTimer = null;
7
24
  constructor(config) {
8
25
  this.config = {
9
26
  timeout: 30000,
@@ -12,8 +29,10 @@ export class CenterClient {
12
29
  ...config,
13
30
  };
14
31
  this.appId = config.appId || 'platform';
32
+ this.qualityConfig = config.qualityConfig ?? {};
15
33
  }
16
34
  async connect() {
35
+ this.setConnectionState('connecting');
17
36
  const opts = {
18
37
  servers: this.config.serverUrl,
19
38
  name: 'center-sdk',
@@ -23,17 +42,158 @@ export class CenterClient {
23
42
  if (this.config.apiKey) {
24
43
  opts.token = this.config.apiKey;
25
44
  }
26
- this.nc = await connect(opts);
45
+ try {
46
+ this.nc = await connect(opts);
47
+ this.setupConnectionHandlers();
48
+ this.startPingTimer();
49
+ this.setConnectionState('connected');
50
+ this.statsStartedAt = Date.now();
51
+ }
52
+ catch (err) {
53
+ this.setConnectionState('disconnected');
54
+ throw err;
55
+ }
27
56
  }
28
57
  async close() {
58
+ this.stopPingTimer();
29
59
  if (this.nc) {
30
60
  await this.nc.drain();
31
61
  this.nc = null;
32
62
  }
63
+ this.setConnectionState('disconnected');
33
64
  }
34
65
  isConnected() {
35
66
  return this.nc !== null && !this.nc.isClosed();
36
67
  }
68
+ /**
69
+ * Get current connection quality metrics.
70
+ */
71
+ getConnectionQuality() {
72
+ return this.buildQualitySnapshot();
73
+ }
74
+ /**
75
+ * Subscribe to connection quality changes.
76
+ * @param callback - Function called with updated quality metrics
77
+ * @returns Unsubscribe function
78
+ */
79
+ onConnectionQualityChange(callback) {
80
+ this.qualityCallbacks.add(callback);
81
+ // Emit current quality immediately
82
+ callback(this.buildQualitySnapshot());
83
+ return () => {
84
+ this.qualityCallbacks.delete(callback);
85
+ };
86
+ }
87
+ /**
88
+ * Ping the server and return round-trip latency in milliseconds.
89
+ */
90
+ async ping() {
91
+ if (!this.nc || !this.isConnected()) {
92
+ throw new Error('Not connected');
93
+ }
94
+ const start = performance.now();
95
+ await this.nc.flush();
96
+ const latency = performance.now() - start;
97
+ this.lastLatencyMs = latency;
98
+ this.lastPingAt = Date.now();
99
+ // Add to history
100
+ this.latencyHistory.push(latency);
101
+ if (this.latencyHistory.length > MAX_LATENCY_HISTORY) {
102
+ this.latencyHistory.shift();
103
+ }
104
+ this.emitQualityChange();
105
+ return latency;
106
+ }
107
+ setConnectionState(state) {
108
+ if (this.connectionState !== state) {
109
+ this.connectionState = state;
110
+ this.emitQualityChange();
111
+ }
112
+ }
113
+ calculateQualityLevel() {
114
+ if (this.connectionState !== 'connected') {
115
+ return 'unknown';
116
+ }
117
+ if (this.lastLatencyMs === null) {
118
+ return 'unknown';
119
+ }
120
+ const excellent = this.qualityConfig.excellentLatencyMs ?? DEFAULT_EXCELLENT_LATENCY_MS;
121
+ const good = this.qualityConfig.goodLatencyMs ?? DEFAULT_GOOD_LATENCY_MS;
122
+ const fair = this.qualityConfig.fairLatencyMs ?? DEFAULT_FAIR_LATENCY_MS;
123
+ if (this.lastLatencyMs <= excellent)
124
+ return 'excellent';
125
+ if (this.lastLatencyMs <= good)
126
+ return 'good';
127
+ if (this.lastLatencyMs <= fair)
128
+ return 'fair';
129
+ return 'poor';
130
+ }
131
+ calculateAvgLatency() {
132
+ if (this.latencyHistory.length === 0)
133
+ return null;
134
+ const sum = this.latencyHistory.reduce((a, b) => a + b, 0);
135
+ return sum / this.latencyHistory.length;
136
+ }
137
+ buildQualitySnapshot() {
138
+ const elapsedSeconds = (Date.now() - this.statsStartedAt) / 1000;
139
+ return {
140
+ state: this.connectionState,
141
+ latencyMs: this.lastLatencyMs,
142
+ avgLatencyMs: this.calculateAvgLatency(),
143
+ messagesSentPerSecond: elapsedSeconds > 0 ? this.messagesSent / elapsedSeconds : 0,
144
+ messagesReceivedPerSecond: elapsedSeconds > 0 ? this.messagesReceived / elapsedSeconds : 0,
145
+ totalMessagesSent: this.messagesSent,
146
+ totalMessagesReceived: this.messagesReceived,
147
+ lastPingAt: this.lastPingAt,
148
+ qualityLevel: this.calculateQualityLevel(),
149
+ };
150
+ }
151
+ emitQualityChange() {
152
+ const quality = this.buildQualitySnapshot();
153
+ for (const callback of this.qualityCallbacks) {
154
+ callback(quality);
155
+ }
156
+ }
157
+ setupConnectionHandlers() {
158
+ if (!this.nc)
159
+ return;
160
+ // Handle connection status changes
161
+ (async () => {
162
+ for await (const status of this.nc.status()) {
163
+ switch (status.type) {
164
+ case 'disconnect':
165
+ this.setConnectionState('reconnecting');
166
+ break;
167
+ case 'reconnect':
168
+ this.setConnectionState('connected');
169
+ break;
170
+ }
171
+ }
172
+ })().catch(() => {
173
+ // Status iterator ended
174
+ });
175
+ }
176
+ startPingTimer() {
177
+ const interval = this.qualityConfig.pingIntervalMs ?? DEFAULT_PING_INTERVAL_MS;
178
+ if (this.pingTimer || interval <= 0)
179
+ return;
180
+ this.pingTimer = setInterval(async () => {
181
+ if (this.isConnected()) {
182
+ try {
183
+ await this.ping();
184
+ }
185
+ catch {
186
+ // Ignore ping errors
187
+ }
188
+ }
189
+ }, interval);
190
+ }
191
+ stopPingTimer() {
192
+ if (this.pingTimer) {
193
+ clearInterval(this.pingTimer);
194
+ this.pingTimer = null;
195
+ }
196
+ }
37
197
  async discoverEdges(opts = {}) {
38
198
  if (!this.nc) {
39
199
  throw new Error('Not connected');
@@ -84,8 +244,20 @@ export class CenterClient {
84
244
  await this.delay(retryDelay);
85
245
  }
86
246
  try {
247
+ this.messagesSent++;
87
248
  const msg = await this.nc.request(subject, sc.encode(JSON.stringify(req)), { timeout, headers: this.getAuthHeaders() });
88
- return JSON.parse(sc.decode(msg.data));
249
+ this.messagesReceived++;
250
+ const rawResp = JSON.parse(sc.decode(msg.data));
251
+ // Check for error response from edge
252
+ if (rawResp.success === false && rawResp.error) {
253
+ throw new Error(`${rawResp.error.code}: ${rawResp.error.message}`);
254
+ }
255
+ // Unwrap the result field (edge wraps responses in { result: ... })
256
+ if (rawResp.result !== undefined) {
257
+ return rawResp.result;
258
+ }
259
+ // Fallback for responses that don't use the wrapper format
260
+ return rawResp;
89
261
  }
90
262
  catch (e) {
91
263
  lastError = e instanceof Error ? e : new Error(String(e));
@@ -113,7 +285,14 @@ export class CenterClient {
113
285
  if (err || unsubscribed)
114
286
  return;
115
287
  try {
116
- const resp = JSON.parse(sc.decode(msg.data));
288
+ const rawResp = JSON.parse(sc.decode(msg.data));
289
+ // Check for error response from edge
290
+ if (rawResp.success === false && rawResp.error) {
291
+ unsubscribe();
292
+ return;
293
+ }
294
+ // Unwrap the result field (edge wraps responses in { result: ... })
295
+ const resp = rawResp.result !== undefined ? rawResp.result : rawResp;
117
296
  handler(resp);
118
297
  }
119
298
  catch {
@@ -143,5 +322,184 @@ export class CenterClient {
143
322
  h.set('Authorization', `Bearer ${this.config.apiKey}`);
144
323
  return h;
145
324
  }
325
+ // ========================================
326
+ // Introspection Methods
327
+ // ========================================
328
+ /**
329
+ * Describe a service by name, returning its ServiceDescriptor.
330
+ * @param serviceName - The name or ID of the service to describe
331
+ * @returns Promise resolving to the ServiceDescriptor
332
+ */
333
+ async describeService(serviceName) {
334
+ if (!this.nc) {
335
+ throw new Error('Not connected');
336
+ }
337
+ if (!serviceName) {
338
+ throw new Error('service name is required');
339
+ }
340
+ const req = { service_id: serviceName };
341
+ const msg = await this.nc.request('$API.SERVICES.DESCRIBE', sc.encode(JSON.stringify(req)), { timeout: this.config.timeout ?? 30000, headers: this.getAuthHeaders() });
342
+ const resp = JSON.parse(sc.decode(msg.data));
343
+ if (!resp.success && resp.error) {
344
+ throw new Error(`${resp.error.code}: ${resp.error.message}`);
345
+ }
346
+ return resp.data;
347
+ }
348
+ /**
349
+ * Describe a specific method of a service, returning its MethodDescriptor.
350
+ * @param serviceName - The name or ID of the service
351
+ * @param methodName - The name of the method to describe
352
+ * @returns Promise resolving to the MethodDescriptor
353
+ */
354
+ async describeMethod(serviceName, methodName) {
355
+ if (!this.nc) {
356
+ throw new Error('Not connected');
357
+ }
358
+ if (!serviceName) {
359
+ throw new Error('service name is required');
360
+ }
361
+ if (!methodName) {
362
+ throw new Error('method name is required');
363
+ }
364
+ const req = { service_id: serviceName, method_name: methodName };
365
+ const msg = await this.nc.request('$API.SERVICES.DESCRIBE_METHOD', sc.encode(JSON.stringify(req)), { timeout: this.config.timeout ?? 30000, headers: this.getAuthHeaders() });
366
+ const resp = JSON.parse(sc.decode(msg.data));
367
+ if (!resp.success && resp.error) {
368
+ throw new Error(`${resp.error.code}: ${resp.error.message}`);
369
+ }
370
+ return resp.data;
371
+ }
372
+ /**
373
+ * Get LLM-friendly context (llm.txt format) for specified services.
374
+ * @param serviceNames - A single service name or array of service names
375
+ * @returns Promise resolving to llm.txt formatted string
376
+ */
377
+ async getLLMContext(serviceNames) {
378
+ if (!this.nc) {
379
+ throw new Error('Not connected');
380
+ }
381
+ const names = Array.isArray(serviceNames) ? serviceNames : [serviceNames];
382
+ const services = await this.listServicesInternal();
383
+ // Filter services by name
384
+ const serviceNameSet = new Set(names);
385
+ const filteredServices = services.filter((svc) => serviceNameSet.has(svc.name) || serviceNameSet.has(svc.id));
386
+ // Get descriptors and format as LLM text
387
+ const descriptors = await this.getDescriptorsForServices(filteredServices);
388
+ return this.formatAsLLMTxt(descriptors);
389
+ }
390
+ /**
391
+ * Get LLM-friendly context (llm.txt format) for all registered services.
392
+ * @returns Promise resolving to llm.txt formatted string
393
+ */
394
+ async getAllLLMContext() {
395
+ if (!this.nc) {
396
+ throw new Error('Not connected');
397
+ }
398
+ const services = await this.listServicesInternal();
399
+ const descriptors = await this.getDescriptorsForServices(services);
400
+ return this.formatAsLLMTxt(descriptors);
401
+ }
402
+ /**
403
+ * List all services with their full ServiceDescriptors.
404
+ * @returns Promise resolving to array of ServiceDescriptors
405
+ */
406
+ async listServicesWithDescriptions() {
407
+ if (!this.nc) {
408
+ throw new Error('Not connected');
409
+ }
410
+ const services = await this.listServicesInternal();
411
+ return this.getDescriptorsForServices(services);
412
+ }
413
+ /**
414
+ * Internal helper to list services from the API.
415
+ */
416
+ async listServicesInternal() {
417
+ const msg = await this.nc.request('$API.SERVICES.LIST', new Uint8Array(), { timeout: this.config.timeout ?? 30000, headers: this.getAuthHeaders() });
418
+ const resp = JSON.parse(sc.decode(msg.data));
419
+ if (!resp.success && resp.error) {
420
+ throw new Error(`${resp.error.code}: ${resp.error.message}`);
421
+ }
422
+ return resp.data || [];
423
+ }
424
+ /**
425
+ * Internal helper to get descriptors for a list of services.
426
+ */
427
+ async getDescriptorsForServices(services) {
428
+ const descriptors = [];
429
+ for (const svc of services) {
430
+ try {
431
+ const desc = await this.describeService(svc.id);
432
+ descriptors.push(desc);
433
+ }
434
+ catch {
435
+ // If we can't get descriptor, build basic one from service info
436
+ descriptors.push({
437
+ name: svc.name,
438
+ version: svc.version,
439
+ description: svc.description,
440
+ });
441
+ }
442
+ }
443
+ return descriptors;
444
+ }
445
+ /**
446
+ * Internal helper to format ServiceDescriptors as llm.txt.
447
+ */
448
+ formatAsLLMTxt(descriptors) {
449
+ const parts = [];
450
+ for (const desc of descriptors) {
451
+ const lines = [];
452
+ lines.push(`# ${desc.name} v${desc.version}`);
453
+ lines.push('');
454
+ if (desc.description) {
455
+ lines.push(desc.description);
456
+ lines.push('');
457
+ }
458
+ if (desc.ai_context?.overview) {
459
+ lines.push('## Overview');
460
+ lines.push('');
461
+ lines.push(desc.ai_context.overview);
462
+ lines.push('');
463
+ }
464
+ if (desc.ai_context?.capabilities && desc.ai_context.capabilities.length > 0) {
465
+ lines.push('## Capabilities');
466
+ lines.push('');
467
+ for (const cap of desc.ai_context.capabilities) {
468
+ lines.push(`- ${cap}`);
469
+ }
470
+ lines.push('');
471
+ }
472
+ if (desc.ai_context?.limitations && desc.ai_context.limitations.length > 0) {
473
+ lines.push('## Limitations');
474
+ lines.push('');
475
+ for (const lim of desc.ai_context.limitations) {
476
+ lines.push(`- ${lim}`);
477
+ }
478
+ lines.push('');
479
+ }
480
+ if (desc.methods && desc.methods.length > 0) {
481
+ lines.push('## Methods');
482
+ lines.push('');
483
+ for (const method of desc.methods) {
484
+ lines.push(`### ${method.name}`);
485
+ lines.push('');
486
+ if (method.description) {
487
+ lines.push(method.description);
488
+ lines.push('');
489
+ }
490
+ if (method.ai_context?.when_to_use) {
491
+ lines.push(`**When to use:** ${method.ai_context.when_to_use}`);
492
+ lines.push('');
493
+ }
494
+ if (method.ai_context?.how_to_use) {
495
+ lines.push(`**How to use:** ${method.ai_context.how_to_use}`);
496
+ lines.push('');
497
+ }
498
+ }
499
+ }
500
+ parts.push(lines.join('\n'));
501
+ }
502
+ return parts.join('\n---\n\n');
503
+ }
146
504
  }
147
505
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/center/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/center/client.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,22 @@
1
- import type { EdgeConfig, ServiceHandler } from '../types.js';
1
+ import type { EdgeConfig, ServiceHandler, ConnectionQuality } from '../types.js';
2
+ import type { ServiceDescriptor } from '../introspect.js';
2
3
  export declare class EdgeClient {
3
4
  private config;
4
5
  private nc;
5
6
  private services;
6
7
  private heartbeatTimer;
8
+ private pingTimer;
7
9
  private appId;
8
10
  private edgeId;
11
+ private connectionState;
12
+ private lastLatencyMs;
13
+ private lastPingAt;
14
+ private latencyHistory;
15
+ private messagesSent;
16
+ private messagesReceived;
17
+ private statsStartedAt;
18
+ private qualityCallbacks;
19
+ private qualityConfig;
9
20
  constructor(config: EdgeConfig);
10
21
  connect(): Promise<void>;
11
22
  disconnect(): Promise<void>;
@@ -17,6 +28,34 @@ export declare class EdgeClient {
17
28
  getEdgeId(): string;
18
29
  /** Returns the app ID (extracted from the API key) */
19
30
  getAppId(): string;
31
+ /**
32
+ * Get the ServiceDescriptor for an exposed service.
33
+ * Returns null if the service is not found.
34
+ * @param serviceName - The name of the service to describe
35
+ */
36
+ getServiceDescriptor(serviceName: string): ServiceDescriptor | null;
37
+ /**
38
+ * Get current connection quality metrics.
39
+ */
40
+ getConnectionQuality(): ConnectionQuality;
41
+ /**
42
+ * Subscribe to connection quality changes.
43
+ * @param callback - Function called with updated quality metrics
44
+ * @returns Unsubscribe function
45
+ */
46
+ onConnectionQualityChange(callback: (quality: ConnectionQuality) => void): () => void;
47
+ /**
48
+ * Ping the server and return round-trip latency in milliseconds.
49
+ */
50
+ ping(): Promise<number>;
51
+ private setConnectionState;
52
+ private calculateQualityLevel;
53
+ private calculateAvgLatency;
54
+ private buildQualitySnapshot;
55
+ private emitQualityChange;
56
+ private setupConnectionHandlers;
57
+ private startPingTimer;
58
+ private stopPingTimer;
20
59
  private extractMethod;
21
60
  private registerPresence;
22
61
  private deregisterPresence;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/edge/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAqB,MAAM,aAAa,CAAC;AAoCjF,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,QAAQ,CAAqE;IACrF,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,UAAU;IAmBxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAsD7C,mBAAmB;IAsC3B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlD,WAAW,IAAI,OAAO;IAItB,uDAAuD;IACvD,SAAS,IAAI,MAAM;IAInB,sDAAsD;IACtD,QAAQ,IAAI,MAAM;IAIlB,OAAO,CAAC,aAAa;YAQP,gBAAgB;YAehB,kBAAkB;YAOlB,eAAe;YAaf,iBAAiB;IAS/B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;CAKvB"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/edge/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAqB,iBAAiB,EAAoE,MAAM,aAAa,CAAC;AACtK,OAAO,KAAK,EAAE,iBAAiB,EAAoB,MAAM,kBAAkB,CAAC;AA2C5E,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,EAAE,CAA+B;IACzC,OAAO,CAAC,QAAQ,CAAqG;IACrH,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,gBAAgB,CAAmD;IAC3E,OAAO,CAAC,aAAa,CAA0B;gBAEnC,MAAM,EAAE,UAAU;IAoBxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoB3B,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;YAwD7C,mBAAmB;IAsC3B,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlD,WAAW,IAAI,OAAO;IAItB,uDAAuD;IACvD,SAAS,IAAI,MAAM;IAInB,sDAAsD;IACtD,QAAQ,IAAI,MAAM;IAIlB;;;;OAIG;IACH,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAsBnE;;OAEG;IACH,oBAAoB,IAAI,iBAAiB;IAIzC;;;;OAIG;IACH,yBAAyB,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI;IASrF;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAsB7B,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,uBAAuB;IAoB/B,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;YAQP,gBAAgB;YAehB,kBAAkB;YAOlB,eAAe;YAaf,iBAAiB;IAS/B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,cAAc;CAKvB"}