@skillful-ai/piece-skai-adapters 0.0.12 → 0.0.13
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/package.json +2 -2
- package/src/index.js +4 -0
- package/src/index.js.map +1 -1
- package/src/lib/actions/skai-to-whapi.d.ts +3 -0
- package/src/lib/actions/skai-to-whapi.js +106 -0
- package/src/lib/actions/skai-to-whapi.js.map +1 -0
- package/src/lib/actions/whapi-to-skai.d.ts +6 -0
- package/src/lib/actions/whapi-to-skai.js +92 -0
- package/src/lib/actions/whapi-to-skai.js.map +1 -0
- package/src/lib/transformers/whapi.transformer.d.ts +74 -0
- package/src/lib/transformers/whapi.transformer.js +141 -0
- package/src/lib/transformers/whapi.transformer.js.map +1 -0
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skillful-ai/piece-skai-adapters",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"main": "./src/index.js",
|
|
6
6
|
"types": "./src/index.d.ts",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@activepieces/pieces-framework": "0.20.1",
|
|
8
|
+
"@activepieces/pieces-framework": "^0.20.1",
|
|
9
9
|
"@sinclair/typebox": "0.34.11",
|
|
10
10
|
"@skillful-ai/skai-sdk": "*",
|
|
11
11
|
"axios": "1.8.3",
|
package/src/index.js
CHANGED
|
@@ -4,8 +4,10 @@ exports.skaiAdapters = void 0;
|
|
|
4
4
|
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
5
5
|
const skai_to_whatsapp_1 = require("./lib/actions/skai-to-whatsapp");
|
|
6
6
|
const skai_to_telegram_1 = require("./lib/actions/skai-to-telegram");
|
|
7
|
+
const skai_to_whapi_1 = require("./lib/actions/skai-to-whapi");
|
|
7
8
|
const whatsapp_to_skai_1 = require("./lib/actions/whatsapp-to-skai");
|
|
8
9
|
const telegram_to_skai_1 = require("./lib/actions/telegram-to-skai");
|
|
10
|
+
const whapi_to_skai_1 = require("./lib/actions/whapi-to-skai");
|
|
9
11
|
const update_chat_message_reference_1 = require("./lib/actions/update-chat-message-reference");
|
|
10
12
|
const skai_response_webhook_1 = require("./lib/triggers/skai-response-webhook");
|
|
11
13
|
exports.skaiAdapters = (0, pieces_framework_1.createPiece)({
|
|
@@ -18,8 +20,10 @@ exports.skaiAdapters = (0, pieces_framework_1.createPiece)({
|
|
|
18
20
|
actions: [
|
|
19
21
|
skai_to_whatsapp_1.skaiToWhatsApp,
|
|
20
22
|
skai_to_telegram_1.skaiToTelegram,
|
|
23
|
+
skai_to_whapi_1.skaiToWhapi,
|
|
21
24
|
whatsapp_to_skai_1.whatsappToSkai,
|
|
22
25
|
telegram_to_skai_1.telegramToSkai,
|
|
26
|
+
whapi_to_skai_1.whapiToSkai,
|
|
23
27
|
update_chat_message_reference_1.updateChatMessageReference,
|
|
24
28
|
],
|
|
25
29
|
triggers: [skai_response_webhook_1.skaiResponseWebhook],
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/pieces/custom/skai-adapters/src/index.ts"],"names":[],"mappings":";;;AAAA,qEAAwE;AACxE,qEAAgE;AAChE,qEAAgE;AAChE,qEAAgE;AAChE,qEAAgE;AAChE,+FAAyF;AACzF,gFAA2E;AAE9D,QAAA,YAAY,GAAG,IAAA,8BAAW,EAAC;IACvC,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,gEAAgE;IAC7E,IAAI,EAAE,4BAAS,CAAC,IAAI,EAAE;IACtB,uBAAuB,EAAE,QAAQ;IACjC,OAAO,EAAE,oFAAoF;IAC7F,OAAO,EAAE,CAAC,aAAa,CAAC;IACxB,OAAO,EAAE;QACR,iCAAc;QACd,iCAAc;QACd,iCAAc;QACd,iCAAc;QACd,0DAA0B;KAC1B;IACD,QAAQ,EAAE,CAAC,2CAAmB,CAAC;CAC/B,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/pieces/custom/skai-adapters/src/index.ts"],"names":[],"mappings":";;;AAAA,qEAAwE;AACxE,qEAAgE;AAChE,qEAAgE;AAChE,+DAA0D;AAC1D,qEAAgE;AAChE,qEAAgE;AAChE,+DAA0D;AAC1D,+FAAyF;AACzF,gFAA2E;AAE9D,QAAA,YAAY,GAAG,IAAA,8BAAW,EAAC;IACvC,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,gEAAgE;IAC7E,IAAI,EAAE,4BAAS,CAAC,IAAI,EAAE;IACtB,uBAAuB,EAAE,QAAQ;IACjC,OAAO,EAAE,oFAAoF;IAC7F,OAAO,EAAE,CAAC,aAAa,CAAC;IACxB,OAAO,EAAE;QACR,iCAAc;QACd,iCAAc;QACd,2BAAW;QACX,iCAAc;QACd,iCAAc;QACd,2BAAW;QACX,0DAA0B;KAC1B;IACD,QAAQ,EAAE,CAAC,2CAAmB,CAAC;CAC/B,CAAC,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.skaiToWhapi = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
6
|
+
const message_combiner_1 = require("../common/message-combiner");
|
|
7
|
+
exports.skaiToWhapi = (0, pieces_framework_1.createAction)({
|
|
8
|
+
name: 'skai_to_whapi',
|
|
9
|
+
displayName: 'SKAI → WHAPI',
|
|
10
|
+
description: 'Transform SKAI webhook response to WHAPI message format. Combines pre-split messages with media following backend logic.',
|
|
11
|
+
props: {
|
|
12
|
+
webhookPayload: pieces_framework_1.Property.Json({
|
|
13
|
+
displayName: 'SKAI Webhook Payload',
|
|
14
|
+
description: 'Output from SKAI Response Webhook trigger',
|
|
15
|
+
required: true,
|
|
16
|
+
}),
|
|
17
|
+
},
|
|
18
|
+
run(context) {
|
|
19
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
20
|
+
const { webhookPayload } = context.propsValue;
|
|
21
|
+
try {
|
|
22
|
+
// Parse webhook payload
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
24
|
+
const payload = webhookPayload;
|
|
25
|
+
// Validate platform (whapi uses whatsapp as platform internally)
|
|
26
|
+
if (!payload.platform ||
|
|
27
|
+
(payload.platform !== 'whatsapp' && payload.platform !== 'whapi')) {
|
|
28
|
+
throw new Error(`Invalid platform: expected 'whatsapp' or 'whapi', got '${payload.platform || 'undefined'}'`);
|
|
29
|
+
}
|
|
30
|
+
// Validate required fields
|
|
31
|
+
const hasReaction = payload.reaction !== undefined && payload.reaction !== null;
|
|
32
|
+
const messages = payload.messages || (payload.message ? [payload.message] : []);
|
|
33
|
+
const hasMessages = messages.length > 0 &&
|
|
34
|
+
messages.some((msg) => msg && msg.trim().length > 0);
|
|
35
|
+
const hasMedia = payload.media_urls && payload.media_urls.length > 0;
|
|
36
|
+
if (!payload.external_id ||
|
|
37
|
+
(!hasMessages && !hasMedia && !hasReaction)) {
|
|
38
|
+
throw new Error('Missing required fields: external_id and (messages or media_urls or reaction)');
|
|
39
|
+
}
|
|
40
|
+
// Format external_id to ChatID format for WHAPI
|
|
41
|
+
const chatId = formatToChatId(payload.external_id);
|
|
42
|
+
// Handle reaction messages
|
|
43
|
+
if (hasReaction) {
|
|
44
|
+
// For reactions, we need the message ID to react to (reference_id)
|
|
45
|
+
if (!payload.reference_id) {
|
|
46
|
+
throw new Error('Missing required field: reference_id (message ID to react to)');
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
messages: [
|
|
50
|
+
{
|
|
51
|
+
to: chatId,
|
|
52
|
+
reaction: payload.reaction || '', // Empty string means remove reaction
|
|
53
|
+
reference_id: payload.reference_id,
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
requiresMultipleSends: false,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// Filter out empty messages
|
|
60
|
+
const validMessages = messages.filter((msg) => msg && msg.trim().length > 0);
|
|
61
|
+
const mediaUrls = payload.media_urls || [];
|
|
62
|
+
const mediaTypes = payload.media_types || [];
|
|
63
|
+
const chatMessageIds = payload.chat_message_ids || [];
|
|
64
|
+
// Combine messages and media using the backend's logic
|
|
65
|
+
const whapiMessages = (0, message_combiner_1.combineMessagesAndMedia)({
|
|
66
|
+
messages: validMessages,
|
|
67
|
+
mediaUrls,
|
|
68
|
+
mediaTypes,
|
|
69
|
+
chatId: chatId,
|
|
70
|
+
chatMessageIds: chatMessageIds.length > 0 ? chatMessageIds : undefined,
|
|
71
|
+
referenceId: payload.reference_id,
|
|
72
|
+
defaultMediaType: 'image',
|
|
73
|
+
chatIdFieldName: 'to',
|
|
74
|
+
});
|
|
75
|
+
// Return all message parts (array if split, single item array if not)
|
|
76
|
+
return {
|
|
77
|
+
messages: whapiMessages,
|
|
78
|
+
requiresMultipleSends: whapiMessages.length > 1,
|
|
79
|
+
};
|
|
80
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.error('Error in SKAI → WHAPI:', error);
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: error.message ||
|
|
87
|
+
'Failed to transform SKAI response to WHAPI format',
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
/**
|
|
94
|
+
* Format phone number to WHAPI ChatID format
|
|
95
|
+
*/
|
|
96
|
+
function formatToChatId(phone) {
|
|
97
|
+
// Remove all non-numeric characters except @ and .
|
|
98
|
+
const cleaned = phone.replace(/[^0-9@.a-z]/gi, '');
|
|
99
|
+
// If already in ChatID format, return as-is
|
|
100
|
+
if (cleaned.includes('@')) {
|
|
101
|
+
return cleaned;
|
|
102
|
+
}
|
|
103
|
+
// Default to individual chat format
|
|
104
|
+
return `${cleaned}@s.whatsapp.net`;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=skai-to-whapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skai-to-whapi.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/custom/skai-adapters/src/lib/actions/skai-to-whapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const whapiToSkai: import("@activepieces/pieces-framework").IAction<import("@activepieces/pieces-framework").PieceAuthProperty, {
|
|
2
|
+
whapiMessage: import("@activepieces/pieces-framework").JsonProperty<true>;
|
|
3
|
+
agent: import("@activepieces/pieces-framework").DropdownProperty<string, false>;
|
|
4
|
+
webhookUrl: import("@activepieces/pieces-framework").ShortTextProperty<true>;
|
|
5
|
+
chatBufferWindowSeconds: import("@activepieces/pieces-framework").NumberProperty<false>;
|
|
6
|
+
}>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.whapiToSkai = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const pieces_framework_1 = require("@activepieces/pieces-framework");
|
|
6
|
+
const whapi_transformer_1 = require("../transformers/whapi.transformer");
|
|
7
|
+
const skai_client_1 = require("../common/skai-client");
|
|
8
|
+
const dropdowns_1 = require("../common/dropdowns");
|
|
9
|
+
exports.whapiToSkai = (0, pieces_framework_1.createAction)({
|
|
10
|
+
name: 'whapi_to_skai',
|
|
11
|
+
displayName: 'WHAPI → SKAI Agent',
|
|
12
|
+
description: 'Transform WHAPI message to generic format and process with SKAI agent',
|
|
13
|
+
props: {
|
|
14
|
+
whapiMessage: pieces_framework_1.Property.Json({
|
|
15
|
+
displayName: 'WHAPI Message',
|
|
16
|
+
description: 'Output from WHAPI New Message trigger',
|
|
17
|
+
required: true,
|
|
18
|
+
}),
|
|
19
|
+
agent: dropdowns_1.agentDropdown,
|
|
20
|
+
webhookUrl: pieces_framework_1.Property.ShortText({
|
|
21
|
+
displayName: 'Webhook Callback URL',
|
|
22
|
+
description: 'URL from SKAI Response Webhook trigger (Flow 2) for backend to send response',
|
|
23
|
+
required: true,
|
|
24
|
+
}),
|
|
25
|
+
chatBufferWindowSeconds: pieces_framework_1.Property.Number({
|
|
26
|
+
displayName: 'Chat Buffer Window (Seconds)',
|
|
27
|
+
description: 'Chat buffer window in seconds (0 to 60 seconds, 1 minute max)',
|
|
28
|
+
required: false,
|
|
29
|
+
defaultValue: 0,
|
|
30
|
+
}),
|
|
31
|
+
},
|
|
32
|
+
run(context) {
|
|
33
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
34
|
+
const { whapiMessage, agent, webhookUrl, chatBufferWindowSeconds } = context.propsValue;
|
|
35
|
+
try {
|
|
36
|
+
// Validate chat buffer window seconds
|
|
37
|
+
const bufferSeconds = chatBufferWindowSeconds !== null && chatBufferWindowSeconds !== void 0 ? chatBufferWindowSeconds : 0;
|
|
38
|
+
if (bufferSeconds < 0 || bufferSeconds > 60) {
|
|
39
|
+
throw new Error('Chat buffer window seconds must be between 0 and 60 (1 minute)');
|
|
40
|
+
}
|
|
41
|
+
// Transform WHAPI message to GenericMessage format
|
|
42
|
+
const transformer = new whapi_transformer_1.WhapiTransformer();
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
44
|
+
const genericMessage = transformer.transform(whapiMessage);
|
|
45
|
+
// Prepare request body
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
const requestBody = {
|
|
48
|
+
external_id: genericMessage.external_id,
|
|
49
|
+
reference_id: genericMessage.reference_id,
|
|
50
|
+
platform: genericMessage.platform,
|
|
51
|
+
message: genericMessage.message,
|
|
52
|
+
sender_name: genericMessage.sender_name,
|
|
53
|
+
unique_handle: genericMessage.unique_handle,
|
|
54
|
+
media_urls: genericMessage.media_urls || [],
|
|
55
|
+
media_base64: genericMessage.media_base64 || [],
|
|
56
|
+
media_types: genericMessage.media_types || [],
|
|
57
|
+
metadata: genericMessage.metadata || {},
|
|
58
|
+
webhook_url: webhookUrl,
|
|
59
|
+
chat_buffer_window_seconds: Math.round(bufferSeconds),
|
|
60
|
+
};
|
|
61
|
+
// Call SKAI Agents API using server context
|
|
62
|
+
const skaiResponse = yield skai_client_1.skaiClient.processMessage({
|
|
63
|
+
serverUrl: context.server.publicUrl,
|
|
64
|
+
token: context.server.token,
|
|
65
|
+
agentId: agent || null,
|
|
66
|
+
payload: requestBody,
|
|
67
|
+
});
|
|
68
|
+
// Build response
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
const response = {
|
|
71
|
+
success: true,
|
|
72
|
+
skaiResponse,
|
|
73
|
+
genericMessage,
|
|
74
|
+
originalPlatform: 'whapi',
|
|
75
|
+
originalMessage: whapiMessage,
|
|
76
|
+
};
|
|
77
|
+
return response;
|
|
78
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('❌ Error in WHAPI → SKAI:', error);
|
|
82
|
+
return {
|
|
83
|
+
success: false,
|
|
84
|
+
error: error.message ||
|
|
85
|
+
'Failed to process message with SKAI agent',
|
|
86
|
+
originalPlatform: 'whapi',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
//# sourceMappingURL=whapi-to-skai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whapi-to-skai.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/custom/skai-adapters/src/lib/actions/whapi-to-skai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { GenericMessage } from '../common/types/generic-message';
|
|
2
|
+
/**
|
|
3
|
+
* WHAPI message structure (output from WHAPI piece trigger)
|
|
4
|
+
* This matches the output format from the WHAPI new-message trigger
|
|
5
|
+
*/
|
|
6
|
+
export interface WhapiMessage {
|
|
7
|
+
from: string;
|
|
8
|
+
messageId: string;
|
|
9
|
+
timestamp: number;
|
|
10
|
+
type: string;
|
|
11
|
+
text?: string;
|
|
12
|
+
senderName?: string;
|
|
13
|
+
chatId: string;
|
|
14
|
+
reaction?: string;
|
|
15
|
+
reactedMessageId?: string;
|
|
16
|
+
image?: {
|
|
17
|
+
id: string;
|
|
18
|
+
mimeType?: string;
|
|
19
|
+
link?: string;
|
|
20
|
+
};
|
|
21
|
+
video?: {
|
|
22
|
+
id: string;
|
|
23
|
+
mimeType?: string;
|
|
24
|
+
link?: string;
|
|
25
|
+
};
|
|
26
|
+
audio?: {
|
|
27
|
+
id: string;
|
|
28
|
+
mimeType?: string;
|
|
29
|
+
link?: string;
|
|
30
|
+
};
|
|
31
|
+
voice?: {
|
|
32
|
+
id: string;
|
|
33
|
+
mimeType?: string;
|
|
34
|
+
link?: string;
|
|
35
|
+
};
|
|
36
|
+
document?: {
|
|
37
|
+
id: string;
|
|
38
|
+
mimeType?: string;
|
|
39
|
+
filename?: string;
|
|
40
|
+
link?: string;
|
|
41
|
+
};
|
|
42
|
+
sticker?: {
|
|
43
|
+
id: string;
|
|
44
|
+
mimeType?: string;
|
|
45
|
+
link?: string;
|
|
46
|
+
};
|
|
47
|
+
location?: {
|
|
48
|
+
latitude: number;
|
|
49
|
+
longitude: number;
|
|
50
|
+
name?: string;
|
|
51
|
+
address?: string;
|
|
52
|
+
};
|
|
53
|
+
contacts?: unknown[];
|
|
54
|
+
rawPayload?: unknown;
|
|
55
|
+
}
|
|
56
|
+
export declare class WhapiTransformer {
|
|
57
|
+
/**
|
|
58
|
+
* Transform WHAPI message to GenericMessage format
|
|
59
|
+
*/
|
|
60
|
+
transform(whapiMessage: WhapiMessage): GenericMessage;
|
|
61
|
+
/**
|
|
62
|
+
* Extract text message from WHAPI message
|
|
63
|
+
*/
|
|
64
|
+
private extractMessage;
|
|
65
|
+
/**
|
|
66
|
+
* Extract media information from WHAPI message
|
|
67
|
+
* WHAPI provides direct download links
|
|
68
|
+
*/
|
|
69
|
+
private extractMedia;
|
|
70
|
+
/**
|
|
71
|
+
* Convert Unix timestamp to ISO 8601 format
|
|
72
|
+
*/
|
|
73
|
+
private convertTimestamp;
|
|
74
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WhapiTransformer = void 0;
|
|
4
|
+
const generic_message_1 = require("../common/types/generic-message");
|
|
5
|
+
class WhapiTransformer {
|
|
6
|
+
/**
|
|
7
|
+
* Transform WHAPI message to GenericMessage format
|
|
8
|
+
*/
|
|
9
|
+
transform(whapiMessage) {
|
|
10
|
+
if (!(whapiMessage === null || whapiMessage === void 0 ? void 0 : whapiMessage.from) || !(whapiMessage === null || whapiMessage === void 0 ? void 0 : whapiMessage.messageId)) {
|
|
11
|
+
throw new Error('Invalid WHAPI message: missing required fields (from, messageId)');
|
|
12
|
+
}
|
|
13
|
+
// Extract phone number from ChatID format (remove @s.whatsapp.net or @g.us)
|
|
14
|
+
const externalId = whapiMessage.from
|
|
15
|
+
.replace('@s.whatsapp.net', '')
|
|
16
|
+
.replace('@g.us', '');
|
|
17
|
+
const genericMessage = Object.assign(Object.assign({ external_id: externalId, reference_id: whapiMessage.messageId, platform: generic_message_1.Platform.WHATSAPP, message: this.extractMessage(whapiMessage), timestamp: this.convertTimestamp(whapiMessage.timestamp), sender_name: whapiMessage.senderName, unique_handle: whapiMessage.chatId }, (whapiMessage.reaction !== undefined && {
|
|
18
|
+
reaction: whapiMessage.reaction,
|
|
19
|
+
})), { metadata: {
|
|
20
|
+
type: whapiMessage.type,
|
|
21
|
+
timestamp: whapiMessage.timestamp,
|
|
22
|
+
chat_id: whapiMessage.chatId,
|
|
23
|
+
source: 'whapi', // Distinguish from Meta WhatsApp
|
|
24
|
+
// Add user profile information
|
|
25
|
+
user: {
|
|
26
|
+
phone_number: externalId,
|
|
27
|
+
name: whapiMessage.senderName,
|
|
28
|
+
},
|
|
29
|
+
} });
|
|
30
|
+
// Handle media attachments
|
|
31
|
+
const media = this.extractMedia(whapiMessage);
|
|
32
|
+
if (media) {
|
|
33
|
+
genericMessage.media_urls = media.urls;
|
|
34
|
+
genericMessage.media_types = media.types;
|
|
35
|
+
// Ensure metadata exists
|
|
36
|
+
if (!genericMessage.metadata) {
|
|
37
|
+
genericMessage.metadata = {};
|
|
38
|
+
}
|
|
39
|
+
// Add media metadata
|
|
40
|
+
if (whapiMessage.image) {
|
|
41
|
+
genericMessage.metadata['image'] = whapiMessage.image;
|
|
42
|
+
}
|
|
43
|
+
if (whapiMessage.video) {
|
|
44
|
+
genericMessage.metadata['video'] = whapiMessage.video;
|
|
45
|
+
}
|
|
46
|
+
if (whapiMessage.audio) {
|
|
47
|
+
genericMessage.metadata['audio'] = whapiMessage.audio;
|
|
48
|
+
}
|
|
49
|
+
if (whapiMessage.document) {
|
|
50
|
+
genericMessage.metadata['document'] = whapiMessage.document;
|
|
51
|
+
}
|
|
52
|
+
if (whapiMessage.voice) {
|
|
53
|
+
genericMessage.metadata['voice'] = whapiMessage.voice;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return genericMessage;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Extract text message from WHAPI message
|
|
60
|
+
*/
|
|
61
|
+
extractMessage(message) {
|
|
62
|
+
var _a, _b;
|
|
63
|
+
// Priority: explicit text field, then captions, then type description
|
|
64
|
+
if (message.text) {
|
|
65
|
+
return message.text;
|
|
66
|
+
}
|
|
67
|
+
switch (message.type) {
|
|
68
|
+
case 'text':
|
|
69
|
+
return message.text || '';
|
|
70
|
+
case 'reaction':
|
|
71
|
+
return undefined;
|
|
72
|
+
case 'image':
|
|
73
|
+
return '[Image]';
|
|
74
|
+
case 'video':
|
|
75
|
+
return '[Video]';
|
|
76
|
+
case 'audio':
|
|
77
|
+
return '[Audio Message]';
|
|
78
|
+
case 'document':
|
|
79
|
+
return `[Document${((_a = message.document) === null || _a === void 0 ? void 0 : _a.filename) ? ': ' + message.document.filename : ''}]`;
|
|
80
|
+
case 'voice':
|
|
81
|
+
return '[Voice Message]';
|
|
82
|
+
case 'sticker':
|
|
83
|
+
return '[Sticker]';
|
|
84
|
+
case 'location':
|
|
85
|
+
return ((_b = message.location) === null || _b === void 0 ? void 0 : _b.name)
|
|
86
|
+
? `[Location: ${message.location.name}]`
|
|
87
|
+
: '[Location]';
|
|
88
|
+
case 'contact':
|
|
89
|
+
case 'contacts':
|
|
90
|
+
return '[Contact]';
|
|
91
|
+
default:
|
|
92
|
+
return `[Unsupported Message Type: ${message.type}]`;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Extract media information from WHAPI message
|
|
97
|
+
* WHAPI provides direct download links
|
|
98
|
+
*/
|
|
99
|
+
extractMedia(message) {
|
|
100
|
+
var _a, _b, _c, _d, _e, _f;
|
|
101
|
+
const media = {
|
|
102
|
+
urls: [],
|
|
103
|
+
types: [],
|
|
104
|
+
};
|
|
105
|
+
if ((_a = message.image) === null || _a === void 0 ? void 0 : _a.link) {
|
|
106
|
+
media.urls.push(message.image.link);
|
|
107
|
+
media.types.push(generic_message_1.MediaType.IMAGE);
|
|
108
|
+
}
|
|
109
|
+
if ((_b = message.video) === null || _b === void 0 ? void 0 : _b.link) {
|
|
110
|
+
media.urls.push(message.video.link);
|
|
111
|
+
media.types.push(generic_message_1.MediaType.VIDEO);
|
|
112
|
+
}
|
|
113
|
+
if ((_c = message.audio) === null || _c === void 0 ? void 0 : _c.link) {
|
|
114
|
+
media.urls.push(message.audio.link);
|
|
115
|
+
media.types.push(generic_message_1.MediaType.AUDIO);
|
|
116
|
+
}
|
|
117
|
+
if ((_d = message.document) === null || _d === void 0 ? void 0 : _d.link) {
|
|
118
|
+
media.urls.push(message.document.link);
|
|
119
|
+
media.types.push(generic_message_1.MediaType.DOCUMENT);
|
|
120
|
+
}
|
|
121
|
+
if ((_e = message.voice) === null || _e === void 0 ? void 0 : _e.link) {
|
|
122
|
+
media.urls.push(message.voice.link);
|
|
123
|
+
media.types.push(generic_message_1.MediaType.VOICE);
|
|
124
|
+
}
|
|
125
|
+
if ((_f = message.sticker) === null || _f === void 0 ? void 0 : _f.link) {
|
|
126
|
+
media.urls.push(message.sticker.link);
|
|
127
|
+
media.types.push(generic_message_1.MediaType.STICKER);
|
|
128
|
+
}
|
|
129
|
+
return media.urls.length > 0 ? media : null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Convert Unix timestamp to ISO 8601 format
|
|
133
|
+
*/
|
|
134
|
+
convertTimestamp(unixTimestamp) {
|
|
135
|
+
const timestampMs = unixTimestamp * 1000;
|
|
136
|
+
const date = new Date(timestampMs);
|
|
137
|
+
return date.toISOString();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.WhapiTransformer = WhapiTransformer;
|
|
141
|
+
//# sourceMappingURL=whapi.transformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whapi.transformer.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/custom/skai-adapters/src/lib/transformers/whapi.transformer.ts"],"names":[],"mappings":"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"}
|