Add Activepieces integration for workflow automation
- Add Activepieces fork with SmoothSchedule custom piece - Create integrations app with Activepieces service layer - Add embed token endpoint for iframe integration - Create Automations page with embedded workflow builder - Add sidebar visibility fix for embed mode - Add list inactive customers endpoint to Public API - Include SmoothSchedule triggers: event created/updated/cancelled - Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"extends": [
|
||||
"../../../../.eslintrc.base.json"
|
||||
],
|
||||
"ignorePatterns": [
|
||||
"!**/*"
|
||||
],
|
||||
"overrides": [
|
||||
{
|
||||
"files": [
|
||||
"*.ts",
|
||||
"*.tsx",
|
||||
"*.js",
|
||||
"*.jsx"
|
||||
],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.ts",
|
||||
"*.tsx"
|
||||
],
|
||||
"rules": {}
|
||||
},
|
||||
{
|
||||
"files": [
|
||||
"*.js",
|
||||
"*.jsx"
|
||||
],
|
||||
"rules": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# pieces-timelines-ai
|
||||
|
||||
This library was generated with [Nx](https://nx.dev).
|
||||
|
||||
## Building
|
||||
|
||||
Run `nx build pieces-timelines-ai` to build the library.
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"name": "@activepieces/piece-timelines-ai",
|
||||
"version": "0.0.2",
|
||||
"type": "commonjs",
|
||||
"main": "./src/index.js",
|
||||
"types": "./src/index.d.ts",
|
||||
"dependencies": {
|
||||
"tslib": "^2.3.0"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
{
|
||||
"name": "pieces-timelines-ai",
|
||||
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
|
||||
"sourceRoot": "packages/pieces/community/timelines-ai/src",
|
||||
"projectType": "library",
|
||||
"release": {
|
||||
"version": {
|
||||
"manifestRootsToUpdate": [
|
||||
"dist/{projectRoot}"
|
||||
],
|
||||
"currentVersionResolver": "git-tag",
|
||||
"fallbackCurrentVersionResolver": "disk"
|
||||
}
|
||||
},
|
||||
"tags": [],
|
||||
"targets": {
|
||||
"build": {
|
||||
"executor": "@nx/js:tsc",
|
||||
"outputs": [
|
||||
"{options.outputPath}"
|
||||
],
|
||||
"options": {
|
||||
"outputPath": "dist/packages/pieces/community/timelines-ai",
|
||||
"tsConfig": "packages/pieces/community/timelines-ai/tsconfig.lib.json",
|
||||
"packageJson": "packages/pieces/community/timelines-ai/package.json",
|
||||
"main": "packages/pieces/community/timelines-ai/src/index.ts",
|
||||
"assets": [
|
||||
"packages/pieces/community/timelines-ai/*.md",
|
||||
{
|
||||
"input": "packages/pieces/community/timelines-ai/src/i18n",
|
||||
"output": "./src/i18n",
|
||||
"glob": "**/!(i18n.json)"
|
||||
}
|
||||
],
|
||||
"buildableProjectDepsInPackageJsonType": "dependencies",
|
||||
"updateBuildableProjectDepsInPackageJson": true
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build",
|
||||
"prebuild"
|
||||
]
|
||||
},
|
||||
"nx-release-publish": {
|
||||
"options": {
|
||||
"packageRoot": "dist/{projectRoot}"
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"executor": "@nx/eslint:lint",
|
||||
"outputs": [
|
||||
"{options.outputFile}"
|
||||
]
|
||||
},
|
||||
"prebuild": {
|
||||
"executor": "nx:run-commands",
|
||||
"options": {
|
||||
"cwd": "packages/pieces/community/timelines-ai",
|
||||
"command": "bun install --no-save --silent"
|
||||
},
|
||||
"dependsOn": [
|
||||
"^build"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"Your TimelinesAI API key.": "Ihr TimelinesAI API-Schlüssel.",
|
||||
"Send Message to Existing Chat": "Nachricht an bestehenden Chat senden",
|
||||
"Send Uploaded File to Existing Chat": "Hochgeladene Datei an bestehenden Chat senden",
|
||||
"Send File to Existing Chat": "Datei an bestehenden Chat senden",
|
||||
"Send Message to New Chat": "Nachricht an neuen Chat senden",
|
||||
"Close Chat": "Chat schließen",
|
||||
"Find Chat": "Chat finden",
|
||||
"Find Message": "Nachricht finden",
|
||||
"Find Uploaded File": "Hochgeladene Datei finden",
|
||||
"Find Message Status": "Nachrichtenstatus finden",
|
||||
"Find WhatsApp Account": "WhatsApp Konto finden",
|
||||
"Custom API Call": "Eigener API-Aufruf",
|
||||
"Sends a text message in a chat identified by chat_id": "Sendet eine Textnachricht in einem von chat_id identifizierten Chat",
|
||||
"Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.": "Senden Sie eine Datei (Medien/Anhang) an einen Chat, mit Metadaten wie Dateinamen, über einen bestehenden Chat.",
|
||||
"Similar to above: send a file attachment to a chat using URL or file input and name.": "Ähnlich wie oben: Senden Sie einen Datei-Anhang an einen Chat mit URL oder Datei-Eingabe und -Namen.",
|
||||
"Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.": "Erstellen Sie einen neuen Chat (neue Unterhaltung), indem Sie das WhatsApp-Konto, die Telefonnummer und die Nachricht angeben.",
|
||||
"Programmatically mark a chat as closed by its chat_id.": "Markieren Sie einen Chat programmatisch als geschlossen durch seine Chat_ID.",
|
||||
"Look up a chat by parameters such as chat_id, phone, name, etc.": "Suchen Sie einen Chat nach Parametern wie chat_id, Telefon, Namen, etc.",
|
||||
"Lookup a message by its WhatsApp message ID.": "Suchen Sie eine Nachricht mit der WhatsApp Nachrichten-ID.",
|
||||
"Locate an uploaded file by filename or identifier.": "Suchen Sie eine hochgeladene Datei nach Dateinamen oder Bezeichner.",
|
||||
"Lookup a message’s delivery status by message ID.": "Suche den Zustellungsstatus einer Nachricht per Nachrichten-ID.",
|
||||
"Search for a WhatsApp account (by phone or ID).": "Suche nach einem WhatsApp-Konto (per Telefon oder ID).",
|
||||
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
|
||||
"Chat": "Chat",
|
||||
"Message Text": "Nachrichtentext",
|
||||
"File": "Datei",
|
||||
"Label": "Label",
|
||||
"Attachment Template ID": "Anhangvorlagen-ID",
|
||||
"Uploaded File": "Datei hochgeladen",
|
||||
"Contact Type": "Kontakttyp",
|
||||
"Contact": "Kontakt",
|
||||
"WhatsApp Account": "WhatsApp Konto",
|
||||
"Message": "Nachricht",
|
||||
"Chat Name": "Chatname",
|
||||
"Labels": "Etiketten",
|
||||
"Is Group": "Ist Gruppe",
|
||||
"Responsible": "Verantwortlich",
|
||||
"Is Read": "Wird gelesen",
|
||||
"Is Closed": "Ist geschlossen",
|
||||
"ChatGPT Autoresponse Enabled": "ChatGPT Autoresponse aktiviert",
|
||||
"Created After": "Erstellt nach",
|
||||
"Created Before": "Erstellt vor",
|
||||
"Page": "Seite",
|
||||
"Message UID": "Nachrichten-UID",
|
||||
"Filename": "Dateiname",
|
||||
"WhatsApp Account ID": "WhatsApp-Konto-ID",
|
||||
"Phone Number": "Telefonnummer",
|
||||
"Method": "Methode",
|
||||
"Headers": "Kopfzeilen",
|
||||
"Query Parameters": "Abfrageparameter",
|
||||
"Body": "Körper",
|
||||
"Response is Binary ?": "Antwort ist binär?",
|
||||
"No Error on Failure": "Kein Fehler bei Fehler",
|
||||
"Timeout (in seconds)": "Timeout (in Sekunden)",
|
||||
"Select the chat to send the message to": "Wählen Sie den Chat aus, an den die Nachricht gesendet wird",
|
||||
"The text content of the message to be sent.": "Der Textinhalt der zu sendenden Nachricht.",
|
||||
"Optional file to send with the message.": "Optionale Datei, die mit der Nachricht gesendet werden soll.",
|
||||
"Optional label to categorize or tag the message.": "Optionale Bezeichnung um die Nachricht zu kategorisieren oder zu markieren.",
|
||||
"Optional ID of the attachment template to use for the message.": "Optionale ID der für die Nachricht zu verwendenden Anhangvorlage.",
|
||||
"Select the uploaded file": "Datei auswählen",
|
||||
"The file to be sent in the chat.": "Die Datei, die im Chat gesendet werden soll.",
|
||||
"Select the type of contact identifier": "Wählen Sie den Typ der Kontakt-Kennung",
|
||||
"Select the contact identifier based on the chosen contact type": "Wählen Sie die Kontakt-Kennung basierend auf dem gewählten Kontakttyp",
|
||||
"Select the WhatsApp account": "WhatsApp-Konto auswählen",
|
||||
"The text message to be sent in the chat.": "Die Textnachricht die im Chat gesendet werden soll.",
|
||||
"An optional label to categorize the chat.": "Eine optionale Bezeichnung um den Chat zu kategorisieren.",
|
||||
"An optional name for the chat (useful for group chats).": "Ein optionaler Name für den Chat (nützlich für Gruppen-Chats).",
|
||||
"Optional ID of a predefined attachment template to use when sending files.": "Optionale ID einer vordefinierten Anhangvorlage, die beim Senden von Dateien verwendet werden soll.",
|
||||
"Filter by labels assigned to the chat": "Nach dem Chat zugewiesenen Beschriftungen filtern",
|
||||
"Filter by whether the chat is a group chat": "Filtern Sie, ob der Chat ein Gruppen-Chat ist",
|
||||
"Filter by the user responsible for the chat (email)": "Filtern nach dem für den Chat verantwortlichen Benutzer (E-Mail)",
|
||||
"Filter by the name of the chat": "Nach dem Namen des Chats filtern",
|
||||
"Filter by whether the chat is marked as read": "Filtern Sie, ob der Chat als gelesen markiert ist",
|
||||
"Filter by whether the chat is closed": "Filtern Sie, ob der Chat geschlossen ist",
|
||||
"Filter by whether ChatGPT autoresponse is enabled for the chat": "Filtern Sie, ob ChatGPT Autoresponse für den Chat aktiviert ist",
|
||||
"Filter chats created after this date": "Chats, die nach diesem Datum erstellt wurden",
|
||||
"Filter chats created before this date": "Chats, die vor diesem Datum erstellt wurden",
|
||||
"Page number for paginated results": "Seitenzahl für paginierte Ergebnisse",
|
||||
"The unique identifier of the message to find.": "Der eindeutige Identifikator der zu findenden Nachricht.",
|
||||
"The name of the uploaded file to search for.": "Der Name der hochgeladenen Datei, nach der gesucht werden soll.",
|
||||
"The unique identifier of the message to look up.": "Der eindeutige Bezeichner der Nachricht, die aufgerufen werden soll.",
|
||||
"The unique identifier of the WhatsApp account to search for.": "Der eindeutige Identifikator des WhatsApp-Kontos nach dem gesucht werden soll.",
|
||||
"The phone number associated with the WhatsApp account to search for.": "Die zu suchende Telefonnummer mit dem WhatsApp-Konto verknüpft.",
|
||||
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
|
||||
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
|
||||
"JID": "JID",
|
||||
"GET": "ERHALTEN",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "LÖSCHEN",
|
||||
"HEAD": "HEAD",
|
||||
"Chat Closed": "Chat geschlossen",
|
||||
"New Outgoing Chat": "Neuer ausgehender Chat",
|
||||
"New Incoming Chat": "Neuer eingehender Chat",
|
||||
"New Sent Message": "Neue Nachricht gesendet",
|
||||
"New Received Message": "Neue empfangene Nachricht",
|
||||
"New Uploaded File": "Neue hochgeladene Datei",
|
||||
"New WhatsApp Account": "Neues WhatsApp-Konto",
|
||||
"Fires when a chat is closed.": "Feuert ab, wenn ein Chat geschlossen wird.",
|
||||
"Fires when a new outgoing chat is initiated.": "Feuert ab, wenn ein neuer ausgehender Chat gestartet wird.",
|
||||
"Fires when a new incoming chat (i.e. from a user) is created.": "Feuert ab, wenn ein neu eingehender Chat (z.B. von einem Benutzer) erstellt wird.",
|
||||
"Fires when a message is sent (outgoing).": "Feuert ab, wenn eine Nachricht gesendet wird (ausgehend).",
|
||||
"Fires when a message is received (incoming).": "Feuert ab, wenn eine Nachricht empfangen wird (eingehend).",
|
||||
"Fires when a new file is uploaded in a chat.": "Feuert ab, wenn eine neue Datei in einem Chat hochgeladen wird.",
|
||||
"Fires when a new WhatsApp account is added/registered.": "Startet, wenn ein neues WhatsApp-Konto hinzugefügt/registriert wird."
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"Your TimelinesAI API key.": "Su clave API TimelinesAI.",
|
||||
"Send Message to Existing Chat": "Enviar mensaje al chat existente",
|
||||
"Send Uploaded File to Existing Chat": "Enviar archivo subido al chat existente",
|
||||
"Send File to Existing Chat": "Enviar archivo al chat existente",
|
||||
"Send Message to New Chat": "Enviar mensaje al nuevo chat",
|
||||
"Close Chat": "Cerrar chat",
|
||||
"Find Chat": "Buscar chat",
|
||||
"Find Message": "Buscar mensaje",
|
||||
"Find Uploaded File": "Buscar archivo subido",
|
||||
"Find Message Status": "Buscar estado del mensaje",
|
||||
"Find WhatsApp Account": "Buscar cuenta de WhatsApp",
|
||||
"Custom API Call": "Llamada API personalizada",
|
||||
"Sends a text message in a chat identified by chat_id": "Envía un mensaje de texto en un chat identificado por chat_id",
|
||||
"Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.": "Enviar un archivo (media/adjunto) a un chat, con metadatos como nombre de archivo, a través del chat existente.",
|
||||
"Similar to above: send a file attachment to a chat using URL or file input and name.": "Similar a arriba: enviar un archivo adjunto a un chat usando la URL o el nombre del archivo.",
|
||||
"Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.": "Crear un nuevo chat (nueva conversación) especificando la cuenta de WhatsApp, número de teléfono y mensaje.",
|
||||
"Programmatically mark a chat as closed by its chat_id.": "Marcar programáticamente un chat como cerrado por su chat_id.",
|
||||
"Look up a chat by parameters such as chat_id, phone, name, etc.": "Buscar un chat por parámetros tales como chat_id, teléfono, nombre, etc.",
|
||||
"Lookup a message by its WhatsApp message ID.": "Busca un mensaje por su ID de mensaje de WhatsApp.",
|
||||
"Locate an uploaded file by filename or identifier.": "Localice un archivo subido por nombre de archivo o identificador.",
|
||||
"Lookup a message’s delivery status by message ID.": "Buscar el estado de entrega de un mensaje por el ID del mensaje.",
|
||||
"Search for a WhatsApp account (by phone or ID).": "Busca una cuenta de WhatsApp (por teléfono o ID).",
|
||||
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
|
||||
"Chat": "Chatear",
|
||||
"Message Text": "Texto del mensaje",
|
||||
"File": "Archivo",
|
||||
"Label": "Etiqueta",
|
||||
"Attachment Template ID": "ID de plantilla adjunta",
|
||||
"Uploaded File": "Archivo subido",
|
||||
"Contact Type": "Tipo de contacto",
|
||||
"Contact": "Contacto",
|
||||
"WhatsApp Account": "Cuenta de WhatsApp",
|
||||
"Message": "Mensaje",
|
||||
"Chat Name": "Nombre del chat",
|
||||
"Labels": "Etiquetas",
|
||||
"Is Group": "Es Grupo",
|
||||
"Responsible": "Responsable",
|
||||
"Is Read": "Leído",
|
||||
"Is Closed": "Está cerrado",
|
||||
"ChatGPT Autoresponse Enabled": "Autoresponse ChatGPT habilitado",
|
||||
"Created After": "Creado después de",
|
||||
"Created Before": "Creado antes",
|
||||
"Page": "Pgina",
|
||||
"Message UID": "UID del mensaje",
|
||||
"Filename": "Nombre de archivo",
|
||||
"WhatsApp Account ID": "ID de cuenta de WhatsApp",
|
||||
"Phone Number": "Número de teléfono",
|
||||
"Method": "Método",
|
||||
"Headers": "Encabezados",
|
||||
"Query Parameters": "Parámetros de consulta",
|
||||
"Body": "Cuerpo",
|
||||
"Response is Binary ?": "¿Respuesta es binaria?",
|
||||
"No Error on Failure": "No hay ningún error en fallo",
|
||||
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
|
||||
"Select the chat to send the message to": "Seleccione el chat al que enviar el mensaje",
|
||||
"The text content of the message to be sent.": "El contenido del texto del mensaje a ser enviado.",
|
||||
"Optional file to send with the message.": "Archivo opcional para enviar con el mensaje.",
|
||||
"Optional label to categorize or tag the message.": "Etiqueta opcional para categorizar o etiquetar el mensaje.",
|
||||
"Optional ID of the attachment template to use for the message.": "ID opcional de la plantilla adjunta a usar para el mensaje.",
|
||||
"Select the uploaded file": "Seleccione el archivo subido",
|
||||
"The file to be sent in the chat.": "El archivo a enviar en el chat.",
|
||||
"Select the type of contact identifier": "Seleccione el tipo de identificador de contacto",
|
||||
"Select the contact identifier based on the chosen contact type": "Seleccione el identificador de contacto basado en el tipo de contacto seleccionado",
|
||||
"Select the WhatsApp account": "Seleccione la cuenta de WhatsApp",
|
||||
"The text message to be sent in the chat.": "El mensaje de texto a enviar en el chat.",
|
||||
"An optional label to categorize the chat.": "Una etiqueta opcional para clasificar el chat.",
|
||||
"An optional name for the chat (useful for group chats).": "Un nombre opcional para el chat (útil para los chats de grupo).",
|
||||
"Optional ID of a predefined attachment template to use when sending files.": "ID opcional de una plantilla de adjunto predefinida a usar al enviar archivos.",
|
||||
"Filter by labels assigned to the chat": "Filtrar por etiquetas asignadas al chat",
|
||||
"Filter by whether the chat is a group chat": "Filtrar por si el chat es un chat de grupo",
|
||||
"Filter by the user responsible for the chat (email)": "Filtrar por el usuario responsable del chat (email)",
|
||||
"Filter by the name of the chat": "Filtrar por el nombre del chat",
|
||||
"Filter by whether the chat is marked as read": "Filtrar por si el chat está marcado como leído",
|
||||
"Filter by whether the chat is closed": "Filtrar por si el chat está cerrado",
|
||||
"Filter by whether ChatGPT autoresponse is enabled for the chat": "Filtrar por si ChatGPT autoresponse está habilitado para el chat",
|
||||
"Filter chats created after this date": "Filtrar chats creados después de esta fecha",
|
||||
"Filter chats created before this date": "Filtrar chats creados antes de esta fecha",
|
||||
"Page number for paginated results": "Número de página para los resultados paginados",
|
||||
"The unique identifier of the message to find.": "El identificador único del mensaje a encontrar.",
|
||||
"The name of the uploaded file to search for.": "El nombre del archivo subido para buscar.",
|
||||
"The unique identifier of the message to look up.": "El identificador único del mensaje a buscar.",
|
||||
"The unique identifier of the WhatsApp account to search for.": "El identificador único de la cuenta de WhatsApp para buscar.",
|
||||
"The phone number associated with the WhatsApp account to search for.": "El número de teléfono asociado con la cuenta de WhatsApp para buscar.",
|
||||
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
|
||||
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
|
||||
"JID": "JID",
|
||||
"GET": "RECOGER",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "BORRAR",
|
||||
"HEAD": "LIMPIO",
|
||||
"Chat Closed": "Chat cerrado",
|
||||
"New Outgoing Chat": "Nuevo chat saliente",
|
||||
"New Incoming Chat": "Nuevo chat entrante",
|
||||
"New Sent Message": "Nuevo mensaje enviado",
|
||||
"New Received Message": "Nuevo mensaje recibido",
|
||||
"New Uploaded File": "Nuevo archivo subido",
|
||||
"New WhatsApp Account": "Nueva cuenta de WhatsApp",
|
||||
"Fires when a chat is closed.": "Dispara cuando un chat está cerrado.",
|
||||
"Fires when a new outgoing chat is initiated.": "Dispara cuando se inicia un nuevo chat saliente.",
|
||||
"Fires when a new incoming chat (i.e. from a user) is created.": "Dispara cuando se crea un nuevo chat entrante (es decir, desde un usuario).",
|
||||
"Fires when a message is sent (outgoing).": "Dispara cuando se envía un mensaje (saliente).",
|
||||
"Fires when a message is received (incoming).": "Dispara cuando se recibe un mensaje (entrante).",
|
||||
"Fires when a new file is uploaded in a chat.": "Dispara cuando un nuevo archivo se carga en un chat.",
|
||||
"Fires when a new WhatsApp account is added/registered.": "Dispara cuando se agrega o registra una nueva cuenta de WhatsApp."
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"Your TimelinesAI API key.": "Votre clé API TimelinesAI.",
|
||||
"Send Message to Existing Chat": "Envoyer un message au chat existant",
|
||||
"Send Uploaded File to Existing Chat": "Envoyer le fichier téléchargé vers le chat existant",
|
||||
"Send File to Existing Chat": "Envoyer un fichier au chat existant",
|
||||
"Send Message to New Chat": "Envoyer un message à un nouveau chat",
|
||||
"Close Chat": "Fermer le chat",
|
||||
"Find Chat": "Trouver le chat",
|
||||
"Find Message": "Rechercher un message",
|
||||
"Find Uploaded File": "Trouver le fichier téléchargé",
|
||||
"Find Message Status": "Trouver le statut du message",
|
||||
"Find WhatsApp Account": "Trouver le compte WhatsApp",
|
||||
"Custom API Call": "Appel d'API personnalisé",
|
||||
"Sends a text message in a chat identified by chat_id": "Envoie un message texte dans une conversation identifiée par chat_id",
|
||||
"Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.": "Envoyer un fichier (media/attachment) à un chat, avec des métadonnées comme le nom de fichier, via un chat existant.",
|
||||
"Similar to above: send a file attachment to a chat using URL or file input and name.": "Similaire à ce qui précède : envoyer une pièce jointe à un chat en utilisant une URL ou une entrée et un nom de fichier.",
|
||||
"Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.": "Créer un nouveau chat (nouvelle conversation) en spécifiant le compte WhatsApp, le numéro de téléphone et le message.",
|
||||
"Programmatically mark a chat as closed by its chat_id.": "Marquer programmatiquement une conversation comme fermée par son chat_id.",
|
||||
"Look up a chat by parameters such as chat_id, phone, name, etc.": "Rechercher une conversation par des paramètres tels que chat_id, téléphone, nom, etc.",
|
||||
"Lookup a message by its WhatsApp message ID.": "Recherche un message par son ID de message WhatsApp.",
|
||||
"Locate an uploaded file by filename or identifier.": "Localisez un fichier téléchargé par nom de fichier ou identifiant.",
|
||||
"Lookup a message’s delivery status by message ID.": "Recherche le statut d'envoi d'un message par ID de message.",
|
||||
"Search for a WhatsApp account (by phone or ID).": "Recherche un compte WhatsApp (par téléphone ou ID).",
|
||||
"Make a custom API call to a specific endpoint": "Passer un appel API personnalisé à un endpoint spécifique",
|
||||
"Chat": "Discuter",
|
||||
"Message Text": "Texte du message",
|
||||
"File": "Ficher",
|
||||
"Label": "Étiquette",
|
||||
"Attachment Template ID": "ID du modèle de pièce jointe",
|
||||
"Uploaded File": "Fichier téléchargé",
|
||||
"Contact Type": "Type de contact",
|
||||
"Contact": "Contacter",
|
||||
"WhatsApp Account": "Compte WhatsApp",
|
||||
"Message": "Message",
|
||||
"Chat Name": "Nom du chat",
|
||||
"Labels": "Étiquettes",
|
||||
"Is Group": "Est un groupe",
|
||||
"Responsible": "Responsable",
|
||||
"Is Read": "Est lu",
|
||||
"Is Closed": "Est fermé",
|
||||
"ChatGPT Autoresponse Enabled": "ChatGPT Autoresponse Activé",
|
||||
"Created After": "Créé après",
|
||||
"Created Before": "Créé avant",
|
||||
"Page": "Page",
|
||||
"Message UID": "UID du message",
|
||||
"Filename": "Nom du fichier",
|
||||
"WhatsApp Account ID": "ID du compte WhatsApp",
|
||||
"Phone Number": "Numéro de téléphone",
|
||||
"Method": "Méthode",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Paramètres de requête",
|
||||
"Body": "Body",
|
||||
"Response is Binary ?": "La réponse est Binaire ?",
|
||||
"No Error on Failure": "Aucune erreur en cas d'échec",
|
||||
"Timeout (in seconds)": "Délai d'expiration (en secondes)",
|
||||
"Select the chat to send the message to": "Sélectionnez le chat à qui envoyer le message",
|
||||
"The text content of the message to be sent.": "Le contenu du message à envoyer.",
|
||||
"Optional file to send with the message.": "Fichier optionnel à envoyer avec le message.",
|
||||
"Optional label to categorize or tag the message.": "Libellé facultatif pour catégoriser ou marquer le message.",
|
||||
"Optional ID of the attachment template to use for the message.": "ID facultatif du modèle de pièce jointe à utiliser pour le message.",
|
||||
"Select the uploaded file": "Sélectionnez le fichier téléchargé",
|
||||
"The file to be sent in the chat.": "Le fichier à envoyer dans le chat.",
|
||||
"Select the type of contact identifier": "Sélectionnez le type d'identifiant de contact",
|
||||
"Select the contact identifier based on the chosen contact type": "Sélectionnez l'identifiant de contact en fonction du type de contact choisi",
|
||||
"Select the WhatsApp account": "Sélectionnez le compte WhatsApp",
|
||||
"The text message to be sent in the chat.": "Le message texte à envoyer dans le chat.",
|
||||
"An optional label to categorize the chat.": "Une étiquette optionnelle pour catégoriser le chat.",
|
||||
"An optional name for the chat (useful for group chats).": "Un nom optionnel pour le chat (utile pour les discussions de groupe).",
|
||||
"Optional ID of a predefined attachment template to use when sending files.": "ID facultatif d'un modèle de pièce jointe prédéfini à utiliser lors de l'envoi de fichiers.",
|
||||
"Filter by labels assigned to the chat": "Filtrer par libellés attribués au chat",
|
||||
"Filter by whether the chat is a group chat": "Filtrer par si le chat est un groupe de discussion",
|
||||
"Filter by the user responsible for the chat (email)": "Filtrer par l'utilisateur responsable du chat (email)",
|
||||
"Filter by the name of the chat": "Filtrer par le nom du chat",
|
||||
"Filter by whether the chat is marked as read": "Filtrer par si le chat est marqué comme lu",
|
||||
"Filter by whether the chat is closed": "Filtrer par si le chat est fermé",
|
||||
"Filter by whether ChatGPT autoresponse is enabled for the chat": "Filtrer par si l'auto-réponse ChatGPT est activée pour le chat",
|
||||
"Filter chats created after this date": "Filtrer les chats créés après cette date",
|
||||
"Filter chats created before this date": "Filtrer les chats créés avant cette date",
|
||||
"Page number for paginated results": "Numéro de page pour les résultats paginés",
|
||||
"The unique identifier of the message to find.": "L'identifiant unique du message à trouver.",
|
||||
"The name of the uploaded file to search for.": "Le nom du fichier téléchargé à rechercher.",
|
||||
"The unique identifier of the message to look up.": "L'identifiant unique du message à rechercher.",
|
||||
"The unique identifier of the WhatsApp account to search for.": "L'identifiant unique du compte WhatsApp à rechercher.",
|
||||
"The phone number associated with the WhatsApp account to search for.": "Le numéro de téléphone associé au compte WhatsApp à rechercher.",
|
||||
"Authorization headers are injected automatically from your connection.": "Les Headers d'autorisation sont injectés automatiquement à partir de votre connexion.",
|
||||
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
|
||||
"JID": "JID",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"Chat Closed": "Discussion fermée",
|
||||
"New Outgoing Chat": "Nouveau chat sortant",
|
||||
"New Incoming Chat": "Nouveau chat entrant",
|
||||
"New Sent Message": "Nouveau message envoyé",
|
||||
"New Received Message": "Nouveau message reçu",
|
||||
"New Uploaded File": "Nouveau fichier téléchargé",
|
||||
"New WhatsApp Account": "Nouveau compte WhatsApp",
|
||||
"Fires when a chat is closed.": "Tire quand un chat est fermé.",
|
||||
"Fires when a new outgoing chat is initiated.": "Tire quand un nouveau chat sortant est lancé.",
|
||||
"Fires when a new incoming chat (i.e. from a user) is created.": "Se déclenche lorsqu'un nouveau chat entrant (c'est-à-dire à partir d'un utilisateur) est créé.",
|
||||
"Fires when a message is sent (outgoing).": "Se déclenche lorsqu'un message est envoyé (sortant).",
|
||||
"Fires when a message is received (incoming).": "Tire quand un message est reçu (entrant).",
|
||||
"Fires when a new file is uploaded in a chat.": "Se déclenche lorsqu'un nouveau fichier est téléchargé dans un chat.",
|
||||
"Fires when a new WhatsApp account is added/registered.": "Se déclenche lorsqu'un nouveau compte WhatsApp est ajouté/enregistré."
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"Your TimelinesAI API key.": "TimelinesAI API キー。",
|
||||
"Send Message to Existing Chat": "既存のチャットにメッセージを送信",
|
||||
"Send Uploaded File to Existing Chat": "アップロードされたファイルを既存のチャットに送信",
|
||||
"Send File to Existing Chat": "既存のチャットにファイルを送信",
|
||||
"Send Message to New Chat": "新しいチャットにメッセージを送信",
|
||||
"Close Chat": "チャットを閉じる",
|
||||
"Find Chat": "チャットを探す",
|
||||
"Find Message": "メッセージを検索",
|
||||
"Find Uploaded File": "アップロードされたファイルを検索",
|
||||
"Find Message Status": "メッセージステータスを検索",
|
||||
"Find WhatsApp Account": "WhatsAppアカウントを探す",
|
||||
"Custom API Call": "カスタムAPI通話",
|
||||
"Sends a text message in a chat identified by chat_id": "chat_idで識別されたチャットにテキストメッセージを送信します。",
|
||||
"Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.": "既存のチャットを介して、ファイル名などのメタデータを使用して、ファイル(メディア/添付)をチャットに送信します。",
|
||||
"Similar to above: send a file attachment to a chat using URL or file input and name.": "上記と同様:URLまたはファイルの入力と名前を使用してチャットにファイル添付ファイルを送信します。",
|
||||
"Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.": "WhatsAppアカウント、電話番号、およびメッセージを指定して、新しいチャット(新しい会話)を作成します。",
|
||||
"Programmatically mark a chat as closed by its chat_id.": "プログラム的にチャットIDをchat_idで閉じたものとしてマークします。",
|
||||
"Look up a chat by parameters such as chat_id, phone, name, etc.": "chat_id、電話、名前などのパラメータでチャットを検索します。",
|
||||
"Lookup a message by its WhatsApp message ID.": "WhatsAppメッセージIDでメッセージを検索します。",
|
||||
"Locate an uploaded file by filename or identifier.": "ファイル名または識別子でアップロードされたファイルを探します。",
|
||||
"Lookup a message’s delivery status by message ID.": "メッセージIDでメッセージの配信状況を検索します。",
|
||||
"Search for a WhatsApp account (by phone or ID).": "WhatsAppアカウントを(電話またはIDで)検索します。",
|
||||
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
|
||||
"Chat": "チャット",
|
||||
"Message Text": "メッセージ テキスト",
|
||||
"File": "ファイル",
|
||||
"Label": "ラベル",
|
||||
"Attachment Template ID": "添付ファイルテンプレートID",
|
||||
"Uploaded File": "アップロードされたファイル",
|
||||
"Contact Type": "連絡先の種類",
|
||||
"Contact": "お問い合わせ",
|
||||
"WhatsApp Account": "WhatsAppアカウント",
|
||||
"Message": "メッセージ",
|
||||
"Chat Name": "チャット名",
|
||||
"Labels": "ラベル",
|
||||
"Is Group": "グループです",
|
||||
"Responsible": "Responsible",
|
||||
"Is Read": "既読にする",
|
||||
"Is Closed": "閉じています",
|
||||
"ChatGPT Autoresponse Enabled": "ChatGPT 自動応答を有効にする",
|
||||
"Created After": "作成後",
|
||||
"Created Before": "作成前",
|
||||
"Page": "ページ",
|
||||
"Message UID": "メッセージUID",
|
||||
"Filename": "ファイル名",
|
||||
"WhatsApp Account ID": "WhatsAppアカウントID",
|
||||
"Phone Number": "電話番号",
|
||||
"Method": "方法",
|
||||
"Headers": "ヘッダー",
|
||||
"Query Parameters": "クエリパラメータ",
|
||||
"Body": "本文",
|
||||
"Response is Binary ?": "応答はバイナリですか?",
|
||||
"No Error on Failure": "失敗時にエラーはありません",
|
||||
"Timeout (in seconds)": "タイムアウト(秒)",
|
||||
"Select the chat to send the message to": "メッセージを送信するチャットを選択してください",
|
||||
"The text content of the message to be sent.": "送信するメッセージのテキストの内容。",
|
||||
"Optional file to send with the message.": "メッセージと一緒に送信する任意のファイル。",
|
||||
"Optional label to categorize or tag the message.": "メッセージを分類またはタグ付けする任意のラベル。",
|
||||
"Optional ID of the attachment template to use for the message.": "メッセージに使用する添付ファイルテンプレートのオプションID。",
|
||||
"Select the uploaded file": "アップロードされたファイルを選択",
|
||||
"The file to be sent in the chat.": "チャットで送信するファイル。",
|
||||
"Select the type of contact identifier": "連絡先識別子の種類を選択します",
|
||||
"Select the contact identifier based on the chosen contact type": "選択した連絡先タイプに基づいて連絡先識別子を選択します",
|
||||
"Select the WhatsApp account": "WhatsAppアカウントを選択",
|
||||
"The text message to be sent in the chat.": "チャットで送信されるテキストメッセージ。",
|
||||
"An optional label to categorize the chat.": "チャットを分類する任意のラベル。",
|
||||
"An optional name for the chat (useful for group chats).": "チャットの任意の名前(グループチャットに便利)",
|
||||
"Optional ID of a predefined attachment template to use when sending files.": "ファイルを送信する際に使用する事前定義された添付ファイルテンプレートの任意のID。",
|
||||
"Filter by labels assigned to the chat": "チャットに割り当てられたラベルでフィルター",
|
||||
"Filter by whether the chat is a group chat": "チャットがグループチャットであるかどうかでフィルター",
|
||||
"Filter by the user responsible for the chat (email)": "チャットを担当するユーザーによってフィルター (メール)",
|
||||
"Filter by the name of the chat": "チャットの名前でフィルター",
|
||||
"Filter by whether the chat is marked as read": "チャットが既読としてマークされているかどうかでフィルター",
|
||||
"Filter by whether the chat is closed": "チャットを閉じているかどうかでフィルター",
|
||||
"Filter by whether ChatGPT autoresponse is enabled for the chat": "チャットでChatGPT自動応答が有効になっているかどうかでフィルター",
|
||||
"Filter chats created after this date": "この日付の後に作成されたチャットをフィルター",
|
||||
"Filter chats created before this date": "この日付の前に作成されたチャットをフィルター",
|
||||
"Page number for paginated results": "ページ化された結果のページ番号",
|
||||
"The unique identifier of the message to find.": "検索するメッセージの一意の識別子",
|
||||
"The name of the uploaded file to search for.": "検索するアップロードされたファイルの名前",
|
||||
"The unique identifier of the message to look up.": "検索するメッセージの一意の識別子",
|
||||
"The unique identifier of the WhatsApp account to search for.": "検索するWhatsAppアカウントの一意の識別子。",
|
||||
"The phone number associated with the WhatsApp account to search for.": "検索するWhatsAppアカウントに関連付けられている電話番号。",
|
||||
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
|
||||
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
|
||||
"JID": "JID",
|
||||
"GET": "取得",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "削除",
|
||||
"HEAD": "頭",
|
||||
"Chat Closed": "チャット終了",
|
||||
"New Outgoing Chat": "新しい送信チャット",
|
||||
"New Incoming Chat": "新しいチャットを受信する",
|
||||
"New Sent Message": "新しい送信済みメッセージ",
|
||||
"New Received Message": "新しい受信メッセージ",
|
||||
"New Uploaded File": "新規アップロードされたファイル",
|
||||
"New WhatsApp Account": "新しいWhatsAppアカウント",
|
||||
"Fires when a chat is closed.": "チャットが閉じられたときに発火します。",
|
||||
"Fires when a new outgoing chat is initiated.": "新しいチャットが開始されたときに発生します。",
|
||||
"Fires when a new incoming chat (i.e. from a user) is created.": "新しいチャット(ユーザー)が作成されたときに発生します。",
|
||||
"Fires when a message is sent (outgoing).": "メッセージが送信されたときに発火します。",
|
||||
"Fires when a message is received (incoming).": "メッセージが受信されたときに発火します。",
|
||||
"Fires when a new file is uploaded in a chat.": "新しいファイルがチャットにアップロードされたときに発生します。",
|
||||
"Fires when a new WhatsApp account is added/registered.": "新しいWhatsAppアカウントが追加/登録されたときに発生します。"
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"Your TimelinesAI API key.": "Uw TimelinesAI API-sleutel.",
|
||||
"Send Message to Existing Chat": "Bericht verzenden naar bestaande chat",
|
||||
"Send Uploaded File to Existing Chat": "Geüploade bestand verzenden naar bestaande Chat",
|
||||
"Send File to Existing Chat": "Bestand verzenden naar bestaande chat",
|
||||
"Send Message to New Chat": "Bericht naar nieuwe chat sturen",
|
||||
"Close Chat": "Chat sluiten",
|
||||
"Find Chat": "Chat zoeken",
|
||||
"Find Message": "Zoek bericht",
|
||||
"Find Uploaded File": "Geüploade bestand zoeken",
|
||||
"Find Message Status": "Vind berichtstatus",
|
||||
"Find WhatsApp Account": "Vind WhatsApp Account",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Sends a text message in a chat identified by chat_id": "Stuurt een tekstbericht in een chat geïdentificeerd door chat_id",
|
||||
"Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.": "Stuur een bestand (media/bijlage) naar een chat, met metadata zoals bestandsnaam, via een bestaande chat.",
|
||||
"Similar to above: send a file attachment to a chat using URL or file input and name.": "Vergelijkbaar met hier: stuur een bestandsbijlage naar een chat via URL of bestandsinvoer en naam.",
|
||||
"Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.": "Maak een nieuwe chat (nieuw gesprek) door het WhatsApp-account, telefoonnummer en bericht te specificeren.",
|
||||
"Programmatically mark a chat as closed by its chat_id.": "Markeer een chat als gesloten door zijn chat_id.",
|
||||
"Look up a chat by parameters such as chat_id, phone, name, etc.": "Zoek een chat op met parameters zoals chat_id, telefoon, naam, etc.",
|
||||
"Lookup a message by its WhatsApp message ID.": "Zoek een bericht via het WhatsApp bericht ID.",
|
||||
"Locate an uploaded file by filename or identifier.": "Zoek een geüpload bestand op bestandsnaam of identificator.",
|
||||
"Lookup a message’s delivery status by message ID.": "Zoek de status van aflevering van een bericht per bericht-ID.",
|
||||
"Search for a WhatsApp account (by phone or ID).": "Zoek naar een WhatsApp-account (op telefoon of ID).",
|
||||
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
|
||||
"Chat": "Chatten",
|
||||
"Message Text": "Bericht Tekst",
|
||||
"File": "Bestand",
|
||||
"Label": "Omschrijving",
|
||||
"Attachment Template ID": "ID bijlage",
|
||||
"Uploaded File": "Geüpload bestand",
|
||||
"Contact Type": "Type contactpersoon",
|
||||
"Contact": "Contactpersoon",
|
||||
"WhatsApp Account": "WhatsApp Account",
|
||||
"Message": "bericht",
|
||||
"Chat Name": "Chat Naam",
|
||||
"Labels": "Labels",
|
||||
"Is Group": "Is groep",
|
||||
"Responsible": "Verantwoordelijkheid",
|
||||
"Is Read": "Is gelezen",
|
||||
"Is Closed": "Is gesloten",
|
||||
"ChatGPT Autoresponse Enabled": "Autoresponse chatGPT ingeschakeld",
|
||||
"Created After": "Gemaakt na",
|
||||
"Created Before": "Aangemaakt voor",
|
||||
"Page": "Pagina",
|
||||
"Message UID": "Bericht UID",
|
||||
"Filename": "Bestandsnaam",
|
||||
"WhatsApp Account ID": "WhatsApp Account-ID",
|
||||
"Phone Number": "Telefoon nummer",
|
||||
"Method": "Methode",
|
||||
"Headers": "Kopteksten",
|
||||
"Query Parameters": "Query parameters",
|
||||
"Body": "Lichaam",
|
||||
"Response is Binary ?": "Antwoord is binair?",
|
||||
"No Error on Failure": "Geen fout bij fout",
|
||||
"Timeout (in seconds)": "Time-out (in seconden)",
|
||||
"Select the chat to send the message to": "Selecteer de chat om het bericht naar toe te sturen",
|
||||
"The text content of the message to be sent.": "De tekstinhoud van het te verzenden bericht.",
|
||||
"Optional file to send with the message.": "Optioneel bestand om te verzenden met het bericht.",
|
||||
"Optional label to categorize or tag the message.": "Optioneel label om het bericht te categoriseren of te taggen.",
|
||||
"Optional ID of the attachment template to use for the message.": "Optionele ID van het te gebruiken bijlage sjabloon voor het bericht.",
|
||||
"Select the uploaded file": "Selecteer het geüploade bestand",
|
||||
"The file to be sent in the chat.": "Het bestand dat in de chat wordt verzonden.",
|
||||
"Select the type of contact identifier": "Selecteer het type contact id",
|
||||
"Select the contact identifier based on the chosen contact type": "Selecteer het contact id op basis van het gekozen contact type",
|
||||
"Select the WhatsApp account": "Selecteer de WhatsApp-account",
|
||||
"The text message to be sent in the chat.": "Het tekstbericht dat in de chat moet worden verzonden.",
|
||||
"An optional label to categorize the chat.": "Een optioneel label om de chat te categoriseren.",
|
||||
"An optional name for the chat (useful for group chats).": "Een optionele naam voor de chat (handig voor groeps-chats).",
|
||||
"Optional ID of a predefined attachment template to use when sending files.": "Optionele ID van een voorgedefinieerd bijlage-sjabloon om te gebruiken bij het verzenden van bestanden.",
|
||||
"Filter by labels assigned to the chat": "Filter op labels die zijn toegewezen aan de chat",
|
||||
"Filter by whether the chat is a group chat": "Filteren op of de chat een groepsgesprek is",
|
||||
"Filter by the user responsible for the chat (email)": "Filter op gebruiker die verantwoordelijk is voor de chat (e-mail)",
|
||||
"Filter by the name of the chat": "Filter op naam van de chat",
|
||||
"Filter by whether the chat is marked as read": "Filter op of de chat is gemarkeerd als gelezen",
|
||||
"Filter by whether the chat is closed": "Filter op of de chat is gesloten",
|
||||
"Filter by whether ChatGPT autoresponse is enabled for the chat": "Filter op of ChatGPT automatisch antwoord is ingeschakeld voor de chat",
|
||||
"Filter chats created after this date": "chats die na deze datum worden aangemaakt filteren",
|
||||
"Filter chats created before this date": "chats filteren gemaakt voor deze datum",
|
||||
"Page number for paginated results": "Paginanummer voor gepagineerde resultaten",
|
||||
"The unique identifier of the message to find.": "De unieke identifier van het bericht te vinden.",
|
||||
"The name of the uploaded file to search for.": "De naam van het geüploade bestand waarnaar gezocht moet worden.",
|
||||
"The unique identifier of the message to look up.": "Het unieke id van het bericht om op te zoeken.",
|
||||
"The unique identifier of the WhatsApp account to search for.": "De unieke identifier van de WhatsApp-account waarnaar gezocht moet worden.",
|
||||
"The phone number associated with the WhatsApp account to search for.": "Het telefoonnummer dat gekoppeld is aan het WhatsApp-account waarnaar gezocht moet worden.",
|
||||
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
|
||||
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
|
||||
"JID": "JID",
|
||||
"GET": "KRIJG",
|
||||
"POST": "POSTE",
|
||||
"PATCH": "BEKIJK",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "VERWIJDEREN",
|
||||
"HEAD": "HOOFD",
|
||||
"Chat Closed": "Chat Gesloten",
|
||||
"New Outgoing Chat": "Nieuwe uitgaande chat",
|
||||
"New Incoming Chat": "Nieuwe inkomende chat",
|
||||
"New Sent Message": "Nieuw verzonden bericht",
|
||||
"New Received Message": "Nieuw ontvangen bericht",
|
||||
"New Uploaded File": "Nieuw geüploade bestand",
|
||||
"New WhatsApp Account": "Nieuw WhatsApp-account",
|
||||
"Fires when a chat is closed.": "Vuurt wanneer een chat wordt gesloten.",
|
||||
"Fires when a new outgoing chat is initiated.": "Vuurt wanneer een nieuwe uitgaande chat wordt gestart.",
|
||||
"Fires when a new incoming chat (i.e. from a user) is created.": "Vuurt wanneer een nieuwe inkomende chat (d.w.z. van een gebruiker) wordt gemaakt.",
|
||||
"Fires when a message is sent (outgoing).": "Vuurt wanneer een bericht is verzonden (uitgaand).",
|
||||
"Fires when a message is received (incoming).": "Vuurt wanneer een bericht wordt ontvangen (inkomen).",
|
||||
"Fires when a new file is uploaded in a chat.": "Schiet wanneer een nieuw bestand wordt geüpload in een chat.",
|
||||
"Fires when a new WhatsApp account is added/registered.": "Vuurt wanneer een nieuwe WhatsApp-account is toegevoegd/geregistreerd."
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"Your TimelinesAI API key.": "Sua chave de API TimelinesAI.",
|
||||
"Send Message to Existing Chat": "Enviar mensagem para bate-papo existente",
|
||||
"Send Uploaded File to Existing Chat": "Enviar Arquivo Enviado para Chat Existente",
|
||||
"Send File to Existing Chat": "Enviar Arquivo para Chat Existente",
|
||||
"Send Message to New Chat": "Enviar Mensagem para Novo Bate-Papo",
|
||||
"Close Chat": "Fechar bate-papo",
|
||||
"Find Chat": "Encontrar bate-papo",
|
||||
"Find Message": "Encontrar mensagem",
|
||||
"Find Uploaded File": "Localizar arquivo enviado",
|
||||
"Find Message Status": "Encontrar Status da Mensagem",
|
||||
"Find WhatsApp Account": "Localizar Conta WhatsApp",
|
||||
"Custom API Call": "Chamada de API personalizada",
|
||||
"Sends a text message in a chat identified by chat_id": "Envia uma mensagem de texto em uma conversa identificada pelo chat_id",
|
||||
"Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.": "Enviar um arquivo (mídia/anexo) para uma conversa, com metadados como o nome do arquivo, via chat existente.",
|
||||
"Similar to above: send a file attachment to a chat using URL or file input and name.": "Semelhante ao acima: envie um anexo de arquivo para uma conversa usando URL ou nome de entrada de arquivo.",
|
||||
"Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.": "Crie um novo chat (nova conversa) especificando a conta do WhatsApp. Número do telefone e mensagem.",
|
||||
"Programmatically mark a chat as closed by its chat_id.": "Marque um chat programaticamente como fechado por seu chat_id.",
|
||||
"Look up a chat by parameters such as chat_id, phone, name, etc.": "Procure um chat por parâmetros como chat_id, telefone, nome etc.",
|
||||
"Lookup a message by its WhatsApp message ID.": "Procure uma mensagem por sua ID de mensagem do WhatsApp.",
|
||||
"Locate an uploaded file by filename or identifier.": "Localizar um arquivo enviado por nome ou identificador.",
|
||||
"Lookup a message’s delivery status by message ID.": "Procurar o status de entrega de uma mensagem por ID de mensagem.",
|
||||
"Search for a WhatsApp account (by phone or ID).": "Procure por uma conta do WhatsApp (por telefone ou ID).",
|
||||
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
|
||||
"Chat": "Bate-papo",
|
||||
"Message Text": "Texto da Mensagem",
|
||||
"File": "Arquivo",
|
||||
"Label": "Descrição",
|
||||
"Attachment Template ID": "ID do modelo de anexo",
|
||||
"Uploaded File": "Arquivo enviado",
|
||||
"Contact Type": "Tipo de contato",
|
||||
"Contact": "contato",
|
||||
"WhatsApp Account": "Conta do WhatsApp",
|
||||
"Message": "mensagem",
|
||||
"Chat Name": "Nome do Bate-papo",
|
||||
"Labels": "Marcadores",
|
||||
"Is Group": "É Grupo",
|
||||
"Responsible": "Responsável",
|
||||
"Is Read": "Está Lido",
|
||||
"Is Closed": "Está fechado",
|
||||
"ChatGPT Autoresponse Enabled": "Resposta do ChatGPT Automática Habilitada",
|
||||
"Created After": "Criado Depois",
|
||||
"Created Before": "Criado Antes",
|
||||
"Page": "Página",
|
||||
"Message UID": "UID da mensagem",
|
||||
"Filename": "Nome",
|
||||
"WhatsApp Account ID": "ID da Conta WhatsApp",
|
||||
"Phone Number": "Número de telefone",
|
||||
"Method": "Método",
|
||||
"Headers": "Cabeçalhos",
|
||||
"Query Parameters": "Parâmetros da consulta",
|
||||
"Body": "Conteúdo",
|
||||
"Response is Binary ?": "A resposta é binária ?",
|
||||
"No Error on Failure": "Nenhum erro no Failure",
|
||||
"Timeout (in seconds)": "Tempo limite (em segundos)",
|
||||
"Select the chat to send the message to": "Selecione o chat para enviar a mensagem para",
|
||||
"The text content of the message to be sent.": "O conteúdo da mensagem a ser enviada.",
|
||||
"Optional file to send with the message.": "Arquivo opcional a enviar com a mensagem.",
|
||||
"Optional label to categorize or tag the message.": "Opcional label para categorizar ou marcar a mensagem.",
|
||||
"Optional ID of the attachment template to use for the message.": "ID opcional do modelo de anexo a ser usado para a mensagem.",
|
||||
"Select the uploaded file": "Selecione o arquivo enviado",
|
||||
"The file to be sent in the chat.": "O arquivo a ser enviado no chat.",
|
||||
"Select the type of contact identifier": "Selecione o tipo de identificador de contato",
|
||||
"Select the contact identifier based on the chosen contact type": "Selecione o identificador de contato com base no tipo de contato escolhido",
|
||||
"Select the WhatsApp account": "Selecione a conta do WhatsApp",
|
||||
"The text message to be sent in the chat.": "A mensagem de texto a ser enviada no chat.",
|
||||
"An optional label to categorize the chat.": "Um rótulo opcional para categorizar o chat.",
|
||||
"An optional name for the chat (useful for group chats).": "Um nome opcional para o chat (útil para chats de grupo).",
|
||||
"Optional ID of a predefined attachment template to use when sending files.": "ID opcional de um modelo predefinido de anexo a ser usado no envio de arquivos.",
|
||||
"Filter by labels assigned to the chat": "Filtrar por etiquetas atribuídas ao bate-papo",
|
||||
"Filter by whether the chat is a group chat": "Filtrar por se o chat é uma conversa de grupo",
|
||||
"Filter by the user responsible for the chat (email)": "Filtrar pelo usuário responsável pelo bate-papo (e-mail)",
|
||||
"Filter by the name of the chat": "Filtrar pelo nome do bate-papo",
|
||||
"Filter by whether the chat is marked as read": "Filtrar por se o bate-papo está marcado como lido",
|
||||
"Filter by whether the chat is closed": "Filtrar por se o chat está fechado",
|
||||
"Filter by whether ChatGPT autoresponse is enabled for the chat": "Filtrar por resposta automática do ChatGPT está ativada para o chat",
|
||||
"Filter chats created after this date": "Filtrar chats criados após esta data",
|
||||
"Filter chats created before this date": "Filtrar chats criados antes desta data",
|
||||
"Page number for paginated results": "Número da página para resultados paginados",
|
||||
"The unique identifier of the message to find.": "O identificador exclusivo da mensagem a ser encontrada.",
|
||||
"The name of the uploaded file to search for.": "O nome do arquivo carregado para pesquisar.",
|
||||
"The unique identifier of the message to look up.": "O identificador exclusivo da mensagem para pesquisar.",
|
||||
"The unique identifier of the WhatsApp account to search for.": "O identificador exclusivo da conta do WhatsApp para procurar.",
|
||||
"The phone number associated with the WhatsApp account to search for.": "O número de telefone associado com a conta do WhatsApp para procurar.",
|
||||
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
|
||||
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
|
||||
"JID": "JID",
|
||||
"GET": "OBTER",
|
||||
"POST": "POSTAR",
|
||||
"PATCH": "COMPRAR",
|
||||
"PUT": "COLOCAR",
|
||||
"DELETE": "EXCLUIR",
|
||||
"HEAD": "CABEÇA",
|
||||
"Chat Closed": "Chat Fechado",
|
||||
"New Outgoing Chat": "Novo Bate-Papo Saída",
|
||||
"New Incoming Chat": "Novo Chat Recebido",
|
||||
"New Sent Message": "Nova mensagem enviada",
|
||||
"New Received Message": "Nova mensagem recebida",
|
||||
"New Uploaded File": "Novo arquivo enviado",
|
||||
"New WhatsApp Account": "Nova conta do WhatsApp",
|
||||
"Fires when a chat is closed.": "Atira quando um chat é fechado.",
|
||||
"Fires when a new outgoing chat is initiated.": "Atira quando um novo chat de saída é iniciado.",
|
||||
"Fires when a new incoming chat (i.e. from a user) is created.": "Atira quando um novo chat de entrada (ou seja, de um usuário) é criado.",
|
||||
"Fires when a message is sent (outgoing).": "Efetua quando uma mensagem é enviada (saída).",
|
||||
"Fires when a message is received (incoming).": "Efetua quando uma mensagem é recebida (entrando).",
|
||||
"Fires when a new file is uploaded in a chat.": "Efetua quando um novo arquivo é carregado em um chat.",
|
||||
"Fires when a new WhatsApp account is added/registered.": "Efetua quando uma nova conta do WhatsApp é adicionada/registrada."
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"Your TimelinesAI API key.": "Your TimelinesAI API key.",
|
||||
"Send Message to Existing Chat": "Send Message to Existing Chat",
|
||||
"Send Uploaded File to Existing Chat": "Send Uploaded File to Existing Chat",
|
||||
"Send File to Existing Chat": "Send File to Existing Chat",
|
||||
"Send Message to New Chat": "Send Message to New Chat",
|
||||
"Close Chat": "Close Chat",
|
||||
"Find Chat": "Find Chat",
|
||||
"Find Message": "Find Message",
|
||||
"Find Uploaded File": "Find Uploaded File",
|
||||
"Find Message Status": "Find Message Status",
|
||||
"Find WhatsApp Account": "Find WhatsApp Account",
|
||||
"Custom API Call": "Custom API Call",
|
||||
"Sends a text message in a chat identified by chat_id": "Sends a text message in a chat identified by chat_id",
|
||||
"Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.": "Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.",
|
||||
"Similar to above: send a file attachment to a chat using URL or file input and name.": "Similar to above: send a file attachment to a chat using URL or file input and name.",
|
||||
"Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.": "Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.",
|
||||
"Programmatically mark a chat as closed by its chat_id.": "Programmatically mark a chat as closed by its chat_id.",
|
||||
"Look up a chat by parameters such as chat_id, phone, name, etc.": "Look up a chat by parameters such as chat_id, phone, name, etc.",
|
||||
"Lookup a message by its WhatsApp message ID.": "Lookup a message by its WhatsApp message ID.",
|
||||
"Locate an uploaded file by filename or identifier.": "Locate an uploaded file by filename or identifier.",
|
||||
"Lookup a message’s delivery status by message ID.": "Lookup a message’s delivery status by message ID.",
|
||||
"Search for a WhatsApp account (by phone or ID).": "Search for a WhatsApp account (by phone or ID).",
|
||||
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
|
||||
"Chat": "Chat",
|
||||
"Message Text": "Message Text",
|
||||
"File": "File",
|
||||
"Label": "Label",
|
||||
"Attachment Template ID": "Attachment Template ID",
|
||||
"Uploaded File": "Uploaded File",
|
||||
"Contact Type": "Contact Type",
|
||||
"Contact": "Contact",
|
||||
"WhatsApp Account": "WhatsApp Account",
|
||||
"Message": "Message",
|
||||
"Chat Name": "Chat Name",
|
||||
"Labels": "Labels",
|
||||
"Is Group": "Is Group",
|
||||
"Responsible": "Responsible",
|
||||
"Is Read": "Is Read",
|
||||
"Is Closed": "Is Closed",
|
||||
"ChatGPT Autoresponse Enabled": "ChatGPT Autoresponse Enabled",
|
||||
"Created After": "Created After",
|
||||
"Created Before": "Created Before",
|
||||
"Page": "Page",
|
||||
"Message UID": "Message UID",
|
||||
"Filename": "Filename",
|
||||
"WhatsApp Account ID": "WhatsApp Account ID",
|
||||
"Phone Number": "Phone Number",
|
||||
"Method": "Method",
|
||||
"Headers": "Headers",
|
||||
"Query Parameters": "Query Parameters",
|
||||
"Body": "Body",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "No Error on Failure",
|
||||
"Timeout (in seconds)": "Timeout (in seconds)",
|
||||
"Select the chat to send the message to": "Select the chat to send the message to",
|
||||
"The text content of the message to be sent.": "The text content of the message to be sent.",
|
||||
"Optional file to send with the message.": "Optional file to send with the message.",
|
||||
"Optional label to categorize or tag the message.": "Optional label to categorize or tag the message.",
|
||||
"Optional ID of the attachment template to use for the message.": "Optional ID of the attachment template to use for the message.",
|
||||
"Select the uploaded file": "Select the uploaded file",
|
||||
"The file to be sent in the chat.": "The file to be sent in the chat.",
|
||||
"Select the type of contact identifier": "Select the type of contact identifier",
|
||||
"Select the contact identifier based on the chosen contact type": "Select the contact identifier based on the chosen contact type",
|
||||
"Select the WhatsApp account": "Select the WhatsApp account",
|
||||
"The text message to be sent in the chat.": "The text message to be sent in the chat.",
|
||||
"An optional label to categorize the chat.": "An optional label to categorize the chat.",
|
||||
"An optional name for the chat (useful for group chats).": "An optional name for the chat (useful for group chats).",
|
||||
"Optional ID of a predefined attachment template to use when sending files.": "Optional ID of a predefined attachment template to use when sending files.",
|
||||
"Filter by labels assigned to the chat": "Filter by labels assigned to the chat",
|
||||
"Filter by whether the chat is a group chat": "Filter by whether the chat is a group chat",
|
||||
"Filter by the user responsible for the chat (email)": "Filter by the user responsible for the chat (email)",
|
||||
"Filter by the name of the chat": "Filter by the name of the chat",
|
||||
"Filter by whether the chat is marked as read": "Filter by whether the chat is marked as read",
|
||||
"Filter by whether the chat is closed": "Filter by whether the chat is closed",
|
||||
"Filter by whether ChatGPT autoresponse is enabled for the chat": "Filter by whether ChatGPT autoresponse is enabled for the chat",
|
||||
"Filter chats created after this date": "Filter chats created after this date",
|
||||
"Filter chats created before this date": "Filter chats created before this date",
|
||||
"Page number for paginated results": "Page number for paginated results",
|
||||
"The unique identifier of the message to find.": "The unique identifier of the message to find.",
|
||||
"The name of the uploaded file to search for.": "The name of the uploaded file to search for.",
|
||||
"The unique identifier of the message to look up.": "The unique identifier of the message to look up.",
|
||||
"The unique identifier of the WhatsApp account to search for.": "The unique identifier of the WhatsApp account to search for.",
|
||||
"The phone number associated with the WhatsApp account to search for.": "The phone number associated with the WhatsApp account to search for.",
|
||||
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"JID": "JID",
|
||||
"GET": "GET",
|
||||
"POST": "POST",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "PUT",
|
||||
"DELETE": "DELETE",
|
||||
"HEAD": "HEAD",
|
||||
"Chat Closed": "Chat Closed",
|
||||
"New Outgoing Chat": "New Outgoing Chat",
|
||||
"New Incoming Chat": "New Incoming Chat",
|
||||
"New Sent Message": "New Sent Message",
|
||||
"New Received Message": "New Received Message",
|
||||
"New Uploaded File": "New Uploaded File",
|
||||
"New WhatsApp Account": "New WhatsApp Account",
|
||||
"Fires when a chat is closed.": "Fires when a chat is closed.",
|
||||
"Fires when a new outgoing chat is initiated.": "Fires when a new outgoing chat is initiated.",
|
||||
"Fires when a new incoming chat (i.e. from a user) is created.": "Fires when a new incoming chat (i.e. from a user) is created.",
|
||||
"Fires when a message is sent (outgoing).": "Fires when a message is sent (outgoing).",
|
||||
"Fires when a message is received (incoming).": "Fires when a message is received (incoming).",
|
||||
"Fires when a new file is uploaded in a chat.": "Fires when a new file is uploaded in a chat.",
|
||||
"Fires when a new WhatsApp account is added/registered.": "Fires when a new WhatsApp account is added/registered."
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"Your TimelinesAI API key.": "Your TimelinesAI API key.",
|
||||
"Send Message to Existing Chat": "Send Message to Existing Chat",
|
||||
"Send Uploaded File to Existing Chat": "Send Uploaded File to Existing Chat",
|
||||
"Send File to Existing Chat": "Send File to Existing Chat",
|
||||
"Send Message to New Chat": "Send Message to New Chat",
|
||||
"Close Chat": "Close Chat",
|
||||
"Find Chat": "Find Chat",
|
||||
"Find Message": "Find Message",
|
||||
"Find Uploaded File": "Find Uploaded File",
|
||||
"Find Message Status": "Find Message Status",
|
||||
"Find WhatsApp Account": "Find WhatsApp Account",
|
||||
"Custom API Call": "自定义 API 呼叫",
|
||||
"Sends a text message in a chat identified by chat_id": "Sends a text message in a chat identified by chat_id",
|
||||
"Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.": "Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.",
|
||||
"Similar to above: send a file attachment to a chat using URL or file input and name.": "Similar to above: send a file attachment to a chat using URL or file input and name.",
|
||||
"Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.": "Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.",
|
||||
"Programmatically mark a chat as closed by its chat_id.": "Programmatically mark a chat as closed by its chat_id.",
|
||||
"Look up a chat by parameters such as chat_id, phone, name, etc.": "Look up a chat by parameters such as chat_id, phone, name, etc.",
|
||||
"Lookup a message by its WhatsApp message ID.": "Lookup a message by its WhatsApp message ID.",
|
||||
"Locate an uploaded file by filename or identifier.": "Locate an uploaded file by filename or identifier.",
|
||||
"Lookup a message’s delivery status by message ID.": "Lookup a message’s delivery status by message ID.",
|
||||
"Search for a WhatsApp account (by phone or ID).": "Search for a WhatsApp account (by phone or ID).",
|
||||
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
|
||||
"Chat": "Chat",
|
||||
"Message Text": "Message Text",
|
||||
"File": "文件",
|
||||
"Label": "Label",
|
||||
"Attachment Template ID": "Attachment Template ID",
|
||||
"Uploaded File": "Uploaded File",
|
||||
"Contact Type": "Contact Type",
|
||||
"Contact": "Contact",
|
||||
"WhatsApp Account": "WhatsApp Account",
|
||||
"Message": "Message",
|
||||
"Chat Name": "Chat Name",
|
||||
"Labels": "Labels",
|
||||
"Is Group": "Is Group",
|
||||
"Responsible": "Responsible",
|
||||
"Is Read": "Is Read",
|
||||
"Is Closed": "Is Closed",
|
||||
"ChatGPT Autoresponse Enabled": "ChatGPT Autoresponse Enabled",
|
||||
"Created After": "Created After",
|
||||
"Created Before": "Created Before",
|
||||
"Page": "Page",
|
||||
"Message UID": "Message UID",
|
||||
"Filename": "Filename",
|
||||
"WhatsApp Account ID": "WhatsApp Account ID",
|
||||
"Phone Number": "Phone Number",
|
||||
"Method": "方法",
|
||||
"Headers": "信头",
|
||||
"Query Parameters": "查询参数",
|
||||
"Body": "正文内容",
|
||||
"Response is Binary ?": "Response is Binary ?",
|
||||
"No Error on Failure": "失败时没有错误",
|
||||
"Timeout (in seconds)": "超时(秒)",
|
||||
"Select the chat to send the message to": "Select the chat to send the message to",
|
||||
"The text content of the message to be sent.": "The text content of the message to be sent.",
|
||||
"Optional file to send with the message.": "Optional file to send with the message.",
|
||||
"Optional label to categorize or tag the message.": "Optional label to categorize or tag the message.",
|
||||
"Optional ID of the attachment template to use for the message.": "Optional ID of the attachment template to use for the message.",
|
||||
"Select the uploaded file": "Select the uploaded file",
|
||||
"The file to be sent in the chat.": "The file to be sent in the chat.",
|
||||
"Select the type of contact identifier": "Select the type of contact identifier",
|
||||
"Select the contact identifier based on the chosen contact type": "Select the contact identifier based on the chosen contact type",
|
||||
"Select the WhatsApp account": "Select the WhatsApp account",
|
||||
"The text message to be sent in the chat.": "The text message to be sent in the chat.",
|
||||
"An optional label to categorize the chat.": "An optional label to categorize the chat.",
|
||||
"An optional name for the chat (useful for group chats).": "An optional name for the chat (useful for group chats).",
|
||||
"Optional ID of a predefined attachment template to use when sending files.": "Optional ID of a predefined attachment template to use when sending files.",
|
||||
"Filter by labels assigned to the chat": "Filter by labels assigned to the chat",
|
||||
"Filter by whether the chat is a group chat": "Filter by whether the chat is a group chat",
|
||||
"Filter by the user responsible for the chat (email)": "Filter by the user responsible for the chat (email)",
|
||||
"Filter by the name of the chat": "Filter by the name of the chat",
|
||||
"Filter by whether the chat is marked as read": "Filter by whether the chat is marked as read",
|
||||
"Filter by whether the chat is closed": "Filter by whether the chat is closed",
|
||||
"Filter by whether ChatGPT autoresponse is enabled for the chat": "Filter by whether ChatGPT autoresponse is enabled for the chat",
|
||||
"Filter chats created after this date": "Filter chats created after this date",
|
||||
"Filter chats created before this date": "Filter chats created before this date",
|
||||
"Page number for paginated results": "Page number for paginated results",
|
||||
"The unique identifier of the message to find.": "The unique identifier of the message to find.",
|
||||
"The name of the uploaded file to search for.": "The name of the uploaded file to search for.",
|
||||
"The unique identifier of the message to look up.": "The unique identifier of the message to look up.",
|
||||
"The unique identifier of the WhatsApp account to search for.": "The unique identifier of the WhatsApp account to search for.",
|
||||
"The phone number associated with the WhatsApp account to search for.": "The phone number associated with the WhatsApp account to search for.",
|
||||
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
|
||||
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
|
||||
"JID": "JID",
|
||||
"GET": "获取",
|
||||
"POST": "帖子",
|
||||
"PATCH": "PATCH",
|
||||
"PUT": "弹出",
|
||||
"DELETE": "删除",
|
||||
"HEAD": "黑色",
|
||||
"Chat Closed": "Chat Closed",
|
||||
"New Outgoing Chat": "New Outgoing Chat",
|
||||
"New Incoming Chat": "New Incoming Chat",
|
||||
"New Sent Message": "New Sent Message",
|
||||
"New Received Message": "New Received Message",
|
||||
"New Uploaded File": "New Uploaded File",
|
||||
"New WhatsApp Account": "New WhatsApp Account",
|
||||
"Fires when a chat is closed.": "Fires when a chat is closed.",
|
||||
"Fires when a new outgoing chat is initiated.": "Fires when a new outgoing chat is initiated.",
|
||||
"Fires when a new incoming chat (i.e. from a user) is created.": "Fires when a new incoming chat (i.e. from a user) is created.",
|
||||
"Fires when a message is sent (outgoing).": "Fires when a message is sent (outgoing).",
|
||||
"Fires when a message is received (incoming).": "Fires when a message is received (incoming).",
|
||||
"Fires when a new file is uploaded in a chat.": "Fires when a new file is uploaded in a chat.",
|
||||
"Fires when a new WhatsApp account is added/registered.": "Fires when a new WhatsApp account is added/registered."
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
import { createCustomApiCallAction } from '@activepieces/pieces-common';
|
||||
import { createPiece } from '@activepieces/pieces-framework';
|
||||
import { closeChat } from './lib/actions/close-chat';
|
||||
import { findChat } from './lib/actions/find-chat';
|
||||
import { findMessage } from './lib/actions/find-message';
|
||||
import { findMessageStatus } from './lib/actions/find-message-status';
|
||||
import { findUploadedFile } from './lib/actions/find-uploaded-file';
|
||||
import { findWhatsappAccount } from './lib/actions/find-whatsapp-account';
|
||||
import { sendFileToExistingChat } from './lib/actions/send-file-to-existing-chat';
|
||||
import { sendMessageToExistingChat } from './lib/actions/send-message-to-existing-chat';
|
||||
import { sendMessageToNewChat } from './lib/actions/send-message-to-new-chat';
|
||||
import { sendUploadedFileToExistingChat } from './lib/actions/send-uploaded-file-to-existing-chat';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from './lib/common';
|
||||
import { chatClosed } from './lib/triggers/chat-closed';
|
||||
import { newIncomingChat } from './lib/triggers/new-incoming-chat';
|
||||
import { newOutgoingChat } from './lib/triggers/new-outgoing-chat';
|
||||
import { newReceivedMessage } from './lib/triggers/new-received-message';
|
||||
import { newSentMessage } from './lib/triggers/new-sent-message';
|
||||
import { newUploadedFile } from './lib/triggers/new-uploaded-file';
|
||||
import { newWhatsappAccount } from './lib/triggers/new-whatsapp-account';
|
||||
import { PieceCategory } from '@activepieces/shared';
|
||||
|
||||
export const timelinesAi = createPiece({
|
||||
displayName: 'TimelinesAI',
|
||||
auth: timelinesAiAuth,
|
||||
minimumSupportedRelease: '0.36.1',
|
||||
logoUrl: 'https://cdn.activepieces.com/pieces/timelines-ai.png',
|
||||
authors: ['LuizDMM', 'sanket-a11y'],
|
||||
categories: [PieceCategory.MARKETING, PieceCategory.COMMUNICATION],
|
||||
actions: [
|
||||
// Write Actions
|
||||
sendMessageToExistingChat,
|
||||
sendUploadedFileToExistingChat,
|
||||
sendFileToExistingChat,
|
||||
sendMessageToNewChat,
|
||||
closeChat,
|
||||
// Search Actions
|
||||
findChat,
|
||||
findMessage,
|
||||
findUploadedFile,
|
||||
findMessageStatus,
|
||||
findWhatsappAccount,
|
||||
// Custom API Call
|
||||
createCustomApiCallAction({
|
||||
baseUrl: () => timelinesAiCommon.baseUrl,
|
||||
auth: timelinesAiAuth,
|
||||
authMapping: async (auth) => ({
|
||||
Authorization: `Bearer ${auth.secret_text}`,
|
||||
}),
|
||||
}),
|
||||
],
|
||||
triggers: [
|
||||
chatClosed,
|
||||
newOutgoingChat,
|
||||
newIncomingChat,
|
||||
newSentMessage,
|
||||
newReceivedMessage,
|
||||
newUploadedFile,
|
||||
newWhatsappAccount,
|
||||
],
|
||||
});
|
||||
@@ -0,0 +1,26 @@
|
||||
import { createAction } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { chatDropdown } from '../common/properties';
|
||||
|
||||
export const closeChat = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'closeChat',
|
||||
displayName: 'Close Chat',
|
||||
description: 'Programmatically mark a chat as closed by its chat_id.',
|
||||
props: {
|
||||
chat_id: chatDropdown({ required: true }),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue: { chat_id } }) {
|
||||
const response = await timelinesAiCommon.updateChat({
|
||||
apiKey: apiKey,
|
||||
chat_id: Number(chat_id),
|
||||
closed: true,
|
||||
});
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(
|
||||
`Failed to close chat: ${response.message || 'Unknown error'}`
|
||||
);
|
||||
}
|
||||
return response;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,87 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { whatsappAccountDropdown } from '../common/properties';
|
||||
|
||||
export const findChat = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'findChat',
|
||||
displayName: 'Find Chat',
|
||||
description:
|
||||
'Look up a chat by parameters such as chat_id, phone, name, etc.',
|
||||
props: {
|
||||
label: Property.Array({
|
||||
displayName: 'Labels',
|
||||
description: 'Filter by labels assigned to the chat',
|
||||
required: false,
|
||||
}),
|
||||
whatsapp_account_id: whatsappAccountDropdown({ required: false }),
|
||||
group: Property.Checkbox({
|
||||
displayName: 'Is Group',
|
||||
description: 'Filter by whether the chat is a group chat',
|
||||
required: false,
|
||||
}),
|
||||
responsible: Property.Array({
|
||||
displayName: 'Responsible',
|
||||
description: 'Filter by the user responsible for the chat (email)',
|
||||
required: false,
|
||||
}),
|
||||
name: Property.ShortText({
|
||||
displayName: 'Chat Name',
|
||||
description: 'Filter by the name of the chat',
|
||||
required: false,
|
||||
}),
|
||||
read: Property.Checkbox({
|
||||
displayName: 'Is Read',
|
||||
description: 'Filter by whether the chat is marked as read',
|
||||
required: false,
|
||||
}),
|
||||
closed: Property.Checkbox({
|
||||
displayName: 'Is Closed',
|
||||
description: 'Filter by whether the chat is closed',
|
||||
required: false,
|
||||
}),
|
||||
chatgpt_autoresponse_enabled: Property.Checkbox({
|
||||
displayName: 'ChatGPT Autoresponse Enabled',
|
||||
description:
|
||||
'Filter by whether ChatGPT autoresponse is enabled for the chat',
|
||||
required: false,
|
||||
}),
|
||||
created_after: Property.DateTime({
|
||||
displayName: 'Created After',
|
||||
description: 'Filter chats created after this date',
|
||||
required: false,
|
||||
}),
|
||||
created_before: Property.DateTime({
|
||||
displayName: 'Created Before',
|
||||
description: 'Filter chats created before this date',
|
||||
required: false,
|
||||
}),
|
||||
page: Property.Number({
|
||||
displayName: 'Page',
|
||||
description: 'Page number for paginated results',
|
||||
required: false,
|
||||
defaultValue: 1,
|
||||
}),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue }) {
|
||||
const { label, responsible, ...rest } = propsValue;
|
||||
const chatParams = {
|
||||
...(label?.length && label.length > 0 ? { label: label.join(',') } : {}),
|
||||
...(responsible?.length && responsible.length > 0
|
||||
? { responsible: responsible.join(',') }
|
||||
: {}),
|
||||
...rest,
|
||||
};
|
||||
console.log('Chat search parameters:', chatParams);
|
||||
const response = await timelinesAiCommon.getChats({
|
||||
apiKey,
|
||||
...chatParams,
|
||||
});
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(
|
||||
`Error fetching chat: ${response.message || 'Unknown error'}`
|
||||
);
|
||||
}
|
||||
return response.data;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,28 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
|
||||
export const findMessageStatus = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'findMessageStatus',
|
||||
displayName: 'Find Message Status',
|
||||
description: 'Lookup a message’s delivery status by message ID.',
|
||||
props: {
|
||||
message_uid: Property.ShortText({
|
||||
displayName: 'Message UID',
|
||||
description: 'The unique identifier of the message to look up.',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue: { message_uid } }) {
|
||||
const response = await timelinesAiCommon.getMessage({
|
||||
apiKey,
|
||||
message_uid,
|
||||
});
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(
|
||||
`Error fetching message: ${response.message || 'Unknown error'}`
|
||||
);
|
||||
}
|
||||
return response.data.status;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,28 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
|
||||
export const findMessage = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'findMessage',
|
||||
displayName: 'Find Message',
|
||||
description: 'Lookup a message by its WhatsApp message ID.',
|
||||
props: {
|
||||
message_uid: Property.ShortText({
|
||||
displayName: 'Message UID',
|
||||
description: 'The unique identifier of the message to find.',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue: { message_uid } }) {
|
||||
const response = await timelinesAiCommon.getMessage({
|
||||
apiKey: apiKey,
|
||||
message_uid,
|
||||
});
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(
|
||||
`Error fetching message: ${response.message || 'Unknown error'}`
|
||||
);
|
||||
}
|
||||
return response.data;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,28 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
|
||||
export const findUploadedFile = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'findUploadedFile',
|
||||
displayName: 'Find Uploaded File',
|
||||
description: 'Locate an uploaded file by filename or identifier.',
|
||||
props: {
|
||||
filename: Property.ShortText({
|
||||
displayName: 'Filename',
|
||||
description: 'The name of the uploaded file to search for.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue: { filename } }) {
|
||||
const response = await timelinesAiCommon.listUploadedFiles({
|
||||
apiKey,
|
||||
filename,
|
||||
});
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(
|
||||
`Error fetching uploaded files: ${response.message || 'Unknown error'}`
|
||||
);
|
||||
}
|
||||
return response.data;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,45 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
|
||||
export const findWhatsappAccount = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'findWhatsappAccount',
|
||||
displayName: 'Find WhatsApp Account',
|
||||
description: 'Search for a WhatsApp account (by phone or ID).',
|
||||
props: {
|
||||
id: Property.ShortText({
|
||||
displayName: 'WhatsApp Account ID',
|
||||
description:
|
||||
'The unique identifier of the WhatsApp account to search for.',
|
||||
required: false,
|
||||
}),
|
||||
phone: Property.ShortText({
|
||||
displayName: 'Phone Number',
|
||||
description:
|
||||
'The phone number associated with the WhatsApp account to search for.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue: { id, phone } }) {
|
||||
const response = await timelinesAiCommon.listWhatsappAccounts({
|
||||
apiKey,
|
||||
});
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(
|
||||
`Error fetching WhatsApp accounts: ${response.message || 'Unknown error'}`
|
||||
);
|
||||
}
|
||||
return response.data.whatsapp_accounts.filter((acc) => {
|
||||
if (id && phone) {
|
||||
return acc.id === id && acc.phone === phone;
|
||||
}
|
||||
if (id) {
|
||||
return acc.id === id;
|
||||
}
|
||||
if (phone) {
|
||||
return acc.phone === phone;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,41 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { chatDropdown } from '../common/properties';
|
||||
|
||||
export const sendFileToExistingChat = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'sendFileToExistingChat',
|
||||
displayName: 'Send File to Existing Chat',
|
||||
description: 'Similar to above: send a file attachment to a chat using URL or file input and name.',
|
||||
props: {
|
||||
chat_id: chatDropdown({ required: true }),
|
||||
file: Property.File({
|
||||
displayName: 'File',
|
||||
description: 'The file to be sent in the chat.',
|
||||
required: true,
|
||||
}),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue }) {
|
||||
const { chat_id, file } = propsValue;
|
||||
if (chat_id === undefined) {
|
||||
throw new Error('chat_id is required');
|
||||
}
|
||||
const fileUploadResponse = await timelinesAiCommon.uploadFile({
|
||||
apiKey,
|
||||
file: file.data,
|
||||
filename: file.filename,
|
||||
});
|
||||
if (fileUploadResponse.status !== 'ok') {
|
||||
throw new Error('File upload failed');
|
||||
}
|
||||
const response = await timelinesAiCommon.sendMessageToExistingChat({
|
||||
apiKey,
|
||||
chat_id: Number(chat_id),
|
||||
file_uid: fileUploadResponse.data.uid,
|
||||
});
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(response.message || 'Sending file to chat failed');
|
||||
}
|
||||
return response.data;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,67 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { chatDropdown } from '../common/properties';
|
||||
|
||||
export const sendMessageToExistingChat = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'sendMessageToExistingChat',
|
||||
displayName: 'Send Message to Existing Chat',
|
||||
description: 'Sends a text message in a chat identified by chat_id',
|
||||
props: {
|
||||
chat_id: chatDropdown({ required: true }),
|
||||
text: Property.LongText({
|
||||
displayName: 'Message Text',
|
||||
description: 'The text content of the message to be sent.',
|
||||
required: true,
|
||||
}),
|
||||
file: Property.File({
|
||||
displayName: 'File',
|
||||
description: 'Optional file to send with the message.',
|
||||
required: false,
|
||||
}),
|
||||
label: Property.ShortText({
|
||||
displayName: 'Label',
|
||||
description: 'Optional label to categorize or tag the message.',
|
||||
required: false,
|
||||
}),
|
||||
attachment_template_id: Property.Number({
|
||||
displayName: 'Attachment Template ID',
|
||||
description:
|
||||
'Optional ID of the attachment template to use for the message.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue }) {
|
||||
const { chat_id, file, ...rest } = propsValue;
|
||||
if (chat_id === undefined) {
|
||||
throw new Error('chat_id is required');
|
||||
}
|
||||
const messageParams = {
|
||||
chat_id: Number(chat_id),
|
||||
file_uid: undefined as string | undefined,
|
||||
...rest,
|
||||
};
|
||||
if (file !== undefined) {
|
||||
const fileUploadResponse = await timelinesAiCommon.uploadFile({
|
||||
apiKey,
|
||||
file: file.data,
|
||||
filename: file.filename,
|
||||
});
|
||||
if (fileUploadResponse.status !== 'ok') {
|
||||
throw new Error('File upload failed');
|
||||
}
|
||||
messageParams['file_uid'] = fileUploadResponse.data.uid;
|
||||
}
|
||||
|
||||
const response = await timelinesAiCommon.sendMessageToExistingChat({
|
||||
apiKey,
|
||||
...messageParams,
|
||||
});
|
||||
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(response.message || 'Failed to send message');
|
||||
}
|
||||
|
||||
return response.data;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,114 @@
|
||||
import {
|
||||
createAction,
|
||||
DynamicPropsValue,
|
||||
Property,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { whatsappAccountDropdown } from '../common/properties';
|
||||
|
||||
export const sendMessageToNewChat = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'sendMessageToNewChat',
|
||||
displayName: 'Send Message to New Chat',
|
||||
description:
|
||||
'Create a new chat (new conversation) by specifying the WhatsApp account, phone number, and message.',
|
||||
props: {
|
||||
contactType: Property.StaticDropdown({
|
||||
displayName: 'Contact Type',
|
||||
description: 'Select the type of contact identifier',
|
||||
required: true,
|
||||
options: {
|
||||
options: [
|
||||
{ label: 'Phone Number', value: 'phone_number' },
|
||||
{ label: 'JID', value: 'jid' },
|
||||
],
|
||||
},
|
||||
defaultValue: 'phone_number',
|
||||
}),
|
||||
contact: Property.DynamicProperties({
|
||||
displayName: 'Contact',
|
||||
description:
|
||||
'Select the contact identifier based on the chosen contact type',
|
||||
required: true,
|
||||
refreshers: ['contactType'],
|
||||
auth: timelinesAiAuth,
|
||||
props: async ({
|
||||
contactType,
|
||||
}): Promise<DynamicPropsValue> => {
|
||||
if (contactType === 'phone_number') {
|
||||
return {
|
||||
phone: Property.ShortText({
|
||||
displayName: 'Phone Number',
|
||||
description:
|
||||
'A phone number formatted to the international standard: [+][country code][area code][local phone number].',
|
||||
required: true,
|
||||
}),
|
||||
};
|
||||
}
|
||||
if (contactType === 'jid') {
|
||||
return {
|
||||
jid: Property.ShortText({
|
||||
displayName: 'JID',
|
||||
description:
|
||||
"WhatsApp ID (JID) of a contact or group, e.g. '123456789@s.whatsapp.net'.",
|
||||
required: true,
|
||||
}),
|
||||
};
|
||||
}
|
||||
return {};
|
||||
},
|
||||
}),
|
||||
whatsapp_account_id: whatsappAccountDropdown({ required: false }),
|
||||
text: Property.LongText({
|
||||
displayName: 'Message',
|
||||
description: 'The text message to be sent in the chat.',
|
||||
required: false,
|
||||
}),
|
||||
file: Property.File({
|
||||
displayName: 'File',
|
||||
description: 'The file to be sent in the chat.',
|
||||
required: false,
|
||||
}),
|
||||
label: Property.ShortText({
|
||||
displayName: 'Label',
|
||||
description: 'An optional label to categorize the chat.',
|
||||
required: false,
|
||||
}),
|
||||
chat_name: Property.ShortText({
|
||||
displayName: 'Chat Name',
|
||||
description: 'An optional name for the chat (useful for group chats).',
|
||||
required: false,
|
||||
}),
|
||||
attachment_template_id: Property.Number({
|
||||
displayName: 'Attachment Template ID',
|
||||
description:
|
||||
'Optional ID of a predefined attachment template to use when sending files.',
|
||||
required: false,
|
||||
}),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue }) {
|
||||
const { contactType, contact, ...rest } = propsValue;
|
||||
if (contactType === 'phone_number') {
|
||||
const response = await timelinesAiCommon.sendMessageToPhoneNumber({
|
||||
apiKey: apiKey,
|
||||
phone: (contact as { phone: string }).phone,
|
||||
...rest,
|
||||
});
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(`Error: ${response.message || 'Failed to send message'}`);
|
||||
}
|
||||
return response;
|
||||
} else if (contactType === 'jid') {
|
||||
const response = await timelinesAiCommon.sendMessageToJid({
|
||||
apiKey: apiKey,
|
||||
jid: (contact as { jid: string }).jid,
|
||||
...rest,
|
||||
});
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(`Error: ${response.message || 'Failed to send message'}`);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,33 @@
|
||||
import { createAction, Property } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { chatDropdown, fileDropdown } from '../common/properties';
|
||||
|
||||
export const sendUploadedFileToExistingChat = createAction({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'sendUploadedFileToExistingChat',
|
||||
displayName: 'Send Uploaded File to Existing Chat',
|
||||
description:
|
||||
'Send a file (media/attachment) to a chat, with metadata like file name, via existing chat.',
|
||||
props: {
|
||||
chat_id: chatDropdown({ required: true }),
|
||||
file_id: fileDropdown({ required: true }),
|
||||
},
|
||||
async run({ auth: apiKey, propsValue }) {
|
||||
const { chat_id, file_id } = propsValue;
|
||||
if (chat_id === undefined) {
|
||||
throw new Error('chat_id is required');
|
||||
}
|
||||
|
||||
const response = await timelinesAiCommon.sendMessageToExistingChat({
|
||||
apiKey,
|
||||
chat_id: Number(chat_id),
|
||||
file_uid: file_id,
|
||||
});
|
||||
|
||||
if (response.status !== 'ok') {
|
||||
throw new Error(response.message || 'Sending message failed');
|
||||
}
|
||||
|
||||
return response.data;
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,223 @@
|
||||
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
|
||||
import { PieceAuth } from '@activepieces/pieces-framework';
|
||||
import {
|
||||
AuthenticationParams,
|
||||
CreateWebhookParams,
|
||||
CreateWebhookResponse,
|
||||
DeleteWebhookParams,
|
||||
DeleteWebhookResponse,
|
||||
GetChatsParams,
|
||||
GetChatsResponse,
|
||||
GetMessageParams,
|
||||
GetMessageResponse,
|
||||
GetUploadedFileParams,
|
||||
GetUploadedFileResponse,
|
||||
GetWhatsappAccountsResponse,
|
||||
ListUploadedFilesParams,
|
||||
ListUploadedFilesResponse,
|
||||
SendMessageToExistingChatParams,
|
||||
SendMessageToExistingChatResponse,
|
||||
SendMessageToJidParams,
|
||||
SendMessageToJidResponse,
|
||||
SendMessageToPhoneNumberParams,
|
||||
SendMessageToPhoneNumberResponse,
|
||||
UpdateChatParams,
|
||||
UpdateChatResponse,
|
||||
UploadFileParams,
|
||||
UploadFileResponse,
|
||||
} from './types';
|
||||
|
||||
export const timelinesAiAuth = PieceAuth.SecretText({
|
||||
displayName: 'API Key',
|
||||
description: 'Your TimelinesAI API key.',
|
||||
required: true,
|
||||
});
|
||||
|
||||
export const timelinesAiCommon = {
|
||||
baseUrl: 'https://app.timelines.ai/integrations/api',
|
||||
getHeaders: (apiKey: string) => ({ Authorization: `Bearer ${apiKey}` }),
|
||||
endpoints: {
|
||||
sendMessageToExistingChat: (chat_id: number) =>
|
||||
`/chats/${chat_id}/messages`,
|
||||
sendMessageToPhoneNumber: '/messages',
|
||||
sendMessageToJid: '/messages/to_jid',
|
||||
updateChat: (chat_id: string) => `/chats/${chat_id}`,
|
||||
getChats: '/chats',
|
||||
getMessage: (message_id: string) => `/messages/${message_id}`,
|
||||
getUploadedFile: (file_id: string) => `/files/${file_id}`,
|
||||
listUploadedFiles: '/files',
|
||||
getWhatsappAccounts: '/whatsapp_accounts',
|
||||
uploadFile: '/files_upload',
|
||||
createWebhook: '/webhooks',
|
||||
deleteWebhook: (webhook_id: number) => `/webhooks/${webhook_id}`,
|
||||
},
|
||||
// API Calls
|
||||
sendMessageToExistingChat: async ({
|
||||
apiKey,
|
||||
...messageParams
|
||||
}: SendMessageToExistingChatParams) => {
|
||||
const response =
|
||||
await httpClient.sendRequest<SendMessageToExistingChatResponse>({
|
||||
method: HttpMethod.POST,
|
||||
url:
|
||||
timelinesAiCommon.baseUrl +
|
||||
timelinesAiCommon.endpoints.sendMessageToExistingChat(
|
||||
messageParams.chat_id
|
||||
),
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
body: messageParams,
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
sendMessageToPhoneNumber: async ({
|
||||
apiKey,
|
||||
...messageParams
|
||||
}: SendMessageToPhoneNumberParams) => {
|
||||
const response =
|
||||
await httpClient.sendRequest<SendMessageToPhoneNumberResponse>({
|
||||
method: HttpMethod.POST,
|
||||
url:
|
||||
timelinesAiCommon.baseUrl +
|
||||
timelinesAiCommon.endpoints.sendMessageToPhoneNumber,
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
body: messageParams,
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
sendMessageToJid: async ({
|
||||
apiKey,
|
||||
...messageParams
|
||||
}: SendMessageToJidParams) => {
|
||||
const response = await httpClient.sendRequest<SendMessageToJidResponse>({
|
||||
method: HttpMethod.POST,
|
||||
url:
|
||||
timelinesAiCommon.baseUrl +
|
||||
timelinesAiCommon.endpoints.sendMessageToJid,
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
body: messageParams,
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
updateChat: async ({ apiKey, ...chatParams }: UpdateChatParams) => {
|
||||
const response = await httpClient.sendRequest<UpdateChatResponse>({
|
||||
method: HttpMethod.PATCH,
|
||||
url:
|
||||
timelinesAiCommon.baseUrl +
|
||||
timelinesAiCommon.endpoints.updateChat(chatParams.chat_id.toString()),
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
body: chatParams,
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
getChats: async ({ apiKey, ...chatParams }: GetChatsParams) => {
|
||||
const { group, read, closed, chatgpt_autoresponse_enabled, page, ...rest } =
|
||||
chatParams;
|
||||
const queryParams = {
|
||||
...(group !== undefined ? { group: group.toString() } : {}),
|
||||
...(read !== undefined ? { read: read.toString() } : {}),
|
||||
...(closed !== undefined ? { closed: closed.toString() } : {}),
|
||||
...(chatgpt_autoresponse_enabled !== undefined
|
||||
? {
|
||||
chatgpt_autoresponse_enabled:
|
||||
chatgpt_autoresponse_enabled.toString(),
|
||||
}
|
||||
: {}),
|
||||
...(page !== undefined ? { page: page.toString() } : {}),
|
||||
...rest,
|
||||
};
|
||||
const response = await httpClient.sendRequest<GetChatsResponse>({
|
||||
method: HttpMethod.GET,
|
||||
url: timelinesAiCommon.baseUrl + timelinesAiCommon.endpoints.getChats,
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
queryParams,
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
getMessage: async ({ apiKey, message_uid }: GetMessageParams) => {
|
||||
const response = await httpClient.sendRequest<GetMessageResponse>({
|
||||
method: HttpMethod.GET,
|
||||
url:
|
||||
timelinesAiCommon.baseUrl +
|
||||
timelinesAiCommon.endpoints.getMessage(message_uid),
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
getUploadedFile: async ({ apiKey, file_uid }: GetUploadedFileParams) => {
|
||||
const response = await httpClient.sendRequest<GetUploadedFileResponse>({
|
||||
method: HttpMethod.GET,
|
||||
url:
|
||||
timelinesAiCommon.baseUrl +
|
||||
timelinesAiCommon.endpoints.getUploadedFile(file_uid),
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
listUploadedFiles: async ({ apiKey, filename }: ListUploadedFilesParams) => {
|
||||
const response = await httpClient.sendRequest<ListUploadedFilesResponse>({
|
||||
method: HttpMethod.GET,
|
||||
url: timelinesAiCommon.baseUrl + timelinesAiCommon.endpoints.listUploadedFiles,
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
queryParams: {
|
||||
...(filename ? { filename } : {}),
|
||||
},
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
listWhatsappAccounts: async ({ apiKey }: AuthenticationParams) => {
|
||||
const response = await httpClient.sendRequest<GetWhatsappAccountsResponse>({
|
||||
method: HttpMethod.GET,
|
||||
url:
|
||||
timelinesAiCommon.baseUrl +
|
||||
timelinesAiCommon.endpoints.getWhatsappAccounts,
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
uploadFile: async ({ apiKey, ...fileParams }: UploadFileParams) => {
|
||||
const { file, filename, content_type } = fileParams;
|
||||
const formData = new FormData();
|
||||
const uint8 = new Uint8Array(file);
|
||||
const blob = new Blob([uint8], {
|
||||
type: content_type || 'application/octet-stream',
|
||||
});
|
||||
formData.append('file', blob, filename || 'upload');
|
||||
if (filename) {
|
||||
formData.append('filename', filename);
|
||||
}
|
||||
if (content_type) {
|
||||
formData.append('content_type', content_type);
|
||||
}
|
||||
|
||||
const response = await httpClient.sendRequest<UploadFileResponse>({
|
||||
method: HttpMethod.POST,
|
||||
url: timelinesAiCommon.baseUrl + timelinesAiCommon.endpoints.uploadFile,
|
||||
headers: {
|
||||
...timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
'Content-Type': 'multipart/form-data',
|
||||
},
|
||||
body: formData,
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
createWebhook: async ({ apiKey, ...webhookParams }: CreateWebhookParams) => {
|
||||
const response = await httpClient.sendRequest<CreateWebhookResponse>({
|
||||
method: HttpMethod.POST,
|
||||
url:
|
||||
timelinesAiCommon.baseUrl + timelinesAiCommon.endpoints.createWebhook,
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
body: webhookParams,
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
deleteWebhook: async ({ apiKey, webhook_id }: DeleteWebhookParams) => {
|
||||
const response = await httpClient.sendRequest<DeleteWebhookResponse>({
|
||||
method: HttpMethod.DELETE,
|
||||
url:
|
||||
timelinesAiCommon.baseUrl +
|
||||
timelinesAiCommon.endpoints.deleteWebhook(webhook_id),
|
||||
headers: timelinesAiCommon.getHeaders(apiKey.secret_text),
|
||||
});
|
||||
return response.body;
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,100 @@
|
||||
import { Property } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '.';
|
||||
|
||||
export const chatDropdown = ({
|
||||
description = 'Select the chat to send the message to',
|
||||
required = true,
|
||||
}: {
|
||||
description?: string;
|
||||
required?: boolean;
|
||||
}) =>
|
||||
Property.Dropdown({
|
||||
auth: timelinesAiAuth,
|
||||
displayName: 'Chat',
|
||||
description: description,
|
||||
required,
|
||||
refreshers: ['auth'],
|
||||
refreshOnSearch: true,
|
||||
options: async ({ auth: apiKey }, { searchValue }) => {
|
||||
if (!apiKey) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please select an authentication first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const response = await timelinesAiCommon.getChats({
|
||||
apiKey: apiKey,
|
||||
|
||||
|
||||
name: searchValue,
|
||||
});
|
||||
const { chats } = response.data;
|
||||
return {
|
||||
options: chats.map((chat) => ({
|
||||
label: chat.name,
|
||||
value: chat.id,
|
||||
})),
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const whatsappAccountDropdown = ({ required = true }) =>
|
||||
Property.Dropdown({
|
||||
auth: timelinesAiAuth,
|
||||
displayName: 'WhatsApp Account',
|
||||
description: 'Select the WhatsApp account',
|
||||
required,
|
||||
refreshers: ['auth'],
|
||||
options: async ({ auth: apiKey }) => {
|
||||
if (!apiKey) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please select an authentication first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const response = await timelinesAiCommon.listWhatsappAccounts({
|
||||
apiKey: apiKey,
|
||||
|
||||
|
||||
});
|
||||
const accounts = response.data;
|
||||
return {
|
||||
options: accounts.whatsapp_accounts.map((account) => ({
|
||||
label: account.account_name,
|
||||
value: account.id,
|
||||
})),
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export const fileDropdown = ({ required = true }) =>
|
||||
Property.Dropdown({
|
||||
auth: timelinesAiAuth,
|
||||
displayName: 'Uploaded File',
|
||||
description: 'Select the uploaded file',
|
||||
required,
|
||||
refreshers: ['auth'],
|
||||
options: async ({ auth: apiKey }) => {
|
||||
if (!apiKey) {
|
||||
return {
|
||||
disabled: true,
|
||||
placeholder: 'Please select an authentication first',
|
||||
options: [],
|
||||
};
|
||||
}
|
||||
const response = await timelinesAiCommon.listUploadedFiles({
|
||||
apiKey: apiKey,
|
||||
|
||||
|
||||
});
|
||||
const files = response.data;
|
||||
return {
|
||||
options: files.map((file) => ({
|
||||
label: file.filename,
|
||||
value: file.uid,
|
||||
})),
|
||||
};
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,242 @@
|
||||
import { AppConnectionValueForAuthProperty } from "@activepieces/pieces-framework";
|
||||
import { timelinesAiAuth } from ".";
|
||||
|
||||
// Base Interfaces
|
||||
export interface AuthenticationParams {
|
||||
apiKey: AppConnectionValueForAuthProperty<typeof timelinesAiAuth>;
|
||||
}
|
||||
|
||||
export interface BaseStatusResponse {
|
||||
status: string;
|
||||
message?: string; // Optional message field for error descriptions
|
||||
}
|
||||
|
||||
export interface BaseMessageUidResponse extends BaseStatusResponse {
|
||||
data: {
|
||||
message_uid: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface GroupMember {
|
||||
name: string;
|
||||
phone: string;
|
||||
role: string;
|
||||
chat_id: number;
|
||||
}
|
||||
|
||||
interface Chat {
|
||||
id: string;
|
||||
name: string;
|
||||
phone: string;
|
||||
jid: string;
|
||||
is_group: boolean;
|
||||
closed: boolean;
|
||||
read: boolean;
|
||||
labels: string[];
|
||||
chatgpt_autoresponse_enabled: boolean;
|
||||
responsible_email: string;
|
||||
responsible_name: string;
|
||||
whatsapp_account_id: string;
|
||||
chat_url: string;
|
||||
created_timestamp: string;
|
||||
last_message_uid: string;
|
||||
last_message_timestamp: string;
|
||||
unattended: boolean;
|
||||
photo: string;
|
||||
group_members: GroupMember[];
|
||||
is_allowed_to_message: boolean;
|
||||
}
|
||||
|
||||
interface Message {
|
||||
uid: string;
|
||||
chat_id: string;
|
||||
timestamp: string;
|
||||
sender_phone: string;
|
||||
sender_name: string;
|
||||
recipient_phone: string;
|
||||
recipient_name: string;
|
||||
from_me: boolean;
|
||||
text: string;
|
||||
attachment_url: string;
|
||||
attachment_filename: string;
|
||||
status: string;
|
||||
origin: string;
|
||||
has_attachment: boolean;
|
||||
message_type: string;
|
||||
reactions: Record<string, string>;
|
||||
data: Record<string, string>;
|
||||
created_by: string;
|
||||
}
|
||||
|
||||
interface UploadedFile {
|
||||
temporary_download_url: string;
|
||||
uid: string;
|
||||
filename: string;
|
||||
size: number;
|
||||
mimetype: string;
|
||||
uploaded_by_email: string;
|
||||
uploaded_at: string;
|
||||
}
|
||||
|
||||
interface WhatsAppAccount {
|
||||
id: string;
|
||||
phone: string;
|
||||
connected_on: string;
|
||||
status: string;
|
||||
owner_name: string;
|
||||
owner_email: string;
|
||||
account_name: string;
|
||||
is_visible: boolean;
|
||||
}
|
||||
|
||||
export interface WebhookInformation {
|
||||
webhook_id: number;
|
||||
}
|
||||
// API Interfaces
|
||||
export interface SendMessageToExistingChatParams extends AuthenticationParams {
|
||||
chat_id: number;
|
||||
text?: string;
|
||||
file_uid?: string;
|
||||
label?: string;
|
||||
chat_name?: string;
|
||||
attachment_template_id?: number;
|
||||
}
|
||||
|
||||
export type SendMessageToExistingChatResponse = BaseMessageUidResponse;
|
||||
|
||||
export interface SendMessageToPhoneNumberParams extends AuthenticationParams {
|
||||
phone: string;
|
||||
text?: string;
|
||||
whatsapp_account_phone?: string;
|
||||
file_uid?: string;
|
||||
label?: string;
|
||||
chat_name?: string;
|
||||
attachment_template_id?: number;
|
||||
}
|
||||
|
||||
export type SendMessageToPhoneNumberResponse = BaseMessageUidResponse;
|
||||
|
||||
export interface SendMessageToJidParams extends AuthenticationParams {
|
||||
jid: string;
|
||||
text?: string;
|
||||
whatsapp_account_phone?: string;
|
||||
file_uid?: string;
|
||||
label?: string;
|
||||
chat_name?: string;
|
||||
attachment_template_id?: number;
|
||||
}
|
||||
|
||||
export type SendMessageToJidResponse = BaseMessageUidResponse;
|
||||
|
||||
export interface UpdateChatParams extends AuthenticationParams {
|
||||
chat_id: number;
|
||||
name?: string;
|
||||
responsible?: string;
|
||||
closed?: boolean;
|
||||
read?: boolean;
|
||||
chatgpt_autoresponse_enabled?: boolean;
|
||||
}
|
||||
|
||||
export interface UpdateChatResponse extends BaseStatusResponse {
|
||||
data: Chat;
|
||||
}
|
||||
|
||||
export interface GetChatsParams extends AuthenticationParams {
|
||||
label?: string;
|
||||
whatsapp_account_id?: string;
|
||||
group?: boolean;
|
||||
responsible?: string;
|
||||
name?: string;
|
||||
read?: boolean;
|
||||
closed?: boolean;
|
||||
chatgpt_autoresponse_enabled?: boolean;
|
||||
page?: number;
|
||||
created_after?: string;
|
||||
created_before?: string;
|
||||
}
|
||||
|
||||
export interface GetChatsResponse extends BaseStatusResponse {
|
||||
data: {
|
||||
has_more_pages: number;
|
||||
chats: Chat[];
|
||||
};
|
||||
}
|
||||
|
||||
export interface GetMessageParams extends AuthenticationParams {
|
||||
message_uid: string;
|
||||
}
|
||||
|
||||
export interface GetMessageResponse extends BaseStatusResponse {
|
||||
data: Message;
|
||||
}
|
||||
|
||||
export interface GetUploadedFileParams extends AuthenticationParams {
|
||||
file_uid: string;
|
||||
}
|
||||
|
||||
export interface GetUploadedFileResponse extends BaseStatusResponse {
|
||||
data: UploadedFile;
|
||||
}
|
||||
|
||||
export interface ListUploadedFilesParams extends AuthenticationParams {
|
||||
filename?: string;
|
||||
}
|
||||
|
||||
export interface ListUploadedFilesResponse extends BaseStatusResponse {
|
||||
data: UploadedFile[];
|
||||
}
|
||||
|
||||
export interface GetWhatsappAccountsResponse extends BaseStatusResponse {
|
||||
data: {
|
||||
whatsapp_accounts: WhatsAppAccount[];
|
||||
};
|
||||
}
|
||||
|
||||
export interface UploadFileParams extends AuthenticationParams {
|
||||
file: Buffer;
|
||||
filename?: string;
|
||||
content_type?: string;
|
||||
}
|
||||
|
||||
export interface UploadFileResponse extends BaseStatusResponse {
|
||||
data: UploadedFile;
|
||||
}
|
||||
|
||||
export interface CreateWebhookParams extends AuthenticationParams {
|
||||
event_type:
|
||||
| 'message:new'
|
||||
| 'message:sent:new'
|
||||
| 'message:received:new'
|
||||
| 'whatsapp:account:connected'
|
||||
| 'whatsapp:account:disconnected'
|
||||
| 'whatsapp:account:suspended'
|
||||
| 'whatsapp:account:resumed'
|
||||
| 'chat:new'
|
||||
| 'chat:incoming:new'
|
||||
| 'chat:outgoing:new'
|
||||
| 'chat:responsible:assigned'
|
||||
| 'chat:responsible:unassigned';
|
||||
enabled?: boolean;
|
||||
url: string;
|
||||
}
|
||||
|
||||
export interface CreateWebhookResponse extends BaseStatusResponse {
|
||||
status: string;
|
||||
data: {
|
||||
id: number;
|
||||
event_type: string;
|
||||
enabled: boolean;
|
||||
url: string;
|
||||
errors_counter: number;
|
||||
};
|
||||
}
|
||||
|
||||
export interface DeleteWebhookParams extends AuthenticationParams {
|
||||
webhook_id: number;
|
||||
}
|
||||
|
||||
export interface DeleteWebhookResponse {
|
||||
message?: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
import {
|
||||
DedupeStrategy,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
createTrigger,
|
||||
AppConnectionValueForAuthProperty,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import dayjs from 'dayjs';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof timelinesAiAuth>,
|
||||
Record<string, never>
|
||||
> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ auth: apiKey, propsValue, lastFetchEpochMS }) => {
|
||||
const response = await timelinesAiCommon.getChats({
|
||||
apiKey: apiKey,
|
||||
closed: true,
|
||||
});
|
||||
const items = response.data.chats;
|
||||
return items.map((item) => ({
|
||||
epochMilliSeconds: dayjs(item.last_message_timestamp).valueOf(),
|
||||
data: item,
|
||||
}));
|
||||
},
|
||||
};
|
||||
|
||||
export const chatClosed = createTrigger({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'chatClosed',
|
||||
displayName: 'Chat Closed',
|
||||
description: 'Fires when a chat is closed.',
|
||||
props: {},
|
||||
sampleData: {},
|
||||
type: TriggerStrategy.POLLING,
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async onEnable(context) {
|
||||
const { store, auth, propsValue } = context;
|
||||
await pollingHelper.onEnable(polling, { store, auth, propsValue });
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const { store, auth, propsValue } = context;
|
||||
await pollingHelper.onDisable(polling, { store, auth, propsValue });
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,72 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { WebhookInformation } from '../common/types';
|
||||
|
||||
export const newIncomingChat = createTrigger({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'newIncomingChat',
|
||||
displayName: 'New Incoming Chat',
|
||||
description: 'Fires when a new incoming chat (i.e. from a user) is created.',
|
||||
props: {},
|
||||
sampleData: {
|
||||
event_type: 'chat:new',
|
||||
chat: {
|
||||
id: 123456,
|
||||
name: 'John Smith',
|
||||
phone: '+123456789',
|
||||
jid: '123456789@s.whatsapp.net',
|
||||
is_group: false,
|
||||
closed: false,
|
||||
read: false,
|
||||
labels: ['string'],
|
||||
unattended_customer: false,
|
||||
chatgpt_autoresponse_enabled: false,
|
||||
whatsapp_account_id: '123456789@s.whatsapp.net',
|
||||
chat_url: 'https://app.timelines.ai/chat/123456/messages/',
|
||||
created_timestamp: '2024-01-08 10:35:18 +0200',
|
||||
last_message_uid: 'afa9d4dd-978d-4a14-aa1b-bd65c272e645',
|
||||
last_message_timestamp: '2024-01-08 10:35:18 +0200',
|
||||
responsible_name: 'Agent Brown',
|
||||
responsible_email: 'agent-brown@example.com',
|
||||
previous_responsible_name: 'Agent Jones',
|
||||
previous_responsible_email: 'agent-jones@example.com',
|
||||
},
|
||||
whatsapp_account: {
|
||||
id: '123456789@s.whatsapp.net',
|
||||
phone: '+123456789',
|
||||
connected_on: '2024-01-08 10:35:18 +0200',
|
||||
disconnected_on: '2024-01-08 10:35:18 +0200',
|
||||
status: 'active',
|
||||
account_name: 'Some account',
|
||||
owner_name: 'Agent Smith',
|
||||
owner_email: 'agent-smith@example.com',
|
||||
},
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const response = await timelinesAiCommon.createWebhook({
|
||||
apiKey: context.auth,
|
||||
event_type: 'chat:incoming:new',
|
||||
url: context.webhookUrl,
|
||||
enabled: true,
|
||||
});
|
||||
await context.store.put<WebhookInformation>('_new_incoming_chat', {
|
||||
webhook_id: response.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const webhookInfo = await context.store.get<WebhookInformation>(
|
||||
'_new_incoming_chat'
|
||||
);
|
||||
const webhook_id = webhookInfo?.webhook_id;
|
||||
if (webhook_id) {
|
||||
await timelinesAiCommon.deleteWebhook({
|
||||
apiKey: context.auth,
|
||||
webhook_id: webhook_id as number,
|
||||
});
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
return [context.payload.body];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,72 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { WebhookInformation } from '../common/types';
|
||||
|
||||
export const newOutgoingChat = createTrigger({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'newOutgoingChat',
|
||||
displayName: 'New Outgoing Chat',
|
||||
description: 'Fires when a new outgoing chat is initiated.',
|
||||
props: {},
|
||||
sampleData: {
|
||||
event_type: 'chat:new',
|
||||
chat: {
|
||||
id: 123456,
|
||||
name: 'John Smith',
|
||||
phone: '+123456789',
|
||||
jid: '123456789@s.whatsapp.net',
|
||||
is_group: false,
|
||||
closed: false,
|
||||
read: false,
|
||||
labels: ['string'],
|
||||
unattended_customer: false,
|
||||
chatgpt_autoresponse_enabled: false,
|
||||
whatsapp_account_id: '123456789@s.whatsapp.net',
|
||||
chat_url: 'https://app.timelines.ai/chat/123456/messages/',
|
||||
created_timestamp: '2024-01-08 10:35:18 +0200',
|
||||
last_message_uid: 'afa9d4dd-978d-4a14-aa1b-bd65c272e645',
|
||||
last_message_timestamp: '2024-01-08 10:35:18 +0200',
|
||||
responsible_name: 'Agent Brown',
|
||||
responsible_email: 'agent-brown@example.com',
|
||||
previous_responsible_name: 'Agent Jones',
|
||||
previous_responsible_email: 'agent-jones@example.com',
|
||||
},
|
||||
whatsapp_account: {
|
||||
id: '123456789@s.whatsapp.net',
|
||||
phone: '+123456789',
|
||||
connected_on: '2024-01-08 10:35:18 +0200',
|
||||
disconnected_on: '2024-01-08 10:35:18 +0200',
|
||||
status: 'active',
|
||||
account_name: 'Some account',
|
||||
owner_name: 'Agent Smith',
|
||||
owner_email: 'agent-smith@example.com',
|
||||
},
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const response = await timelinesAiCommon.createWebhook({
|
||||
apiKey: context.auth,
|
||||
event_type: 'chat:outgoing:new',
|
||||
url: context.webhookUrl,
|
||||
enabled: true,
|
||||
});
|
||||
await context.store.put<WebhookInformation>('_new_outgoing_chat', {
|
||||
webhook_id: response.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const webhookInfo = await context.store.get<WebhookInformation>(
|
||||
'_new_outgoing_chat'
|
||||
);
|
||||
const webhook_id = webhookInfo?.webhook_id;
|
||||
if (webhook_id) {
|
||||
await timelinesAiCommon.deleteWebhook({
|
||||
apiKey: context.auth,
|
||||
webhook_id: webhook_id as number,
|
||||
});
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
return [context.payload.body];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,79 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { WebhookInformation } from '../common/types';
|
||||
|
||||
export const newReceivedMessage = createTrigger({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'newReceivedMessage',
|
||||
displayName: 'New Received Message',
|
||||
description: 'Fires when a message is received (incoming).',
|
||||
props: {},
|
||||
sampleData: {
|
||||
event_type: 'message:new',
|
||||
chat: {
|
||||
full_name: 'Agent Smith',
|
||||
chat_url: 'https://app.timelines.ai/chat/123456/messages/',
|
||||
chat_id: 123456,
|
||||
is_group: false,
|
||||
phone: '+123456789',
|
||||
responsible_name: 'Agent Brown',
|
||||
responsible_email: 'agent-brown@example.com',
|
||||
},
|
||||
whatsapp_account: {
|
||||
full_name: 'Agent Brown',
|
||||
email: 'agent-brown@example.com',
|
||||
phone: '+123456789',
|
||||
},
|
||||
message: {
|
||||
text: 'Sending some example document to you',
|
||||
direction: 'sent',
|
||||
origin: 'Public API',
|
||||
timestamp: '2024-01-08 10:35:18 +0200',
|
||||
message_uid: 'c7ec509d-0171-1ead-a84b-c6943a644768',
|
||||
reply_to_uid: 'c7ec509d-0171-1ead-a84b-c6943a644768',
|
||||
sender: {
|
||||
full_name: 'John Smith',
|
||||
phone: '+123456789',
|
||||
},
|
||||
recipient: {
|
||||
full_name: 'John Smith',
|
||||
phone: '+123456789',
|
||||
},
|
||||
attachments: [
|
||||
{
|
||||
temporary_download_url: 'https://example.s3.amazonaws.com/att/...',
|
||||
filename: 'example.doc',
|
||||
size: 1234567,
|
||||
mimetype: 'application/msword',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const response = await timelinesAiCommon.createWebhook({
|
||||
apiKey: context.auth,
|
||||
event_type: 'message:received:new',
|
||||
url: context.webhookUrl,
|
||||
enabled: true,
|
||||
});
|
||||
await context.store.put<WebhookInformation>('_new_received_message', {
|
||||
webhook_id: response.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const webhookInfo = await context.store.get<WebhookInformation>(
|
||||
'_new_received_message'
|
||||
);
|
||||
const webhook_id = webhookInfo?.webhook_id;
|
||||
if (webhook_id) {
|
||||
await timelinesAiCommon.deleteWebhook({
|
||||
apiKey: context.auth,
|
||||
webhook_id: webhook_id as number,
|
||||
});
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
return [context.payload.body];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,81 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { WebhookInformation } from '../common/types';
|
||||
|
||||
export const newSentMessage = createTrigger({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'newSentMessage',
|
||||
displayName: 'New Sent Message',
|
||||
description: 'Fires when a message is sent (outgoing).',
|
||||
props: {},
|
||||
sampleData: {
|
||||
event_type: 'message:new',
|
||||
chat: {
|
||||
full_name: 'Agent Smith',
|
||||
chat_url: 'https://app.timelines.ai/chat/123456/messages/',
|
||||
chat_id: 123456,
|
||||
is_group: false,
|
||||
phone: '+123456789',
|
||||
responsible_name: 'Agent Brown',
|
||||
responsible_email: 'agent-brown@example.com',
|
||||
},
|
||||
whatsapp_account: {
|
||||
full_name: 'Agent Brown',
|
||||
email: 'agent-brown@example.com',
|
||||
phone: '+123456789',
|
||||
},
|
||||
message: {
|
||||
text: 'Sending some example document to you',
|
||||
direction: 'sent',
|
||||
origin: 'Public API',
|
||||
timestamp: '2024-01-08 10:35:18 +0200',
|
||||
message_uid: 'c7ec509d-0171-1ead-a84b-c6943a644768',
|
||||
reply_to_uid: 'c7ec509d-0171-1ead-a84b-c6943a644768',
|
||||
sender: {
|
||||
full_name: 'John Smith',
|
||||
phone: '+123456789',
|
||||
},
|
||||
recipient: {
|
||||
full_name: 'John Smith',
|
||||
phone: '+123456789',
|
||||
},
|
||||
attachments: [
|
||||
{
|
||||
temporary_download_url: 'https://example.s3.amazonaws.com/att/...',
|
||||
filename: 'example.doc',
|
||||
size: 1234567,
|
||||
mimetype: 'application/msword',
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const response = await timelinesAiCommon.createWebhook({
|
||||
apiKey: context.auth,
|
||||
event_type: 'message:sent:new',
|
||||
url: context.webhookUrl,
|
||||
enabled: true,
|
||||
});
|
||||
await context.store.put<WebhookInformation>('_new_sent_message', {
|
||||
webhook_id: response.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const webhookInfo = await context.store.get<WebhookInformation>(
|
||||
'_new_sent_message'
|
||||
);
|
||||
const webhook_id = webhookInfo?.webhook_id;
|
||||
if (webhook_id) {
|
||||
await timelinesAiCommon.deleteWebhook({
|
||||
apiKey: context.auth,
|
||||
webhook_id,
|
||||
});
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
return [context.payload.body];
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
import {
|
||||
DedupeStrategy,
|
||||
Polling,
|
||||
pollingHelper,
|
||||
} from '@activepieces/pieces-common';
|
||||
import {
|
||||
createTrigger,
|
||||
AppConnectionValueForAuthProperty,
|
||||
TriggerStrategy,
|
||||
} from '@activepieces/pieces-framework';
|
||||
import dayjs from 'dayjs';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
|
||||
const polling: Polling<
|
||||
AppConnectionValueForAuthProperty<typeof timelinesAiAuth>,
|
||||
Record<string, never>
|
||||
> = {
|
||||
strategy: DedupeStrategy.TIMEBASED,
|
||||
items: async ({ auth: apiKey, propsValue, lastFetchEpochMS }) => {
|
||||
const response = await timelinesAiCommon.listUploadedFiles({
|
||||
apiKey,
|
||||
});
|
||||
const items = response.data;
|
||||
return items.map((item) => ({
|
||||
epochMilliSeconds: dayjs(item.uploaded_at).valueOf(),
|
||||
data: item,
|
||||
}));
|
||||
},
|
||||
};
|
||||
|
||||
export const newUploadedFile = createTrigger({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'newUploadedFile',
|
||||
displayName: 'New Uploaded File',
|
||||
description: 'Fires when a new file is uploaded in a chat.',
|
||||
props: {},
|
||||
sampleData: {},
|
||||
type: TriggerStrategy.POLLING,
|
||||
async test(context) {
|
||||
return await pollingHelper.test(polling, context);
|
||||
},
|
||||
async onEnable(context) {
|
||||
const { store, auth, propsValue } = context;
|
||||
await pollingHelper.onEnable(polling, { store, auth, propsValue });
|
||||
},
|
||||
|
||||
async onDisable(context) {
|
||||
const { store, auth, propsValue } = context;
|
||||
await pollingHelper.onDisable(polling, { store, auth, propsValue });
|
||||
},
|
||||
|
||||
async run(context) {
|
||||
return await pollingHelper.poll(polling, context);
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,51 @@
|
||||
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
|
||||
import { timelinesAiAuth, timelinesAiCommon } from '../common';
|
||||
import { WebhookInformation } from '../common/types';
|
||||
|
||||
export const newWhatsappAccount = createTrigger({
|
||||
auth: timelinesAiAuth,
|
||||
name: 'newWhatsappAccount',
|
||||
displayName: 'New WhatsApp Account',
|
||||
description: 'Fires when a new WhatsApp account is added/registered.',
|
||||
props: {},
|
||||
sampleData: {
|
||||
event_type: 'whatsapp:account:connected',
|
||||
whatsapp_account: {
|
||||
id: '123456789@s.whatsapp.net',
|
||||
phone: '+123456789',
|
||||
connected_on: '2024-01-08 10:35:18 +0200',
|
||||
disconnected_on: '2024-01-08 10:35:18 +0200',
|
||||
status: 'active',
|
||||
account_name: 'Smith',
|
||||
owner_name: 'John Smith',
|
||||
owner_email: 'john-smith@example.com',
|
||||
},
|
||||
},
|
||||
type: TriggerStrategy.WEBHOOK,
|
||||
async onEnable(context) {
|
||||
const response = await timelinesAiCommon.createWebhook({
|
||||
apiKey: context.auth,
|
||||
event_type: 'whatsapp:account:connected',
|
||||
url: context.webhookUrl,
|
||||
enabled: true,
|
||||
});
|
||||
await context.store.put<WebhookInformation>('_new_whatsapp_account', {
|
||||
webhook_id: response.data.id,
|
||||
});
|
||||
},
|
||||
async onDisable(context) {
|
||||
const webhookInfo = await context.store.get<WebhookInformation>(
|
||||
'_new_whatsapp_account'
|
||||
);
|
||||
const webhook_id = webhookInfo?.webhook_id;
|
||||
if (webhook_id) {
|
||||
await timelinesAiCommon.deleteWebhook({
|
||||
apiKey: context.auth,
|
||||
webhook_id: webhook_id,
|
||||
});
|
||||
}
|
||||
},
|
||||
async run(context) {
|
||||
return [context.payload.body];
|
||||
},
|
||||
});
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"extends": "../../../../tsconfig.base.json",
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"forceConsistentCasingInFileNames": true,
|
||||
"strict": true,
|
||||
"importHelpers": true,
|
||||
"noImplicitOverride": true,
|
||||
"noImplicitReturns": true,
|
||||
"noFallthroughCasesInSwitch": true,
|
||||
"noPropertyAccessFromIndexSignature": true
|
||||
},
|
||||
"files": [],
|
||||
"include": [],
|
||||
"references": [
|
||||
{
|
||||
"path": "./tsconfig.lib.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"extends": "./tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../../../dist/out-tsc",
|
||||
"declaration": true,
|
||||
"types": ["node"]
|
||||
},
|
||||
"include": ["src/**/*.ts"]
|
||||
}
|
||||
Reference in New Issue
Block a user