crewly 1.4.47 → 1.4.49
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.
- package/config/skills/agent/core/report-progress/execute.sh +0 -2
- package/dist/backend/backend/src/constants.d.ts +48 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +48 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +28 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js +3 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts +23 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/relay.controller.js +85 -0
- package/dist/backend/backend/src/controllers/cloud/relay.controller.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +11 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +22 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +27 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +54 -0
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js +20 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts +163 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js +484 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.service.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +181 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +91 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/relay-client.service.js +2 -0
- package/dist/backend/backend/src/services/cloud/relay-client.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts +86 -0
- package/dist/backend/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js +257 -16
- package/dist/backend/backend/src/services/messaging/queue-processor.service.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +48 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +48 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/frontend/dist/assets/{index-7357dbef.js → index-28fcc469.js} +289 -289
- package/frontend/dist/assets/{index-a393888e.css → index-78e43622.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -231,6 +231,9 @@ export class CloudClientService {
|
|
|
231
231
|
* ```
|
|
232
232
|
*/
|
|
233
233
|
async getTemplates() {
|
|
234
|
+
// If token is already known to be expired, return empty without hitting the API
|
|
235
|
+
if (this.isTokenExpired())
|
|
236
|
+
return [];
|
|
234
237
|
this.ensureConnected();
|
|
235
238
|
const url = `${this.cloudUrl}${CLOUD_CONSTANTS.ENDPOINTS.TEMPLATES}`;
|
|
236
239
|
const response = await fetch(url, {
|
|
@@ -239,6 +242,11 @@ export class CloudClientService {
|
|
|
239
242
|
signal: AbortSignal.timeout(CLOUD_CONSTANTS.TIMEOUTS.FETCH_TEMPLATES),
|
|
240
243
|
});
|
|
241
244
|
if (!response.ok) {
|
|
245
|
+
// 401/403 means token expired or revoked — return empty list + update status
|
|
246
|
+
if (this.isAuthError(response.status)) {
|
|
247
|
+
this.handleAuthFailure('getTemplates', response.status);
|
|
248
|
+
return [];
|
|
249
|
+
}
|
|
242
250
|
this.logger.error('Failed to fetch templates', { status: response.status });
|
|
243
251
|
throw new Error(`Failed to fetch templates: ${response.status}`);
|
|
244
252
|
}
|
|
@@ -262,6 +270,10 @@ export class CloudClientService {
|
|
|
262
270
|
* ```
|
|
263
271
|
*/
|
|
264
272
|
async getTemplateDetail(id) {
|
|
273
|
+
// If token is already known to be expired, throw user-friendly error
|
|
274
|
+
if (this.isTokenExpired()) {
|
|
275
|
+
throw new Error('Cloud token expired. Please reconnect to CrewlyAI Cloud.');
|
|
276
|
+
}
|
|
265
277
|
this.ensureConnected();
|
|
266
278
|
const endpoint = CLOUD_CONSTANTS.ENDPOINTS.TEMPLATE_DETAIL.replace(':id', id);
|
|
267
279
|
const url = `${this.cloudUrl}${endpoint}`;
|
|
@@ -271,6 +283,11 @@ export class CloudClientService {
|
|
|
271
283
|
signal: AbortSignal.timeout(CLOUD_CONSTANTS.TIMEOUTS.FETCH_TEMPLATE_DETAIL),
|
|
272
284
|
});
|
|
273
285
|
if (!response.ok) {
|
|
286
|
+
// 401/403 means token expired or revoked
|
|
287
|
+
if (this.isAuthError(response.status)) {
|
|
288
|
+
this.handleAuthFailure('getTemplateDetail', response.status);
|
|
289
|
+
throw new Error('Cloud token expired. Please reconnect to CrewlyAI Cloud.');
|
|
290
|
+
}
|
|
274
291
|
if (response.status === 404) {
|
|
275
292
|
throw new Error(`Template not found: ${id}`);
|
|
276
293
|
}
|
|
@@ -310,6 +327,14 @@ export class CloudClientService {
|
|
|
310
327
|
isConnected() {
|
|
311
328
|
return this.connectionStatus === CLOUD_CONSTANTS.CONNECTION_STATUS.CONNECTED;
|
|
312
329
|
}
|
|
330
|
+
/**
|
|
331
|
+
* Check whether the cloud token has expired (401/403 from cloud API).
|
|
332
|
+
*
|
|
333
|
+
* @returns true if the token has expired
|
|
334
|
+
*/
|
|
335
|
+
isTokenExpired() {
|
|
336
|
+
return this.connectionStatus === CLOUD_CONSTANTS.CONNECTION_STATUS.TOKEN_EXPIRED;
|
|
337
|
+
}
|
|
313
338
|
/**
|
|
314
339
|
* Get the current subscription tier.
|
|
315
340
|
*
|
|
@@ -328,6 +353,9 @@ export class CloudClientService {
|
|
|
328
353
|
* @throws Error when not connected or fetch fails
|
|
329
354
|
*/
|
|
330
355
|
async fetchCloudDevices() {
|
|
356
|
+
// If token is already known to be expired, return empty without hitting the API
|
|
357
|
+
if (this.isTokenExpired())
|
|
358
|
+
return [];
|
|
331
359
|
this.ensureConnected();
|
|
332
360
|
const url = `${this.cloudUrl}${CLOUD_CONSTANTS.RELAY_ENDPOINTS.DEVICES}`;
|
|
333
361
|
const response = await fetch(url, {
|
|
@@ -336,6 +364,11 @@ export class CloudClientService {
|
|
|
336
364
|
signal: AbortSignal.timeout(CLOUD_CONSTANTS.TIMEOUTS.FETCH_TEMPLATES),
|
|
337
365
|
});
|
|
338
366
|
if (!response.ok) {
|
|
367
|
+
// 401/403 means token expired or revoked — return empty list + update status
|
|
368
|
+
if (this.isAuthError(response.status)) {
|
|
369
|
+
this.handleAuthFailure('fetchCloudDevices', response.status);
|
|
370
|
+
return [];
|
|
371
|
+
}
|
|
339
372
|
// 404 means the cloud devices endpoint is not yet available — return empty list gracefully
|
|
340
373
|
if (response.status === 404) {
|
|
341
374
|
this.logger.warn('Cloud devices endpoint not available (404), returning empty list');
|
|
@@ -375,5 +408,26 @@ export class CloudClientService {
|
|
|
375
408
|
'Content-Type': 'application/json',
|
|
376
409
|
};
|
|
377
410
|
}
|
|
411
|
+
/**
|
|
412
|
+
* Check if an HTTP status code indicates an authentication/authorization failure.
|
|
413
|
+
*
|
|
414
|
+
* @param status - HTTP status code
|
|
415
|
+
* @returns true if the status is 401 or 403
|
|
416
|
+
*/
|
|
417
|
+
isAuthError(status) {
|
|
418
|
+
return status === 401 || status === 403;
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Handle a 401/403 response from the cloud API by transitioning
|
|
422
|
+
* the connection status to TOKEN_EXPIRED. This signals the frontend
|
|
423
|
+
* to show a reconnect prompt instead of a raw error.
|
|
424
|
+
*
|
|
425
|
+
* @param context - Description of the failed operation (for logging)
|
|
426
|
+
* @param status - HTTP status code from the cloud API
|
|
427
|
+
*/
|
|
428
|
+
handleAuthFailure(context, status) {
|
|
429
|
+
this.logger.warn(`Cloud token expired or revoked during ${context}`, { status });
|
|
430
|
+
this.connectionStatus = CLOUD_CONSTANTS.CONNECTION_STATUS.TOKEN_EXPIRED;
|
|
431
|
+
}
|
|
378
432
|
}
|
|
379
433
|
//# sourceMappingURL=cloud-client.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-client.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-client.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,aAAa,EAAwB,MAAM,2BAA2B,CAAC;AAChF,OAAO,EACL,eAAe,GAGhB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"cloud-client.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-client.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"cloud-initializer.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,gEAAgE;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,eAAe,CAAC,CAoE5E"}
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
* @module services/cloud/cloud-initializer
|
|
11
11
|
*/
|
|
12
12
|
import { CloudClientService } from './cloud-client.service.js';
|
|
13
|
+
import { CloudSyncService } from './cloud-sync.service.js';
|
|
14
|
+
import { DeviceIdentityService } from './device-identity.service.js';
|
|
13
15
|
import { LoggerService } from '../core/logger.service.js';
|
|
14
16
|
import { CLOUD_CONSTANTS } from '../../constants.js';
|
|
15
17
|
const logger = LoggerService.getInstance().createComponentLogger('CloudInitializer');
|
|
@@ -51,6 +53,24 @@ export async function initializeCloudIfConfigured() {
|
|
|
51
53
|
catch {
|
|
52
54
|
logger.debug('Relay auto-connect not available during startup (non-fatal)');
|
|
53
55
|
}
|
|
56
|
+
// Start Cloud Sync for device discovery and message polling
|
|
57
|
+
try {
|
|
58
|
+
const identity = await DeviceIdentityService.getInstance().getOrCreateIdentity();
|
|
59
|
+
CloudSyncService.getInstance().start({
|
|
60
|
+
cloudUrl: config.cloudUrl,
|
|
61
|
+
token: config.token,
|
|
62
|
+
deviceId: identity.deviceId,
|
|
63
|
+
deviceName: identity.deviceName,
|
|
64
|
+
});
|
|
65
|
+
logger.info('CloudSyncService started during initialization', {
|
|
66
|
+
deviceId: identity.deviceId,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch (syncError) {
|
|
70
|
+
logger.warn('CloudSyncService start failed during initialization (non-fatal)', {
|
|
71
|
+
error: syncError instanceof Error ? syncError.message : String(syncError),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
54
74
|
logger.info('Cloud connection restored successfully', { tier: config.tier });
|
|
55
75
|
return { attempted: true, success: true };
|
|
56
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloud-initializer.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-initializer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAkB,MAAM,oBAAoB,CAAC;AAErE,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;AAcrF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAChD,MAAM,MAAM,GAAG,kBAAkB,CAAC,WAAW,EAAE,CAAC;IAEhD,oDAAoD;IACpD,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACjE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC5C,CAAC;IAED,wBAAwB;IACxB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAClD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,CAAC,IAAI,CAAC,kDAAkD,EAAE;YAC/D,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,IAAI,EAAE,MAAM,CAAC,IAAI;SACjB,CAAC,CAAC;QAEH,gEAAgE;QAChE,4DAA4D;QAC5D,MAAM,CAAC,YAAY,CAClB,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,KAAK,EACX,MAAM,CAAC,IAAkB,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,CACxD,CAAC;QAEF,6EAA6E;QAC7E,IAAI,CAAC;YACJ,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,6CAA6C,CAAC,CAAC;YAClG,yBAAyB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QAAC,MAAM,CAAC;YACR,MAAM,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;YAC7D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7D,CAAC,CAAC;QACH,OAAO;YACN,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC7D,CAAC;IACH,CAAC;AACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"cloud-initializer.js","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-initializer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Sync Service
|
|
3
|
+
*
|
|
4
|
+
* Singleton service that replaces the WebSocket Relay pairing model with a
|
|
5
|
+
* simpler heartbeat + polling architecture. All devices under the same Cloud
|
|
6
|
+
* account are automatically visible and can exchange messages.
|
|
7
|
+
*
|
|
8
|
+
* Responsibilities:
|
|
9
|
+
* - Heartbeat: periodically uploads device status to Cloud
|
|
10
|
+
* - Device poll: periodically fetches the device list for the account
|
|
11
|
+
* - Message poll: periodically fetches pending messages for this device
|
|
12
|
+
* - Send: posts messages to specific devices via Cloud
|
|
13
|
+
*
|
|
14
|
+
* @see docs/cloud-sync-design.md
|
|
15
|
+
* @module services/cloud/cloud-sync.service
|
|
16
|
+
*/
|
|
17
|
+
import { EventEmitter } from 'events';
|
|
18
|
+
import type { CloudSyncConfig, CloudSyncState, SyncDevice, MessageType } from './cloud-sync.types.js';
|
|
19
|
+
/**
|
|
20
|
+
* CloudSyncService singleton.
|
|
21
|
+
*
|
|
22
|
+
* Manages heartbeat, device discovery, and message polling for the
|
|
23
|
+
* Cloud Sync system. Extends EventEmitter to notify consumers of
|
|
24
|
+
* device and message changes.
|
|
25
|
+
*
|
|
26
|
+
* Events:
|
|
27
|
+
* - `devices_updated` — Fired when the device list changes. Payload: SyncDevice[]
|
|
28
|
+
* - `message` — Fired for each incoming message. Payload: IncomingMessage
|
|
29
|
+
* - `device_online` — Fired when a device comes online. Payload: SyncDevice
|
|
30
|
+
* - `device_offline` — Fired when a device goes offline. Payload: SyncDevice
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* const sync = CloudSyncService.getInstance();
|
|
35
|
+
* sync.start({ cloudUrl, token, deviceId, deviceName });
|
|
36
|
+
* sync.on('message', (msg) => console.log('Received:', msg));
|
|
37
|
+
* sync.on('devices_updated', (devices) => console.log('Devices:', devices));
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare class CloudSyncService extends EventEmitter {
|
|
41
|
+
private static instance;
|
|
42
|
+
private readonly logger;
|
|
43
|
+
/** Current service state */
|
|
44
|
+
private state;
|
|
45
|
+
/** Configuration (set on start) */
|
|
46
|
+
private config;
|
|
47
|
+
/** Cached device list from last poll */
|
|
48
|
+
private devices;
|
|
49
|
+
/** Cached Crewly version */
|
|
50
|
+
private version;
|
|
51
|
+
/** Heartbeat timer handle */
|
|
52
|
+
private heartbeatTimer;
|
|
53
|
+
/** Device poll timer handle */
|
|
54
|
+
private devicePollTimer;
|
|
55
|
+
/** Message poll timer handle */
|
|
56
|
+
private messagePollTimer;
|
|
57
|
+
/** Consecutive heartbeat failure count */
|
|
58
|
+
private heartbeatFailures;
|
|
59
|
+
/** Consecutive device poll failure count */
|
|
60
|
+
private devicePollFailures;
|
|
61
|
+
/** Consecutive message poll failure count */
|
|
62
|
+
private messagePollFailures;
|
|
63
|
+
private constructor();
|
|
64
|
+
/**
|
|
65
|
+
* Get the singleton instance.
|
|
66
|
+
*
|
|
67
|
+
* @returns CloudSyncService instance
|
|
68
|
+
*/
|
|
69
|
+
static getInstance(): CloudSyncService;
|
|
70
|
+
/**
|
|
71
|
+
* Reset the singleton (for testing).
|
|
72
|
+
*/
|
|
73
|
+
static resetInstance(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Start the Cloud Sync service.
|
|
76
|
+
*
|
|
77
|
+
* Begins heartbeat, device polling, and message polling timers.
|
|
78
|
+
* Performs an immediate heartbeat and device poll on start.
|
|
79
|
+
*
|
|
80
|
+
* @param config - Cloud connection configuration
|
|
81
|
+
*/
|
|
82
|
+
start(config: CloudSyncConfig): void;
|
|
83
|
+
/**
|
|
84
|
+
* Stop the Cloud Sync service.
|
|
85
|
+
*
|
|
86
|
+
* Clears all timers and resets state. Safe to call multiple times.
|
|
87
|
+
*/
|
|
88
|
+
stop(): void;
|
|
89
|
+
/**
|
|
90
|
+
* Check if the sync service has been started.
|
|
91
|
+
*
|
|
92
|
+
* @returns True if the service is currently syncing
|
|
93
|
+
*/
|
|
94
|
+
isStarted(): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Get the current service state.
|
|
97
|
+
*
|
|
98
|
+
* @returns Current CloudSyncState
|
|
99
|
+
*/
|
|
100
|
+
getState(): CloudSyncState;
|
|
101
|
+
/**
|
|
102
|
+
* Get all cached devices for this Cloud account.
|
|
103
|
+
*
|
|
104
|
+
* @returns Array of SyncDevice objects (may include offline devices)
|
|
105
|
+
*/
|
|
106
|
+
getDevices(): SyncDevice[];
|
|
107
|
+
/**
|
|
108
|
+
* Get only online devices (excluding this device).
|
|
109
|
+
*
|
|
110
|
+
* @returns Array of online SyncDevice objects
|
|
111
|
+
*/
|
|
112
|
+
getOnlineDevices(): SyncDevice[];
|
|
113
|
+
/**
|
|
114
|
+
* Send a message to another device via the Cloud message queue.
|
|
115
|
+
*
|
|
116
|
+
* @param toDeviceId - Target device identifier
|
|
117
|
+
* @param type - Message type
|
|
118
|
+
* @param payload - Message payload (must be JSON-serializable)
|
|
119
|
+
* @throws Error when not started or API call fails
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* await sync.sendMessage('dev-456', 'command', {
|
|
124
|
+
* action: 'delegate-task',
|
|
125
|
+
* content: 'Implement feature X'
|
|
126
|
+
* });
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
sendMessage(toDeviceId: string, type: MessageType, payload: unknown): Promise<void>;
|
|
130
|
+
/**
|
|
131
|
+
* Send a heartbeat to the Cloud server with current device state.
|
|
132
|
+
* Called periodically by the heartbeat timer.
|
|
133
|
+
*/
|
|
134
|
+
sendHeartbeat(): Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* Poll the Cloud server for the current device list.
|
|
137
|
+
* Updates the cached device list and emits events on changes.
|
|
138
|
+
*/
|
|
139
|
+
pollDevices(): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* Poll the Cloud server for pending messages addressed to this device.
|
|
142
|
+
* Emits 'message' event for each received message, then acknowledges.
|
|
143
|
+
*/
|
|
144
|
+
pollMessages(): Promise<void>;
|
|
145
|
+
/**
|
|
146
|
+
* Acknowledge processed messages so Cloud can remove them from the queue.
|
|
147
|
+
*
|
|
148
|
+
* @param messageIds - Array of message IDs to acknowledge
|
|
149
|
+
*/
|
|
150
|
+
private ackMessages;
|
|
151
|
+
/**
|
|
152
|
+
* Check if any failure counter has exceeded the threshold.
|
|
153
|
+
* If so, transition to error state.
|
|
154
|
+
*/
|
|
155
|
+
private checkErrorThreshold;
|
|
156
|
+
/**
|
|
157
|
+
* Build authorization headers for Cloud API requests.
|
|
158
|
+
*
|
|
159
|
+
* @returns Headers with Bearer token and Content-Type
|
|
160
|
+
*/
|
|
161
|
+
private authHeaders;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=cloud-sync.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-sync.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/cloud/cloud-sync.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,UAAU,EAIV,WAAW,EACZ,MAAM,uBAAuB,CAAC;AA8C/B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IAEzC,4BAA4B;IAC5B,OAAO,CAAC,KAAK,CAA6B;IAC1C,mCAAmC;IACnC,OAAO,CAAC,MAAM,CAAgC;IAC9C,wCAAwC;IACxC,OAAO,CAAC,OAAO,CAAoB;IACnC,4BAA4B;IAC5B,OAAO,CAAC,OAAO,CAAa;IAE5B,6BAA6B;IAC7B,OAAO,CAAC,cAAc,CAA+C;IACrE,+BAA+B;IAC/B,OAAO,CAAC,eAAe,CAA+C;IACtE,gCAAgC;IAChC,OAAO,CAAC,gBAAgB,CAA+C;IAEvE,0CAA0C;IAC1C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,4CAA4C;IAC5C,OAAO,CAAC,kBAAkB,CAAK;IAC/B,6CAA6C;IAC7C,OAAO,CAAC,mBAAmB,CAAK;IAEhC,OAAO;IAKP;;;;OAIG;IACH,MAAM,CAAC,WAAW,IAAI,gBAAgB;IAOtC;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,IAAI;IAW5B;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI;IA6CpC;;;;OAIG;IACH,IAAI,IAAI,IAAI;IAiBZ;;;;OAIG;IACH,SAAS,IAAI,OAAO;IAIpB;;;;OAIG;IACH,QAAQ,IAAI,cAAc;IAI1B;;;;OAIG;IACH,UAAU,IAAI,UAAU,EAAE;IAI1B;;;;OAIG;IACH,gBAAgB,IAAI,UAAU,EAAE;IAIhC;;;;;;;;;;;;;;;OAeG;IACG,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA+BzF;;;OAGG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CpC;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAyElC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IA6CnC;;;;OAIG;YACW,WAAW;IA2BzB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;;;OAIG;IACH,OAAO,CAAC,WAAW;CAMpB"}
|