@questionbase/deskfree 0.3.0-alpha.8 → 0.3.0-alpha.9

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 (65) hide show
  1. package/dist/index.d.ts +722 -7
  2. package/dist/index.js +9050 -26
  3. package/dist/index.js.map +1 -1
  4. package/package.json +4 -3
  5. package/dist/channel.d.ts +0 -3
  6. package/dist/channel.d.ts.map +0 -1
  7. package/dist/channel.js +0 -529
  8. package/dist/channel.js.map +0 -1
  9. package/dist/client.d.ts +0 -184
  10. package/dist/client.d.ts.map +0 -1
  11. package/dist/client.js +0 -264
  12. package/dist/client.js.map +0 -1
  13. package/dist/context.d.ts +0 -15
  14. package/dist/context.d.ts.map +0 -1
  15. package/dist/context.js +0 -31
  16. package/dist/context.js.map +0 -1
  17. package/dist/deliver.d.ts +0 -22
  18. package/dist/deliver.d.ts.map +0 -1
  19. package/dist/deliver.js +0 -432
  20. package/dist/deliver.js.map +0 -1
  21. package/dist/error-reporter.d.ts +0 -39
  22. package/dist/error-reporter.d.ts.map +0 -1
  23. package/dist/error-reporter.js +0 -94
  24. package/dist/error-reporter.js.map +0 -1
  25. package/dist/gateway.d.ts +0 -13
  26. package/dist/gateway.d.ts.map +0 -1
  27. package/dist/gateway.js +0 -770
  28. package/dist/gateway.js.map +0 -1
  29. package/dist/index.d.ts.map +0 -1
  30. package/dist/llm-definitions.d.ts +0 -117
  31. package/dist/llm-definitions.d.ts.map +0 -1
  32. package/dist/llm-definitions.js +0 -121
  33. package/dist/llm-definitions.js.map +0 -1
  34. package/dist/offline-queue.d.ts +0 -45
  35. package/dist/offline-queue.d.ts.map +0 -1
  36. package/dist/offline-queue.js +0 -109
  37. package/dist/offline-queue.js.map +0 -1
  38. package/dist/paths.d.ts +0 -10
  39. package/dist/paths.d.ts.map +0 -1
  40. package/dist/paths.js +0 -29
  41. package/dist/paths.js.map +0 -1
  42. package/dist/runtime.d.ts +0 -17
  43. package/dist/runtime.d.ts.map +0 -1
  44. package/dist/runtime.js +0 -24
  45. package/dist/runtime.js.map +0 -1
  46. package/dist/streaming.d.ts +0 -44
  47. package/dist/streaming.d.ts.map +0 -1
  48. package/dist/streaming.js +0 -125
  49. package/dist/streaming.js.map +0 -1
  50. package/dist/tools.d.ts +0 -23
  51. package/dist/tools.d.ts.map +0 -1
  52. package/dist/tools.js +0 -437
  53. package/dist/tools.js.map +0 -1
  54. package/dist/types.d.ts +0 -484
  55. package/dist/types.d.ts.map +0 -1
  56. package/dist/types.js +0 -2
  57. package/dist/types.js.map +0 -1
  58. package/dist/version.d.ts +0 -2
  59. package/dist/version.d.ts.map +0 -1
  60. package/dist/version.js +0 -4
  61. package/dist/version.js.map +0 -1
  62. package/dist/workspace.d.ts +0 -18
  63. package/dist/workspace.d.ts.map +0 -1
  64. package/dist/workspace.js +0 -83
  65. package/dist/workspace.js.map +0 -1
