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:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,42 @@
{
"**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n": "**Gib deinen AgentX API Schlüssel ein**\n---\n### Wie du deinen API-Schlüssel\nerhältst. Besuchen Sie [AgentX](https://www.agentx.so/) und melden Sie sich an.\n2. Klicken Sie auf Ihren Avatar (linke untere Ecke).\n3. Kopieren Sie Ihren API-Schlüssel aus dem Popup-Fenster.\n4. Fügen Sie ihn hier ein.\n\n",
"Create Conversation With Single Agent": "Konversation mit Single Agent erstellen",
"Send Message to Existing Conversation": "Nachricht an bestehende Unterhaltung senden",
"Find Message": "Nachricht finden",
"Search Agents": "Agenten suchen",
"Find Conversation": "Unterhaltung finden",
"Create a new conversation with a specific Agent by ID.": "Erstellen Sie eine neue Konversation mit einem bestimmten Agenten per ID.",
"Send a message to an existing conversation with an agent.": "Senden Sie eine Nachricht an eine bestehende Unterhaltung mit einem Agenten.",
"Searches for a specific message by ID (or searches text within messages) inside a conversation.": "Sucht nach einer bestimmten Nachricht mittels ID (oder durchsucht Text innerhalb von Nachrichten) innerhalb einer Unterhaltung.",
"Find agents by name or ID using search filters.": "Finden Sie Agenten nach Namen oder ID mit Suchfiltern.",
"Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).": "Sucht eine bestehende Konversation nach Agent-ID (optional nach Konversations-ID oder Name).",
"Agent": "Agent",
"Conversation Type": "Konversationstyp",
"Conversation": "Unterhaltung",
"Agent Mode": "Agenten-Modus",
"Message": "Nachricht",
"Memory Context": "Speicherkontext",
"Search Term": "Suchbegriff",
"Agent Name": "Agentenname",
"Agent ID": "Agenten-ID",
"Conversation ID": "Konversations-ID",
"Conversation Name,tittle or ID": "Konversationsname, Titel oder ID",
"Select an AgentX agent": "AgentX-Agent auswählen",
"Choose the type of conversation": "Wählen Sie die Art der Unterhaltung",
"Select a conversation for the chosen Agent": "Wählen Sie eine Unterhaltung für den ausgewählten Agenten",
"Choose how the agent should respond": "Wählen Sie, wie der Agent antworten soll",
"The message you want to send to the agent.": "Die Nachricht, die Sie an den Agenten senden möchten.",
"Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.": "Anzahl früherer Nachrichten, die aufgenommen werden sollen. 0 = so viel wie möglich, 1 = nur letzte Nachricht, etc.",
"Text to search for in message content. Leave blank if searching by Message ID.": "Text für die Suche im Nachrichteninhalt. Leer lassen, wenn nach Nachrichten-ID gesucht wird.",
"Search by agent name (partial matches allowed).": "Suche nach Agentennamen (partielle Übereinstimmung erlaubt).",
"Search by exact Agent ID.": "Suche nach exakter Agenten-ID.",
"Search by exact Conversation ID.": "Suche nach exakter Konversations-ID.",
"Search conversation by its name (derived from the first message).": "Suche die Konversation nach ihrem Namen (abgeleitet von der ersten Nachricht).",
"Chat": "Chat",
"Search": "Suche",
"Ecommerce": "E-Commerce",
"New Agent": "Neuer Agent",
"New Conversation": "Neue Unterhaltung",
"Triggers when a new AgentX agent is created.": "Wird ausgelöst, wenn ein neuer AgentX-Agent erstellt wird.",
"Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled.": "Wird ausgelöst, wenn eine neue Unterhaltung mit einem bestimmten Agent beginnt. Erkennt nur Unterhaltungen, die erstellt wurden, nachdem der Trigger aktiviert ist."
}

View File

