@questionbase/deskfree 0.1.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.
Files changed (52) hide show
  1. package/README.md +129 -0
  2. package/dist/channel.d.ts +3 -0
  3. package/dist/channel.d.ts.map +1 -0
  4. package/dist/channel.js +503 -0
  5. package/dist/channel.js.map +1 -0
  6. package/dist/client.d.ts +148 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +255 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/deliver.d.ts +22 -0
  11. package/dist/deliver.d.ts.map +1 -0
  12. package/dist/deliver.js +350 -0
  13. package/dist/deliver.js.map +1 -0
  14. package/dist/gateway.d.ts +13 -0
  15. package/dist/gateway.d.ts.map +1 -0
  16. package/dist/gateway.js +687 -0
  17. package/dist/gateway.js.map +1 -0
  18. package/dist/index.d.ts +11 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +19 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/llm-definitions.d.ts +116 -0
  23. package/dist/llm-definitions.d.ts.map +1 -0
  24. package/dist/llm-definitions.js +148 -0
  25. package/dist/llm-definitions.js.map +1 -0
  26. package/dist/offline-queue.d.ts +45 -0
  27. package/dist/offline-queue.d.ts.map +1 -0
  28. package/dist/offline-queue.js +109 -0
  29. package/dist/offline-queue.js.map +1 -0
  30. package/dist/paths.d.ts +10 -0
  31. package/dist/paths.d.ts.map +1 -0
  32. package/dist/paths.js +29 -0
  33. package/dist/paths.js.map +1 -0
  34. package/dist/runtime.d.ts +17 -0
  35. package/dist/runtime.d.ts.map +1 -0
  36. package/dist/runtime.js +24 -0
  37. package/dist/runtime.js.map +1 -0
  38. package/dist/tools.d.ts +35 -0
  39. package/dist/tools.d.ts.map +1 -0
  40. package/dist/tools.js +527 -0
  41. package/dist/tools.js.map +1 -0
  42. package/dist/types.d.ts +389 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +2 -0
  45. package/dist/types.js.map +1 -0
  46. package/dist/workspace.d.ts +18 -0
  47. package/dist/workspace.d.ts.map +1 -0
  48. package/dist/workspace.js +83 -0
  49. package/dist/workspace.js.map +1 -0
  50. package/openclaw.plugin.json +8 -0
  51. package/package.json +63 -0
  52. package/skills/deskfree/SKILL.md +271 -0