package/dist/deliver.js DELETED
@@ -1,432 +0,0 @@
1
- import { reportError } from './error-reporter';
2
- import { getActiveTaskId } from './gateway';
3
- import { resolvePluginStorePath } from './paths';
4
- import { getDeskFreeRuntime } from './runtime';
5
- import { DeskFreeStreamingSession } from './streaming';
6
- import { randomUUID } from 'node:crypto';
7
- import { createWriteStream } from 'node:fs';
8
- import { mkdir, unlink } from 'node:fs/promises';
9
- import { dirname, extname } from 'node:path';
10
- import { Readable } from 'node:stream';
11
- import { pipeline } from 'node:stream/promises';
12
- import { createTypingCallbacks, logTypingFailure } from 'openclaw/plugin-sdk';
13
- // Maximum file size for attachments (10MB)
14
- const MAX_ATTACHMENT_SIZE = 10 * 1024 * 1024;
15
- // Download timeout (30 seconds)
16
- const DOWNLOAD_TIMEOUT_MS = 30 * 1000;
17
- // Rate limiting: maximum attachments per message
18
- const MAX_ATTACHMENTS_PER_MESSAGE = 10;
19
- // Rate limiting: maximum total download size per message (50MB)
20
- const MAX_TOTAL_DOWNLOAD_SIZE = 50 * 1024 * 1024;
21
- // Allowed content types for security
22
- const ALLOWED_CONTENT_TYPES = [
23
- 'image/',
24
- 'video/',
25
- 'audio/',
26
- 'application/pdf',
27
- 'text/',
28
- 'application/json',
29
- 'application/xml',
30
- 'application/zip',
31
- 'application/x-zip-compressed',
32
- 'application/gzip',
33
- 'application/msword',
34
- 'application/vnd.openxmlformats-officedocument',
35
- 'application/vnd.ms-excel',
36
- 'application/vnd.ms-powerpoint',
37
- ];
38
- /**
39
- * Validates if a content type is safe to download.
40
- */
41
- export function isContentTypeAllowed(contentType) {
42
- const normalized = contentType.toLowerCase().trim();
43
- return ALLOWED_CONTENT_TYPES.some((allowed) => normalized.startsWith(allowed));
44
- }
45
- /**
46
- * Sanitizes a filename to prevent directory traversal and other security issues.
47
- */
48
- export function sanitizeFileName(fileName) {
49
- return fileName
50
- .replace(/[^a-zA-Z0-9._-]/g, '_') // Replace unsafe chars with underscore
51
- .replace(/\.+/g, '.') // Replace multiple dots with single dot
52
- .replace(/^\./, '_') // Replace leading dot
53
- .substring(0, 100); // Limit length
54
- }
55
- /**
56
- * Validates a URL to ensure it's a proper HTTPS URL.
57
- */
58
- export function validateDownloadUrl(url) {
59
- try {
60
- const parsed = new URL(url);
61
- if (parsed.protocol !== 'https:') {
62
- throw new Error('Only HTTPS URLs are allowed');
63
- }
64
- // Block localhost and private IP ranges
65
- const hostname = parsed.hostname.toLowerCase();
66
- // Strip IPv6 brackets for comparison (URL parser wraps IPv6 in brackets)
67
- const bareHostname = hostname.replace(/^\[|\]$/g, '');
68
- if (bareHostname === 'localhost' ||
69
- bareHostname === '127.0.0.1' ||
70
- bareHostname === '::1') {
71
- throw new Error('Local URLs are not allowed');
72
- }
73
- // Block private IP ranges (RFC 1918 and others)
74
- const ipv4Patterns = [
75
- /^10\./, // 10.0.0.0/8
76
- /^192\.168\./, // 192.168.0.0/16
77
- /^172\.(1[6-9]|2[0-9]|3[0-1])\./, // 172.16.0.0/12
78
- /^169\.254\./, // Link-local 169.254.0.0/16
79
- /^0\./, // Current network
80
- /^127\./, // Loopback
81
- ];
82
- for (const pattern of ipv4Patterns) {
83
- if (pattern.test(hostname)) {
84
- throw new Error('Private IP addresses are not allowed');
85
- }
86
- }
87
- // Block IPv6 private/reserved ranges
88
- // bareHostname has brackets stripped, so compare raw IPv6 addresses
89
- const ipv6Patterns = [
90
- /^fe80:/i, // Link-local fe80::/10
91
- /^fc00:/i, // Unique Local Address fc00::/7
92
- /^fd/i, // Unique Local Address fd00::/8 (subset of fc00::/7)
93
- /^::$/i, // Unspecified address ::
94
- /^::ffff:/i, // IPv4-mapped IPv6 (e.g. ::ffff:127.0.0.1)
95
- /^100::/i, // Discard prefix 100::/64
96
- /^2001:db8:/i, // Documentation 2001:db8::/32
97
- /^ff0[0-9a-f]:/i, // Multicast ff00::/8
98
- ];
99
- for (const pattern of ipv6Patterns) {
100
- if (pattern.test(bareHostname)) {
101
- throw new Error('Private IP addresses are not allowed');
102
- }
103
- }
104
- // Validate URL length to prevent DoS
105
- if (url.length > 2048) {
106
- throw new Error('URL too long (max 2048 characters)');
107
- }
108
- }
109
- catch (error) {
110
- throw new Error(`Invalid URL: ${error instanceof Error ? error.message : String(error)}`);
111
- }
112
- }
113
- /**
114
- * Downloads a file from a signed S3 URL and saves it to the plugin store.
115
- * Includes security validations and error handling.
116
- */
117
- async function fetchAndSaveMedia(attachment) {
118
- // Validate input
119
- if (!attachment.url) {
120
- throw new Error('Attachment URL is required');
121
- }
122
- if (!attachment.name) {
123
- throw new Error('Attachment name is required');
124
- }
125
- if (!attachment.contentType) {
126
- throw new Error('Attachment content type is required');
127
- }
128
- // Security validations
129
- validateDownloadUrl(attachment.url);
130
- if (!isContentTypeAllowed(attachment.contentType)) {
131
- throw new Error(`Content type not allowed: ${attachment.contentType}`);
132
- }
133
- if (attachment.size > MAX_ATTACHMENT_SIZE) {
134
- throw new Error(`File too large: ${attachment.size} bytes (max: ${MAX_ATTACHMENT_SIZE})`);
135
- }
136
- // Generate safe file path with additional security checks
137
- const sanitizedName = sanitizeFileName(attachment.name);
138
- // Additional validation - ensure no path traversal attempts
139
- if (sanitizedName.includes('..') ||
140
- sanitizedName.includes('/') ||
141
- sanitizedName.includes('\\')) {
142
- throw new Error('Invalid filename: contains path traversal characters');
143
- }
144
- // Only append extension if the sanitized name doesn't already have one
145
- const hasExt = extname(sanitizedName).length > 0;
146
- const fileName = hasExt
147
- ? `${randomUUID()}_${sanitizedName}`
148
- : `${randomUUID()}_${sanitizedName}${extname(attachment.name) || '.bin'}`;
149
- // Final validation of complete filename
150
- if (fileName.length > 255) {
151
- throw new Error('Generated filename too long (max 255 characters)');
152
- }
153
- const filePath = resolvePluginStorePath(`media/inbound/${fileName}`);
154
- // Ensure directory exists
155
- await mkdir(dirname(filePath), { recursive: true });
156
- // Download with timeout and validations
157
- const controller = new AbortController();
158
- const timeoutId = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);
159
- let fileStream = null;
160
- try {
161
- const response = await fetch(attachment.url, {
162
- signal: controller.signal,
163
- headers: {
164
- 'User-Agent': 'DeskFree-OpenClaw/1.0',
165
- },
166
- });
167
- if (!response.ok) {
168
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
169
- }
170
- if (!response.body) {
171
- throw new Error('Empty response body');
172
- }
173
- // Validate content type from response
174
- const responseContentType = response.headers.get('content-type');
175
- if (responseContentType && !isContentTypeAllowed(responseContentType)) {
176
- throw new Error(`Response content type not allowed: ${responseContentType}`);
177
- }
178
- // Validate content length if provided
179
- const contentLength = response.headers.get('content-length');
180
- if (contentLength) {
181
- const size = parseInt(contentLength, 10);
182
- if (size > MAX_ATTACHMENT_SIZE) {
183
- throw new Error(`Content too large: ${size} bytes (max: ${MAX_ATTACHMENT_SIZE})`);
184
- }
185
- }
186
- // Stream the response body to disk with size tracking
187
- const nodeStream = Readable.fromWeb(response.body);
188
- fileStream = createWriteStream(filePath);
189
- let bytesWritten = 0;
190
- let sizeExceeded = false;
191
- nodeStream.on('data', (chunk) => {
192
- bytesWritten += chunk.length;
193
- if (bytesWritten > MAX_ATTACHMENT_SIZE && !sizeExceeded) {
194
- sizeExceeded = true;
195
- nodeStream.destroy(new Error('File size limit exceeded during download'));
196
- }
197
- });
198
- // Handle stream errors properly
199
- nodeStream.on('error', () => {
200
- if (fileStream && !fileStream.destroyed) {
201
- fileStream.destroy();
202
- }
203
- });
204
- fileStream.on('error', () => {
205
- if (!nodeStream.destroyed) {
206
- nodeStream.destroy();
207
- }
208
- });
209
- await pipeline(nodeStream, fileStream);
210
- return {
211
- path: filePath,
212
- contentType: responseContentType || attachment.contentType,
213
- };
214
- }
215
- catch (error) {
216
- // Ensure streams are properly closed
217
- if (fileStream && !fileStream.destroyed) {
218
- fileStream.destroy();
219
- fileStream = null;
220
- }
221
- // Clean up partial file if download failed
222
- try {
223
- await unlink(filePath);
224
- }
225
- catch {
226
- // Ignore cleanup errors - file might not have been created
227
- }
228
- if (controller.signal.aborted) {
229
- throw new Error(`Download timeout after ${DOWNLOAD_TIMEOUT_MS}ms`);
230
- }
231
- throw new Error(`Failed to download attachment: ${error instanceof Error ? error.message : String(error)}`);
232
- }
233
- finally {
234
- clearTimeout(timeoutId);
235
- // Final cleanup - ensure file stream is closed
236
- if (fileStream && !fileStream.destroyed) {
237
- fileStream.destroy();
238
- }
239
- }
240
- }
241
- /**
242
- * Delivers a DeskFree chat message to the OpenClaw agent pipeline.
243
- *
244
- * Each message produces a single inbound message.
245
- * If the message has a taskId, it's set as ThreadId for conversation threading.
246
- */
247
- export async function deliverMessageToAgent(ctx, message, client) {
248
- const runtime = getDeskFreeRuntime();
249
- const log = ctx.log ?? runtime.logging.createLogger('deskfree:deliver');
250
- const peerId = message.humanId.trim().toLowerCase();
251
- log.info(`Delivering message ${message.messageId} from ${message.userName ?? message.humanId}` +
252
- (message.taskId ? ` (task: ${message.taskId})` : '') +
253
- `: "${message.content.slice(0, 80)}${message.content.length > 80 ? '…' : ''}"`);
254
- // Download attachments if present
255
- const attachments = message.attachments ?? [];
256
- // Validate attachment count
257
- if (attachments.length > MAX_ATTACHMENTS_PER_MESSAGE) {
258
- log.warn(`Message has ${attachments.length} attachments, limiting to ${MAX_ATTACHMENTS_PER_MESSAGE}`);
259
- }
260
- // Calculate total attachment size for rate limiting
261
- const totalSize = attachments
262
- .slice(0, MAX_ATTACHMENTS_PER_MESSAGE)
263
- .reduce((sum, att) => sum + (att.size || 0), 0);
264
- if (totalSize > MAX_TOTAL_DOWNLOAD_SIZE) {
265
- log.warn(`Total attachment size ${totalSize} bytes exceeds limit ${MAX_TOTAL_DOWNLOAD_SIZE} bytes`);
266
- // Don't fail the entire message, just log the warning
267
- }
268
- const mediaPaths = [];
269
- const mediaTypes = [];
270
- const mediaUrls = [];
271
- for (const [index, attachment] of attachments
272
- .slice(0, MAX_ATTACHMENTS_PER_MESSAGE)
273
- .entries()) {
274
- if (!attachment.url) {
275
- log.warn(`Skipping attachment ${index}: no URL provided`);
276
- continue;
277
- }
278
- try {
279
- const saved = await fetchAndSaveMedia(attachment);
280
- mediaPaths.push(saved.path);
281
- mediaTypes.push(saved.contentType);
282
- mediaUrls.push(saved.path);
283
- log.info(`Downloaded attachment ${index}: ${attachment.name} (${saved.contentType})`);
284
- }
285
- catch (error) {
286
- const errorMsg = error instanceof Error ? error.message : String(error);
287
- log.warn(`Failed to download attachment ${index} (${attachment.name}): ${errorMsg}`);
288
- // Non-fatal — continue processing other attachments and the message
289
- }
290
- }
291
- const msgCtx = runtime.channel.reply.finalizeInboundContext({
292
- Body: message.content,
293
- RawBody: message.content,
294
- ChatType: 'dm',
295
- Provider: 'deskfree',
296
- Surface: 'deskfree',
297
- Channel: 'deskfree',
298
- From: message.humanId,
299
- To: message.humanId,
300
- MessageSid: message.messageId,
301
- ThreadId: message.taskId ?? undefined,
302
- Timestamp: message.createdAt,
303
- AccountId: ctx.accountId,
304
- FromName: message.userName ?? 'Unknown',
305
- SessionKey: `agent:main:deskfree:dm:${peerId}`,
306
- // Backward-compatible: first attachment
307
- MediaPath: mediaPaths[0],
308
- MediaType: mediaTypes[0],
309
- MediaUrl: mediaUrls[0],
310
- // Array keys for multiple attachments
311
- MediaPaths: mediaPaths,
312
- MediaTypes: mediaTypes,
313
- MediaUrls: mediaUrls,
314
- MediaCount: mediaPaths.length,
315
- });
316
- try {
317
- // Send typing immediately so the user sees feedback while the agent processes
318
- try {
319
- await client.typing({ taskId: message.taskId ?? undefined });
320
- }
321
- catch (err) {
322
- logTypingFailure({
323
- log: (m) => log.warn(m),
324
- channel: 'deskfree',
325
- action: 'start',
326
- error: err instanceof Error ? err : new Error(String(err)),
327
- });
328
- }
329
- const cfg = runtime.config.loadConfig();
330
- const typingCallbacks = createTypingCallbacks({
331
- start: async () => {
332
- await client.typing({ taskId: message.taskId ?? undefined });
333
- },
334
- stop: async () => {
335
- await client.typing({
336
- taskId: message.taskId ?? undefined,
337
- clear: true,
338
- });
339
- },
340
- onStartError: (err) => {
341
- logTypingFailure({
342
- log: (m) => log.warn(m),
343
- channel: 'deskfree',
344
- action: 'start',
345
- error: err,
346
- });
347
- },
348
- onStopError: (err) => {
349
- logTypingFailure({
350
- log: (m) => log.warn(m),
351
- channel: 'deskfree',
352
- action: 'stop',
353
- error: err,
354
- });
355
- },
356
- });
357
- // Streaming session — reused across block + final delivers
358
- let streamingSession = null;
359
- // Accumulate block text — OpenClaw sends deltas, not full text
360
- let accumulatedText = '';
361
- const { dispatcher, replyOptions } = runtime.channel.reply.createReplyDispatcherWithTyping({
362
- channel: 'deskfree',
363
- accountId: ctx.accountId,
364
- onReplyStart: typingCallbacks.onReplyStart,
365
- onIdle: typingCallbacks.onIdle,
366
- deliver: async (payload, info) => {
367
- const text = typeof payload === 'string'
368
- ? payload
369
- : (payload.text ?? payload.body ?? '');
370
- if (!text) {
371
- log.warn('Deliver callback called with empty text, skipping.');
372
- return;
373
- }
374
- const taskId = message.taskId ?? getActiveTaskId() ?? undefined;
375
- const kind = info?.kind ?? 'final';
376
- if (kind === 'block') {
377
- // Block streaming: progressive message updates
378
- // OpenClaw sends deltas — accumulate into full text
379
- accumulatedText += text;
380
- if (!streamingSession) {
381
- // First block — create the message
382
- streamingSession = new DeskFreeStreamingSession(client, log);
383
- log.info(`Streaming reply to DeskFree (task: ${taskId ?? 'none'}): "${accumulatedText.slice(0, 80)}..."`);
384
- await streamingSession.start(accumulatedText, taskId);
385
- }
386
- else {
387
- // Subsequent block — update in place with full accumulated text
388
- await streamingSession.update(accumulatedText);
389
- }
390
- }
391
- else if (kind === 'final') {
392
- if (streamingSession?.isActive()) {
393
- // Final after streaming — close with final text
394
- // Use the final text from OpenClaw (authoritative, may differ from accumulated)
395
- await streamingSession.close(text);
396
- streamingSession = null;
397
- accumulatedText = '';
398
- log.info('Streaming reply finalized.');
399
- }
400
- else {
401
- // No streaming — send as normal message
402
- log.info(`Sending reply to DeskFree (task: ${taskId ?? 'none'}): "${text.slice(0, 80)}..."`);
403
- await client.sendMessage({ content: text, taskId });
404
- log.info('Reply sent successfully.');
405
- }
406
- }
407
- else {
408
- // tool results or other kinds — send as normal
409
- log.info(`Sending ${kind} reply to DeskFree (task: ${taskId ?? 'none'}): "${text.slice(0, 80)}..."`);
410
- await client.sendMessage({ content: text, taskId });
411
- }
412
- },
413
- });
414
- await runtime.channel.reply.dispatchReplyFromConfig({
415
- ctx: msgCtx,
416
- cfg,
417
- dispatcher,
418
- replyOptions,
419
- });
420
- log.info(`Message ${message.messageId} dispatched successfully.`);
421
- }
422
- catch (err) {
423
- const errMsg = err instanceof Error ? err.message : String(err);
424
- log.warn(`Failed to dispatch message ${message.messageId}: ${errMsg}`);
425
- reportError('error', `Failed to dispatch message: ${errMsg}`, {
426
- component: 'deliver',
427
- event: 'dispatch_failed',
428
- messageId: message.messageId,
429
- });
430
- }
431
- }
432
- //# sourceMappingURL=deliver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deliver.js","sourceRoot":"","sources":["../src/deliver.ts"],"names":[],"mappings":"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"}
@@ -1,39 +0,0 @@
1
- import type { DeskFreeClient } from './client';
2
- import type { PluginLogger } from './types';
3
- /**
4
- * Initialize the global ErrorReporter singleton.
5
- * Called once when the DeskFree gateway connection starts.
6
- */
7
- export declare function initErrorReporter(client: DeskFreeClient, logger: PluginLogger): ErrorReporter;
8
- /**
9
- * Get the global ErrorReporter instance, or null if not yet initialized.
10
- * Use this from any module to report errors without passing the instance around.
11
- */
12
- export declare function getErrorReporter(): ErrorReporter | null;
13
- /**
14
- * Convenience: report an error if the reporter is initialized.
15
- * No-op if called before initErrorReporter(). Never throws.
16
- */
17
- export declare function reportError(level: 'warn' | 'error' | 'fatal', message: string, metadata?: Record<string, unknown>): void;
18
- /**
19
- * Batched, async, fire-and-forget error reporter that sends plugin errors
20
- * to the DeskFree backend via `agent.reportError`.
21
- *
22
- * Errors are queued in memory and flushed periodically or when the batch
23
- * reaches MAX_BATCH_SIZE. Reporting failures are silently swallowed to
24
- * never block the plugin.
25
- */
26
- export declare class ErrorReporter {
27
- private queue;
28
- private flushTimer;
29
- private client;
30
- private logger;
31
- constructor(client: DeskFreeClient, logger: PluginLogger);
32
- /** Enqueue an error for reporting. Never throws. */
33
- report(level: 'warn' | 'error' | 'fatal', message: string, metadata?: Record<string, unknown>): void;
34
- /** Flush queued errors to the backend. Fire-and-forget. */
35
- flush(): Promise<void>;
36
- /** Stop the periodic flush timer. */
37
- dispose(): void;
38
- }
39
- //# sourceMappingURL=error-reporter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-reporter.d.ts","sourceRoot":"","sources":["../src/error-reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAiB5C;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,YAAY,GACnB,aAAa,CAMf;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAEvD;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EACjC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,IAAI,CAEN;AAED;;;;;;;GAOG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY;IAcxD,oDAAoD;IACpD,MAAM,CACJ,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,EACjC,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,IAAI;IAkBP,2DAA2D;IACrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,qCAAqC;IACrC,OAAO,IAAI,IAAI;CAShB"}
@@ -1,94 +0,0 @@
1
- const FLUSH_INTERVAL_MS = 10_000;
2
- const MAX_BATCH_SIZE = 50;
3
- const MAX_QUEUE_SIZE = 200;
4
- // ── Singleton access ──────────────────────────────────────────────────
5
- let _instance = null;
6
- /**
7
- * Initialize the global ErrorReporter singleton.
8
- * Called once when the DeskFree gateway connection starts.
9
- */
10
- export function initErrorReporter(client, logger) {
11
- if (_instance) {
12
- _instance.dispose();
13
- }
14
- _instance = new ErrorReporter(client, logger);
15
- return _instance;
16
- }
17
- /**
18
- * Get the global ErrorReporter instance, or null if not yet initialized.
19
- * Use this from any module to report errors without passing the instance around.
20
- */
21
- export function getErrorReporter() {
22
- return _instance;
23
- }
24
- /**
25
- * Convenience: report an error if the reporter is initialized.
26
- * No-op if called before initErrorReporter(). Never throws.
27
- */
28
- export function reportError(level, message, metadata) {
29
- _instance?.report(level, message, metadata);
30
- }
31
- /**
32
- * Batched, async, fire-and-forget error reporter that sends plugin errors
33
- * to the DeskFree backend via `agent.reportError`.
34
- *
35
- * Errors are queued in memory and flushed periodically or when the batch
36
- * reaches MAX_BATCH_SIZE. Reporting failures are silently swallowed to
37
- * never block the plugin.
38
- */
39
- export class ErrorReporter {
40
- queue = [];
41
- flushTimer = null;
42
- client;
43
- logger;
44
- constructor(client, logger) {
45
- this.client = client;
46
- this.logger = logger;
47
- this.flushTimer = setInterval(() => void this.flush(), FLUSH_INTERVAL_MS);
48
- if (this.flushTimer &&
49
- typeof this.flushTimer === 'object' &&
50
- 'unref' in this.flushTimer) {
51
- this.flushTimer.unref();
52
- }
53
- }
54
- /** Enqueue an error for reporting. Never throws. */
55
- report(level, message, metadata) {
56
- // Drop oldest entries if queue is full to bound memory
57
- if (this.queue.length >= MAX_QUEUE_SIZE) {
58
- this.queue.splice(0, this.queue.length - MAX_QUEUE_SIZE + 1);
59
- }
60
- this.queue.push({
61
- message: message.slice(0, 4000),
62
- level,
63
- timestamp: new Date().toISOString(),
64
- metadata,
65
- });
66
- if (this.queue.length >= MAX_BATCH_SIZE) {
67
- void this.flush();
68
- }
69
- }
70
- /** Flush queued errors to the backend. Fire-and-forget. */
71
- async flush() {
72
- if (this.queue.length === 0)
73
- return;
74
- const batch = this.queue.splice(0, MAX_BATCH_SIZE);
75
- try {
76
- await this.client.reportError({ errors: batch });
77
- }
78
- catch {
79
- // Fire-and-forget — never block the plugin
80
- this.logger.debug(`[error-reporter] Failed to flush ${batch.length} error(s) to backend`);
81
- }
82
- }
83
- /** Stop the periodic flush timer. */
84
- dispose() {
85
- if (this.flushTimer) {
86
- clearInterval(this.flushTimer);
87
- this.flushTimer = null;
88
- }
89
- if (_instance === this) {
90
- _instance = null;
91
- }
92
- }
93
- }
94
- //# sourceMappingURL=error-reporter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"error-reporter.js","sourceRoot":"","sources":["../src/error-reporter.ts"],"names":[],"mappings":"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"}
package/dist/gateway.d.ts DELETED
@@ -1,13 +0,0 @@
1
- import type { ChannelGatewayContext } from './types';
2
- export declare function setActiveTaskId(taskId: string | null): void;
3
- export declare function getActiveTaskId(): string | null;
4
- /**
5
- * Main entry point for the DeskFree channel gateway.
6
- * Called by OpenClaw's channel manager via gateway.startAccount().
7
- *
8
- * Maintains a WebSocket connection for real-time notifications
9
- * and polls the messages endpoint for actual data.
10
- * Falls back to interval-based polling if WebSocket is unavailable.
11
- */
12
- export declare function startDeskFreeConnection(ctx: ChannelGatewayContext): Promise<void>;
13
- //# sourceMappingURL=gateway.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,qBAAqB,EAItB,MAAM,SAAS,CAAC;AAajB,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE3D;AAED,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAwRD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC,IAAI,CAAC,CAiHf"}