@@ -0,0 +1,42 @@
{
"**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n": "**Introduce tu clave API de Agente X**\n---\n### Cómo obtener tu clave API\n1. Visita [Agente X](https://www.agentx.so/) e inicia sesión.\n2. Haz clic en tu avatar (esquina inferior izquierda).\n3. Copia tu clave API desde la ventana emergente.\n4. Pégala aquí.\n\n",
"Create Conversation With Single Agent": "Crear conversación con un agente único",
"Send Message to Existing Conversation": "Enviar mensaje a la conversación existente",
"Find Message": "Buscar mensaje",
"Search Agents": "Buscar agentes",
"Find Conversation": "Encontrar conversación",
"Create a new conversation with a specific Agent by ID.": "Crear una nueva conversación con un agente específico por ID.",
"Send a message to an existing conversation with an agent.": "Enviar un mensaje a una conversación existente con un agente.",
"Searches for a specific message by ID (or searches text within messages) inside a conversation.": "Busca un mensaje específico por ID (o busca texto dentro de los mensajes) dentro de una conversación.",
"Find agents by name or ID using search filters.": "Encuentre agentes por nombre o ID usando filtros de búsqueda.",
"Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).": "Busca una conversación existente por Agente ID (opcionalmente por ID de conversación o Nombre).",
"Agent": "Agente",
"Conversation Type": "Tipo de conversación",
"Conversation": "Conversación",
"Agent Mode": "Modo agente",
"Message": "Mensaje",
"Memory Context": "Contexto de memoria",
"Search Term": "Buscar término",
"Agent Name": "Nombre del agente",
"Agent ID": "ID del agente",
"Conversation ID": "ID de conversación",
"Conversation Name,tittle or ID": "Nombre de la conversación, título o ID",
"Select an AgentX agent": "Seleccione un agente AgentX",
"Choose the type of conversation": "Elija el tipo de conversación",
"Select a conversation for the chosen Agent": "Seleccione una conversación para el agente seleccionado",
"Choose how the agent should respond": "Elija cómo debe responder el agente",
"The message you want to send to the agent.": "El mensaje que desea enviar al agente.",
"Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.": "Número de mensajes anteriores a incluir. 0 = en la medida de lo posible, 1 = solo el último mensaje, etc.",
"Text to search for in message content. Leave blank if searching by Message ID.": "Texto para buscar en el contenido del mensaje. Dejar en blanco si se busca por ID del mensaje.",
"Search by agent name (partial matches allowed).": "Buscar por nombre del agente (se permiten coincidencias parciales).",
"Search by exact Agent ID.": "Buscar por el agente exacto ID.",
"Search by exact Conversation ID.": "Buscar por ID de conversación exacta.",
"Search conversation by its name (derived from the first message).": "Buscar conversación por su nombre (derivado del primer mensaje).",
"Chat": "Chatear",
"Search": "Buscar",
"Ecommerce": "Comercio electrónico",
"New Agent": "Nuevo agente",
"New Conversation": "Nueva conversación",
"Triggers when a new AgentX agent is created.": "Dispara cuando se crea un nuevo agente, Agente X.",
"Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled.": "Dispara cuando una nueva conversación comienza con un agente específico. Sólo detecta las conversaciones creadas después de que el disparador esté activado."
}

View File

@@ -0,0 +1,42 @@
{
"**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n": "**Entrez votre clé API AgentX**\n---\n### Comment obtenir votre clé API\n1. Visitez [AgentX](https://www.agentx.so/) et connectez-vous.\n2. Cliquez sur votre avatar (en bas à gauche).\n3. Copiez votre clé API à partir de la fenêtre popup.\n4. Collez-la ici.\n\n",
"Create Conversation With Single Agent": "Créer une conversation avec un seul agent",
"Send Message to Existing Conversation": "Envoyer un message à une conversation existante",
"Find Message": "Rechercher un message",
"Search Agents": "Rechercher des agents",
"Find Conversation": "Trouver une conversation",
"Create a new conversation with a specific Agent by ID.": "Créer une nouvelle conversation avec un agent spécifique par ID.",
"Send a message to an existing conversation with an agent.": "Envoyer un message à une conversation existante avec un agent.",
"Searches for a specific message by ID (or searches text within messages) inside a conversation.": "Recherche un message spécifique par ID (ou recherche du texte dans les messages) dans une conversation.",
"Find agents by name or ID using search filters.": "Trouver des agents par nom ou ID à l'aide de filtres de recherche.",
"Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).": "Recherche une conversation existante par ID d'agent (éventuellement par ID de conversation ou Nom).",
"Agent": "Agent",
"Conversation Type": "Type de conversation",
"Conversation": "Conversation",
"Agent Mode": "Mode Agent",
"Message": "Message",
"Memory Context": "Contexte de la mémoire",
"Search Term": "Terme de recherche",
"Agent Name": "Nom de l'agent",
"Agent ID": "ID de l'agent",
"Conversation ID": "ID de la conversation",
"Conversation Name,tittle or ID": "Nom de la conversation,tittle ou ID",
"Select an AgentX agent": "Sélectionnez un agent AgentX",
"Choose the type of conversation": "Choisissez le type de conversation",
"Select a conversation for the chosen Agent": "Sélectionnez une conversation pour l'agent choisi",
"Choose how the agent should respond": "Choisissez comment l'agent doit répondre",
"The message you want to send to the agent.": "Le message que vous voulez envoyer à l'agent.",
"Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.": "Nombre de messages précédents à inclure. 0 = autant que possible, 1 = seulement le dernier message, etc.",
"Text to search for in message content. Leave blank if searching by Message ID.": "Texte à rechercher dans le contenu du message. Laissez vide si vous recherchez par ID de message.",
"Search by agent name (partial matches allowed).": "Recherche par nom d'agent (correspondances partielles autorisées).",
"Search by exact Agent ID.": "Recherche par ID d'agent exact.",
"Search by exact Conversation ID.": "Rechercher par ID de conversation exact.",
"Search conversation by its name (derived from the first message).": "Rechercher la conversation par son nom (dérivé du premier message).",
"Chat": "Discuter",
"Search": "Rechercher",
"Ecommerce": "E-commerce",
"New Agent": "Nouvel Agent",
"New Conversation": "Nouvelle conversation",
"Triggers when a new AgentX agent is created.": "Déclenche lorsqu'un nouvel agent AgentX est créé.",
"Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled.": "Déclenche quand une nouvelle conversation commence avec un agent spécifique. Ne détecte que les conversations créées après que le déclencheur soit activé."
}