@@ -0,0 +1,350 @@
1
+ import { getActiveTaskId } from './gateway';
2
+ import { resolvePluginStorePath } from './paths';
3
+ import { getDeskFreeRuntime } from './runtime';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { createWriteStream } from 'node:fs';
6
+ import { mkdir, unlink } from 'node:fs/promises';
7
+ import { dirname, extname } from 'node:path';
8
+ import { Readable } from 'node:stream';
9
+ import { pipeline } from 'node:stream/promises';
10
+ import { createTypingCallbacks, logTypingFailure } from 'openclaw/plugin-sdk';
11
+ // Maximum file size for attachments (10MB)
12
+ const MAX_ATTACHMENT_SIZE = 10 * 1024 * 1024;
13
+ // Download timeout (30 seconds)
14
+ const DOWNLOAD_TIMEOUT_MS = 30 * 1000;
15
+ // Rate limiting: maximum attachments per message
16
+ const MAX_ATTACHMENTS_PER_MESSAGE = 10;
17
+ // Rate limiting: maximum total download size per message (50MB)
18
+ const MAX_TOTAL_DOWNLOAD_SIZE = 50 * 1024 * 1024;
19
+ // Allowed content types for security
20
+ const ALLOWED_CONTENT_TYPES = [
21
+ 'image/',
22
+ 'video/',
23
+ 'audio/',
24
+ 'application/pdf',
25
+ 'text/',
26
+ 'application/json',
27
+ 'application/xml',
28
+ 'application/zip',
29
+ 'application/x-zip-compressed',
30
+ 'application/gzip',
31
+ 'application/msword',
32
+ 'application/vnd.openxmlformats-officedocument',
33
+ 'application/vnd.ms-excel',
34
+ 'application/vnd.ms-powerpoint',
35
+ ];
36
+ /**
37
+ * Validates if a content type is safe to download.
38
+ */
39
+ export function isContentTypeAllowed(contentType) {
40
+ const normalized = contentType.toLowerCase().trim();
41
+ return ALLOWED_CONTENT_TYPES.some((allowed) => normalized.startsWith(allowed));
42
+ }
43
+ /**
44
+ * Sanitizes a filename to prevent directory traversal and other security issues.
45
+ */
46
+ export function sanitizeFileName(fileName) {
47
+ return fileName
48
+ .replace(/[^a-zA-Z0-9._-]/g, '_') // Replace unsafe chars with underscore
49
+ .replace(/\.+/g, '.') // Replace multiple dots with single dot
50
+ .replace(/^\./, '_') // Replace leading dot
51
+ .substring(0, 100); // Limit length
52
+ }
53
+ /**
54
+ * Validates a URL to ensure it's a proper HTTPS URL.
55
+ */
56
+ export function validateDownloadUrl(url) {
57
+ try {
58
+ const parsed = new URL(url);
59
+ if (parsed.protocol !== 'https:') {
60
+ throw new Error('Only HTTPS URLs are allowed');
61
+ }
62
+ // Block localhost and private IP ranges
63
+ const hostname = parsed.hostname.toLowerCase();
64
+ // Strip IPv6 brackets for comparison (URL parser wraps IPv6 in brackets)
65
+ const bareHostname = hostname.replace(/^\[|\]$/g, '');
66
+ if (bareHostname === 'localhost' ||
67
+ bareHostname === '127.0.0.1' ||
68
+ bareHostname === '::1') {
69
+ throw new Error('Local URLs are not allowed');
70
+ }
71
+ // Block private IP ranges (RFC 1918 and others)
72
+ const ipv4Patterns = [
73
+ /^10\./, // 10.0.0.0/8
74
+ /^192\.168\./, // 192.168.0.0/16
75
+ /^172\.(1[6-9]|2[0-9]|3[0-1])\./, // 172.16.0.0/12
76
+ /^169\.254\./, // Link-local 169.254.0.0/16
77
+ /^0\./, // Current network
78
+ /^127\./, // Loopback
79
+ ];
80
+ for (const pattern of ipv4Patterns) {
81
+ if (pattern.test(hostname)) {
82
+ throw new Error('Private IP addresses are not allowed');
83
+ }
84
+ }
85
+ // Validate URL length to prevent DoS
86
+ if (url.length > 2048) {
87
+ throw new Error('URL too long (max 2048 characters)');
88
+ }
89
+ }
90
+ catch (error) {
91
+ throw new Error(`Invalid URL: ${error instanceof Error ? error.message : String(error)}`);
92
+ }
93
+ }
94
+ /**
95
+ * Downloads a file from a signed S3 URL and saves it to the plugin store.
96
+ * Includes security validations and error handling.
97
+ */
98
+ async function fetchAndSaveMedia(attachment) {
99
+ // Validate input
100
+ if (!attachment.url) {
101
+ throw new Error('Attachment URL is required');
102
+ }
103
+ if (!attachment.name) {
104
+ throw new Error('Attachment name is required');
105
+ }
106
+ if (!attachment.contentType) {
107
+ throw new Error('Attachment content type is required');
108
+ }
109
+ // Security validations
110
+ validateDownloadUrl(attachment.url);
111
+ if (!isContentTypeAllowed(attachment.contentType)) {
112
+ throw new Error(`Content type not allowed: ${attachment.contentType}`);
113
+ }
114
+ if (attachment.size > MAX_ATTACHMENT_SIZE) {
115
+ throw new Error(`File too large: ${attachment.size} bytes (max: ${MAX_ATTACHMENT_SIZE})`);
116
+ }
117
+ // Generate safe file path with additional security checks
118
+ const sanitizedName = sanitizeFileName(attachment.name);
119
+ // Additional validation - ensure no path traversal attempts
120
+ if (sanitizedName.includes('..') ||
121
+ sanitizedName.includes('/') ||
122
+ sanitizedName.includes('\\')) {
123
+ throw new Error('Invalid filename: contains path traversal characters');
124
+ }
125
+ // Only append extension if the sanitized name doesn't already have one
126
+ const hasExt = extname(sanitizedName).length > 0;
127
+ const fileName = hasExt
128
+ ? `${randomUUID()}_${sanitizedName}`
129
+ : `${randomUUID()}_${sanitizedName}${extname(attachment.name) || '.bin'}`;
130
+ // Final validation of complete filename
131
+ if (fileName.length > 255) {
132
+ throw new Error('Generated filename too long (max 255 characters)');
133
+ }
134
+ const filePath = resolvePluginStorePath(`media/inbound/${fileName}`);
135
+ // Ensure directory exists
136
+ await mkdir(dirname(filePath), { recursive: true });
137
+ // Download with timeout and validations
138
+ const controller = new AbortController();
139
+ const timeoutId = setTimeout(() => controller.abort(), DOWNLOAD_TIMEOUT_MS);
140
+ let fileStream = null;
141
+ try {
142
+ const response = await fetch(attachment.url, {
143
+ signal: controller.signal,
144
+ headers: {
145
+ 'User-Agent': 'DeskFree-OpenClaw/1.0',
146
+ },
147
+ });
148
+ if (!response.ok) {
149
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
150
+ }
151
+ if (!response.body) {
152
+ throw new Error('Empty response body');
153
+ }
154
+ // Validate content type from response
155
+ const responseContentType = response.headers.get('content-type');
156
+ if (responseContentType && !isContentTypeAllowed(responseContentType)) {
157
+ throw new Error(`Response content type not allowed: ${responseContentType}`);
158
+ }
159
+ // Validate content length if provided
160
+ const contentLength = response.headers.get('content-length');
161
+ if (contentLength) {
162
+ const size = parseInt(contentLength, 10);
163
+ if (size > MAX_ATTACHMENT_SIZE) {
164
+ throw new Error(`Content too large: ${size} bytes (max: ${MAX_ATTACHMENT_SIZE})`);
165
+ }
166
+ }
167
+ // Stream the response body to disk with size tracking
168
+ const nodeStream = Readable.fromWeb(response.body);
169
+ fileStream = createWriteStream(filePath);
170
+ let bytesWritten = 0;
171
+ let sizeExceeded = false;
172
+ nodeStream.on('data', (chunk) => {
173
+ bytesWritten += chunk.length;
174
+ if (bytesWritten > MAX_ATTACHMENT_SIZE && !sizeExceeded) {
175
+ sizeExceeded = true;
176
+ nodeStream.destroy(new Error('File size limit exceeded during download'));
177
+ }
178
+ });
179
+ // Handle stream errors properly
180
+ nodeStream.on('error', () => {
181
+ if (fileStream && !fileStream.destroyed) {
182
+ fileStream.destroy();
183
+ }
184
+ });
185
+ fileStream.on('error', () => {
186
+ if (!nodeStream.destroyed) {
187
+ nodeStream.destroy();
188
+ }
189
+ });
190
+ await pipeline(nodeStream, fileStream);
191
+ return {
192
+ path: filePath,
193
+ contentType: responseContentType || attachment.contentType,
194
+ };
195
+ }
196
+ catch (error) {
197
+ // Ensure streams are properly closed
198
+ if (fileStream && !fileStream.destroyed) {
199
+ fileStream.destroy();
200
+ fileStream = null;
201
+ }
202
+ // Clean up partial file if download failed
203
+ try {
204
+ await unlink(filePath);
205
+ }
206
+ catch {
207
+ // Ignore cleanup errors - file might not have been created
208
+ }
209
+ if (controller.signal.aborted) {
210
+ throw new Error(`Download timeout after ${DOWNLOAD_TIMEOUT_MS}ms`);
211
+ }
212
+ throw new Error(`Failed to download attachment: ${error instanceof Error ? error.message : String(error)}`);
213
+ }
214
+ finally {
215
+ clearTimeout(timeoutId);
216
+ // Final cleanup - ensure file stream is closed
217
+ if (fileStream && !fileStream.destroyed) {
218
+ fileStream.destroy();
219
+ }
220
+ }
221
+ }
222
+ /**
223
+ * Delivers a DeskFree chat message to the OpenClaw agent pipeline.
224
+ *
225
+ * Each message produces a single inbound message.
226
+ * If the message has a taskId, it's set as ThreadId for conversation threading.
227
+ */
228
+ export async function deliverMessageToAgent(ctx, message, client) {
229
+ const runtime = getDeskFreeRuntime();
230
+ const log = ctx.log ?? runtime.logging.createLogger('deskfree:deliver');
231
+ const peerId = message.humanId.trim().toLowerCase();
232
+ log.info(`Delivering message ${message.messageId} from ${message.userName ?? message.humanId}` +
233
+ (message.taskId ? ` (task: ${message.taskId})` : '') +
234
+ `: "${message.content.slice(0, 80)}${message.content.length > 80 ? '…' : ''}"`);
235
+ // Download attachments if present
236
+ const attachments = message.attachments ?? [];
237
+ // Validate attachment count
238
+ if (attachments.length > MAX_ATTACHMENTS_PER_MESSAGE) {
239
+ log.warn(`Message has ${attachments.length} attachments, limiting to ${MAX_ATTACHMENTS_PER_MESSAGE}`);
240
+ }
241
+ // Calculate total attachment size for rate limiting
242
+ const totalSize = attachments
243
+ .slice(0, MAX_ATTACHMENTS_PER_MESSAGE)
244
+ .reduce((sum, att) => sum + (att.size || 0), 0);
245
+ if (totalSize > MAX_TOTAL_DOWNLOAD_SIZE) {
246
+ log.warn(`Total attachment size ${totalSize} bytes exceeds limit ${MAX_TOTAL_DOWNLOAD_SIZE} bytes`);
247
+ // Don't fail the entire message, just log the warning
248
+ }
249
+ const mediaPaths = [];
250
+ const mediaTypes = [];
251
+ const mediaUrls = [];
252
+ for (const [index, attachment] of attachments
253
+ .slice(0, MAX_ATTACHMENTS_PER_MESSAGE)
254
+ .entries()) {
255
+ if (!attachment.url) {
256
+ log.warn(`Skipping attachment ${index}: no URL provided`);
257
+ continue;
258
+ }
259
+ try {
260
+ const saved = await fetchAndSaveMedia(attachment);
261
+ mediaPaths.push(saved.path);
262
+ mediaTypes.push(saved.contentType);
263
+ mediaUrls.push(saved.path);
264
+ log.info(`Downloaded attachment ${index}: ${attachment.name} (${saved.contentType})`);
265
+ }
266
+ catch (error) {
267
+ const errorMsg = error instanceof Error ? error.message : String(error);
268
+ log.warn(`Failed to download attachment ${index} (${attachment.name}): ${errorMsg}`);
269
+ // Non-fatal — continue processing other attachments and the message
270
+ }
271
+ }
272
+ const msgCtx = runtime.channel.reply.finalizeInboundContext({
273
+ Body: message.content,
274
+ RawBody: message.content,
275
+ ChatType: 'dm',
276
+ Provider: 'deskfree',
277
+ Surface: 'deskfree',
278
+ Channel: 'deskfree',
279
+ From: message.humanId,
280
+ To: message.humanId,
281
+ MessageSid: message.messageId,
282
+ ThreadId: message.taskId ?? undefined,
283
+ Timestamp: message.createdAt,
284
+ AccountId: ctx.accountId,
285
+ FromName: message.userName ?? 'Unknown',
286
+ SessionKey: `agent:main:deskfree:dm:${peerId}`,
287
+ // Backward-compatible: first attachment
288
+ MediaPath: mediaPaths[0],
289
+ MediaType: mediaTypes[0],
290
+ MediaUrl: mediaUrls[0],
291
+ // Array keys for multiple attachments
292
+ MediaPaths: mediaPaths,
293
+ MediaTypes: mediaTypes,
294
+ MediaUrls: mediaUrls,
295
+ MediaCount: mediaPaths.length,
296
+ });
297
+ try {
298
+ const cfg = runtime.config.loadConfig();
299
+ const typingCallbacks = createTypingCallbacks({
300
+ start: async () => {
301
+ await client.typing({ taskId: message.taskId ?? undefined });
302
+ },
303
+ onStartError: (err) => {
304
+ logTypingFailure({
305
+ log: (m) => log.warn(m),
306
+ channel: 'deskfree',
307
+ action: 'start',
308
+ error: err,
309
+ });
310
+ },
311
+ });
312
+ const { dispatcher, replyOptions } = runtime.channel.reply.createReplyDispatcherWithTyping({
313
+ channel: 'deskfree',
314
+ accountId: ctx.accountId,
315
+ onReplyStart: typingCallbacks.onReplyStart,
316
+ onIdle: typingCallbacks.onIdle,
317
+ deliver: async (payload) => {
318
+ const text = typeof payload === 'string'
319
+ ? payload
320
+ : (payload.text ?? payload.body ?? '');
321
+ if (text) {
322
+ // Use the message's own taskId if present, otherwise
323
+ // fall back to the active task for auto-threading
324
+ const taskId = message.taskId ?? getActiveTaskId() ?? undefined;
325
+ log.info(`Sending reply to DeskFree (task: ${taskId ?? 'none'}): "${text.slice(0, 80)}..."`);
326
+ await client.sendMessage({
327
+ content: text,
328
+ taskId,
329
+ });
330
+ log.info('Reply sent successfully.');
331
+ }
332
+ else {
333
+ log.warn('Deliver callback called with empty text, skipping.');
334
+ }
335
+ },
336
+ });
337
+ await runtime.channel.reply.dispatchReplyFromConfig({
338
+ ctx: msgCtx,
339
+ cfg,
340
+ dispatcher,
341
+ replyOptions,
342
+ });
343
+ log.info(`Message ${message.messageId} dispatched successfully.`);
344
+ }
345
+ catch (err) {
346
+ const errMsg = err instanceof Error ? err.message : String(err);
347
+ log.warn(`Failed to dispatch message ${message.messageId}: ${errMsg}`);
348
+ }
349
+ }
350
+ //# sourceMappingURL=deliver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deliver.js","sourceRoot":"","sources":["../src/deliver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,qBAAqB,EAGtB,MAAM,SAAS,CAAC;AAejB,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE3D;AAED,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AA6QD;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,qBAAqB,GACzB,OAAO,CAAC,IAAI,CAAC,CA+Ff"}