View File

@@ -0,0 +1,42 @@
{
"**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n": "**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n",
"Create Conversation With Single Agent": "単一のエージェントで会話を作成",
"Send Message to Existing Conversation": "既存の会話にメッセージを送信",
"Find Message": "メッセージを検索",
"Search Agents": "エージェントを検索",
"Find Conversation": "会話を検索",
"Create a new conversation with a specific Agent by ID.": "ID によって特定のエージェントと新しい会話を作成します。",
"Send a message to an existing conversation with an agent.": "エージェントと既存の会話にメッセージを送信します。",
"Searches for a specific message by ID (or searches text within messages) inside a conversation.": "会話内で、ID (またはメッセージ内のテキスト検索) で特定のメッセージを検索します。",
"Find agents by name or ID using search filters.": "検索フィルターを使用して名前またはIDでエージェントを検索します。",
"Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).": "エージェントIDで既存の会話を検索します(会話IDまたは名前)。",
"Agent": "エージェント",
"Conversation Type": "会話の種類",
"Conversation": "会話",
"Agent Mode": "エージェントモード",
"Message": "メッセージ",
"Memory Context": "メモリのコンテキスト",
"Search Term": "検索用語",
"Agent Name": "エージェント名",
"Agent ID": "エージェントID",
"Conversation ID": "会話ID",
"Conversation Name,tittle or ID": "会話名、脆弱性またはID",
"Select an AgentX agent": "AgentX エージェントを選択",
"Choose the type of conversation": "会話の種類を選択",
"Select a conversation for the chosen Agent": "選択したエージェントの会話を選択します",
"Choose how the agent should respond": "エージェントの応答方法を選択してください",
"The message you want to send to the agent.": "エージェントに送信したいメッセージ。",
"Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.": "含める前のメッセージ数。0 = 可能な限り、1 = 最後のメッセージのみなど。",
"Text to search for in message content. Leave blank if searching by Message ID.": "メッセージ内の内容を検索するテキスト。メッセージIDで検索する場合は空白のままにします。",
"Search by agent name (partial matches allowed).": "エージェント名で検索 (部分一致が許可されています)",
"Search by exact Agent ID.": "エージェントIDで検索します。",
"Search by exact Conversation ID.": "正確な会話IDで検索",
"Search conversation by its name (derived from the first message).": "最初のメッセージから派生した名前で会話を検索します。",
"Chat": "チャット",
"Search": "検索",
"Ecommerce": "Eコマースformat@@0",
"New Agent": "新しいエージェント",
"New Conversation": "新しい会話",
"Triggers when a new AgentX agent is created.": "新しい AgentX エージェントが作成されたときにトリガーします。",
"Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled.": "特定のエージェントで新しい会話が始まるとトリガーされます。トリガーが有効になってから作成された会話のみ検出されます。"
}

View File

@@ -0,0 +1,42 @@
{
"**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n": "**Voer je Agent X API Key**\n---\n### Hoe je API key\n1 te verkrijgen. Bezoek [AgentX](https://www.agentx.so/) en log in.\n2. Klik op uw avatar (linkerbeneden).\n3. Kopieer uw API-sleutel uit het pop-upvenster.\n4. Plak deze hier.\n\n",
"Create Conversation With Single Agent": "Gesprek maken met één agent",
"Send Message to Existing Conversation": "Bericht verzenden naar bestaande conversatie",
"Find Message": "Zoek bericht",
"Search Agents": "Agents zoeken",
"Find Conversation": "Gesprek zoeken",
"Create a new conversation with a specific Agent by ID.": "Maak een nieuw gesprek met een specifieke agent via ID.",
"Send a message to an existing conversation with an agent.": "Stuur een bericht naar een bestaand gesprek met een agent.",
"Searches for a specific message by ID (or searches text within messages) inside a conversation.": "Zoekt naar een specifiek bericht door ID (of zoekt tekst binnen berichten) binnen een gesprek.",
"Find agents by name or ID using search filters.": "Zoek agents op naam of ID met behulp van zoekfilters.",
"Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).": "Ziet een bestaand gesprek op door Agent ID ((optioneel) op gespreksID of naam).",
"Agent": "Agent",
"Conversation Type": "Soort gesprek",
"Conversation": "Gesprek",
"Agent Mode": "Agent modus",
"Message": "bericht",
"Memory Context": "Geheugen Context",
"Search Term": "Zoek term",
"Agent Name": "Agent naam",
"Agent ID": "Agent ID",
"Conversation ID": "Conversatie ID",
"Conversation Name,tittle or ID": "Gespreksnaam, tittle of ID",
"Select an AgentX agent": "Selecteer een agent",
"Choose the type of conversation": "Kies het type gesprek",
"Select a conversation for the chosen Agent": "Selecteer een gesprek voor de gekozen agent",
"Choose how the agent should respond": "Kies hoe de agent moet reageren",
"The message you want to send to the agent.": "Het bericht dat u naar de agent wilt sturen.",
"Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.": "Aantal vorige berichten om op te nemen. 0 = zo veel als mogelijk, 1 = alleen laatste bericht, etc.",
"Text to search for in message content. Leave blank if searching by Message ID.": "Tekst om te zoeken in berichtinhoud. Laat leeg bij het zoeken op bericht-ID.",
"Search by agent name (partial matches allowed).": "Zoeken op medewerkernaam (gedeeltelijke overeenkomsten toegestaan).",
"Search by exact Agent ID.": "Zoek op exacte agent ID.",
"Search by exact Conversation ID.": "Zoek op exacte conversatie-ID.",
"Search conversation by its name (derived from the first message).": "Zoek gesprek op zijn naam (afgeleid van het eerste bericht).",
"Chat": "Chatten",
"Search": "Zoeken",
"Ecommerce": "E-commerce",
"New Agent": "Nieuwe medewerker",
"New Conversation": "Nieuwe conversatie",
"Triggers when a new AgentX agent is created.": "Triggert wanneer een nieuwe Agent is aangemaakt.",
"Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled.": "Triggert wanneer een nieuw gesprek begint met een specifieke agent. detecteert alleen conversaties gemaakt nadat de trigger is ingeschakeld."
}

View File

@@ -0,0 +1,42 @@
{
"**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n": "**Digite sua chave de API AgentX**\n---\n### Como obter a sua chave de API\n1. Visite [AgentX](https://www.agentx.so/) e entre na sua conta.\n2. Clique em seu avatar (canto inferior esquerdo).\n3. Copie sua chave de API da janela popup.\n4. Cole aqui.\n\n",
"Create Conversation With Single Agent": "Criar conversa com um único agente",
"Send Message to Existing Conversation": "Enviar Mensagem para Conversa Existente",
"Find Message": "Encontrar mensagem",
"Search Agents": "Procurar agentes",
"Find Conversation": "Localizar Conversa",
"Create a new conversation with a specific Agent by ID.": "Criar uma nova conversa com um agente específico por ID.",
"Send a message to an existing conversation with an agent.": "Enviar uma mensagem para uma conversa existente com um agente.",
"Searches for a specific message by ID (or searches text within messages) inside a conversation.": "Procura uma mensagem específica por ID (ou busca texto dentro das mensagens) dentro de uma conversa.",
"Find agents by name or ID using search filters.": "Encontrar agentes por nome ou ID usando filtros de pesquisa.",
"Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).": "Procura uma conversa existente por agente ID (opcionalmente por ID de conversa ou Nome).",
"Agent": "Representante",
"Conversation Type": "Tipo de conversa",
"Conversation": "Conversa",
"Agent Mode": "Modo representante",
"Message": "mensagem",
"Memory Context": "Contexto de memória",
"Search Term": "Termo para pesquisa",
"Agent Name": "Nome do Representante",
"Agent ID": "ID representante",
"Conversation ID": "ID da conversa",
"Conversation Name,tittle or ID": "Nome da conversa,tittle ou ID",
"Select an AgentX agent": "Selecione um agente AgentX",
"Choose the type of conversation": "Escolha o tipo de conversa",
"Select a conversation for the chosen Agent": "Selecione uma conversa para o agente escolhido",
"Choose how the agent should respond": "Escolha como o agente deve responder",
"The message you want to send to the agent.": "A mensagem que deseja enviar ao agente",
"Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.": "Número de mensagens anteriores para incluir. 0 = o máximo possível, 1 = apenas a última mensagem, etc.",
"Text to search for in message content. Leave blank if searching by Message ID.": "Texto para procurar no conteúdo da mensagem. Deixe em branco se pesquisar por ID de mensagem.",
"Search by agent name (partial matches allowed).": "Pesquisa por nome do agente (correspondências parciais permitidas).",
"Search by exact Agent ID.": "Pesquisar por ID exata do Agente.",
"Search by exact Conversation ID.": "Pesquisar por ID exato de conversação.",
"Search conversation by its name (derived from the first message).": "Buscar conversa por seu nome (derivada da primeira mensagem).",
"Chat": "Bate-papo",
"Search": "Pesquisar",
"Ecommerce": "Ecommerce",
"New Agent": "Novo Agente",
"New Conversation": "Nova conversa",
"Triggers when a new AgentX agent is created.": "Dispara quando um novo agente AgentX for criado.",
"Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled.": "Aciona quando uma nova conversa começa com um agente específico. Detecta conversas criadas apenas após a ativação ser ativada."
}

View File

@@ -0,0 +1,42 @@
{
"**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n": "**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n",
"Create Conversation With Single Agent": "Create Conversation With Single Agent",
"Send Message to Existing Conversation": "Send Message to Existing Conversation",
"Find Message": "Find Message",
"Search Agents": "Search Agents",
"Find Conversation": "Find Conversation",
"Create a new conversation with a specific Agent by ID.": "Create a new conversation with a specific Agent by ID.",
"Send a message to an existing conversation with an agent.": "Send a message to an existing conversation with an agent.",
"Searches for a specific message by ID (or searches text within messages) inside a conversation.": "Searches for a specific message by ID (or searches text within messages) inside a conversation.",
"Find agents by name or ID using search filters.": "Find agents by name or ID using search filters.",
"Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).": "Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).",
"Agent": "Agent",
"Conversation Type": "Conversation Type",
"Conversation": "Conversation",
"Agent Mode": "Agent Mode",
"Message": "Message",
"Memory Context": "Memory Context",
"Search Term": "Search Term",
"Agent Name": "Agent Name",
"Agent ID": "Agent ID",
"Conversation ID": "Conversation ID",
"Conversation Name,tittle or ID": "Conversation Name,tittle or ID",
"Select an AgentX agent": "Select an AgentX agent",
"Choose the type of conversation": "Choose the type of conversation",
"Select a conversation for the chosen Agent": "Select a conversation for the chosen Agent",
"Choose how the agent should respond": "Choose how the agent should respond",
"The message you want to send to the agent.": "The message you want to send to the agent.",
"Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.": "Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.",
"Text to search for in message content. Leave blank if searching by Message ID.": "Text to search for in message content. Leave blank if searching by Message ID.",
"Search by agent name (partial matches allowed).": "Search by agent name (partial matches allowed).",
"Search by exact Agent ID.": "Search by exact Agent ID.",
"Search by exact Conversation ID.": "Search by exact Conversation ID.",
"Search conversation by its name (derived from the first message).": "Search conversation by its name (derived from the first message).",
"Chat": "Chat",
"Search": "Search",
"Ecommerce": "Ecommerce",
"New Agent": "New Agent",
"New Conversation": "New Conversation",
"Triggers when a new AgentX agent is created.": "Triggers when a new AgentX agent is created.",
"Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled.": "Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled."
}

View File

@@ -0,0 +1,42 @@
{
"**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n": "**Enter your AgentX API Key**\n---\n### How to obtain your API key\n1. Visit [AgentX](https://www.agentx.so/) and log in.\n2. Click on your avatar (bottom-left corner).\n3. Copy your API Key from the popup window.\n4. Paste it here.\n\n",
"Create Conversation With Single Agent": "Create Conversation With Single Agent",
"Send Message to Existing Conversation": "Send Message to Existing Conversation",
"Find Message": "Find Message",
"Search Agents": "Search Agents",
"Find Conversation": "Find Conversation",
"Create a new conversation with a specific Agent by ID.": "Create a new conversation with a specific Agent by ID.",
"Send a message to an existing conversation with an agent.": "Send a message to an existing conversation with an agent.",
"Searches for a specific message by ID (or searches text within messages) inside a conversation.": "Searches for a specific message by ID (or searches text within messages) inside a conversation.",
"Find agents by name or ID using search filters.": "Find agents by name or ID using search filters.",
"Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).": "Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).",
"Agent": "Agent",
"Conversation Type": "Conversation Type",
"Conversation": "Conversation",
"Agent Mode": "Agent Mode",
"Message": "Message",
"Memory Context": "Memory Context",
"Search Term": "Search Term",
"Agent Name": "Agent Name",
"Agent ID": "Agent ID",
"Conversation ID": "Conversation ID",
"Conversation Name,tittle or ID": "Conversation Name,tittle or ID",
"Select an AgentX agent": "Select an AgentX agent",
"Choose the type of conversation": "Choose the type of conversation",
"Select a conversation for the chosen Agent": "Select a conversation for the chosen Agent",
"Choose how the agent should respond": "Choose how the agent should respond",
"The message you want to send to the agent.": "The message you want to send to the agent.",
"Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.": "Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.",
"Text to search for in message content. Leave blank if searching by Message ID.": "Text to search for in message content. Leave blank if searching by Message ID.",
"Search by agent name (partial matches allowed).": "Search by agent name (partial matches allowed).",
"Search by exact Agent ID.": "Search by exact Agent ID.",
"Search by exact Conversation ID.": "Search by exact Conversation ID.",
"Search conversation by its name (derived from the first message).": "Search conversation by its name (derived from the first message).",
"Chat": "Chat",
"Search": "搜索",
"Ecommerce": "Ecommerce",
"New Agent": "New Agent",
"New Conversation": "New Conversation",
"Triggers when a new AgentX agent is created.": "Triggers when a new AgentX agent is created.",
"Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled.": "Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled."
}

View File

@@ -0,0 +1,23 @@
import { createPiece, PieceAuth } from "@activepieces/pieces-framework";
import { createConversationWithSingleAgent } from "./lib/actions/create-conversation-with-single-agent";
import { sendMessageToExistingConversation } from "./lib/actions/send-message-to-existing-conversation";
import { findMessage } from "./lib/actions/find-message";
import { searchAgents } from "./lib/actions/search-agents";
import { findConversation } from "./lib/actions/find-conversation";
import { newAgent } from "./lib/triggers/new-agent";
import { newConversation } from "./lib/triggers/new-conversation";
import { AgentXAuth } from "./lib/common/auth";
import { PieceCategory } from "@activepieces/shared";
export const agentx = createPiece({
displayName: "AgentX",
auth: AgentXAuth,
minimumSupportedRelease: '0.36.1',
categories:[PieceCategory.ARTIFICIAL_INTELLIGENCE],
logoUrl: "https://cdn.activepieces.com/pieces/agentx.png",
authors: ['Niket2035','sanket-a11y'],
actions: [createConversationWithSingleAgent, sendMessageToExistingConversation, findMessage, searchAgents,findConversation],
triggers: [newAgent,newConversation],
});

View File

@@ -0,0 +1,43 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { AgentXAuth } from '../common/auth';
import { AgentIdDropdown } from '../common/dropdown';
import { makeRequest } from '../common/client';
import { HttpMethod } from '@activepieces/pieces-common';
export const createConversationWithSingleAgent = createAction({
auth: AgentXAuth,
name: 'createConversationWithSingleAgent',
displayName: 'Create Conversation With Single Agent',
description: 'Create a new conversation with a specific Agent by ID.',
props: {
agentId: AgentIdDropdown,
type: Property.StaticDropdown({
displayName: "Conversation Type",
description: "Choose the type of conversation",
required: true,
options: {
disabled: false,
options: [
{ label: "Chat", value: "chat" },
{ label: "Search", value: "search" },
{ label: "Ecommerce", value: "ecommerce" },
],
},
}),
},
async run({ auth, propsValue }) {
const { agentId, type } = propsValue;
const response = await makeRequest(
auth.secret_text,
HttpMethod.POST,
`/agents/${agentId}/conversations/new`,
{
type
}
)
return response;
},
});

View File

@@ -0,0 +1,66 @@
import { createAction, Property } from "@activepieces/pieces-framework";
import { makeRequest } from "../common/client";
import { AgentXAuth } from "../common/auth";
import { HttpMethod } from "@activepieces/pieces-common";
import { AgentIdDropdown, ConversationIdDropdown } from "../common/dropdown";
export const findConversation = createAction({
auth: AgentXAuth,
name: "find_conversation",
displayName: "Find Conversation",
description:
"Looks up an existing conversation by Agent ID (optionally by conversation ID or Name).",
props: {
agentId: AgentIdDropdown,
conversationId: Property.ShortText({
displayName: "Conversation ID",
description: "Search by exact Conversation ID.",
required: false,
}),
conversationName: Property.ShortText({
displayName: "Conversation Name,tittle or ID",
description:
"Search conversation by its name (derived from the first message).",
required: false,
}),
},
async run({ auth, propsValue }) {
const { agentId, conversationId, conversationName } = propsValue;
const addName = (conversation: any) => ({
...conversation,
name:
conversation.messages?.[0]?.text?.slice(0, 30) ||
`Conversation ${conversation._id || conversation.id}`,
});
const conversations = await makeRequest(
auth.secret_text,
HttpMethod.GET,
`/agents/${agentId}/conversations`
);
if (!Array.isArray(conversations)) {
throw new Error(
"Unexpected response from AgentX API: expected an array of conversations."
);
}
const conversationsWithName = conversations.map(addName);
if (conversationName) {
return conversationsWithName.filter((c) =>
c.name.toLowerCase().includes(conversationName.toLowerCase())
);
}
if (conversationId) {
return conversationsWithName.filter(
(c) => c.id === conversationId || c._id === conversationId
);
}
return conversationsWithName;
},
});

View File

@@ -0,0 +1,59 @@
import { createAction, Property } from "@activepieces/pieces-framework";
import { HttpMethod } from "@activepieces/pieces-common";
import { makeRequest } from "../common/client";
import { AgentXAuth } from "../common/auth";
import { AgentIdDropdown, ConversationIdDropdown } from "../common/dropdown";
type Message = {
id: string;
text?: string;
[key: string]: unknown;
};
type ConversationDetail = {
id: string;
messages: Message[];
[key: string]: unknown;
};
export const findMessage = createAction({
auth: AgentXAuth,
name: "find_message",
displayName: "Find Message",
description:
"Searches for a specific message by ID (or searches text within messages) inside a conversation.",
props: {
agentId: AgentIdDropdown,
conversationId: ConversationIdDropdown,
searchTerm: Property.ShortText({
displayName: "Search Term",
description:
"Text to search for in message content. Leave blank if searching by Message ID.",
required: false,
}),
},
async run({ auth, propsValue }) {
const { agentId, conversationId, searchTerm } = propsValue;
const conversation = await makeRequest(
auth.secret_text,
HttpMethod.GET,
`/agents/${agentId}/conversations/${conversationId}`
) as ConversationDetail;
const allMessages = conversation?.messages || [];
if (!searchTerm) {
return allMessages;
}
const lowerCaseSearchTerm = searchTerm.toLowerCase();
return allMessages.filter(
(m: any) =>
(m.text && m.text.toLowerCase().includes(lowerCaseSearchTerm)) ||
(m.content && m.content.toLowerCase().includes(lowerCaseSearchTerm))
);
},
});

View File

@@ -0,0 +1,49 @@
import { createAction, Property } from "@activepieces/pieces-framework";
import { makeRequest } from "../common/client";
import { AgentXAuth } from "../common/auth";
import { HttpMethod } from "@activepieces/pieces-common";
export const searchAgents = createAction({
auth: AgentXAuth,
name: "search_agents",
displayName: "Search Agents",
description: "Find agents by name or ID using search filters.",
props: {
name: Property.ShortText({
displayName: "Agent Name",
description: "Search by agent name (partial matches allowed).",
required: false,
}),
id: Property.ShortText({
displayName: "Agent ID",
description: "Search by exact Agent ID.",
required: false,
}),
},
async run({ auth, propsValue }) {
const { name, id } = propsValue;
const agents = await makeRequest(auth.secret_text, HttpMethod.GET, "/agents");
if (!Array.isArray(agents)) {
throw new Error("Unexpected response from AgentX API: expected an array of agents.");
}
const filtered = agents.filter((agent: any) => {
let matches = true;
if (id) {
matches = matches && agent._id === id;
}
if (name && agent.name) {
matches = matches && agent.name.toLowerCase().includes(name.toLowerCase());
}
return matches;
});
return filtered;
},
});

View File

@@ -0,0 +1,56 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { AgentXAuth } from '../common/auth';
import { makeRequest } from '../common/client';
import { HttpMethod } from '@activepieces/pieces-common';
import { ConversationIdDropdown } from '../common/dropdown';
import { AgentIdDropdown } from '../common/dropdown';
export const sendMessageToExistingConversation = createAction({
auth: AgentXAuth,
name: 'sendMessageToExistingConversation',
displayName: 'Send Message to Existing Conversation',
description: 'Send a message to an existing conversation with an agent.',
props: {
agentId: AgentIdDropdown,
conversationId: ConversationIdDropdown,
agentMode: Property.StaticDropdown({
displayName: "Agent Mode",
description: "Choose how the agent should respond",
required: true,
options: {
disabled: false,
options: [
{ label: "Chat", value: "chat" },
{ label: "Search", value: "search" },
],
},
}),
message: Property.LongText({
displayName: "Message",
description: "The message you want to send to the agent.",
required: true,
}),
context: Property.Number({
displayName: "Memory Context",
description:
"Number of previous messages to include. 0 = as much as possible, 1 = only last message, etc.",
required: false,
}),
},
async run({ auth, propsValue }) {
const { conversationId, agentMode, message, context } = propsValue;
const response = await makeRequest(
auth.secret_text,
HttpMethod.POST,
`/conversations/${conversationId}/message`,
{
conversationId,
agentMode,
message,
context,
}
)
return response;
},
});

View File

@@ -0,0 +1,36 @@
import { PieceAuth } from "@activepieces/pieces-framework";
import { makeRequest } from "./client";
import { HttpMethod } from "@activepieces/pieces-common";
export const AgentXAuth = PieceAuth.SecretText({
displayName: 'AgentX API Key',
description: `**Enter your AgentX API Key**
---
### How to obtain your API key
1. Visit [AgentX](https://www.agentx.so/) and log in.
2. Click on your avatar (bottom-left corner).
3. Copy your API Key from the popup window.
4. Paste it here.
`,
required: true,
validate: async ({ auth }) => {
if (auth) {
try {
await makeRequest(auth as string, HttpMethod.GET, "/agents");
return {
valid: true,
};
} catch (error) {
return {
valid: false,
error: "Invalid API Key or authentication failed.",
};
}
}
return {
valid: false,
error: "API Key is required.",
};
},
});

View File

@@ -0,0 +1,26 @@
import { HttpMethod, httpClient } from "@activepieces/pieces-common";
export const BASE_URL = `https://api.agentx.so/api/v1/access`;
export async function makeRequest(
apiKey: string,
method: HttpMethod,
path: string,
body?: unknown
) {
try {
const response = await httpClient.sendRequest({
method,
url: `${BASE_URL}${path}`,
headers: {
"x-api-key": apiKey,
"Content-Type": "application/json",
Accept: "application/json",
},
body,
});
return response.body;
} catch (error: any) {
throw new Error(`AgentX API error: ${error.message || String(error)}`);
}
}

View File

@@ -0,0 +1,86 @@
import { Property } from "@activepieces/pieces-framework";
import { makeRequest } from "./client";
import { HttpMethod } from "@activepieces/pieces-common";
import { AgentXAuth } from "./auth";
export const AgentIdDropdown = Property.Dropdown<string,true,typeof AgentXAuth>({
auth: AgentXAuth,
displayName: "Agent",
description: "Select an AgentX agent",
required: true, // ensures the value is always a string, not undefined
refreshers: ["auth"],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: "Please connect your AgentX account first",
options: [],
};
}
try {
const agents = await makeRequest(auth.secret_text, HttpMethod.GET, "/agents");
return {
disabled: false,
options: agents.map((agent: any) => ({
label: agent.name || `Agent ${agent.id}`,
value: agent._id, // must be string
})),
};
} catch (error: any) {
return {
disabled: true,
placeholder: `Failed to fetch agents: ${error.message || error}`,
options: [],
};
}
},
});
export const ConversationIdDropdown = Property.Dropdown({
auth: AgentXAuth,
displayName: "Conversation",
description: "Select a conversation for the chosen Agent",
required: false,
refreshers: ["auth", "agentId"],
options: async ({ auth, agentId }) => {
if (!auth) {
return {
disabled: true,
placeholder: "Please connect your AgentX account first",
options: [],
};
}
if (!agentId) {
return {
disabled: true,
placeholder: "Select an Agent first",
options: [],
};
}
try {
const conversations = await makeRequest(
auth.secret_text,
HttpMethod.GET,
`/agents/${agentId}/conversations`
);
return {
disabled: false,
options: conversations.map((c: any) => ({
label: c.title || `Conversation ${c._id}`,
value: c._id,
})),
};
} catch (error: any) {
return {
disabled: true,
placeholder: `Failed to fetch conversations: ${error.message || error}`,
options: [],
};
}
},
});

View File

@@ -0,0 +1,63 @@
import {createTrigger,TriggerStrategy, AppConnectionValueForAuthProperty,} from "@activepieces/pieces-framework";
import {DedupeStrategy,Polling,pollingHelper,} from "@activepieces/pieces-common";
import dayjs from "dayjs";
import { makeRequest } from "../common/client";
import { HttpMethod } from "@activepieces/pieces-common";
import { AgentXAuth } from "../common/auth";
type Agent = {
id: string;
name?: string;
createdAt: string;
};
const polling: Polling<
AppConnectionValueForAuthProperty<typeof AgentXAuth>,
Record<string, never>
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth }) => {
const agents = (await makeRequest(auth.secret_text, HttpMethod.GET, "/agents")) as Agent[];
const sortedAgents = agents.sort((a, b) =>
dayjs(b.createdAt).valueOf() - dayjs(a.createdAt).valueOf()
);
return sortedAgents.map((agent) => ({
epochMilliSeconds: dayjs(agent.createdAt).valueOf(),
data: agent,
}));
},
};
export const newAgent = createTrigger({
auth: AgentXAuth,
name: "new_agent",
displayName: "New Agent",
description: "Triggers when a new AgentX agent is created.",
props: {},
sampleData: {
_id: "agt_1234567890abcdef",
name: "Customer Support Bot",
created_at: "2025-09-08T10:00:00Z",
},
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);
},
});

View File

@@ -0,0 +1,90 @@
import {
createTrigger,
TriggerStrategy,
AppConnectionValueForAuthProperty,
} from "@activepieces/pieces-framework";
import {
DedupeStrategy,
Polling,
pollingHelper,
HttpMethod,
} from "@activepieces/pieces-common";
import dayjs from "dayjs";
import { makeRequest } from "../common/client";
import { AgentXAuth } from "../common/auth";
import { AgentIdDropdown } from "../common/dropdown";
type Conversation = {
_id: string;
type?: string;
createdAt: string;
};
const polling: Polling<
AppConnectionValueForAuthProperty<typeof AgentXAuth>,
{ agentId?: string }
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue }) => {
const { agentId } = propsValue;
if (!agentId) {
return [];
}
try {
const conversations = (await makeRequest(
auth.secret_text,
HttpMethod.GET,
`/agents/${agentId}/conversations`
)) as Conversation[];
const sortedConversations = conversations.sort((a, b) =>
dayjs(b.createdAt).valueOf() - dayjs(a.createdAt).valueOf()
);
return sortedConversations.map((conv) => ({
epochMilliSeconds: dayjs(conv.createdAt).valueOf(),
data: conv,
}));
} catch (error) {
console.error(`Error fetching conversations for agent ${agentId}:`, error);
throw error;
}
},
};
export const newConversation = createTrigger({
auth: AgentXAuth,
name: "new_conversation",
displayName: "New Conversation",
description: "Triggers when a new conversation begins with a specific Agent. Only detects conversations created after the trigger is enabled.",
type: TriggerStrategy.POLLING,
props: {
agentId: AgentIdDropdown,
},
sampleData: {
id: "conv_1234567890abcdef",
type: "chat",
created_at: "2025-09-08T11:45:00Z",
},
async test(context) {
return await pollingHelper.test(polling, context);
},
async onEnable(context) {
await pollingHelper.onEnable(polling, context);
},
async onDisable(context) {
await pollingHelper.onDisable(polling, context);
},
async run(context) {
return await pollingHelper.poll(polling, context);
},
});