diff --git a/apps/docs/components/icons.tsx b/apps/docs/components/icons.tsx index 27a3c5119d..b85680a25b 100644 --- a/apps/docs/components/icons.tsx +++ b/apps/docs/components/icons.tsx @@ -3765,12 +3765,16 @@ export function MailgunIcon(props: SVGProps) { return ( - + ) } diff --git a/apps/docs/components/ui/block-info-card.tsx b/apps/docs/components/ui/block-info-card.tsx index 6474f24acc..e54286cc8d 100644 --- a/apps/docs/components/ui/block-info-card.tsx +++ b/apps/docs/components/ui/block-info-card.tsx @@ -24,7 +24,7 @@ export function BlockInfoCard({
{ResolvedIcon ? ( diff --git a/apps/docs/content/docs/de/tools/dynamodb.mdx b/apps/docs/content/docs/de/tools/dynamodb.mdx new file mode 100644 index 0000000000..c189187b99 --- /dev/null +++ b/apps/docs/content/docs/de/tools/dynamodb.mdx @@ -0,0 +1,188 @@ +--- +title: Amazon DynamoDB +description: Verbindung zu Amazon DynamoDB +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon DynamoDB](https://aws.amazon.com/dynamodb/) ist ein vollständig verwalteter NoSQL-Datenbankdienst von AWS, der schnelle und vorhersehbare Leistung mit nahtloser Skalierbarkeit bietet. Mit DynamoDB können Sie beliebige Datenmengen speichern und abrufen und jede Art von Anforderungsverkehr bedienen, ohne dass Sie Hardware oder Infrastruktur verwalten müssen. + +Mit DynamoDB können Sie: + +- **Elemente abrufen**: Elemente in Ihren Tabellen mithilfe von Primärschlüsseln nachschlagen +- **Elemente einfügen**: Elemente in Ihren Tabellen hinzufügen oder ersetzen +- **Elemente abfragen**: Mehrere Elemente mithilfe von Abfragen über Indizes abrufen +- **Tabellen scannen**: Alle oder einen Teil der Daten in einer Tabelle lesen +- **Elemente aktualisieren**: Bestimmte Attribute vorhandener Elemente ändern +- **Elemente löschen**: Datensätze aus Ihren Tabellen entfernen + +In Sim ermöglicht die DynamoDB-Integration Ihren Agenten den sicheren Zugriff auf DynamoDB-Tabellen und deren Manipulation mithilfe von AWS-Anmeldeinformationen. Zu den unterstützten Operationen gehören: + +- **Get**: Ein Element anhand seines Schlüssels abrufen +- **Put**: Elemente einfügen oder überschreiben +- **Query**: Abfragen mit Schlüsselbedingungen und Filtern ausführen +- **Scan**: Mehrere Elemente durch Scannen der Tabelle oder des Index lesen +- **Update**: Bestimmte Attribute eines oder mehrerer Elemente ändern +- **Delete**: Ein Element aus einer Tabelle entfernen + +Diese Integration ermöglicht es Sim-Agenten, Datenverwaltungsaufgaben innerhalb Ihrer DynamoDB-Tabellen programmatisch zu automatisieren, sodass Sie Workflows erstellen können, die skalierbare NoSQL-Daten ohne manuellen Aufwand oder Serververwaltung verwalten, ändern und abrufen. +{/* MANUAL-CONTENT-END */} + +## Nutzungsanweisungen + +Integrieren Sie Amazon DynamoDB in Workflows. Unterstützt Get-, Put-, Query-, Scan-, Update- und Delete-Operationen auf DynamoDB-Tabellen. + +## Tools + +### `dynamodb_get` + +Ein Element aus einer DynamoDB-Tabelle anhand des Primärschlüssels abrufen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel | +| `tableName` | string | Ja | DynamoDB-Tabellenname | +| `key` | object | Ja | Primärschlüssel des abzurufenden Elements | +| `consistentRead` | boolean | Nein | Stark konsistentes Lesen verwenden | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `item` | object | Abgerufenes Element | + +### `dynamodb_put` + +Ein Element in eine DynamoDB-Tabelle einfügen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel | +| `tableName` | string | Ja | DynamoDB-Tabellenname | +| `item` | object | Ja | Element, das in die Tabelle eingefügt werden soll | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `item` | object | Erstelltes Element | + +### `dynamodb_query` + +Abfrage von Elementen aus einer DynamoDB-Tabelle mit Schlüsselbedingungen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel | +| `tableName` | string | Ja | DynamoDB-Tabellenname | +| `keyConditionExpression` | string | Ja | Schlüsselbedingungsausdruck (z.B. "pk = :pk") | +| `filterExpression` | string | Nein | Filterausdruck für Ergebnisse | +| `expressionAttributeNames` | object | Nein | Attributnamenzuordnungen für reservierte Wörter | +| `expressionAttributeValues` | object | Nein | Ausdrucksattributwerte | +| `indexName` | string | Nein | Name des sekundären Index für die Abfrage | +| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Elemente | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `items` | array | Array der zurückgegebenen Elemente | +| `count` | number | Anzahl der zurückgegebenen Elemente | + +### `dynamodb_scan` + +Alle Elemente in einer DynamoDB-Tabelle scannen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel | +| `tableName` | string | Ja | DynamoDB-Tabellenname | +| `filterExpression` | string | Nein | Filterausdruck für Ergebnisse | +| `projectionExpression` | string | Nein | Abzurufende Attribute | +| `expressionAttributeNames` | object | Nein | Attributnamenzuordnungen für reservierte Wörter | +| `expressionAttributeValues` | object | Nein | Ausdrucksattributwerte | +| `limit` | number | Nein | Maximale Anzahl der zurückzugebenden Elemente | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `items` | array | Array der zurückgegebenen Elemente | +| `count` | number | Anzahl der zurückgegebenen Elemente | + +### `dynamodb_update` + +Ein Element in einer DynamoDB-Tabelle aktualisieren + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel | +| `tableName` | string | Ja | Name der DynamoDB-Tabelle | +| `key` | object | Ja | Primärschlüssel des zu aktualisierenden Elements | +| `updateExpression` | string | Ja | Aktualisierungsausdruck (z.B. "SET #name = :name") | +| `expressionAttributeNames` | object | Nein | Attributnamenzuordnungen für reservierte Wörter | +| `expressionAttributeValues` | object | Nein | Ausdrucksattributwerte | +| `conditionExpression` | string | Nein | Bedingung, die erfüllt sein muss, damit die Aktualisierung erfolgreich ist | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `item` | object | Aktualisiertes Element | + +### `dynamodb_delete` + +Ein Element aus einer DynamoDB-Tabelle löschen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel | +| `tableName` | string | Ja | Name der DynamoDB-Tabelle | +| `key` | object | Ja | Primärschlüssel des zu löschenden Elements | +| `conditionExpression` | string | Nein | Bedingung, die erfüllt sein muss, damit das Löschen erfolgreich ist | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | + +## Hinweise + +- Kategorie: `tools` +- Typ: `dynamodb` diff --git a/apps/docs/content/docs/de/tools/mailgun.mdx b/apps/docs/content/docs/de/tools/mailgun.mdx index a1981beed4..901c76277f 100644 --- a/apps/docs/content/docs/de/tools/mailgun.mdx +++ b/apps/docs/content/docs/de/tools/mailgun.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/de/tools/rds.mdx b/apps/docs/content/docs/de/tools/rds.mdx new file mode 100644 index 0000000000..27f23e0005 --- /dev/null +++ b/apps/docs/content/docs/de/tools/rds.mdx @@ -0,0 +1,168 @@ +--- +title: Amazon RDS +description: Verbindung zu Amazon RDS über Data API +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon RDS Aurora Serverless](https://aws.amazon.com/rds/aurora/serverless/) ist eine vollständig verwaltete relationale Datenbank, die automatisch startet, herunterfährt und ihre Kapazität basierend auf den Anforderungen Ihrer Anwendung skaliert. Sie ermöglicht es Ihnen, SQL-Datenbanken in der Cloud zu betreiben, ohne Datenbankserver verwalten zu müssen. + +Mit RDS Aurora Serverless können Sie: + +- **Daten abfragen**: Flexible SQL-Abfragen über Ihre Tabellen ausführen +- **Neue Datensätze einfügen**: Automatisch Daten zu Ihrer Datenbank hinzufügen +- **Bestehende Datensätze aktualisieren**: Daten in Ihren Tabellen mit benutzerdefinierten Filtern ändern +- **Datensätze löschen**: Unerwünschte Daten mit präzisen Kriterien entfernen +- **Raw-SQL ausführen**: Jeden gültigen SQL-Befehl ausführen, der von Aurora unterstützt wird + +In Sim ermöglicht die RDS-Integration Ihren Agenten, sicher und programmatisch mit Amazon Aurora Serverless-Datenbanken zu arbeiten. Zu den unterstützten Operationen gehören: + +- **Abfrage**: SELECT und andere SQL-Abfragen ausführen, um Zeilen aus Ihrer Datenbank abzurufen +- **Einfügen**: Neue Datensätze mit strukturierten Daten in Tabellen einfügen +- **Aktualisieren**: Daten in Zeilen ändern, die Ihren angegebenen Bedingungen entsprechen +- **Löschen**: Datensätze aus einer Tabelle nach benutzerdefinierten Filtern oder Kriterien entfernen +- **Ausführen**: Raw-SQL für fortgeschrittene Szenarien ausführen + +Diese Integration ermöglicht es Ihren Agenten, eine breite Palette von Datenbankoperationen ohne manuelle Eingriffe zu automatisieren. Durch die Verbindung von Sim mit Amazon RDS können Sie Agenten erstellen, die relationale Daten innerhalb Ihrer Workflows verwalten, aktualisieren und abrufen – alles ohne Datenbankinfrastruktur oder -verbindungen zu verwalten. +{/* MANUAL-CONTENT-END */} + +## Nutzungsanweisungen + +Integrieren Sie Amazon RDS Aurora Serverless in den Workflow mit der Data API. Kann Daten abfragen, einfügen, aktualisieren, löschen und Raw-SQL ausführen, ohne Datenbankverbindungen verwalten zu müssen. + +## Tools + +### `rds_query` + +Führen Sie eine SELECT-Abfrage auf Amazon RDS mit der Data API aus + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel | +| `resourceArn` | string | Ja | ARN des Aurora-DB-Clusters | +| `secretArn` | string | Ja | ARN des Secrets Manager-Geheimnisses mit DB-Anmeldedaten | +| `database` | string | Nein | Datenbankname (optional) | +| `query` | string | Ja | SQL-SELECT-Abfrage zur Ausführung | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `rows` | array | Array der zurückgegebenen Zeilen aus der Abfrage | +| `rowCount` | number | Anzahl der zurückgegebenen Zeilen | + +### `rds_insert` + +Daten in eine Amazon RDS-Tabelle mit der Data API einfügen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel | +| `resourceArn` | string | Ja | ARN des Aurora-DB-Clusters | +| `secretArn` | string | Ja | ARN des Secrets Manager-Geheimnisses mit DB-Anmeldedaten | +| `database` | string | Nein | Datenbankname (optional) | +| `table` | string | Ja | Tabellenname zum Einfügen | +| `data` | object | Ja | Einzufügende Daten als Schlüssel-Wert-Paare | + +#### Output + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `rows` | array | Array der eingefügten Zeilen | +| `rowCount` | number | Anzahl der eingefügten Zeilen | + +### `rds_update` + +Daten in einer Amazon RDS-Tabelle über die Data API aktualisieren + +#### Input + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS-Geheimzugriffsschlüssel | +| `resourceArn` | string | Ja | ARN des Aurora-DB-Clusters | +| `secretArn` | string | Ja | ARN des Secrets Manager-Geheimnisses mit DB-Anmeldedaten | +| `database` | string | Nein | Datenbankname (optional) | +| `table` | string | Ja | Name der zu aktualisierenden Tabelle | +| `data` | object | Ja | Zu aktualisierende Daten als Schlüssel-Wert-Paare | +| `conditions` | object | Ja | Bedingungen für die Aktualisierung (z.B. `{"id": 1}`) | + +#### Output + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `rows` | array | Array der aktualisierten Zeilen | +| `rowCount` | number | Anzahl der aktualisierten Zeilen | + +### `rds_delete` + +Daten aus einer Amazon RDS-Tabelle über die Data API löschen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS geheimer Zugriffsschlüssel | +| `resourceArn` | string | Ja | ARN des Aurora-DB-Clusters | +| `secretArn` | string | Ja | ARN des Secrets Manager-Geheimnisses mit DB-Anmeldedaten | +| `database` | string | Nein | Datenbankname (optional) | +| `table` | string | Ja | Tabellenname, aus dem gelöscht werden soll | +| `conditions` | object | Ja | Bedingungen für das Löschen (z.B. `{"id": 1}`) | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `rows` | array | Array der gelöschten Zeilen | +| `rowCount` | number | Anzahl der gelöschten Zeilen | + +### `rds_execute` + +Rohes SQL auf Amazon RDS über die Data API ausführen + +#### Eingabe + +| Parameter | Typ | Erforderlich | Beschreibung | +| --------- | ---- | -------- | ----------- | +| `region` | string | Ja | AWS-Region (z.B. us-east-1) | +| `accessKeyId` | string | Ja | AWS-Zugriffsschlüssel-ID | +| `secretAccessKey` | string | Ja | AWS geheimer Zugriffsschlüssel | +| `resourceArn` | string | Ja | ARN des Aurora-DB-Clusters | +| `secretArn` | string | Ja | ARN des Secrets Manager-Geheimnisses mit DB-Anmeldedaten | +| `database` | string | Nein | Datenbankname (optional) | +| `query` | string | Ja | Rohe SQL-Abfrage zur Ausführung | + +#### Ausgabe + +| Parameter | Typ | Beschreibung | +| --------- | ---- | ----------- | +| `message` | string | Statusmeldung der Operation | +| `rows` | array | Array der zurückgegebenen oder betroffenen Zeilen | +| `rowCount` | number | Anzahl der betroffenen Zeilen | + +## Hinweise + +- Kategorie: `tools` +- Typ: `rds` diff --git a/apps/docs/content/docs/de/tools/s3.mdx b/apps/docs/content/docs/de/tools/s3.mdx index e50fe8b93d..d09f5a1623 100644 --- a/apps/docs/content/docs/de/tools/s3.mdx +++ b/apps/docs/content/docs/de/tools/s3.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/en/tools/mailgun.mdx b/apps/docs/content/docs/en/tools/mailgun.mdx index 450576219a..9fb05cfab7 100644 --- a/apps/docs/content/docs/en/tools/mailgun.mdx +++ b/apps/docs/content/docs/en/tools/mailgun.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/es/tools/dynamodb.mdx b/apps/docs/content/docs/es/tools/dynamodb.mdx new file mode 100644 index 0000000000..97a5bd050e --- /dev/null +++ b/apps/docs/content/docs/es/tools/dynamodb.mdx @@ -0,0 +1,188 @@ +--- +title: Amazon DynamoDB +description: Conectar a Amazon DynamoDB +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon DynamoDB](https://aws.amazon.com/dynamodb/) es un servicio de base de datos NoSQL completamente administrado ofrecido por AWS que proporciona un rendimiento rápido y predecible con escalabilidad perfecta. DynamoDB te permite almacenar y recuperar cualquier cantidad de datos y atender cualquier nivel de tráfico de solicitudes, sin necesidad de administrar hardware o infraestructura. + +Con DynamoDB, puedes: + +- **Obtener elementos**: Buscar elementos en tus tablas usando claves primarias +- **Poner elementos**: Añadir o reemplazar elementos en tus tablas +- **Consultar elementos**: Recuperar múltiples elementos usando consultas a través de índices +- **Escanear tablas**: Leer todos o parte de los datos en una tabla +- **Actualizar elementos**: Modificar atributos específicos de elementos existentes +- **Eliminar elementos**: Eliminar registros de tus tablas + +En Sim, la integración con DynamoDB permite a tus agentes acceder y manipular de forma segura las tablas de DynamoDB utilizando credenciales de AWS. Las operaciones compatibles incluyen: + +- **Get**: Recuperar un elemento por su clave +- **Put**: Insertar o sobrescribir elementos +- **Query**: Ejecutar consultas utilizando condiciones de clave y filtros +- **Scan**: Leer múltiples elementos escaneando la tabla o índice +- **Update**: Cambiar atributos específicos de uno o más elementos +- **Delete**: Eliminar un elemento de una tabla + +Esta integración permite a los agentes de Sim automatizar tareas de gestión de datos dentro de tus tablas de DynamoDB de forma programática, para que puedas crear flujos de trabajo que gestionen, modifiquen y recuperen datos NoSQL escalables sin esfuerzo manual ni gestión de servidores. +{/* MANUAL-CONTENT-END */} + +## Instrucciones de uso + +Integra Amazon DynamoDB en flujos de trabajo. Compatible con operaciones Get, Put, Query, Scan, Update y Delete en tablas de DynamoDB. + +## Herramientas + +### `dynamodb_get` + +Obtener un elemento de una tabla DynamoDB mediante clave primaria + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS \(p. ej., us-east-1\) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `tableName` | string | Sí | Nombre de la tabla DynamoDB | +| `key` | object | Sí | Clave primaria del elemento a recuperar | +| `consistentRead` | boolean | No | Usar lectura fuertemente consistente | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `item` | object | Elemento recuperado | + +### `dynamodb_put` + +Poner un elemento en una tabla DynamoDB + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS \(p. ej., us-east-1\) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `tableName` | string | Sí | Nombre de la tabla DynamoDB | +| `item` | object | Sí | Elemento a poner en la tabla | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `item` | object | Elemento creado | + +### `dynamodb_query` + +Consultar elementos de una tabla DynamoDB usando condiciones de clave + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS \(p. ej., us-east-1\) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `tableName` | string | Sí | Nombre de la tabla DynamoDB | +| `keyConditionExpression` | string | Sí | Expresión de condición de clave \(p. ej., "pk = :pk"\) | +| `filterExpression` | string | No | Expresión de filtro para resultados | +| `expressionAttributeNames` | object | No | Mapeos de nombres de atributos para palabras reservadas | +| `expressionAttributeValues` | object | No | Valores de atributos de expresión | +| `indexName` | string | No | Nombre del índice secundario para consultar | +| `limit` | number | No | Número máximo de elementos a devolver | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `items` | array | Array de elementos devueltos | +| `count` | number | Número de elementos devueltos | + +### `dynamodb_scan` + +Escanear todos los elementos en una tabla DynamoDB + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS \(p. ej., us-east-1\) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `tableName` | string | Sí | Nombre de la tabla DynamoDB | +| `filterExpression` | string | No | Expresión de filtro para resultados | +| `projectionExpression` | string | No | Atributos a recuperar | +| `expressionAttributeNames` | object | No | Mapeos de nombres de atributos para palabras reservadas | +| `expressionAttributeValues` | object | No | Valores de atributos de expresión | +| `limit` | number | No | Número máximo de elementos a devolver | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `items` | array | Array de elementos devueltos | +| `count` | number | Número de elementos devueltos | + +### `dynamodb_update` + +Actualizar un elemento en una tabla de DynamoDB + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS \(p. ej., us-east-1\) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `tableName` | string | Sí | Nombre de la tabla de DynamoDB | +| `key` | object | Sí | Clave primaria del elemento a actualizar | +| `updateExpression` | string | Sí | Expresión de actualización \(p. ej., "SET #name = :name"\) | +| `expressionAttributeNames` | object | No | Mapeos de nombres de atributos para palabras reservadas | +| `expressionAttributeValues` | object | No | Valores de atributos de expresión | +| `conditionExpression` | string | No | Condición que debe cumplirse para que la actualización tenga éxito | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `item` | object | Elemento actualizado | + +### `dynamodb_delete` + +Eliminar un elemento de una tabla de DynamoDB + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS \(p. ej., us-east-1\) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `tableName` | string | Sí | Nombre de la tabla de DynamoDB | +| `key` | object | Sí | Clave primaria del elemento a eliminar | +| `conditionExpression` | string | No | Condición que debe cumplirse para que la eliminación tenga éxito | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | + +## Notas + +- Categoría: `tools` +- Tipo: `dynamodb` diff --git a/apps/docs/content/docs/es/tools/mailgun.mdx b/apps/docs/content/docs/es/tools/mailgun.mdx index f1e5e5704a..75defc2a45 100644 --- a/apps/docs/content/docs/es/tools/mailgun.mdx +++ b/apps/docs/content/docs/es/tools/mailgun.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/es/tools/rds.mdx b/apps/docs/content/docs/es/tools/rds.mdx new file mode 100644 index 0000000000..9666538be7 --- /dev/null +++ b/apps/docs/content/docs/es/tools/rds.mdx @@ -0,0 +1,168 @@ +--- +title: Amazon RDS +description: Conéctate a Amazon RDS a través de Data API +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon RDS Aurora Serverless](https://aws.amazon.com/rds/aurora/serverless/) es una base de datos relacional completamente administrada que se inicia, se apaga y escala automáticamente según las necesidades de tu aplicación. Te permite ejecutar bases de datos SQL en la nube sin tener que administrar servidores de bases de datos. + +Con RDS Aurora Serverless, puedes: + +- **Consultar datos**: Ejecutar consultas SQL flexibles en tus tablas +- **Insertar nuevos registros**: Añadir datos a tu base de datos automáticamente +- **Actualizar registros existentes**: Modificar datos en tus tablas usando filtros personalizados +- **Eliminar registros**: Quitar datos no deseados utilizando criterios precisos +- **Ejecutar SQL puro**: Ejecutar cualquier comando SQL válido compatible con Aurora + +En Sim, la integración con RDS permite a tus agentes trabajar con bases de datos Amazon Aurora Serverless de forma segura y programática. Las operaciones compatibles incluyen: + +- **Consulta**: Ejecutar SELECT y otras consultas SQL para obtener filas de tu base de datos +- **Inserción**: Insertar nuevos registros en tablas con datos estructurados +- **Actualización**: Cambiar datos en filas que coincidan con tus condiciones especificadas +- **Eliminación**: Eliminar registros de una tabla mediante filtros o criterios personalizados +- **Ejecución**: Ejecutar SQL puro para escenarios avanzados + +Esta integración permite a tus agentes automatizar una amplia gama de operaciones de bases de datos sin intervención manual. Al conectar Sim con Amazon RDS, puedes crear agentes que gestionen, actualicen y recuperen datos relacionales dentro de tus flujos de trabajo, todo sin tener que manejar infraestructura o conexiones de bases de datos. +{/* MANUAL-CONTENT-END */} + +## Instrucciones de uso + +Integra Amazon RDS Aurora Serverless en el flujo de trabajo utilizando la Data API. Puede consultar, insertar, actualizar, eliminar y ejecutar SQL puro sin administrar conexiones de base de datos. + +## Herramientas + +### `rds_query` + +Ejecutar una consulta SELECT en Amazon RDS utilizando la API de datos + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS (p. ej., us-east-1) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `resourceArn` | string | Sí | ARN del clúster de Aurora DB | +| `secretArn` | string | Sí | ARN del secreto de Secrets Manager que contiene las credenciales de la base de datos | +| `database` | string | No | Nombre de la base de datos (opcional) | +| `query` | string | Sí | Consulta SQL SELECT para ejecutar | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `rows` | array | Array de filas devueltas por la consulta | +| `rowCount` | number | Número de filas devueltas | + +### `rds_insert` + +Insertar datos en una tabla de Amazon RDS utilizando la API de datos + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS (p. ej., us-east-1) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `resourceArn` | string | Sí | ARN del clúster de Aurora DB | +| `secretArn` | string | Sí | ARN del secreto de Secrets Manager que contiene las credenciales de la base de datos | +| `database` | string | No | Nombre de la base de datos (opcional) | +| `table` | string | Sí | Nombre de la tabla donde insertar | +| `data` | object | Sí | Datos a insertar como pares clave-valor | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `rows` | array | Array de filas insertadas | +| `rowCount` | number | Número de filas insertadas | + +### `rds_update` + +Actualizar datos en una tabla de Amazon RDS utilizando la API de datos + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS (p. ej., us-east-1) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `resourceArn` | string | Sí | ARN del clúster de Aurora DB | +| `secretArn` | string | Sí | ARN del secreto de Secrets Manager que contiene las credenciales de la base de datos | +| `database` | string | No | Nombre de la base de datos (opcional) | +| `table` | string | Sí | Nombre de la tabla a actualizar | +| `data` | object | Sí | Datos a actualizar como pares clave-valor | +| `conditions` | object | Sí | Condiciones para la actualización (p. ej., `{"id": 1}`) | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `rows` | array | Array de filas actualizadas | +| `rowCount` | number | Número de filas actualizadas | + +### `rds_delete` + +Eliminar datos de una tabla de Amazon RDS utilizando la API de datos + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS (p. ej., us-east-1) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `resourceArn` | string | Sí | ARN del clúster de Aurora DB | +| `secretArn` | string | Sí | ARN del secreto de Secrets Manager que contiene las credenciales de la base de datos | +| `database` | string | No | Nombre de la base de datos (opcional) | +| `table` | string | Sí | Nombre de la tabla de la que eliminar | +| `conditions` | object | Sí | Condiciones para la eliminación (p. ej., `{"id": 1}`) | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `rows` | array | Array de filas eliminadas | +| `rowCount` | number | Número de filas eliminadas | + +### `rds_execute` + +Ejecutar SQL sin procesar en Amazon RDS usando la API de datos + +#### Entrada + +| Parámetro | Tipo | Obligatorio | Descripción | +| --------- | ---- | -------- | ----------- | +| `region` | string | Sí | Región de AWS (p. ej., us-east-1) | +| `accessKeyId` | string | Sí | ID de clave de acceso de AWS | +| `secretAccessKey` | string | Sí | Clave de acceso secreta de AWS | +| `resourceArn` | string | Sí | ARN del clúster de Aurora DB | +| `secretArn` | string | Sí | ARN del secreto de Secrets Manager que contiene las credenciales de la base de datos | +| `database` | string | No | Nombre de la base de datos (opcional) | +| `query` | string | Sí | Consulta SQL sin procesar para ejecutar | + +#### Salida + +| Parámetro | Tipo | Descripción | +| --------- | ---- | ----------- | +| `message` | string | Mensaje de estado de la operación | +| `rows` | array | Array de filas devueltas o afectadas | +| `rowCount` | number | Número de filas afectadas | + +## Notas + +- Categoría: `tools` +- Tipo: `rds` diff --git a/apps/docs/content/docs/es/tools/s3.mdx b/apps/docs/content/docs/es/tools/s3.mdx index 3ce7241e09..09651746fb 100644 --- a/apps/docs/content/docs/es/tools/s3.mdx +++ b/apps/docs/content/docs/es/tools/s3.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/fr/tools/dynamodb.mdx b/apps/docs/content/docs/fr/tools/dynamodb.mdx new file mode 100644 index 0000000000..037d3f5f6b --- /dev/null +++ b/apps/docs/content/docs/fr/tools/dynamodb.mdx @@ -0,0 +1,188 @@ +--- +title: Amazon DynamoDB +description: Connexion à Amazon DynamoDB +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon DynamoDB](https://aws.amazon.com/dynamodb/) est un service de base de données NoSQL entièrement géré proposé par AWS qui offre des performances rapides et prévisibles avec une évolutivité transparente. DynamoDB vous permet de stocker et de récupérer n'importe quelle quantité de données et gère n'importe quel niveau de trafic de requêtes, sans que vous ayez à gérer le matériel ou l'infrastructure. + +Avec DynamoDB, vous pouvez : + +- **Obtenir des éléments** : rechercher des éléments dans vos tables à l'aide de clés primaires +- **Mettre des éléments** : ajouter ou remplacer des éléments dans vos tables +- **Interroger des éléments** : récupérer plusieurs éléments à l'aide de requêtes sur les index +- **Scanner des tables** : lire tout ou partie des données d'une table +- **Mettre à jour des éléments** : modifier des attributs spécifiques d'éléments existants +- **Supprimer des éléments** : supprimer des enregistrements de vos tables + +Dans Sim, l'intégration DynamoDB permet à vos agents d'accéder en toute sécurité aux tables DynamoDB et de les manipuler à l'aide des identifiants AWS. Les opérations prises en charge comprennent : + +- **Get** : récupérer un élément par sa clé +- **Put** : insérer ou écraser des éléments +- **Query** : exécuter des requêtes à l'aide de conditions de clé et de filtres +- **Scan** : lire plusieurs éléments en scannant la table ou l'index +- **Update** : modifier des attributs spécifiques d'un ou plusieurs éléments +- **Delete** : supprimer un élément d'une table + +Cette intégration permet aux agents Sim d'automatiser les tâches de gestion de données au sein de vos tables DynamoDB de manière programmatique, afin que vous puissiez créer des flux de travail qui gèrent, modifient et récupèrent des données NoSQL évolutives sans effort manuel ni gestion de serveur. +{/* MANUAL-CONTENT-END */} + +## Instructions d'utilisation + +Intégrez Amazon DynamoDB dans les flux de travail. Prend en charge les opérations Get, Put, Query, Scan, Update et Delete sur les tables DynamoDB. + +## Outils + +### `dynamodb_get` + +Récupérer un élément d'une table DynamoDB par clé primaire + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | chaîne | Oui | Région AWS (par ex., us-east-1) | +| `accessKeyId` | chaîne | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | chaîne | Oui | Clé d'accès secrète AWS | +| `tableName` | chaîne | Oui | Nom de la table DynamoDB | +| `key` | objet | Oui | Clé primaire de l'élément à récupérer | +| `consistentRead` | booléen | Non | Utiliser une lecture fortement cohérente | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | chaîne | Message d'état de l'opération | +| `item` | objet | Élément récupéré | + +### `dynamodb_put` + +Mettre un élément dans une table DynamoDB + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | chaîne | Oui | Région AWS (par ex., us-east-1) | +| `accessKeyId` | chaîne | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | chaîne | Oui | Clé d'accès secrète AWS | +| `tableName` | chaîne | Oui | Nom de la table DynamoDB | +| `item` | objet | Oui | Élément à mettre dans la table | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | chaîne | Message d'état de l'opération | +| `item` | objet | Élément créé | + +### `dynamodb_query` + +Interroger les éléments d'une table DynamoDB à l'aide de conditions de clé + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | chaîne | Oui | Région AWS (par ex., us-east-1) | +| `accessKeyId` | chaîne | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | chaîne | Oui | Clé d'accès secrète AWS | +| `tableName` | chaîne | Oui | Nom de la table DynamoDB | +| `keyConditionExpression` | chaîne | Oui | Expression de condition de clé (par ex., "pk = :pk") | +| `filterExpression` | chaîne | Non | Expression de filtre pour les résultats | +| `expressionAttributeNames` | objet | Non | Mappages de noms d'attributs pour les mots réservés | +| `expressionAttributeValues` | objet | Non | Valeurs d'attributs d'expression | +| `indexName` | chaîne | Non | Nom de l'index secondaire à interroger | +| `limit` | nombre | Non | Nombre maximum d'éléments à retourner | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | chaîne | Message d'état de l'opération | +| `items` | tableau | Tableau des éléments retournés | +| `count` | nombre | Nombre d'éléments retournés | + +### `dynamodb_scan` + +Scanner tous les éléments d'une table DynamoDB + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | chaîne | Oui | Région AWS (par ex., us-east-1) | +| `accessKeyId` | chaîne | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | chaîne | Oui | Clé d'accès secrète AWS | +| `tableName` | chaîne | Oui | Nom de la table DynamoDB | +| `filterExpression` | chaîne | Non | Expression de filtre pour les résultats | +| `projectionExpression` | chaîne | Non | Attributs à récupérer | +| `expressionAttributeNames` | objet | Non | Mappages de noms d'attributs pour les mots réservés | +| `expressionAttributeValues` | objet | Non | Valeurs d'attributs d'expression | +| `limit` | nombre | Non | Nombre maximum d'éléments à retourner | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | string | Message d'état de l'opération | +| `items` | array | Tableau des éléments retournés | +| `count` | number | Nombre d'éléments retournés | + +### `dynamodb_update` + +Mettre à jour un élément dans une table DynamoDB + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | string | Oui | Région AWS (par ex., us-east-1) | +| `accessKeyId` | string | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | string | Oui | Clé d'accès secrète AWS | +| `tableName` | string | Oui | Nom de la table DynamoDB | +| `key` | object | Oui | Clé primaire de l'élément à mettre à jour | +| `updateExpression` | string | Oui | Expression de mise à jour (par ex., "SET #name = :name") | +| `expressionAttributeNames` | object | Non | Mappages de noms d'attributs pour les mots réservés | +| `expressionAttributeValues` | object | Non | Valeurs d'attributs d'expression | +| `conditionExpression` | string | Non | Condition qui doit être remplie pour que la mise à jour réussisse | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | string | Message d'état de l'opération | +| `item` | object | Élément mis à jour | + +### `dynamodb_delete` + +Supprimer un élément d'une table DynamoDB + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | string | Oui | Région AWS (par ex., us-east-1) | +| `accessKeyId` | string | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | string | Oui | Clé d'accès secrète AWS | +| `tableName` | string | Oui | Nom de la table DynamoDB | +| `key` | object | Oui | Clé primaire de l'élément à supprimer | +| `conditionExpression` | string | Non | Condition qui doit être remplie pour que la suppression réussisse | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | string | Message d'état de l'opération | + +## Notes + +- Catégorie : `tools` +- Type : `dynamodb` diff --git a/apps/docs/content/docs/fr/tools/mailgun.mdx b/apps/docs/content/docs/fr/tools/mailgun.mdx index 39d0bc982b..10f8d9bd4c 100644 --- a/apps/docs/content/docs/fr/tools/mailgun.mdx +++ b/apps/docs/content/docs/fr/tools/mailgun.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/fr/tools/rds.mdx b/apps/docs/content/docs/fr/tools/rds.mdx new file mode 100644 index 0000000000..dd4ea863fd --- /dev/null +++ b/apps/docs/content/docs/fr/tools/rds.mdx @@ -0,0 +1,168 @@ +--- +title: Amazon RDS +description: Connexion à Amazon RDS via l'API Data +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon RDS Aurora Serverless](https://aws.amazon.com/rds/aurora/serverless/) est une base de données relationnelle entièrement gérée qui démarre, s'arrête et adapte automatiquement sa capacité en fonction des besoins de votre application. Elle vous permet d'exécuter des bases de données SQL dans le cloud sans avoir à gérer des serveurs de base de données. + +Avec RDS Aurora Serverless, vous pouvez : + +- **Interroger des données** : exécuter des requêtes SQL flexibles sur vos tables +- **Insérer de nouveaux enregistrements** : ajouter automatiquement des données à votre base de données +- **Mettre à jour des enregistrements existants** : modifier des données dans vos tables à l'aide de filtres personnalisés +- **Supprimer des enregistrements** : éliminer les données indésirables en utilisant des critères précis +- **Exécuter du SQL brut** : lancer toute commande SQL valide prise en charge par Aurora + +Dans Sim, l'intégration RDS permet à vos agents de travailler avec les bases de données Amazon Aurora Serverless de manière sécurisée et programmatique. Les opérations prises en charge comprennent : + +- **Requête** : exécuter des requêtes SELECT et autres requêtes SQL pour récupérer des lignes de votre base de données +- **Insertion** : insérer de nouveaux enregistrements dans les tables avec des données structurées +- **Mise à jour** : modifier les données dans les lignes qui correspondent à vos conditions spécifiées +- **Suppression** : supprimer des enregistrements d'une table par filtres ou critères personnalisés +- **Exécution** : exécuter du SQL brut pour des scénarios avancés + +Cette intégration permet à vos agents d'automatiser un large éventail d'opérations de base de données sans intervention manuelle. En connectant Sim avec Amazon RDS, vous pouvez créer des agents qui gèrent, mettent à jour et récupèrent des données relationnelles dans vos flux de travail, le tout sans avoir à gérer l'infrastructure ou les connexions de base de données. +{/* MANUAL-CONTENT-END */} + +## Instructions d'utilisation + +Intégrez Amazon RDS Aurora Serverless dans le flux de travail en utilisant l'API Data. Possibilité d'interroger, d'insérer, de mettre à jour, de supprimer et d'exécuter du SQL brut sans gérer les connexions à la base de données. + +## Outils + +### `rds_query` + +Exécuter une requête SELECT sur Amazon RDS en utilisant l'API Data + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | chaîne | Oui | Région AWS \(ex., us-east-1\) | +| `accessKeyId` | chaîne | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | chaîne | Oui | Clé d'accès secrète AWS | +| `resourceArn` | chaîne | Oui | ARN du cluster Aurora DB | +| `secretArn` | chaîne | Oui | ARN du secret Secrets Manager contenant les identifiants de la base de données | +| `database` | chaîne | Non | Nom de la base de données \(facultatif\) | +| `query` | chaîne | Oui | Requête SQL SELECT à exécuter | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | chaîne | Message d'état de l'opération | +| `rows` | tableau | Tableau des lignes retournées par la requête | +| `rowCount` | nombre | Nombre de lignes retournées | + +### `rds_insert` + +Insérer des données dans une table Amazon RDS en utilisant l'API Data + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | chaîne | Oui | Région AWS \(ex., us-east-1\) | +| `accessKeyId` | chaîne | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | chaîne | Oui | Clé d'accès secrète AWS | +| `resourceArn` | chaîne | Oui | ARN du cluster Aurora DB | +| `secretArn` | chaîne | Oui | ARN du secret Secrets Manager contenant les identifiants de la base de données | +| `database` | chaîne | Non | Nom de la base de données \(facultatif\) | +| `table` | chaîne | Oui | Nom de la table dans laquelle insérer | +| `data` | objet | Oui | Données à insérer sous forme de paires clé-valeur | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | string | Message d'état de l'opération | +| `rows` | array | Tableau des lignes insérées | +| `rowCount` | number | Nombre de lignes insérées | + +### `rds_update` + +Mettre à jour des données dans une table Amazon RDS en utilisant l'API Data + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | string | Oui | Région AWS (par ex., us-east-1) | +| `accessKeyId` | string | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | string | Oui | Clé d'accès secrète AWS | +| `resourceArn` | string | Oui | ARN du cluster de base de données Aurora | +| `secretArn` | string | Oui | ARN du secret Secrets Manager contenant les identifiants de la base de données | +| `database` | string | Non | Nom de la base de données (facultatif) | +| `table` | string | Oui | Nom de la table à mettre à jour | +| `data` | object | Oui | Données à mettre à jour sous forme de paires clé-valeur | +| `conditions` | object | Oui | Conditions pour la mise à jour (par ex., `{"id": 1}`) | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | string | Message d'état de l'opération | +| `rows` | array | Tableau des lignes mises à jour | +| `rowCount` | number | Nombre de lignes mises à jour | + +### `rds_delete` + +Supprimer des données d'une table Amazon RDS en utilisant l'API Data + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | chaîne | Oui | Région AWS (par ex., us-east-1) | +| `accessKeyId` | chaîne | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | chaîne | Oui | Clé d'accès secrète AWS | +| `resourceArn` | chaîne | Oui | ARN du cluster de base de données Aurora | +| `secretArn` | chaîne | Oui | ARN du secret Secrets Manager contenant les identifiants de la base de données | +| `database` | chaîne | Non | Nom de la base de données (facultatif) | +| `table` | chaîne | Oui | Nom de la table à supprimer | +| `conditions` | objet | Oui | Conditions pour la suppression (par ex., `{"id": 1}`) | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | chaîne | Message d'état de l'opération | +| `rows` | tableau | Tableau des lignes supprimées | +| `rowCount` | nombre | Nombre de lignes supprimées | + +### `rds_execute` + +Exécuter du SQL brut sur Amazon RDS en utilisant l'API Data + +#### Entrée + +| Paramètre | Type | Obligatoire | Description | +| --------- | ---- | -------- | ----------- | +| `region` | chaîne | Oui | Région AWS (par ex., us-east-1) | +| `accessKeyId` | chaîne | Oui | ID de clé d'accès AWS | +| `secretAccessKey` | chaîne | Oui | Clé d'accès secrète AWS | +| `resourceArn` | chaîne | Oui | ARN du cluster de base de données Aurora | +| `secretArn` | chaîne | Oui | ARN du secret Secrets Manager contenant les identifiants de la base de données | +| `database` | chaîne | Non | Nom de la base de données (facultatif) | +| `query` | chaîne | Oui | Requête SQL brute à exécuter | + +#### Sortie + +| Paramètre | Type | Description | +| --------- | ---- | ----------- | +| `message` | string | Message d'état de l'opération | +| `rows` | array | Tableau des lignes retournées ou affectées | +| `rowCount` | number | Nombre de lignes affectées | + +## Notes + +- Catégorie : `tools` +- Type : `rds` diff --git a/apps/docs/content/docs/fr/tools/s3.mdx b/apps/docs/content/docs/fr/tools/s3.mdx index 4191d12f09..6ccd31470c 100644 --- a/apps/docs/content/docs/fr/tools/s3.mdx +++ b/apps/docs/content/docs/fr/tools/s3.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/ja/tools/dynamodb.mdx b/apps/docs/content/docs/ja/tools/dynamodb.mdx new file mode 100644 index 0000000000..e15ca2815a --- /dev/null +++ b/apps/docs/content/docs/ja/tools/dynamodb.mdx @@ -0,0 +1,188 @@ +--- +title: Amazon DynamoDB +description: Amazon DynamoDBに接続する +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon DynamoDB](https://aws.amazon.com/dynamodb/)はAWSが提供する完全マネージド型のNoSQLデータベースサービスで、シームレスなスケーラビリティを備えた高速で予測可能なパフォーマンスを提供します。DynamoDBを使用すると、ハードウェアやインフラストラクチャを管理する必要なく、任意の量のデータを保存および取得し、あらゆるレベルのリクエストトラフィックに対応できます。 + +DynamoDBでは、以下のことが可能です: + +- **アイテムの取得**:プライマリキーを使用してテーブル内のアイテムを検索 +- **アイテムの配置**:テーブルにアイテムを追加または置換 +- **アイテムのクエリ**:インデックス全体でクエリを使用して複数のアイテムを取得 +- **テーブルのスキャン**:テーブル内のデータの全部または一部を読み取り +- **アイテムの更新**:既存のアイテムの特定の属性を変更 +- **アイテムの削除**:テーブルからレコードを削除 + +Simでは、DynamoDB統合により、エージェントがAWS認証情報を使用してDynamoDBテーブルに安全にアクセスし操作することができます。サポートされている操作には以下が含まれます: + +- **Get**:キーによるアイテムの取得 +- **Put**:アイテムの挿入または上書き +- **Query**:キー条件とフィルターを使用したクエリの実行 +- **Scan**:テーブルまたはインデックスをスキャンして複数のアイテムを読み取り +- **Update**:1つ以上のアイテムの特定の属性を変更 +- **Delete**:テーブルからアイテムを削除 + +この統合により、SimエージェントはプログラムによってDynamoDBテーブル内のデータ管理タスクを自動化できるようになり、手動の作業やサーバー管理なしでスケーラブルなNoSQLデータを管理、変更、取得するワークフローを構築できます。 +{/* MANUAL-CONTENT-END */} + +## 使用方法 + +Amazon DynamoDBをワークフローに統合します。DynamoDBテーブルに対するGet、Put、Query、Scan、Update、Delete操作をサポートしています。 + +## ツール + +### `dynamodb_get` + +プライマリキーを使用してDynamoDBテーブルからアイテムを取得する + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWSリージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWSアクセスキーID | +| `secretAccessKey` | string | はい | AWSシークレットアクセスキー | +| `tableName` | string | はい | DynamoDBテーブル名 | +| `key` | object | はい | 取得するアイテムのプライマリキー | +| `consistentRead` | boolean | いいえ | 強力な整合性のある読み取りを使用する | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `item` | object | 取得したアイテム | + +### `dynamodb_put` + +DynamoDBテーブルにアイテムを追加する + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWSリージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWSアクセスキーID | +| `secretAccessKey` | string | はい | AWSシークレットアクセスキー | +| `tableName` | string | はい | DynamoDBテーブル名 | +| `item` | object | はい | テーブルに追加するアイテム | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `item` | object | 作成されたアイテム | + +### `dynamodb_query` + +キー条件を使用してDynamoDBテーブルからアイテムをクエリする + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWSリージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWSアクセスキーID | +| `secretAccessKey` | string | はい | AWSシークレットアクセスキー | +| `tableName` | string | はい | DynamoDBテーブル名 | +| `keyConditionExpression` | string | はい | キー条件式(例:"pk = :pk") | +| `filterExpression` | string | いいえ | 結果のフィルター式 | +| `expressionAttributeNames` | object | いいえ | 予約語の属性名マッピング | +| `expressionAttributeValues` | object | いいえ | 式の属性値 | +| `indexName` | string | いいえ | クエリするセカンダリインデックス名 | +| `limit` | number | いいえ | 返すアイテムの最大数 | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `items` | array | 返されたアイテムの配列 | +| `count` | number | 返されたアイテムの数 | + +### `dynamodb_scan` + +DynamoDBテーブル内のすべてのアイテムをスキャンする + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWSリージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWSアクセスキーID | +| `secretAccessKey` | string | はい | AWSシークレットアクセスキー | +| `tableName` | string | はい | DynamoDBテーブル名 | +| `filterExpression` | string | いいえ | 結果のフィルター式 | +| `projectionExpression` | string | いいえ | 取得する属性 | +| `expressionAttributeNames` | object | いいえ | 予約語の属性名マッピング | +| `expressionAttributeValues` | object | いいえ | 式の属性値 | +| `limit` | number | いいえ | 返すアイテムの最大数 | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `items` | array | 返されたアイテムの配列 | +| `count` | number | 返されたアイテム数 | + +### `dynamodb_update` + +DynamoDBテーブル内のアイテムを更新する + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWSリージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWSアクセスキーID | +| `secretAccessKey` | string | はい | AWSシークレットアクセスキー | +| `tableName` | string | はい | DynamoDBテーブル名 | +| `key` | object | はい | 更新するアイテムのプライマリキー | +| `updateExpression` | string | はい | 更新式(例:"SET #name = :name") | +| `expressionAttributeNames` | object | いいえ | 予約語の属性名マッピング | +| `expressionAttributeValues` | object | いいえ | 式の属性値 | +| `conditionExpression` | string | いいえ | 更新が成功するために満たす必要がある条件 | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `item` | object | 更新されたアイテム | + +### `dynamodb_delete` + +DynamoDBテーブルからアイテムを削除する + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWSリージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWSアクセスキーID | +| `secretAccessKey` | string | はい | AWSシークレットアクセスキー | +| `tableName` | string | はい | DynamoDBテーブル名 | +| `key` | object | はい | 削除するアイテムのプライマリキー | +| `conditionExpression` | string | いいえ | 削除が成功するために満たす必要がある条件 | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | + +## 注意事項 + +- カテゴリー: `tools` +- タイプ: `dynamodb` diff --git a/apps/docs/content/docs/ja/tools/mailgun.mdx b/apps/docs/content/docs/ja/tools/mailgun.mdx index 82083e2e47..46c7d50a20 100644 --- a/apps/docs/content/docs/ja/tools/mailgun.mdx +++ b/apps/docs/content/docs/ja/tools/mailgun.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/ja/tools/rds.mdx b/apps/docs/content/docs/ja/tools/rds.mdx new file mode 100644 index 0000000000..6e06ea152a --- /dev/null +++ b/apps/docs/content/docs/ja/tools/rds.mdx @@ -0,0 +1,168 @@ +--- +title: Amazon RDS +description: Data APIを通じてAmazon RDSに接続 +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon RDS Aurora Serverless](https://aws.amazon.com/rds/aurora/serverless/)は、アプリケーションのニーズに基づいて自動的に起動、シャットダウン、容量のスケーリングを行う完全マネージド型のリレーショナルデータベースです。データベースサーバーを管理することなく、クラウドでSQLデータベースを実行できます。 + +RDS Aurora Serverlessでは、以下のことが可能です: + +- **データのクエリ**: テーブル間で柔軟なSQLクエリを実行 +- **新しいレコードの挿入**: データベースに自動的にデータを追加 +- **既存レコードの更新**: カスタムフィルターを使用してテーブル内のデータを変更 +- **レコードの削除**: 正確な条件を使用して不要なデータを削除 +- **生のSQLの実行**: Auroraでサポートされている有効なSQLコマンドを実行 + +Simでは、RDS統合により、エージェントがAmazon Aurora Serverlessデータベースを安全かつプログラム的に操作できるようになります。サポートされている操作には以下が含まれます: + +- **クエリ**: SELECTやその他のSQLクエリを実行してデータベースから行を取得 +- **挿入**: 構造化データを使用してテーブルに新しいレコードを挿入 +- **更新**: 指定した条件に一致する行のデータを変更 +- **削除**: カスタムフィルターや条件によってテーブルからレコードを削除 +- **実行**: 高度なシナリオ向けに生のSQLを実行 + +この統合により、エージェントは手動介入なしに幅広いデータベース操作を自動化できます。SimとAmazon RDSを接続することで、ワークフロー内でリレーショナルデータを管理、更新、取得するエージェントを構築できます—すべてデータベースインフラストラクチャや接続を扱うことなく実現できます。 +{/* MANUAL-CONTENT-END */} + +## 使用手順 + +Data APIを使用してAmazon RDS Aurora Serverlessをワークフローに統合します。データベース接続を管理することなく、クエリ、挿入、更新、削除、生のSQLの実行が可能です。 + +## ツール + +### `rds_query` + +Data APIを使用してAmazon RDSでSELECTクエリを実行する + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWSリージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWSアクセスキーID | +| `secretAccessKey` | string | はい | AWSシークレットアクセスキー | +| `resourceArn` | string | はい | Aurora DBクラスターのARN | +| `secretArn` | string | はい | DB認証情報を含むSecrets ManagerシークレットのARN | +| `database` | string | いいえ | データベース名(オプション) | +| `query` | string | はい | 実行するSQL SELECTクエリ | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `rows` | array | クエリから返された行の配列 | +| `rowCount` | number | 返された行数 | + +### `rds_insert` + +Data APIを使用してAmazon RDSテーブルにデータを挿入する + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWSリージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWSアクセスキーID | +| `secretAccessKey` | string | はい | AWSシークレットアクセスキー | +| `resourceArn` | string | はい | Aurora DBクラスターのARN | +| `secretArn` | string | はい | DB認証情報を含むSecrets ManagerシークレットのARN | +| `database` | string | いいえ | データベース名(オプション) | +| `table` | string | はい | 挿入先のテーブル名 | +| `data` | object | はい | キーと値のペアとして挿入するデータ | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `rows` | array | 挿入された行の配列 | +| `rowCount` | number | 挿入された行数 | + +### `rds_update` + +Data APIを使用してAmazon RDSテーブルのデータを更新する + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWSリージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWSアクセスキーID | +| `secretAccessKey` | string | はい | AWSシークレットアクセスキー | +| `resourceArn` | string | はい | Aurora DBクラスターのARN | +| `secretArn` | string | はい | DB認証情報を含むSecrets ManagerシークレットのARN | +| `database` | string | いいえ | データベース名(オプション) | +| `table` | string | はい | 更新するテーブル名 | +| `data` | object | はい | キーと値のペアとして更新するデータ | +| `conditions` | object | はい | 更新の条件(例:`{"id": 1}`) | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `rows` | array | 更新された行の配列 | +| `rowCount` | number | 更新された行数 | + +### `rds_delete` + +Data APIを使用してAmazon RDSテーブルからデータを削除する + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWS リージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWS アクセスキーID | +| `secretAccessKey` | string | はい | AWS シークレットアクセスキー | +| `resourceArn` | string | はい | Aurora DBクラスターのARN | +| `secretArn` | string | はい | DB認証情報を含むSecrets ManagerシークレットのARN | +| `database` | string | いいえ | データベース名(オプション) | +| `table` | string | はい | 削除対象のテーブル名 | +| `conditions` | object | はい | 削除条件(例:`{"id": 1}`) | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `rows` | array | 削除された行の配列 | +| `rowCount` | number | 削除された行数 | + +### `rds_execute` + +Data APIを使用してAmazon RDSで生のSQLを実行する + +#### 入力 + +| パラメータ | 型 | 必須 | 説明 | +| --------- | ---- | -------- | ----------- | +| `region` | string | はい | AWS リージョン(例:us-east-1) | +| `accessKeyId` | string | はい | AWS アクセスキーID | +| `secretAccessKey` | string | はい | AWS シークレットアクセスキー | +| `resourceArn` | string | はい | Aurora DBクラスターのARN | +| `secretArn` | string | はい | DB認証情報を含むSecrets ManagerシークレットのARN | +| `database` | string | いいえ | データベース名(オプション) | +| `query` | string | はい | 実行する生のSQLクエリ | + +#### 出力 + +| パラメータ | 型 | 説明 | +| --------- | ---- | ----------- | +| `message` | string | 操作ステータスメッセージ | +| `rows` | array | 返却または影響を受けた行の配列 | +| `rowCount` | number | 影響を受けた行数 | + +## 注意事項 + +- カテゴリー: `tools` +- タイプ: `rds` diff --git a/apps/docs/content/docs/ja/tools/s3.mdx b/apps/docs/content/docs/ja/tools/s3.mdx index 8bbb99322e..d472c5f7ad 100644 --- a/apps/docs/content/docs/ja/tools/s3.mdx +++ b/apps/docs/content/docs/ja/tools/s3.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/zh/tools/dynamodb.mdx b/apps/docs/content/docs/zh/tools/dynamodb.mdx new file mode 100644 index 0000000000..7390c01f40 --- /dev/null +++ b/apps/docs/content/docs/zh/tools/dynamodb.mdx @@ -0,0 +1,188 @@ +--- +title: Amazon DynamoDB +description: 连接到 Amazon DynamoDB +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon DynamoDB](https://aws.amazon.com/dynamodb/) 是 AWS 提供的一项完全托管的 NoSQL 数据库服务,具有快速且可预测的性能,并支持无缝扩展。DynamoDB 允许您存储和检索任意数量的数据,并处理任何级别的请求流量,而无需您管理硬件或基础设施。 + +使用 DynamoDB,您可以: + +- **获取项目**:使用主键查找表中的项目 +- **添加项目**:在表中添加或替换项目 +- **查询项目**:通过索引查询检索多个项目 +- **扫描表**:读取表中的全部或部分数据 +- **更新项目**:修改现有项目的特定属性 +- **删除项目**:从表中移除记录 + +在 Sim 中,DynamoDB 集成使您的代理能够使用 AWS 凭证安全地访问和操作 DynamoDB 表。支持的操作包括: + +- **获取**:通过键检索项目 +- **添加**:插入或覆盖项目 +- **查询**:使用键条件和过滤器运行查询 +- **扫描**:通过扫描表或索引读取多个项目 +- **更新**:更改一个或多个项目的特定属性 +- **删除**:从表中移除项目 + +此集成使 Sim 代理能够以编程方式自动化管理 DynamoDB 表中的数据管理任务,从而构建无需手动操作或服务器管理的工作流,来管理、修改和检索可扩展的 NoSQL 数据。 +{/* MANUAL-CONTENT-END */} + +## 使用说明 + +将 Amazon DynamoDB 集成到工作流中。支持对 DynamoDB 表执行获取、添加、查询、扫描、更新和删除操作。 + +## 工具 + +### `dynamodb_get` + +通过主键从 DynamoDB 表中获取一个项目 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `tableName` | string | 是 | DynamoDB 表名 | +| `key` | object | 是 | 要检索的项目主键 | +| `consistentRead` | boolean | 否 | 使用强一致性读取 | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `item` | object | 检索到的项目 | + +### `dynamodb_put` + +将一个项目放入 DynamoDB 表中 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `tableName` | string | 是 | DynamoDB 表名 | +| `item` | object | 是 | 要放入表中的项目 | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `item` | object | 创建的项目 | + +### `dynamodb_query` + +使用键条件从 DynamoDB 表中查询项目 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `tableName` | string | 是 | DynamoDB 表名 | +| `keyConditionExpression` | string | 是 | 键条件表达式 \(例如,"pk = :pk"\) | +| `filterExpression` | string | 否 | 结果的过滤表达式 | +| `expressionAttributeNames` | object | 否 | 保留字的属性名称映射 | +| `expressionAttributeValues` | object | 否 | 表达式属性值 | +| `indexName` | string | 否 | 要查询的二级索引名称 | +| `limit` | number | 否 | 要返回的最大项目数 | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `items` | array | 返回的项目数组 | +| `count` | number | 返回的项目数量 | + +### `dynamodb_scan` + +扫描 DynamoDB 表中的所有项目 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `tableName` | string | 是 | DynamoDB 表名 | +| `filterExpression` | string | 否 | 结果的过滤表达式 | +| `projectionExpression` | string | 否 | 要检索的属性 | +| `expressionAttributeNames` | object | 否 | 保留字的属性名称映射 | +| `expressionAttributeValues` | object | 否 | 表达式属性值 | +| `limit` | number | 否 | 要返回的最大项目数 | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `items` | array | 返回的项目数组 | +| `count` | number | 返回的项目数量 | + +### `dynamodb_update` + +更新 DynamoDB 表中的项目 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `tableName` | string | 是 | DynamoDB 表名 | +| `key` | object | 是 | 要更新项目的主键 | +| `updateExpression` | string | 是 | 更新表达式 \(例如,"SET #name = :name"\) | +| `expressionAttributeNames` | object | 否 | 保留字的属性名称映射 | +| `expressionAttributeValues` | object | 否 | 表达式属性值 | +| `conditionExpression` | string | 否 | 更新成功所需满足的条件 | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `item` | object | 更新后的项目 | + +### `dynamodb_delete` + +从 DynamoDB 表中删除项目 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `tableName` | string | 是 | DynamoDB 表名 | +| `key` | object | 是 | 要删除项目的主键 | +| `conditionExpression` | string | 否 | 删除成功所需满足的条件 | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | + +## 注意 + +- 类别: `tools` +- 类型: `dynamodb` diff --git a/apps/docs/content/docs/zh/tools/mailgun.mdx b/apps/docs/content/docs/zh/tools/mailgun.mdx index 8d2e2c4ae6..82a369d363 100644 --- a/apps/docs/content/docs/zh/tools/mailgun.mdx +++ b/apps/docs/content/docs/zh/tools/mailgun.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/content/docs/zh/tools/rds.mdx b/apps/docs/content/docs/zh/tools/rds.mdx new file mode 100644 index 0000000000..304aa235e7 --- /dev/null +++ b/apps/docs/content/docs/zh/tools/rds.mdx @@ -0,0 +1,168 @@ +--- +title: Amazon RDS +description: 通过 Data API 连接到 Amazon RDS +--- + +import { BlockInfoCard } from "@/components/ui/block-info-card" + + + +{/* MANUAL-CONTENT-START:intro */} +[Amazon RDS Aurora Serverless](https://aws.amazon.com/rds/aurora/serverless/) 是一种完全托管的关系型数据库,它会根据您的应用需求自动启动、关闭并调整容量。它允许您在云中运行 SQL 数据库,而无需管理数据库服务器。 + +使用 RDS Aurora Serverless,您可以: + +- **查询数据**:在表中运行灵活的 SQL 查询 +- **插入新记录**:自动向数据库添加数据 +- **更新现有记录**:使用自定义筛选条件修改表中的数据 +- **删除记录**:通过精确的条件删除不需要的数据 +- **执行原始 SQL**:运行 Aurora 支持的任何有效 SQL 命令 + +在 Sim 中,RDS 集成使您的代理能够以安全且编程的方式与 Amazon Aurora Serverless 数据库交互。支持的操作包括: + +- **查询**:运行 SELECT 和其他 SQL 查询以从数据库中获取行 +- **插入**:将新记录插入到具有结构化数据的表中 +- **更新**:更改符合指定条件的行中的数据 +- **删除**:通过自定义筛选条件从表中删除记录 +- **执行**:运行原始 SQL 以应对高级场景 + +此集成允许您的代理在无需人工干预的情况下自动化各种数据库操作。通过将 Sim 与 Amazon RDS 连接,您可以构建能够在工作流中管理、更新和检索关系数据的代理——无需处理数据库基础设施或连接。 +{/* MANUAL-CONTENT-END */} + +## 使用说明 + +通过 Data API 将 Amazon RDS Aurora Serverless 集成到工作流中。可以查询、插入、更新、删除以及执行原始 SQL,而无需管理数据库连接。 + +## 工具 + +### `rds_query` + +使用数据 API 在 Amazon RDS 上执行 SELECT 查询 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `resourceArn` | string | 是 | Aurora 数据库集群的 ARN | +| `secretArn` | string | 是 | 包含数据库凭据的 Secrets Manager 密钥的 ARN | +| `database` | string | 否 | 数据库名称 \(可选\) | +| `query` | string | 是 | 要执行的 SQL SELECT 查询 | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `rows` | array | 查询返回的行数组 | +| `rowCount` | number | 返回的行数 | + +### `rds_insert` + +使用数据 API 将数据插入 Amazon RDS 表 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `resourceArn` | string | 是 | Aurora 数据库集群的 ARN | +| `secretArn` | string | 是 | 包含数据库凭据的 Secrets Manager 密钥的 ARN | +| `database` | string | 否 | 数据库名称 \(可选\) | +| `table` | string | 是 | 要插入的表名 | +| `data` | object | 是 | 要插入的数据,作为键值对 | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `rows` | array | 插入行的数组 | +| `rowCount` | number | 插入的行数 | + +### `rds_update` + +使用 Data API 更新 Amazon RDS 表中的数据 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `resourceArn` | string | 是 | Aurora 数据库集群的 ARN | +| `secretArn` | string | 是 | 包含数据库凭据的 Secrets Manager 密钥的 ARN | +| `database` | string | 否 | 数据库名称 \(可选\) | +| `table` | string | 是 | 要更新的表名 | +| `data` | object | 是 | 要更新的数据,作为键值对 | +| `conditions` | object | 是 | 更新条件 \(例如,\{"id": 1\}\) | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `rows` | array | 更新行的数组 | +| `rowCount` | number | 更新的行数 | + +### `rds_delete` + +使用 Data API 从 Amazon RDS 表中删除数据 + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `resourceArn` | string | 是 | Aurora 数据库集群的 ARN | +| `secretArn` | string | 是 | 包含数据库凭据的 Secrets Manager 密钥的 ARN | +| `database` | string | 否 | 数据库名称 \(可选\) | +| `table` | string | 是 | 要删除的表名 | +| `conditions` | object | 是 | 删除条件 \(例如,\{"id": 1\}\) | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `rows` | array | 已删除行的数组 | +| `rowCount` | number | 已删除行的数量 | + +### `rds_execute` + +使用 Data API 在 Amazon RDS 上执行原始 SQL + +#### 输入 + +| 参数 | 类型 | 必需 | 描述 | +| --------- | ---- | -------- | ----------- | +| `region` | string | 是 | AWS 区域 \(例如,us-east-1\) | +| `accessKeyId` | string | 是 | AWS 访问密钥 ID | +| `secretAccessKey` | string | 是 | AWS 秘密访问密钥 | +| `resourceArn` | string | 是 | Aurora 数据库集群的 ARN | +| `secretArn` | string | 是 | 包含数据库凭据的 Secrets Manager 密钥的 ARN | +| `database` | string | 否 | 数据库名称 \(可选\) | +| `query` | string | 是 | 要执行的原始 SQL 查询 | + +#### 输出 + +| 参数 | 类型 | 描述 | +| --------- | ---- | ----------- | +| `message` | string | 操作状态消息 | +| `rows` | array | 返回或受影响的行数组 | +| `rowCount` | number | 受影响的行数 | + +## 注意 + +- 类别: `tools` +- 类型: `rds` diff --git a/apps/docs/content/docs/zh/tools/s3.mdx b/apps/docs/content/docs/zh/tools/s3.mdx index 0f18de05f0..d63a182d41 100644 --- a/apps/docs/content/docs/zh/tools/s3.mdx +++ b/apps/docs/content/docs/zh/tools/s3.mdx @@ -7,7 +7,7 @@ import { BlockInfoCard } from "@/components/ui/block-info-card" {/* MANUAL-CONTENT-START:intro */} diff --git a/apps/docs/i18n.lock b/apps/docs/i18n.lock index cdc8deceee..423253da9f 100644 --- a/apps/docs/i18n.lock +++ b/apps/docs/i18n.lock @@ -1028,7 +1028,7 @@ checksums: meta/title: cce1ae862f9851c02137f7be070e87bf meta/description: 9c24136d13767cf42d598ecd2cd7895b content/0: 1b031fb0c62c46b177aeed5c3d3f8f80 - content/1: 5cc75c9b77c8b8ee90fd3727b3b3e71a + content/1: 4897888e9b93f43cfa08f08e01d63d45 content/2: bd6df7d7d47e2f5a3562df04bb4c2be5 content/3: a8184d3faf141c4c38d8a31b6374830d content/4: b0425d5c200cae7c869529ea3b8f7214 @@ -47252,7 +47252,7 @@ checksums: meta/title: b0301322c66fcbf604c6988c11a8a0b6 meta/description: 54233683a87a944c333d0a27a15f297e content/0: 1b031fb0c62c46b177aeed5c3d3f8f80 - content/1: 0aefa3b41a9d2ecaf2cfafe6818ed5d2 + content/1: 64159072101de51ad1e456dc76936fd0 content/2: 3f99340b6a2b22d8f91d8cabd457f4f5 content/3: e64b467b3c7f0ade59c79c0a9a8da002 content/4: a639faec4ba8d6237dd700c4c986f8cd @@ -47386,3 +47386,101 @@ checksums: content/14: 387026e7559d9305d0c39edb833e5dcc content/15: b3f310d5ef115bea5a8b75bf25d7ea9a content/16: 448c1ded449bcd1a71f9b589990e1e63 + 0329dfb025ed7a18c4270a67b8e53e1d: + meta/title: 985458a8500ac43c5066b77c5b7172a7 + meta/description: 3a9a5e355c6305088436e9e5295e5e74 + content/0: 1b031fb0c62c46b177aeed5c3d3f8f80 + content/1: 69eb63bb56f5c92f9a06a409fd06e127 + content/2: ceb73025bb48cd3988b5b75eef739ff8 + content/3: 155060ca67bead6a56e501f66d2a6f3e + content/4: 7b84fdc9aa957bab919fe8e445a00127 + content/5: 35bef9915378b9fae2950c43b28d4c66 + content/6: c037e5ef2321d91a39c29c68b423e7d0 + content/7: 805694c6320ddd125301f4bd80948bc4 + content/8: 821e6394b0a953e2b0842b04ae8f3105 + content/9: 7b3b50d86217fa5327e2060db6dc79b1 + content/10: 9c8aa3f09c9b2bd50ea4cdff3598ea4e + content/11: 4a83970297f02d066a140ace7a3ea574 + content/12: 3d0fd2cbd2fd3e61f4dfb545c979cc96 + content/13: 371d0e46b4bd2c23f559b8bc112f6955 + content/14: c6324e539565645847c9b7dc307edbb7 + content/15: bcadfc362b69078beee0088e5936c98b + content/16: d2ae8b29edb03c531de32ab61bdb8199 + content/17: afae946bba1f0a5067cdeacb54f5ff31 + content/18: 9a9d552a9a22b6bd6ee4817cf156548c + content/19: 371d0e46b4bd2c23f559b8bc112f6955 + content/20: 26c5931909354e24571974ccfd8e18f8 + content/21: bcadfc362b69078beee0088e5936c98b + content/22: a6062bdeb33b01cee6c6341254b4f2ad + content/23: 26f3623886a41211d0f929ea6877c370 + content/24: b7e6e86ed0a93dda08569bf6151ee889 + content/25: 371d0e46b4bd2c23f559b8bc112f6955 + content/26: 00608072da9103c89fe5a185645516d0 + content/27: bcadfc362b69078beee0088e5936c98b + content/28: 1afd7403b0fe00913c06e1d69761b7eb + content/29: acf650b1fbe371415a38e1740cba105d + content/30: 01f378c57892b72e3d2d275aca9eaadf + content/31: 371d0e46b4bd2c23f559b8bc112f6955 + content/32: abedb3d9f6ed8f86b76d315d08a2e42b + content/33: bcadfc362b69078beee0088e5936c98b + content/34: 8000c9a9f17a94f6145ebf73becfe558 + content/35: f4a9c229ff71084944a3a7684369a01f + content/36: 7adc475d3c445bd57a77aedb9616da9a + content/37: 371d0e46b4bd2c23f559b8bc112f6955 + content/38: 48c59e09ee36b3d9af3313be2ae5c6d0 + content/39: bcadfc362b69078beee0088e5936c98b + content/40: 59480e97be4e274ddfe5dd8d7f695f05 + content/41: b3f310d5ef115bea5a8b75bf25d7ea9a + content/42: 901ec146345636911d3cc074b6ebfd74 + 451a43cd6440c2447809c9fdc08c7829: + meta/title: cf7ddc77722328e80e5c60d3f42d5577 + meta/description: b6a942fcfafc8821473cacceb558b1f2 + content/0: 1b031fb0c62c46b177aeed5c3d3f8f80 + content/1: 4cf45dd008600c03d0c0549a05110d19 + content/2: 1543a4668fafc72bbba8fe509d5dae57 + content/3: aac6c43b00d999ae7b17b75ef4dc4fc0 + content/4: d083836bb2cd4e5a2876b554e3cd4ae8 + content/5: f1fad0adc2cd25d9a94d5e8d3d275a95 + content/6: 228f96649fa48a0fd2d234d21670ce2f + content/7: 5c2e954b6ee98bea3f3fc6245549c362 + content/8: 821e6394b0a953e2b0842b04ae8f3105 + content/9: b57dad4eb1172e3b0f53009b7d1da96e + content/10: 9c8aa3f09c9b2bd50ea4cdff3598ea4e + content/11: 8562eed524a2e830528798b198c96561 + content/12: 6d9d0007b39670c814a81d610501932e + content/13: 371d0e46b4bd2c23f559b8bc112f6955 + content/14: 6bf3965f5e253d978b652829301399dc + content/15: bcadfc362b69078beee0088e5936c98b + content/16: b7d1fb5e3ccc4a184957e304704a403a + content/17: 808c733932b8cce795b7af43940d88fb + content/18: bd99763a4125a2964039ae6220cfa9b8 + content/19: 371d0e46b4bd2c23f559b8bc112f6955 + content/20: 058c6fe90a3d5d08068c818c6ab1bce1 + content/21: bcadfc362b69078beee0088e5936c98b + content/22: 55600ea367d0b75b0d731dfafe3c4d03 + content/23: af471c6ba3cf808dc02acc3aa174c6ac + content/24: 6cf95280ce4e38cbb1236063867bb681 + content/25: 371d0e46b4bd2c23f559b8bc112f6955 + content/26: e8e70139db1670b1cce1a481ee6a4fec + content/27: bcadfc362b69078beee0088e5936c98b + content/28: f368f6303c8e1cd9670addb972c40dc7 + content/29: bc15e59ce2303dafb4f903468041ebfa + content/30: 59c94fb79703463b63635dc5adf9dea8 + content/31: 371d0e46b4bd2c23f559b8bc112f6955 + content/32: ff866c458970452e2d9d0b418ece0466 + content/33: bcadfc362b69078beee0088e5936c98b + content/34: f368f6303c8e1cd9670addb972c40dc7 + content/35: 32e29c637f05979f7609c5275ad8b4d6 + content/36: 667d37e37c9f801b9aabe30ad900686d + content/37: 371d0e46b4bd2c23f559b8bc112f6955 + content/38: 7c963e0dcecc7000e73fa5a47a138953 + content/39: bcadfc362b69078beee0088e5936c98b + content/40: 26051148e989cb79677c897f49d4f226 + content/41: 62cc98976187ecb6d598f16648eb4604 + content/42: e095759a2cc2de3b86130dfc21e87ff9 + content/43: 371d0e46b4bd2c23f559b8bc112f6955 + content/44: f5084008138beb64b1321b1bff0b6ccd + content/45: bcadfc362b69078beee0088e5936c98b + content/46: 1696af7fda8206f857591de089cea25c + content/47: b3f310d5ef115bea5a8b75bf25d7ea9a + content/48: 076d05c494cf5c494ed98e011b27b289 diff --git a/apps/sim/app/(auth)/components/auth-background.tsx b/apps/sim/app/(auth)/components/auth-background.tsx index ec12774a19..a06ec0cdbf 100644 --- a/apps/sim/app/(auth)/components/auth-background.tsx +++ b/apps/sim/app/(auth)/components/auth-background.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import AuthBackgroundSVG from '@/app/(auth)/components/auth-background-svg' type AuthBackgroundProps = { diff --git a/apps/sim/app/(auth)/components/oauth-provider-checker.tsx b/apps/sim/app/(auth)/components/oauth-provider-checker.tsx index 43766112bb..5651e1d5ec 100644 --- a/apps/sim/app/(auth)/components/oauth-provider-checker.tsx +++ b/apps/sim/app/(auth)/components/oauth-provider-checker.tsx @@ -1,7 +1,7 @@ 'use server' -import { env } from '@/lib/env' -import { isProd } from '@/lib/environment' +import { env } from '@/lib/core/config/env' +import { isProd } from '@/lib/core/config/environment' export async function getOAuthProviderStatus() { const githubAvailable = !!(env.GITHUB_CLIENT_ID && env.GITHUB_CLIENT_SECRET) diff --git a/apps/sim/app/(auth)/components/social-login-buttons.tsx b/apps/sim/app/(auth)/components/social-login-buttons.tsx index 19d2a8cb5c..541c242a12 100644 --- a/apps/sim/app/(auth)/components/social-login-buttons.tsx +++ b/apps/sim/app/(auth)/components/social-login-buttons.tsx @@ -3,7 +3,7 @@ import { type ReactNode, useEffect, useState } from 'react' import { GithubIcon, GoogleIcon } from '@/components/icons' import { Button } from '@/components/ui/button' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { inter } from '@/app/_styles/fonts/inter/inter' interface SocialLoginButtonsProps { diff --git a/apps/sim/app/(auth)/components/sso-login-button.tsx b/apps/sim/app/(auth)/components/sso-login-button.tsx index eeaa650a7d..395a8d4541 100644 --- a/apps/sim/app/(auth)/components/sso-login-button.tsx +++ b/apps/sim/app/(auth)/components/sso-login-button.tsx @@ -2,8 +2,8 @@ import { useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' -import { getEnv, isTruthy } from '@/lib/env' -import { cn } from '@/lib/utils' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' interface SSOLoginButtonProps { callbackURL?: string diff --git a/apps/sim/app/(auth)/login/login-form.tsx b/apps/sim/app/(auth)/login/login-form.tsx index 37a948f4f9..bb3d22d1f6 100644 --- a/apps/sim/app/(auth)/login/login-form.tsx +++ b/apps/sim/app/(auth)/login/login-form.tsx @@ -14,12 +14,12 @@ import { } from '@/components/ui/dialog' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { client } from '@/lib/auth-client' -import { quickValidateEmail } from '@/lib/email/validation' -import { getEnv, isFalsy, isTruthy } from '@/lib/env' +import { client } from '@/lib/auth/auth-client' +import { getEnv, isFalsy, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { SocialLoginButtons } from '@/app/(auth)/components/social-login-buttons' diff --git a/apps/sim/app/(auth)/reset-password/reset-password-form.tsx b/apps/sim/app/(auth)/reset-password/reset-password-form.tsx index 5c8a30e842..7f5b8647d5 100644 --- a/apps/sim/app/(auth)/reset-password/reset-password-form.tsx +++ b/apps/sim/app/(auth)/reset-password/reset-password-form.tsx @@ -5,7 +5,7 @@ import { ArrowRight, ChevronRight, Eye, EyeOff } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { inter } from '@/app/_styles/fonts/inter/inter' interface RequestResetFormProps { diff --git a/apps/sim/app/(auth)/signup/page.tsx b/apps/sim/app/(auth)/signup/page.tsx index 6e0734a1f9..f8878e8aa8 100644 --- a/apps/sim/app/(auth)/signup/page.tsx +++ b/apps/sim/app/(auth)/signup/page.tsx @@ -1,4 +1,4 @@ -import { env, isTruthy } from '@/lib/env' +import { env, isTruthy } from '@/lib/core/config/env' import { getOAuthProviderStatus } from '@/app/(auth)/components/oauth-provider-checker' import SignupForm from '@/app/(auth)/signup/signup-form' diff --git a/apps/sim/app/(auth)/signup/signup-form.tsx b/apps/sim/app/(auth)/signup/signup-form.tsx index c908d006a9..654676f0e6 100644 --- a/apps/sim/app/(auth)/signup/signup-form.tsx +++ b/apps/sim/app/(auth)/signup/signup-form.tsx @@ -7,11 +7,11 @@ import { useRouter, useSearchParams } from 'next/navigation' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { client, useSession } from '@/lib/auth-client' -import { quickValidateEmail } from '@/lib/email/validation' -import { getEnv, isFalsy, isTruthy } from '@/lib/env' +import { client, useSession } from '@/lib/auth/auth-client' +import { getEnv, isFalsy, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { SocialLoginButtons } from '@/app/(auth)/components/social-login-buttons' diff --git a/apps/sim/app/(auth)/sso/page.tsx b/apps/sim/app/(auth)/sso/page.tsx index ba8b82d022..18ff14f905 100644 --- a/apps/sim/app/(auth)/sso/page.tsx +++ b/apps/sim/app/(auth)/sso/page.tsx @@ -1,5 +1,5 @@ import { redirect } from 'next/navigation' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import SSOForm from '@/app/(auth)/sso/sso-form' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/(auth)/sso/sso-form.tsx b/apps/sim/app/(auth)/sso/sso-form.tsx index 497a4d8c27..ae699134e6 100644 --- a/apps/sim/app/(auth)/sso/sso-form.tsx +++ b/apps/sim/app/(auth)/sso/sso-form.tsx @@ -6,11 +6,11 @@ import { useRouter, useSearchParams } from 'next/navigation' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { client } from '@/lib/auth-client' -import { quickValidateEmail } from '@/lib/email/validation' -import { env, isFalsy } from '@/lib/env' +import { client } from '@/lib/auth/auth-client' +import { env, isFalsy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' diff --git a/apps/sim/app/(auth)/verify/page.tsx b/apps/sim/app/(auth)/verify/page.tsx index c841e42c35..0c9eeca10d 100644 --- a/apps/sim/app/(auth)/verify/page.tsx +++ b/apps/sim/app/(auth)/verify/page.tsx @@ -1,5 +1,5 @@ -import { hasEmailService } from '@/lib/email/mailer' -import { isEmailVerificationEnabled, isProd } from '@/lib/environment' +import { isEmailVerificationEnabled, isProd } from '@/lib/core/config/environment' +import { hasEmailService } from '@/lib/messaging/email/mailer' import { VerifyContent } from '@/app/(auth)/verify/verify-content' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/(auth)/verify/use-verification.ts b/apps/sim/app/(auth)/verify/use-verification.ts index af88eb4289..fd30e960f3 100644 --- a/apps/sim/app/(auth)/verify/use-verification.ts +++ b/apps/sim/app/(auth)/verify/use-verification.ts @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' import { useRouter, useSearchParams } from 'next/navigation' -import { client, useSession } from '@/lib/auth-client' +import { client, useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('useVerification') diff --git a/apps/sim/app/(auth)/verify/verify-content.tsx b/apps/sim/app/(auth)/verify/verify-content.tsx index d622f4257d..7259205bc8 100644 --- a/apps/sim/app/(auth)/verify/verify-content.tsx +++ b/apps/sim/app/(auth)/verify/verify-content.tsx @@ -4,7 +4,7 @@ import { Suspense, useEffect, useState } from 'react' import { useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { useVerification } from '@/app/(auth)/verify/use-verification' diff --git a/apps/sim/app/(landing)/careers/page.tsx b/apps/sim/app/(landing)/careers/page.tsx index f531615264..78318e7d7c 100644 --- a/apps/sim/app/(landing)/careers/page.tsx +++ b/apps/sim/app/(landing)/careers/page.tsx @@ -13,10 +13,10 @@ import { SelectValue, } from '@/components/ui/select' import { Textarea } from '@/components/ui/textarea' -import { quickValidateEmail } from '@/lib/email/validation' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Footer from '@/app/(landing)/components/footer/footer' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/(landing)/components/background/background.tsx b/apps/sim/app/(landing)/components/background/background.tsx index 03920259f5..5fae578aec 100644 --- a/apps/sim/app/(landing)/components/background/background.tsx +++ b/apps/sim/app/(landing)/components/background/background.tsx @@ -1,5 +1,5 @@ import dynamic from 'next/dynamic' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' // Lazy load the SVG to reduce initial bundle size const BackgroundSVG = dynamic(() => import('./background-svg'), { diff --git a/apps/sim/app/(landing)/components/hero/components/landing-canvas/dot-pattern.tsx b/apps/sim/app/(landing)/components/hero/components/landing-canvas/dot-pattern.tsx index 46af1c5173..d3ce55cc3d 100644 --- a/apps/sim/app/(landing)/components/hero/components/landing-canvas/dot-pattern.tsx +++ b/apps/sim/app/(landing)/components/hero/components/landing-canvas/dot-pattern.tsx @@ -2,7 +2,7 @@ import type React from 'react' import { useEffect, useId, useRef, useState } from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * DotPattern Component Props diff --git a/apps/sim/app/(landing)/components/hero/hero.tsx b/apps/sim/app/(landing)/components/hero/hero.tsx index c925147e6f..7c94b011e3 100644 --- a/apps/sim/app/(landing)/components/hero/hero.tsx +++ b/apps/sim/app/(landing)/components/hero/hero.tsx @@ -32,7 +32,7 @@ import { StripeIcon, SupabaseIcon, } from '@/components/icons' -import { LandingPromptStorage } from '@/lib/browser-storage' +import { LandingPromptStorage } from '@/lib/core/utils/browser-storage' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { CARD_WIDTH, diff --git a/apps/sim/app/(landing)/components/landing-pricing/landing-pricing.tsx b/apps/sim/app/(landing)/components/landing-pricing/landing-pricing.tsx index 012f5b6de7..2b26ba9e47 100644 --- a/apps/sim/app/(landing)/components/landing-pricing/landing-pricing.tsx +++ b/apps/sim/app/(landing)/components/landing-pricing/landing-pricing.tsx @@ -12,8 +12,8 @@ import { Workflow, } from 'lucide-react' import { useRouter } from 'next/navigation' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { inter } from '@/app/_styles/fonts/inter/inter' import { ENTERPRISE_PLAN_FEATURES, diff --git a/apps/sim/app/(landing)/components/legal-layout.tsx b/apps/sim/app/(landing)/components/legal-layout.tsx index d817fd60f5..f75599d20b 100644 --- a/apps/sim/app/(landing)/components/legal-layout.tsx +++ b/apps/sim/app/(landing)/components/legal-layout.tsx @@ -1,6 +1,6 @@ 'use client' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Footer from '@/app/(landing)/components/footer/footer' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/(landing)/components/nav/nav.tsx b/apps/sim/app/(landing)/components/nav/nav.tsx index 721cd5dd7f..1725c2b164 100644 --- a/apps/sim/app/(landing)/components/nav/nav.tsx +++ b/apps/sim/app/(landing)/components/nav/nav.tsx @@ -7,7 +7,7 @@ import Link from 'next/link' import { useRouter } from 'next/navigation' import { GithubIcon } from '@/components/icons' import { useBrandConfig } from '@/lib/branding/branding' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import { getFormattedGitHubStars } from '@/app/(landing)/actions/github' diff --git a/apps/sim/app/(landing)/privacy/page.tsx b/apps/sim/app/(landing)/privacy/page.tsx index 1586afcb98..7f6a0ee7d6 100644 --- a/apps/sim/app/(landing)/privacy/page.tsx +++ b/apps/sim/app/(landing)/privacy/page.tsx @@ -2,7 +2,7 @@ import { useEffect } from 'react' import Link from 'next/link' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { LegalLayout } from '@/app/(landing)/components' export default function PrivacyPolicy() { diff --git a/apps/sim/app/(landing)/terms/page.tsx b/apps/sim/app/(landing)/terms/page.tsx index 47ffd72d1b..9b56a567ee 100644 --- a/apps/sim/app/(landing)/terms/page.tsx +++ b/apps/sim/app/(landing)/terms/page.tsx @@ -2,7 +2,7 @@ import { useEffect } from 'react' import Link from 'next/link' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { LegalLayout } from '@/app/(landing)/components' export default function TermsOfService() { diff --git a/apps/sim/app/_shell/providers/posthog-provider.tsx b/apps/sim/app/_shell/providers/posthog-provider.tsx index 01261cbeba..6e7ae038eb 100644 --- a/apps/sim/app/_shell/providers/posthog-provider.tsx +++ b/apps/sim/app/_shell/providers/posthog-provider.tsx @@ -3,7 +3,7 @@ import { useEffect } from 'react' import posthog from 'posthog-js' import { PostHogProvider as PHProvider } from 'posthog-js/react' -import { getEnv, isTruthy } from '../../../lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' export function PostHogProvider({ children }: { children: React.ReactNode }) { useEffect(() => { diff --git a/apps/sim/app/_shell/providers/session-provider.tsx b/apps/sim/app/_shell/providers/session-provider.tsx index 19d881516a..70fe344bd0 100644 --- a/apps/sim/app/_shell/providers/session-provider.tsx +++ b/apps/sim/app/_shell/providers/session-provider.tsx @@ -3,7 +3,7 @@ import type React from 'react' import { createContext, useCallback, useEffect, useMemo, useState } from 'react' import posthog from 'posthog-js' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' export type AppSession = { user: { diff --git a/apps/sim/app/api/__test-utils__/utils.ts b/apps/sim/app/api/__test-utils__/utils.ts index 781b122f14..8b85d79dc5 100644 --- a/apps/sim/app/api/__test-utils__/utils.ts +++ b/apps/sim/app/api/__test-utils__/utils.ts @@ -305,24 +305,20 @@ export function createMockRequest( } export function mockExecutionDependencies() { - vi.mock('@/lib/utils', async () => { - const actual = await vi.importActual('@/lib/utils') - return { - ...(actual as any), - decryptSecret: vi.fn().mockImplementation((encrypted: string) => { - const entries = Object.entries(mockEnvironmentVars) - const found = entries.find(([_, val]) => val === encrypted) - const key = found ? found[0] : null - - return Promise.resolve({ - decrypted: - key && key in mockDecryptedEnvVars - ? mockDecryptedEnvVars[key as keyof typeof mockDecryptedEnvVars] - : 'decrypted-value', - }) - }), - } - }) + vi.mock('@/lib/core/security/encryption', () => ({ + decryptSecret: vi.fn().mockImplementation((encrypted: string) => { + const entries = Object.entries(mockEnvironmentVars) + const found = entries.find(([_, val]) => val === encrypted) + const key = found ? found[0] : null + + return Promise.resolve({ + decrypted: + key && key in mockDecryptedEnvVars + ? mockDecryptedEnvVars[key as keyof typeof mockDecryptedEnvVars] + : 'decrypted-value', + }) + }), + })) vi.mock('@/lib/logs/execution/trace-spans/trace-spans', () => ({ buildTraceSpans: vi.fn().mockReturnValue({ @@ -455,7 +451,7 @@ export function mockWorkflowAccessValidation(shouldSucceed = true) { } export async function getMockedDependencies() { - const utilsModule = await import('@/lib/utils') + const encryptionModule = await import('@/lib/core/security/encryption') const traceSpansModule = await import('@/lib/logs/execution/trace-spans/trace-spans') const workflowUtilsModule = await import('@/lib/workflows/utils') const executorModule = await import('@/executor') @@ -463,7 +459,7 @@ export async function getMockedDependencies() { const dbModule = await import('@sim/db') return { - decryptSecret: utilsModule.decryptSecret, + decryptSecret: encryptionModule.decryptSecret, buildTraceSpans: traceSpansModule.buildTraceSpans, updateWorkflowRunCounts: workflowUtilsModule.updateWorkflowRunCounts, Executor: executorModule.Executor, @@ -801,7 +797,7 @@ export function mockFileSystem( export function mockEncryption(options: { encryptedValue?: string; decryptedValue?: string } = {}) { const { encryptedValue = 'encrypted-value', decryptedValue = 'decrypted-value' } = options - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/security/encryption', () => ({ encryptSecret: vi.fn().mockResolvedValue({ encrypted: encryptedValue }), decryptSecret: vi.fn().mockResolvedValue({ decrypted: decryptedValue }), })) diff --git a/apps/sim/app/api/auth/oauth/connections/route.ts b/apps/sim/app/api/auth/oauth/connections/route.ts index 0a824ebcbf..8ec7c85993 100644 --- a/apps/sim/app/api/auth/oauth/connections/route.ts +++ b/apps/sim/app/api/auth/oauth/connections/route.ts @@ -3,10 +3,10 @@ import { eq } from 'drizzle-orm' import { jwtDecode } from 'jwt-decode' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import type { OAuthProvider } from '@/lib/oauth/oauth' import { evaluateScopeCoverage, parseProvider } from '@/lib/oauth/oauth' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('OAuthConnectionsAPI') diff --git a/apps/sim/app/api/auth/oauth/credentials/route.ts b/apps/sim/app/api/auth/oauth/credentials/route.ts index 21f02d9de8..6f5f40de81 100644 --- a/apps/sim/app/api/auth/oauth/credentials/route.ts +++ b/apps/sim/app/api/auth/oauth/credentials/route.ts @@ -5,10 +5,10 @@ import { jwtDecode } from 'jwt-decode' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { evaluateScopeCoverage, parseProvider } from '@/lib/oauth/oauth' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/oauth/disconnect/route.ts b/apps/sim/app/api/auth/oauth/disconnect/route.ts index 265e86f480..39f3b8648b 100644 --- a/apps/sim/app/api/auth/oauth/disconnect/route.ts +++ b/apps/sim/app/api/auth/oauth/disconnect/route.ts @@ -4,8 +4,8 @@ import { and, eq, like, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/oauth/microsoft/file/route.ts b/apps/sim/app/api/auth/oauth/microsoft/file/route.ts index c6400477ce..4bb6de84ce 100644 --- a/apps/sim/app/api/auth/oauth/microsoft/file/route.ts +++ b/apps/sim/app/api/auth/oauth/microsoft/file/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateMicrosoftGraphId } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { getCredential, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/oauth/microsoft/files/route.ts b/apps/sim/app/api/auth/oauth/microsoft/files/route.ts index 020fec07c2..a5fe878875 100644 --- a/apps/sim/app/api/auth/oauth/microsoft/files/route.ts +++ b/apps/sim/app/api/auth/oauth/microsoft/files/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getCredential, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/oauth/token/route.ts b/apps/sim/app/api/auth/oauth/token/route.ts index f70955b5fb..b89aff1aa9 100644 --- a/apps/sim/app/api/auth/oauth/token/route.ts +++ b/apps/sim/app/api/auth/oauth/token/route.ts @@ -2,8 +2,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { authorizeCredentialUse } from '@/lib/auth/credential-access' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getCredential, refreshTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts b/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts index 8cead83d0f..4337033779 100644 --- a/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts +++ b/apps/sim/app/api/auth/oauth/wealthbox/item/route.ts @@ -3,9 +3,9 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateEnum, validatePathSegment } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateEnum, validatePathSegment } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts b/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts index eea0ebff83..83ba588ba2 100644 --- a/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts +++ b/apps/sim/app/api/auth/oauth/wealthbox/items/route.ts @@ -3,8 +3,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/sso/register/route.ts b/apps/sim/app/api/auth/sso/register/route.ts index 0e8c18815c..ccda1314b1 100644 --- a/apps/sim/app/api/auth/sso/register/route.ts +++ b/apps/sim/app/api/auth/sso/register/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { auth } from '@/lib/auth' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('SSO-Register') diff --git a/apps/sim/app/api/auth/trello/authorize/route.ts b/apps/sim/app/api/auth/trello/authorize/route.ts index 5172db53f6..d3c05f9137 100644 --- a/apps/sim/app/api/auth/trello/authorize/route.ts +++ b/apps/sim/app/api/auth/trello/authorize/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('TrelloAuthorize') diff --git a/apps/sim/app/api/auth/trello/callback/route.ts b/apps/sim/app/api/auth/trello/callback/route.ts index e1732b9ffe..2aa76dc8ad 100644 --- a/apps/sim/app/api/auth/trello/callback/route.ts +++ b/apps/sim/app/api/auth/trello/callback/route.ts @@ -1,5 +1,5 @@ import { type NextRequest, NextResponse } from 'next/server' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/auth/trello/store/route.ts b/apps/sim/app/api/auth/trello/store/route.ts index 11ba70af08..7bebff6591 100644 --- a/apps/sim/app/api/auth/trello/store/route.ts +++ b/apps/sim/app/api/auth/trello/store/route.ts @@ -1,7 +1,7 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { db } from '@/../../packages/db' import { account } from '@/../../packages/db/schema' diff --git a/apps/sim/app/api/billing/portal/route.ts b/apps/sim/app/api/billing/portal/route.ts index 959a83cd7f..c68b24e669 100644 --- a/apps/sim/app/api/billing/portal/route.ts +++ b/apps/sim/app/api/billing/portal/route.ts @@ -4,8 +4,8 @@ import { and, eq, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { requireStripeClient } from '@/lib/billing/stripe-client' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('BillingPortal') diff --git a/apps/sim/app/api/billing/update-cost/route.ts b/apps/sim/app/api/billing/update-cost/route.ts index 75c7979a29..c22a21cdbb 100644 --- a/apps/sim/app/api/billing/update-cost/route.ts +++ b/apps/sim/app/api/billing/update-cost/route.ts @@ -5,9 +5,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' import { checkInternalApiKey } from '@/lib/copilot/utils' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('BillingUpdateCostAPI') diff --git a/apps/sim/app/api/careers/submit/route.ts b/apps/sim/app/api/careers/submit/route.ts index bf0d492e05..5ed4b418ce 100644 --- a/apps/sim/app/api/careers/submit/route.ts +++ b/apps/sim/app/api/careers/submit/route.ts @@ -3,9 +3,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import CareersConfirmationEmail from '@/components/emails/careers/careers-confirmation-email' import CareersSubmissionEmail from '@/components/emails/careers/careers-submission-email' -import { sendEmail } from '@/lib/email/mailer' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/chat/[identifier]/otp/route.ts b/apps/sim/app/api/chat/[identifier]/otp/route.ts index 8ba425972d..37412a55f9 100644 --- a/apps/sim/app/api/chat/[identifier]/otp/route.ts +++ b/apps/sim/app/api/chat/[identifier]/otp/route.ts @@ -4,10 +4,10 @@ import { eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { z } from 'zod' import { renderOTPEmail } from '@/components/emails/render-email' -import { sendEmail } from '@/lib/email/mailer' +import { getRedisClient, markMessageAsProcessed, releaseLock } from '@/lib/core/config/redis' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient, markMessageAsProcessed, releaseLock } from '@/lib/redis' -import { generateRequestId } from '@/lib/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' import { addCorsHeaders, setChatAuthCookie } from '@/app/api/chat/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/chat/[identifier]/route.test.ts b/apps/sim/app/api/chat/[identifier]/route.test.ts index c7cc5754e4..7e119786b3 100644 --- a/apps/sim/app/api/chat/[identifier]/route.test.ts +++ b/apps/sim/app/api/chat/[identifier]/route.test.ts @@ -53,17 +53,20 @@ vi.mock('@/lib/logs/execution/logging-session', () => ({ })), })) -vi.mock('@/lib/workflows/streaming', () => ({ +vi.mock('@/lib/workflows/streaming/streaming', () => ({ createStreamingResponse: vi.fn().mockImplementation(async () => createMockStream()), })) -vi.mock('@/lib/utils', () => ({ +vi.mock('@/lib/core/utils/sse', () => ({ SSE_HEADERS: { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive', 'X-Accel-Buffering': 'no', }, +})) + +vi.mock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn().mockReturnValue('test-request-id'), })) @@ -388,7 +391,7 @@ describe('Chat Identifier API Route', () => { const params = Promise.resolve({ identifier: 'test-chat' }) const { POST } = await import('@/app/api/chat/[identifier]/route') - const { createStreamingResponse } = await import('@/lib/workflows/streaming') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') const response = await POST(req, { params }) @@ -440,7 +443,7 @@ describe('Chat Identifier API Route', () => { }) it('should handle workflow execution errors gracefully', async () => { - const { createStreamingResponse } = await import('@/lib/workflows/streaming') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') const originalStreamingResponse = vi.mocked(createStreamingResponse).getMockImplementation() vi.mocked(createStreamingResponse).mockImplementationOnce(async () => { throw new Error('Execution failed') @@ -492,7 +495,7 @@ describe('Chat Identifier API Route', () => { const params = Promise.resolve({ identifier: 'test-chat' }) const { POST } = await import('@/app/api/chat/[identifier]/route') - const { createStreamingResponse } = await import('@/lib/workflows/streaming') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') await POST(req, { params }) @@ -511,7 +514,7 @@ describe('Chat Identifier API Route', () => { const params = Promise.resolve({ identifier: 'test-chat' }) const { POST } = await import('@/app/api/chat/[identifier]/route') - const { createStreamingResponse } = await import('@/lib/workflows/streaming') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') await POST(req, { params }) diff --git a/apps/sim/app/api/chat/[identifier]/route.ts b/apps/sim/app/api/chat/[identifier]/route.ts index cac8f60dff..60a4c0ae78 100644 --- a/apps/sim/app/api/chat/[identifier]/route.ts +++ b/apps/sim/app/api/chat/[identifier]/route.ts @@ -4,11 +4,11 @@ import { chat } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { ChatFiles } from '@/lib/uploads' -import { generateRequestId } from '@/lib/utils' import { addCorsHeaders, setChatAuthCookie, @@ -182,8 +182,8 @@ export async function POST( } } - const { createStreamingResponse } = await import('@/lib/workflows/streaming') - const { SSE_HEADERS } = await import('@/lib/utils') + const { createStreamingResponse } = await import('@/lib/workflows/streaming/streaming') + const { SSE_HEADERS } = await import('@/lib/core/utils/sse') const { createFilteredResult } = await import('@/app/api/workflows/[id]/execute/route') const workflowInput: any = { input, conversationId } diff --git a/apps/sim/app/api/chat/manage/[id]/route.test.ts b/apps/sim/app/api/chat/manage/[id]/route.test.ts index e5fe704ad5..7c1c3ff9fb 100644 --- a/apps/sim/app/api/chat/manage/[id]/route.test.ts +++ b/apps/sim/app/api/chat/manage/[id]/route.test.ts @@ -69,15 +69,15 @@ describe('Chat Edit API Route', () => { }), })) - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/security/encryption', () => ({ encryptSecret: mockEncryptSecret.mockResolvedValue({ encrypted: 'encrypted-password' }), })) - vi.doMock('@/lib/urls/utils', () => ({ + vi.doMock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn().mockReturnValue('localhost:3000'), })) - vi.doMock('@/lib/environment', () => ({ + vi.doMock('@/lib/core/config/environment', () => ({ isDev: true, })) @@ -86,7 +86,7 @@ describe('Chat Edit API Route', () => { })) mockDeployWorkflow.mockResolvedValue({ success: true, version: 1 }) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ deployWorkflow: mockDeployWorkflow, })) diff --git a/apps/sim/app/api/chat/manage/[id]/route.ts b/apps/sim/app/api/chat/manage/[id]/route.ts index 5048030782..c624582e97 100644 --- a/apps/sim/app/api/chat/manage/[id]/route.ts +++ b/apps/sim/app/api/chat/manage/[id]/route.ts @@ -4,11 +4,11 @@ import { eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' +import { encryptSecret } from '@/lib/core/security/encryption' +import { getEmailDomain } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getEmailDomain } from '@/lib/urls/utils' -import { encryptSecret } from '@/lib/utils' -import { deployWorkflow } from '@/lib/workflows/db-helpers' +import { deployWorkflow } from '@/lib/workflows/persistence/utils' import { checkChatAccess } from '@/app/api/chat/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/chat/route.test.ts b/apps/sim/app/api/chat/route.test.ts index 567d02c2f1..7156c80c72 100644 --- a/apps/sim/app/api/chat/route.test.ts +++ b/apps/sim/app/api/chat/route.test.ts @@ -66,7 +66,7 @@ describe('Chat API Route', () => { }), })) - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/security/encryption', () => ({ encryptSecret: mockEncryptSecret.mockResolvedValue({ encrypted: 'encrypted-password' }), })) @@ -78,7 +78,7 @@ describe('Chat API Route', () => { checkWorkflowAccessForChatCreation: mockCheckWorkflowAccessForChatCreation, })) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ deployWorkflow: mockDeployWorkflow.mockResolvedValue({ success: true, version: 1, @@ -249,7 +249,7 @@ describe('Chat API Route', () => { }), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { NODE_ENV: 'development', NEXT_PUBLIC_APP_URL: 'http://localhost:3000', @@ -296,7 +296,7 @@ describe('Chat API Route', () => { }), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { NODE_ENV: 'development', NEXT_PUBLIC_APP_URL: 'http://localhost:3000', diff --git a/apps/sim/app/api/chat/route.ts b/apps/sim/app/api/chat/route.ts index ea0153fdeb..a2476424ce 100644 --- a/apps/sim/app/api/chat/route.ts +++ b/apps/sim/app/api/chat/route.ts @@ -5,11 +5,11 @@ import type { NextRequest } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' +import { encryptSecret } from '@/lib/core/security/encryption' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { encryptSecret } from '@/lib/utils' -import { deployWorkflow } from '@/lib/workflows/db-helpers' +import { deployWorkflow } from '@/lib/workflows/persistence/utils' import { checkWorkflowAccessForChatCreation } from '@/app/api/chat/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/chat/utils.test.ts b/apps/sim/app/api/chat/utils.test.ts index bc7bca71a2..9faa65b1ea 100644 --- a/apps/sim/app/api/chat/utils.test.ts +++ b/apps/sim/app/api/chat/utils.test.ts @@ -5,7 +5,7 @@ import type { NextResponse } from 'next/server' * @vitest-environment node */ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' vi.mock('@sim/db', () => ({ db: { @@ -36,8 +36,11 @@ vi.mock('@/stores/workflows/server-utils', () => ({ const mockDecryptSecret = vi.fn() -vi.mock('@/lib/utils', () => ({ +vi.mock('@/lib/core/security/encryption', () => ({ decryptSecret: mockDecryptSecret, +})) + +vi.mock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn(), })) @@ -60,7 +63,7 @@ describe('Chat API Utils', () => { }, }) - vi.doMock('@/lib/environment', () => ({ + vi.doMock('@/lib/core/config/environment', () => ({ isDev: true, isHosted: false, })) @@ -229,7 +232,7 @@ describe('Chat API Utils', () => { it('should validate password for POST requests', async () => { const { validateChatAuth } = await import('@/app/api/chat/utils') - const { decryptSecret } = await import('@/lib/utils') + const { decryptSecret } = await import('@/lib/core/security/encryption') const deployment = { id: 'chat-id', diff --git a/apps/sim/app/api/chat/utils.ts b/apps/sim/app/api/chat/utils.ts index 88c2062f32..1e41f92012 100644 --- a/apps/sim/app/api/chat/utils.ts +++ b/apps/sim/app/api/chat/utils.ts @@ -2,10 +2,10 @@ import { db } from '@sim/db' import { chat, workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import type { NextRequest, NextResponse } from 'next/server' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' +import { decryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { hasAdminPermission } from '@/lib/permissions/utils' -import { decryptSecret } from '@/lib/utils' +import { hasAdminPermission } from '@/lib/workspaces/permissions/utils' const logger = createLogger('ChatAuthUtils') diff --git a/apps/sim/app/api/copilot/api-keys/generate/route.ts b/apps/sim/app/api/copilot/api-keys/generate/route.ts index 081f345b50..2971babf49 100644 --- a/apps/sim/app/api/copilot/api-keys/generate/route.ts +++ b/apps/sim/app/api/copilot/api-keys/generate/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' +import { env } from '@/lib/core/config/env' const GenerateApiKeySchema = z.object({}).optional() diff --git a/apps/sim/app/api/copilot/api-keys/route.ts b/apps/sim/app/api/copilot/api-keys/route.ts index 3de2b0feb0..9e61ba281e 100644 --- a/apps/sim/app/api/copilot/api-keys/route.ts +++ b/apps/sim/app/api/copilot/api-keys/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' +import { env } from '@/lib/core/config/env' export async function GET(request: NextRequest) { try { diff --git a/apps/sim/app/api/copilot/chat/route.test.ts b/apps/sim/app/api/copilot/chat/route.test.ts index 80b30dabf5..c680890bd8 100644 --- a/apps/sim/app/api/copilot/chat/route.test.ts +++ b/apps/sim/app/api/copilot/chat/route.test.ts @@ -97,8 +97,11 @@ describe('Copilot Chat API Route', () => { mockGetRotatingApiKey.mockReturnValue('test-api-key') - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/config/api-keys', () => ({ getRotatingApiKey: mockGetRotatingApiKey, + })) + + vi.doMock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn(() => 'test-request-id'), })) @@ -110,7 +113,7 @@ describe('Copilot Chat API Route', () => { NODE_ENV: 'test', } as const - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: mockEnvValues, getEnv: (variable: string) => mockEnvValues[variable as keyof typeof mockEnvValues], isTruthy: (value: string | boolean | number | undefined) => diff --git a/apps/sim/app/api/copilot/chat/route.ts b/apps/sim/app/api/copilot/chat/route.ts index d20145e097..8981c5dd24 100644 --- a/apps/sim/app/api/copilot/chat/route.ts +++ b/apps/sim/app/api/copilot/chat/route.ts @@ -4,19 +4,19 @@ import { and, desc, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateChatTitle } from '@/lib/copilot/chat-title' +import { getCopilotModel } from '@/lib/copilot/config' +import { SIM_AGENT_API_URL_DEFAULT, SIM_AGENT_VERSION } from '@/lib/copilot/constants' import { authenticateCopilotRequestSessionOnly, createBadRequestResponse, createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' -import { getCopilotModel } from '@/lib/copilot/config' +} from '@/lib/copilot/request-helpers' import type { CopilotProviderConfig } from '@/lib/copilot/types' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { SIM_AGENT_API_URL_DEFAULT, SIM_AGENT_VERSION } from '@/lib/sim-agent/constants' -import { generateChatTitle } from '@/lib/sim-agent/utils' import { CopilotFiles } from '@/lib/uploads' import { createFileContent } from '@/lib/uploads/utils/file-utils' diff --git a/apps/sim/app/api/copilot/chat/update-messages/route.ts b/apps/sim/app/api/copilot/chat/update-messages/route.ts index f58e2f7a53..bc17ddad52 100644 --- a/apps/sim/app/api/copilot/chat/update-messages/route.ts +++ b/apps/sim/app/api/copilot/chat/update-messages/route.ts @@ -9,7 +9,7 @@ import { createNotFoundResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotChatUpdateAPI') diff --git a/apps/sim/app/api/copilot/chats/route.ts b/apps/sim/app/api/copilot/chats/route.ts index 49301e8db1..e51d3fb597 100644 --- a/apps/sim/app/api/copilot/chats/route.ts +++ b/apps/sim/app/api/copilot/chats/route.ts @@ -6,7 +6,7 @@ import { authenticateCopilotRequestSessionOnly, createInternalServerErrorResponse, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotChatsListAPI') diff --git a/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts b/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts index 6d2d3e89b7..9725413985 100644 --- a/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts +++ b/apps/sim/app/api/copilot/checkpoints/revert/route.test.ts @@ -24,7 +24,7 @@ describe('Copilot Checkpoints Revert API Route', () => { mockCryptoUuid() // Mock getBaseUrl to return localhost for tests - vi.doMock('@/lib/urls/utils', () => ({ + vi.doMock('@/lib/core/utils/urls', () => ({ getBaseUrl: vi.fn(() => 'http://localhost:3000'), getBaseDomain: vi.fn(() => 'localhost:3000'), getEmailDomain: vi.fn(() => 'localhost:3000'), diff --git a/apps/sim/app/api/copilot/checkpoints/revert/route.ts b/apps/sim/app/api/copilot/checkpoints/revert/route.ts index a6a7f29998..e47f2f6d11 100644 --- a/apps/sim/app/api/copilot/checkpoints/revert/route.ts +++ b/apps/sim/app/api/copilot/checkpoints/revert/route.ts @@ -9,10 +9,10 @@ import { createNotFoundResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' +import { validateUUID } from '@/lib/core/security/input-validation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { validateUUID } from '@/lib/security/input-validation' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('CheckpointRevertAPI') diff --git a/apps/sim/app/api/copilot/checkpoints/route.ts b/apps/sim/app/api/copilot/checkpoints/route.ts index 55722b430e..5110ae12f9 100644 --- a/apps/sim/app/api/copilot/checkpoints/route.ts +++ b/apps/sim/app/api/copilot/checkpoints/route.ts @@ -9,7 +9,7 @@ import { createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('WorkflowCheckpointsAPI') diff --git a/apps/sim/app/api/copilot/confirm/route.test.ts b/apps/sim/app/api/copilot/confirm/route.test.ts index 75db10f4df..6fc1bfa7e8 100644 --- a/apps/sim/app/api/copilot/confirm/route.test.ts +++ b/apps/sim/app/api/copilot/confirm/route.test.ts @@ -28,27 +28,23 @@ describe('Copilot Confirm API Route', () => { } mockGetRedisClient.mockReturnValue(mockRedisClient) - mockRedisExists.mockResolvedValue(1) // Tool call exists by default + mockRedisExists.mockResolvedValue(1) mockRedisSet.mockResolvedValue('OK') - vi.doMock('@/lib/redis', () => ({ + vi.doMock('@/lib/core/config/redis', () => ({ getRedisClient: mockGetRedisClient, })) - // Mock setTimeout to control polling behavior vi.spyOn(global, 'setTimeout').mockImplementation((callback, _delay) => { - // Immediately call callback to avoid delays if (typeof callback === 'function') { setImmediate(callback) } return setTimeout(() => {}, 0) as any }) - // Mock Date.now to control timeout behavior let mockTime = 1640995200000 vi.spyOn(Date, 'now').mockImplementation(() => { - // Increment time rapidly to trigger timeout for non-existent keys - mockTime += 10000 // Add 10 seconds each call + mockTime += 10000 return mockTime }) }) @@ -82,7 +78,6 @@ describe('Copilot Confirm API Route', () => { const req = createMockRequest('POST', { status: 'success', - // Missing toolCallId }) const { POST } = await import('@/app/api/copilot/confirm/route') @@ -149,7 +144,6 @@ describe('Copilot Confirm API Route', () => { status: 'success', }) - // Verify Redis operations were called expect(mockRedisExists).toHaveBeenCalled() expect(mockRedisSet).toHaveBeenCalled() }) @@ -252,7 +246,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Mock Redis client as unavailable mockGetRedisClient.mockReturnValue(null) const req = createMockRequest('POST', { @@ -272,7 +265,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Mock tool call as not existing in Redis mockRedisExists.mockResolvedValue(0) const req = createMockRequest('POST', { @@ -292,7 +284,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Mock Redis operations to throw an error mockRedisExists.mockRejectedValue(new Error('Redis connection failed')) const req = createMockRequest('POST', { @@ -312,7 +303,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Tool call exists but set operation fails mockRedisExists.mockResolvedValue(1) mockRedisSet.mockRejectedValue(new Error('Redis set failed')) @@ -333,7 +323,6 @@ describe('Copilot Confirm API Route', () => { const authMocks = mockAuth() authMocks.setAuthenticated() - // Create a request with invalid JSON const req = new NextRequest('http://localhost:3000/api/copilot/confirm', { method: 'POST', body: '{invalid-json', diff --git a/apps/sim/app/api/copilot/confirm/route.ts b/apps/sim/app/api/copilot/confirm/route.ts index a58426f852..fed0ad3dff 100644 --- a/apps/sim/app/api/copilot/confirm/route.ts +++ b/apps/sim/app/api/copilot/confirm/route.ts @@ -7,9 +7,9 @@ import { createRequestTracker, createUnauthorizedResponse, type NotificationStatus, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' +import { getRedisClient } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient } from '@/lib/redis' const logger = createLogger('CopilotConfirmAPI') diff --git a/apps/sim/app/api/copilot/context-usage/route.ts b/apps/sim/app/api/copilot/context-usage/route.ts index fdac63b836..edb2b31c59 100644 --- a/apps/sim/app/api/copilot/context-usage/route.ts +++ b/apps/sim/app/api/copilot/context-usage/route.ts @@ -2,10 +2,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { getCopilotModel } from '@/lib/copilot/config' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' import type { CopilotProviderConfig } from '@/lib/copilot/types' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' const logger = createLogger('ContextUsageAPI') diff --git a/apps/sim/app/api/copilot/execute-copilot-server-tool/route.ts b/apps/sim/app/api/copilot/execute-copilot-server-tool/route.ts index 333e5bed43..c4bdbf4d8c 100644 --- a/apps/sim/app/api/copilot/execute-copilot-server-tool/route.ts +++ b/apps/sim/app/api/copilot/execute-copilot-server-tool/route.ts @@ -6,7 +6,7 @@ import { createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { routeExecution } from '@/lib/copilot/tools/server/router' import { createLogger } from '@/lib/logs/console/logger' diff --git a/apps/sim/app/api/copilot/feedback/route.ts b/apps/sim/app/api/copilot/feedback/route.ts index a71e293f89..86a95a9fc0 100644 --- a/apps/sim/app/api/copilot/feedback/route.ts +++ b/apps/sim/app/api/copilot/feedback/route.ts @@ -8,7 +8,7 @@ import { createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' +} from '@/lib/copilot/request-helpers' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotFeedbackAPI') diff --git a/apps/sim/app/api/copilot/stats/route.ts b/apps/sim/app/api/copilot/stats/route.ts index 643900c32c..ea52c1c58b 100644 --- a/apps/sim/app/api/copilot/stats/route.ts +++ b/apps/sim/app/api/copilot/stats/route.ts @@ -1,14 +1,14 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' import { authenticateCopilotRequestSessionOnly, createBadRequestResponse, createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' -import { env } from '@/lib/env' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' +} from '@/lib/copilot/request-helpers' +import { env } from '@/lib/core/config/env' const SIM_AGENT_API_URL = env.SIM_AGENT_API_URL || SIM_AGENT_API_URL_DEFAULT diff --git a/apps/sim/app/api/copilot/tools/mark-complete/route.ts b/apps/sim/app/api/copilot/tools/mark-complete/route.ts index 601a652d0a..93bfef7d2d 100644 --- a/apps/sim/app/api/copilot/tools/mark-complete/route.ts +++ b/apps/sim/app/api/copilot/tools/mark-complete/route.ts @@ -1,15 +1,15 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/copilot/constants' import { authenticateCopilotRequestSessionOnly, createBadRequestResponse, createInternalServerErrorResponse, createRequestTracker, createUnauthorizedResponse, -} from '@/lib/copilot/auth' -import { env } from '@/lib/env' +} from '@/lib/copilot/request-helpers' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' const logger = createLogger('CopilotMarkToolCompleteAPI') diff --git a/apps/sim/app/api/copilot/training/examples/route.ts b/apps/sim/app/api/copilot/training/examples/route.ts index cb5919af41..7d735427df 100644 --- a/apps/sim/app/api/copilot/training/examples/route.ts +++ b/apps/sim/app/api/copilot/training/examples/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotTrainingExamplesAPI') diff --git a/apps/sim/app/api/copilot/training/route.ts b/apps/sim/app/api/copilot/training/route.ts index 278132e48c..aed162af6a 100644 --- a/apps/sim/app/api/copilot/training/route.ts +++ b/apps/sim/app/api/copilot/training/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotTrainingAPI') diff --git a/apps/sim/app/api/creators/[id]/route.ts b/apps/sim/app/api/creators/[id]/route.ts index 886f5b7ddf..c55b915cbf 100644 --- a/apps/sim/app/api/creators/[id]/route.ts +++ b/apps/sim/app/api/creators/[id]/route.ts @@ -4,8 +4,8 @@ import { and, eq, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('CreatorProfileByIdAPI') diff --git a/apps/sim/app/api/creators/[id]/verify/route.ts b/apps/sim/app/api/creators/[id]/verify/route.ts index 9e29bbdfe5..2bb13115bd 100644 --- a/apps/sim/app/api/creators/[id]/verify/route.ts +++ b/apps/sim/app/api/creators/[id]/verify/route.ts @@ -3,8 +3,8 @@ import { templateCreators, user } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('CreatorVerificationAPI') diff --git a/apps/sim/app/api/creators/route.ts b/apps/sim/app/api/creators/route.ts index 13c6d34f18..96548e83e3 100644 --- a/apps/sim/app/api/creators/route.ts +++ b/apps/sim/app/api/creators/route.ts @@ -5,8 +5,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import type { CreatorProfileDetails } from '@/app/_types/creator-profile' const logger = createLogger('CreatorProfilesAPI') diff --git a/apps/sim/app/api/environment/route.ts b/apps/sim/app/api/environment/route.ts index c26c1dbfd6..6425305f3b 100644 --- a/apps/sim/app/api/environment/route.ts +++ b/apps/sim/app/api/environment/route.ts @@ -4,8 +4,9 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { decryptSecret, encryptSecret, generateRequestId } from '@/lib/utils' import type { EnvironmentVariable } from '@/stores/settings/environment/types' const logger = createLogger('EnvironmentAPI') diff --git a/apps/sim/app/api/files/authorization.ts b/apps/sim/app/api/files/authorization.ts index d40635b7f1..6083a92c74 100644 --- a/apps/sim/app/api/files/authorization.ts +++ b/apps/sim/app/api/files/authorization.ts @@ -2,7 +2,6 @@ import { db } from '@sim/db' import { document, workspaceFile } from '@sim/db/schema' import { eq, like, or } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import { getFileMetadata } from '@/lib/uploads' import type { StorageContext } from '@/lib/uploads/config' import { @@ -14,6 +13,7 @@ import { import type { StorageConfig } from '@/lib/uploads/core/storage-client' import { getFileMetadataByKey } from '@/lib/uploads/server/metadata' import { inferContextFromKey } from '@/lib/uploads/utils/file-utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('FileAuthorization') diff --git a/apps/sim/app/api/files/download/route.ts b/apps/sim/app/api/files/download/route.ts index 0d2642965a..38de9b4021 100644 --- a/apps/sim/app/api/files/download/route.ts +++ b/apps/sim/app/api/files/download/route.ts @@ -61,7 +61,7 @@ export async function POST(request: NextRequest) { throw new FileNotFoundError(`File not found: ${key}`) } - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') const downloadUrl = `${getBaseUrl()}/api/files/serve/${encodeURIComponent(key)}?context=${storageContext}` logger.info(`Generated download URL for ${storageContext} file: ${key}`) diff --git a/apps/sim/app/api/files/parse/route.ts b/apps/sim/app/api/files/parse/route.ts index b1c5d5cc3e..a81560ea41 100644 --- a/apps/sim/app/api/files/parse/route.ts +++ b/apps/sim/app/api/files/parse/route.ts @@ -5,10 +5,9 @@ import path from 'path' import binaryExtensionsList from 'binary-extensions' import { type NextRequest, NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { validateExternalUrl } from '@/lib/core/security/input-validation' import { isSupportedFileType, parseFile } from '@/lib/file-parsers' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { validateExternalUrl } from '@/lib/security/input-validation' import { isUsingCloudStorage, type StorageContext, StorageService } from '@/lib/uploads' import { UPLOAD_DIR_SERVER } from '@/lib/uploads/core/setup.server' import { getFileMetadataByKey } from '@/lib/uploads/server/metadata' @@ -19,6 +18,7 @@ import { getViewerUrl, inferContextFromKey, } from '@/lib/uploads/utils/file-utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { verifyFileAccess } from '@/app/api/files/authorization' import '@/lib/uploads/core/setup.server' diff --git a/apps/sim/app/api/files/upload/route.ts b/apps/sim/app/api/files/upload/route.ts index c2f629fa4e..89d911e89d 100644 --- a/apps/sim/app/api/files/upload/route.ts +++ b/apps/sim/app/api/files/upload/route.ts @@ -2,10 +2,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { createLogger } from '@/lib/logs/console/logger' import '@/lib/uploads/core/setup.server' import { getSession } from '@/lib/auth' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import type { StorageContext } from '@/lib/uploads/config' import { isImageFileType } from '@/lib/uploads/utils/file-utils' import { validateFileType } from '@/lib/uploads/utils/validation' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { createErrorResponse, createOptionsResponse, diff --git a/apps/sim/app/api/folders/[id]/duplicate/route.ts b/apps/sim/app/api/folders/[id]/duplicate/route.ts index eff6180644..914485a3b6 100644 --- a/apps/sim/app/api/folders/[id]/duplicate/route.ts +++ b/apps/sim/app/api/folders/[id]/duplicate/route.ts @@ -4,10 +4,10 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' -import { duplicateWorkflow } from '@/lib/workflows/duplicate' +import { duplicateWorkflow } from '@/lib/workflows/persistence/duplicate' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('FolderDuplicateAPI') diff --git a/apps/sim/app/api/folders/[id]/route.test.ts b/apps/sim/app/api/folders/[id]/route.test.ts index 9fdd18cd40..5b5f3c8c28 100644 --- a/apps/sim/app/api/folders/[id]/route.test.ts +++ b/apps/sim/app/api/folders/[id]/route.test.ts @@ -113,7 +113,7 @@ describe('Individual Folder API Route', () => { mockGetUserEntityPermissions.mockResolvedValue('admin') - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: mockGetUserEntityPermissions, })) }) diff --git a/apps/sim/app/api/folders/[id]/route.ts b/apps/sim/app/api/folders/[id]/route.ts index faa15aaa79..8c42b96569 100644 --- a/apps/sim/app/api/folders/[id]/route.ts +++ b/apps/sim/app/api/folders/[id]/route.ts @@ -5,7 +5,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('FoldersIDAPI') diff --git a/apps/sim/app/api/folders/route.test.ts b/apps/sim/app/api/folders/route.test.ts index 6f59c4a888..d7da4f779c 100644 --- a/apps/sim/app/api/folders/route.test.ts +++ b/apps/sim/app/api/folders/route.test.ts @@ -83,7 +83,7 @@ describe('Folders API Route', () => { }, })) - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: mockGetUserEntityPermissions, })) }) diff --git a/apps/sim/app/api/folders/route.ts b/apps/sim/app/api/folders/route.ts index 7e11b17823..050d8524d7 100644 --- a/apps/sim/app/api/folders/route.ts +++ b/apps/sim/app/api/folders/route.ts @@ -4,7 +4,7 @@ import { and, asc, desc, eq, isNull } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('FoldersAPI') diff --git a/apps/sim/app/api/function/execute/route.test.ts b/apps/sim/app/api/function/execute/route.test.ts index 0d8345632c..a8aff5f9fb 100644 --- a/apps/sim/app/api/function/execute/route.test.ts +++ b/apps/sim/app/api/function/execute/route.test.ts @@ -66,7 +66,7 @@ describe('Function Execute API Route', () => { }) it.concurrent('should block SSRF attacks through secure fetch wrapper', async () => { - const { validateProxyUrl } = await import('@/lib/security/input-validation') + const { validateProxyUrl } = await import('@/lib/core/security/input-validation') expect(validateProxyUrl('http://169.254.169.254/latest/meta-data/').isValid).toBe(false) expect(validateProxyUrl('http://127.0.0.1:8080/admin').isValid).toBe(false) @@ -75,7 +75,7 @@ describe('Function Execute API Route', () => { }) it.concurrent('should allow legitimate external URLs', async () => { - const { validateProxyUrl } = await import('@/lib/security/input-validation') + const { validateProxyUrl } = await import('@/lib/core/security/input-validation') expect(validateProxyUrl('https://api.github.com/user').isValid).toBe(true) expect(validateProxyUrl('https://httpbin.org/get').isValid).toBe(true) @@ -83,7 +83,7 @@ describe('Function Execute API Route', () => { }) it.concurrent('should block dangerous protocols', async () => { - const { validateProxyUrl } = await import('@/lib/security/input-validation') + const { validateProxyUrl } = await import('@/lib/core/security/input-validation') expect(validateProxyUrl('file:///etc/passwd').isValid).toBe(false) expect(validateProxyUrl('ftp://internal.server/files').isValid).toBe(false) diff --git a/apps/sim/app/api/function/execute/route.ts b/apps/sim/app/api/function/execute/route.ts index 8a0f7058a0..5a6e5d8719 100644 --- a/apps/sim/app/api/function/execute/route.ts +++ b/apps/sim/app/api/function/execute/route.ts @@ -1,11 +1,11 @@ import { createContext, Script } from 'vm' import { type NextRequest, NextResponse } from 'next/server' -import { env, isTruthy } from '@/lib/env' +import { env, isTruthy } from '@/lib/core/config/env' +import { validateProxyUrl } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { executeInE2B } from '@/lib/execution/e2b' import { CodeLanguage, DEFAULT_CODE_LANGUAGE, isValidCodeLanguage } from '@/lib/execution/languages' import { createLogger } from '@/lib/logs/console/logger' -import { validateProxyUrl } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' export const runtime = 'nodejs' diff --git a/apps/sim/app/api/guardrails/validate/route.ts b/apps/sim/app/api/guardrails/validate/route.ts index 83c27eb139..93be5e8b47 100644 --- a/apps/sim/app/api/guardrails/validate/route.ts +++ b/apps/sim/app/api/guardrails/validate/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { validateHallucination } from '@/lib/guardrails/validate_hallucination' import { validateJson } from '@/lib/guardrails/validate_json' import { validatePII } from '@/lib/guardrails/validate_pii' import { validateRegex } from '@/lib/guardrails/validate_regex' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('GuardrailsValidateAPI') diff --git a/apps/sim/app/api/help/route.ts b/apps/sim/app/api/help/route.ts index ad90a3230c..27a9d03afa 100644 --- a/apps/sim/app/api/help/route.ts +++ b/apps/sim/app/api/help/route.ts @@ -2,12 +2,12 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { renderHelpConfirmationEmail } from '@/components/emails' import { getSession } from '@/lib/auth' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' +import { getEmailDomain } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getEmailDomain } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' const logger = createLogger('HelpAPI') diff --git a/apps/sim/app/api/jobs/[jobId]/route.ts b/apps/sim/app/api/jobs/[jobId]/route.ts index bf5fd3ed93..faa4f17439 100644 --- a/apps/sim/app/api/jobs/[jobId]/route.ts +++ b/apps/sim/app/api/jobs/[jobId]/route.ts @@ -2,8 +2,8 @@ import { runs } from '@trigger.dev/sdk' import { type NextRequest, NextResponse } from 'next/server' import { authenticateApiKeyFromHeader, updateApiKeyLastUsed } from '@/lib/api-key/service' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { createErrorResponse } from '@/app/api/workflows/utils' const logger = createLogger('TaskStatusAPI') diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts index 9a9b50636b..659328ddaf 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/chunks/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { batchChunkOperation, createChunk, queryChunks } from '@/lib/knowledge/chunks/service' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getUserId } from '@/app/api/auth/oauth/utils' import { checkDocumentAccess, checkDocumentWriteAccess } from '@/app/api/knowledge/utils' import { calculateCost } from '@/providers/utils' diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts index 4bd4307d14..66f15071c3 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/route.ts @@ -1,6 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { deleteDocument, markDocumentAsFailedTimeout, @@ -8,7 +9,6 @@ import { updateDocument, } from '@/lib/knowledge/documents/service' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { checkDocumentAccess, checkDocumentWriteAccess } from '@/app/api/knowledge/utils' const logger = createLogger('DocumentByIdAPI') diff --git a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts index 18bb9988f5..5403857e48 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/[documentId]/tag-definitions/route.ts @@ -2,7 +2,7 @@ import { randomUUID } from 'crypto' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/consts' +import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/constants' import { cleanupUnusedTagDefinitions, createOrUpdateTagDefinitionsBulk, diff --git a/apps/sim/app/api/knowledge/[id]/documents/route.ts b/apps/sim/app/api/knowledge/[id]/documents/route.ts index 4c93d1dd29..6229650101 100644 --- a/apps/sim/app/api/knowledge/[id]/documents/route.ts +++ b/apps/sim/app/api/knowledge/[id]/documents/route.ts @@ -189,7 +189,7 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id: // Track bulk document upload try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.knowledge_base.documents_uploaded', { 'knowledge_base.id': knowledgeBaseId, 'documents.count': createdDocuments.length, @@ -253,7 +253,7 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id: // Track single document upload try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.knowledge_base.documents_uploaded', { 'knowledge_base.id': knowledgeBaseId, 'documents.count': 1, diff --git a/apps/sim/app/api/knowledge/[id]/route.ts b/apps/sim/app/api/knowledge/[id]/route.ts index bce2006b32..6e006d1a81 100644 --- a/apps/sim/app/api/knowledge/[id]/route.ts +++ b/apps/sim/app/api/knowledge/[id]/route.ts @@ -1,13 +1,13 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { deleteKnowledgeBase, getKnowledgeBaseById, updateKnowledgeBase, } from '@/lib/knowledge/service' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { checkKnowledgeBaseAccess, checkKnowledgeBaseWriteAccess } from '@/app/api/knowledge/utils' const logger = createLogger('KnowledgeBaseByIdAPI') diff --git a/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts b/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts index 41762ab621..6e45c64d13 100644 --- a/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts +++ b/apps/sim/app/api/knowledge/[id]/tag-definitions/route.ts @@ -2,7 +2,7 @@ import { randomUUID } from 'crypto' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/consts' +import { SUPPORTED_FIELD_TYPES } from '@/lib/knowledge/constants' import { createTagDefinition, getTagDefinitions } from '@/lib/knowledge/tags/service' import { createLogger } from '@/lib/logs/console/logger' import { checkKnowledgeBaseAccess } from '@/app/api/knowledge/utils' diff --git a/apps/sim/app/api/knowledge/route.ts b/apps/sim/app/api/knowledge/route.ts index 31ad493600..d79520f2ed 100644 --- a/apps/sim/app/api/knowledge/route.ts +++ b/apps/sim/app/api/knowledge/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createKnowledgeBase, getKnowledgeBases } from '@/lib/knowledge/service' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('KnowledgeBaseAPI') diff --git a/apps/sim/app/api/knowledge/search/route.test.ts b/apps/sim/app/api/knowledge/search/route.test.ts index 50c3c3a7f0..3195988f08 100644 --- a/apps/sim/app/api/knowledge/search/route.test.ts +++ b/apps/sim/app/api/knowledge/search/route.test.ts @@ -26,7 +26,7 @@ vi.mock('drizzle-orm', () => ({ mockKnowledgeSchemas() -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { OPENAI_API_KEY: 'test-api-key', }, @@ -34,7 +34,7 @@ vi.mock('@/lib/env', () => ({ typeof value === 'string' ? value === 'true' || value === '1' : Boolean(value), })) -vi.mock('@/lib/utils', () => ({ +vi.mock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn(() => 'test-request-id'), })) diff --git a/apps/sim/app/api/knowledge/search/route.ts b/apps/sim/app/api/knowledge/search/route.ts index 645ecd040c..1bd86c40a4 100644 --- a/apps/sim/app/api/knowledge/search/route.ts +++ b/apps/sim/app/api/knowledge/search/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { TAG_SLOTS } from '@/lib/knowledge/consts' +import { generateRequestId } from '@/lib/core/utils/request' +import { TAG_SLOTS } from '@/lib/knowledge/constants' import { getDocumentTagDefinitions } from '@/lib/knowledge/tags/service' import { createLogger } from '@/lib/logs/console/logger' import { estimateTokenCount } from '@/lib/tokenization/estimators' -import { generateRequestId } from '@/lib/utils' import { getUserId } from '@/app/api/auth/oauth/utils' import { generateSearchEmbedding, diff --git a/apps/sim/app/api/knowledge/search/utils.test.ts b/apps/sim/app/api/knowledge/search/utils.test.ts index c95a07fceb..1834873f52 100644 --- a/apps/sim/app/api/knowledge/search/utils.test.ts +++ b/apps/sim/app/api/knowledge/search/utils.test.ts @@ -30,7 +30,7 @@ vi.stubGlobal( }) ) -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: {}, getEnv: (key: string) => process.env[key], isTruthy: (value: string | boolean | number | undefined) => @@ -179,7 +179,7 @@ describe('Knowledge Search Utils', () => { describe('generateSearchEmbedding', () => { it('should use Azure OpenAI when KB-specific config is provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -214,7 +214,7 @@ describe('Knowledge Search Utils', () => { }) it('should fallback to OpenAI when no KB Azure config provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { OPENAI_API_KEY: 'test-openai-key', @@ -245,7 +245,7 @@ describe('Knowledge Search Utils', () => { }) it('should use default API version when not provided in Azure config', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -274,7 +274,7 @@ describe('Knowledge Search Utils', () => { }) it('should use custom model name when provided in Azure config', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -304,7 +304,7 @@ describe('Knowledge Search Utils', () => { }) it('should throw error when no API configuration provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) await expect(generateSearchEmbedding('test query')).rejects.toThrow( @@ -313,7 +313,7 @@ describe('Knowledge Search Utils', () => { }) it('should handle Azure OpenAI API errors properly', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -337,7 +337,7 @@ describe('Knowledge Search Utils', () => { }) it('should handle OpenAI API errors properly', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { OPENAI_API_KEY: 'test-openai-key', @@ -358,7 +358,7 @@ describe('Knowledge Search Utils', () => { }) it('should include correct request body for Azure OpenAI', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -392,7 +392,7 @@ describe('Knowledge Search Utils', () => { }) it('should include correct request body for OpenAI', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { OPENAI_API_KEY: 'test-openai-key', diff --git a/apps/sim/app/api/knowledge/search/utils.ts b/apps/sim/app/api/knowledge/search/utils.ts index 365623e87c..b25b07fb27 100644 --- a/apps/sim/app/api/knowledge/search/utils.ts +++ b/apps/sim/app/api/knowledge/search/utils.ts @@ -54,7 +54,7 @@ export interface SearchParams { } // Use shared embedding utility -export { generateSearchEmbedding } from '@/lib/embeddings/utils' +export { generateSearchEmbedding } from '@/lib/knowledge/embeddings' function getTagFilters(filters: Record, embedding: any) { return Object.entries(filters).map(([key, value]) => { diff --git a/apps/sim/app/api/knowledge/utils.test.ts b/apps/sim/app/api/knowledge/utils.test.ts index 3e4112f73b..7ac7c4f4af 100644 --- a/apps/sim/app/api/knowledge/utils.test.ts +++ b/apps/sim/app/api/knowledge/utils.test.ts @@ -15,7 +15,7 @@ vi.mock('drizzle-orm', () => ({ sql: (strings: TemplateStringsArray, ...expr: any[]) => ({ strings, expr }), })) -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { OPENAI_API_KEY: 'test-key' }, getEnv: (key: string) => process.env[key], isTruthy: (value: string | boolean | number | undefined) => @@ -164,8 +164,8 @@ vi.mock('@sim/db', () => { } }) -import { generateEmbeddings } from '@/lib/embeddings/utils' import { processDocumentAsync } from '@/lib/knowledge/documents/service' +import { generateEmbeddings } from '@/lib/knowledge/embeddings' import { checkChunkAccess, checkDocumentAccess, @@ -272,7 +272,7 @@ describe('Knowledge Utils', () => { }) it('should use Azure OpenAI when Azure config is provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { AZURE_OPENAI_API_KEY: 'test-azure-key', @@ -305,7 +305,7 @@ describe('Knowledge Utils', () => { }) it('should fallback to OpenAI when no Azure config provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) Object.assign(env, { OPENAI_API_KEY: 'test-openai-key', @@ -334,7 +334,7 @@ describe('Knowledge Utils', () => { }) it('should throw error when no API configuration provided', async () => { - const { env } = await import('@/lib/env') + const { env } = await import('@/lib/core/config/env') Object.keys(env).forEach((key) => delete (env as any)[key]) await expect(generateEmbeddings(['test text'])).rejects.toThrow( diff --git a/apps/sim/app/api/knowledge/utils.ts b/apps/sim/app/api/knowledge/utils.ts index 29ec910b25..d1fc0d867d 100644 --- a/apps/sim/app/api/knowledge/utils.ts +++ b/apps/sim/app/api/knowledge/utils.ts @@ -1,7 +1,7 @@ import { db } from '@sim/db' import { document, embedding, knowledgeBase } from '@sim/db/schema' import { and, eq, isNull } from 'drizzle-orm' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' export interface KnowledgeBaseData { id: string diff --git a/apps/sim/app/api/logs/[id]/route.ts b/apps/sim/app/api/logs/[id]/route.ts index 015197597a..82e8deb09d 100644 --- a/apps/sim/app/api/logs/[id]/route.ts +++ b/apps/sim/app/api/logs/[id]/route.ts @@ -3,8 +3,8 @@ import { permissions, workflow, workflowExecutionLogs } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('LogDetailsByIdAPI') diff --git a/apps/sim/app/api/logs/cleanup/route.ts b/apps/sim/app/api/logs/cleanup/route.ts index bbc4eb4461..7f55cfd373 100644 --- a/apps/sim/app/api/logs/cleanup/route.ts +++ b/apps/sim/app/api/logs/cleanup/route.ts @@ -3,7 +3,7 @@ import { subscription, user, workflow, workflowExecutionLogs } from '@sim/db/sch import { and, eq, inArray, lt, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { snapshotService } from '@/lib/logs/execution/snapshot/service' import { isUsingCloudStorage, StorageService } from '@/lib/uploads' diff --git a/apps/sim/app/api/logs/route.ts b/apps/sim/app/api/logs/route.ts index 3d7e532825..5f187515db 100644 --- a/apps/sim/app/api/logs/route.ts +++ b/apps/sim/app/api/logs/route.ts @@ -4,8 +4,8 @@ import { and, desc, eq, gte, inArray, lte, type SQL, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('LogsAPI') diff --git a/apps/sim/app/api/logs/triggers/route.ts b/apps/sim/app/api/logs/triggers/route.ts index f5562049ac..ace20752aa 100644 --- a/apps/sim/app/api/logs/triggers/route.ts +++ b/apps/sim/app/api/logs/triggers/route.ts @@ -4,8 +4,8 @@ import { and, eq, isNotNull, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('TriggersAPI') diff --git a/apps/sim/app/api/mcp/servers/route.ts b/apps/sim/app/api/mcp/servers/route.ts index 8e30ef8022..370ddac581 100644 --- a/apps/sim/app/api/mcp/servers/route.ts +++ b/apps/sim/app/api/mcp/servers/route.ts @@ -109,7 +109,7 @@ export const POST = withMcpAuth('write')( // Track MCP server registration try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.mcp.server_added', { 'mcp.server_id': serverId, 'mcp.server_name': body.name, diff --git a/apps/sim/app/api/mcp/tools/execute/route.ts b/apps/sim/app/api/mcp/tools/execute/route.ts index 63845865fc..48205811d4 100644 --- a/apps/sim/app/api/mcp/tools/execute/route.ts +++ b/apps/sim/app/api/mcp/tools/execute/route.ts @@ -199,7 +199,7 @@ export const POST = withMcpAuth('read')( // Track MCP tool execution try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.mcp.tool_executed', { 'mcp.server_id': serverId, 'mcp.tool_name': toolName, diff --git a/apps/sim/app/api/memory/[id]/route.ts b/apps/sim/app/api/memory/[id]/route.ts index 4408ad3d07..73b31024f0 100644 --- a/apps/sim/app/api/memory/[id]/route.ts +++ b/apps/sim/app/api/memory/[id]/route.ts @@ -3,8 +3,8 @@ import { memory, workflowBlocks } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('MemoryByIdAPI') diff --git a/apps/sim/app/api/memory/route.ts b/apps/sim/app/api/memory/route.ts index 3b7c621427..065ee64661 100644 --- a/apps/sim/app/api/memory/route.ts +++ b/apps/sim/app/api/memory/route.ts @@ -3,8 +3,8 @@ import { memory, workflowBlocks } from '@sim/db/schema' import { and, eq, inArray, isNull, like } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getWorkflowAccessContext } from '@/lib/workflows/utils' const logger = createLogger('MemoryAPI') diff --git a/apps/sim/app/api/organizations/[id]/invitations/route.ts b/apps/sim/app/api/organizations/[id]/invitations/route.ts index 1506a89164..5a61a277a5 100644 --- a/apps/sim/app/api/organizations/[id]/invitations/route.ts +++ b/apps/sim/app/api/organizations/[id]/invitations/route.ts @@ -21,11 +21,11 @@ import { validateBulkInvitations, validateSeatAvailability, } from '@/lib/billing/validation/seat-management' -import { sendEmail } from '@/lib/email/mailer' -import { quickValidateEmail } from '@/lib/email/validation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { hasWorkspaceAdminAccess } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { quickValidateEmail } from '@/lib/messaging/email/validation' +import { hasWorkspaceAdminAccess } from '@/lib/workspaces/permissions/utils' const logger = createLogger('OrganizationInvitations') diff --git a/apps/sim/app/api/organizations/[id]/members/route.ts b/apps/sim/app/api/organizations/[id]/members/route.ts index 43e69e4813..9b54abf607 100644 --- a/apps/sim/app/api/organizations/[id]/members/route.ts +++ b/apps/sim/app/api/organizations/[id]/members/route.ts @@ -7,10 +7,10 @@ import { getEmailSubject, renderInvitationEmail } from '@/components/emails/rend import { getSession } from '@/lib/auth' import { getUserUsageData } from '@/lib/billing/core/usage' import { validateSeatAvailability } from '@/lib/billing/validation/seat-management' -import { sendEmail } from '@/lib/email/mailer' -import { quickValidateEmail } from '@/lib/email/validation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { quickValidateEmail } from '@/lib/messaging/email/validation' const logger = createLogger('OrganizationMembersAPI') diff --git a/apps/sim/app/api/organizations/[id]/seats/route.ts b/apps/sim/app/api/organizations/[id]/seats/route.ts index 8812b3673f..c107b42a81 100644 --- a/apps/sim/app/api/organizations/[id]/seats/route.ts +++ b/apps/sim/app/api/organizations/[id]/seats/route.ts @@ -5,7 +5,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { requireStripeClient } from '@/lib/billing/stripe-client' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('OrganizationSeatsAPI') diff --git a/apps/sim/app/api/providers/ollama/models/route.ts b/apps/sim/app/api/providers/ollama/models/route.ts index 767d8a4eef..16a448028b 100644 --- a/apps/sim/app/api/providers/ollama/models/route.ts +++ b/apps/sim/app/api/providers/ollama/models/route.ts @@ -1,5 +1,5 @@ import { type NextRequest, NextResponse } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import type { ModelsObject } from '@/providers/ollama/types' diff --git a/apps/sim/app/api/providers/route.ts b/apps/sim/app/api/providers/route.ts index ba98cfa9a2..6b95f67e9f 100644 --- a/apps/sim/app/api/providers/route.ts +++ b/apps/sim/app/api/providers/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import type { StreamingExecution } from '@/executor/types' import { executeProviderRequest } from '@/providers' import { getApiKey } from '@/providers/utils' diff --git a/apps/sim/app/api/providers/vllm/models/route.ts b/apps/sim/app/api/providers/vllm/models/route.ts index 71c4dd04a2..843ea9fa67 100644 --- a/apps/sim/app/api/providers/vllm/models/route.ts +++ b/apps/sim/app/api/providers/vllm/models/route.ts @@ -1,5 +1,5 @@ import { type NextRequest, NextResponse } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('VLLMModelsAPI') diff --git a/apps/sim/app/api/proxy/image/route.ts b/apps/sim/app/api/proxy/image/route.ts index c4f0b91e66..70d1fd81d3 100644 --- a/apps/sim/app/api/proxy/image/route.ts +++ b/apps/sim/app/api/proxy/image/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { validateImageUrl } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateImageUrl } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('ImageProxyAPI') diff --git a/apps/sim/app/api/proxy/route.ts b/apps/sim/app/api/proxy/route.ts index efe50d029c..96e59273bb 100644 --- a/apps/sim/app/api/proxy/route.ts +++ b/apps/sim/app/api/proxy/route.ts @@ -3,11 +3,11 @@ import { NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' import { generateInternalToken } from '@/lib/auth/internal' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' +import { validateProxyUrl } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { validateProxyUrl } from '@/lib/security/input-validation' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' import { executeTool } from '@/tools' import { getTool, validateRequiredParametersAfterMerge } from '@/tools/utils' diff --git a/apps/sim/app/api/proxy/tts/route.ts b/apps/sim/app/api/proxy/tts/route.ts index ee92b9acd0..f3db903461 100644 --- a/apps/sim/app/api/proxy/tts/route.ts +++ b/apps/sim/app/api/proxy/tts/route.ts @@ -1,10 +1,10 @@ import type { NextRequest } from 'next/server' import { NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' import { StorageService } from '@/lib/uploads' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('ProxyTTSAPI') diff --git a/apps/sim/app/api/proxy/tts/stream/route.ts b/apps/sim/app/api/proxy/tts/stream/route.ts index 1f090d36d6..84c8c05b0f 100644 --- a/apps/sim/app/api/proxy/tts/stream/route.ts +++ b/apps/sim/app/api/proxy/tts/stream/route.ts @@ -1,8 +1,8 @@ import type { NextRequest } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' const logger = createLogger('ProxyTTSStreamAPI') diff --git a/apps/sim/app/api/proxy/tts/unified/route.ts b/apps/sim/app/api/proxy/tts/unified/route.ts index dadfe50f50..9937a513a3 100644 --- a/apps/sim/app/api/proxy/tts/unified/route.ts +++ b/apps/sim/app/api/proxy/tts/unified/route.ts @@ -1,9 +1,9 @@ import type { NextRequest } from 'next/server' import { NextResponse } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' import { StorageService } from '@/lib/uploads' -import { getBaseUrl } from '@/lib/urls/utils' import type { AzureTtsParams, CartesiaTtsParams, diff --git a/apps/sim/app/api/proxy/video/route.ts b/apps/sim/app/api/proxy/video/route.ts index fe3bf433f1..01f75fdba9 100644 --- a/apps/sim/app/api/proxy/video/route.ts +++ b/apps/sim/app/api/proxy/video/route.ts @@ -232,7 +232,7 @@ export async function POST(request: NextRequest) { } const { StorageService } = await import('@/lib/uploads') - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') const timestamp = Date.now() const fileName = `video-${provider}-${timestamp}.mp4` diff --git a/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts b/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts index 7185519756..8fcdfe59d8 100644 --- a/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts +++ b/apps/sim/app/api/resume/[workflowId]/[executionId]/[contextId]/route.ts @@ -1,8 +1,8 @@ import { randomUUID } from 'crypto' import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' import { validateWorkflowAccess } from '@/app/api/workflows/middleware' diff --git a/apps/sim/app/api/schedules/[id]/route.ts b/apps/sim/app/api/schedules/[id]/route.ts index abf50d9155..cd50005178 100644 --- a/apps/sim/app/api/schedules/[id]/route.ts +++ b/apps/sim/app/api/schedules/[id]/route.ts @@ -4,9 +4,9 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('ScheduleAPI') diff --git a/apps/sim/app/api/schedules/[id]/status/route.ts b/apps/sim/app/api/schedules/[id]/status/route.ts index 3f3d3d7b29..59c7533b6e 100644 --- a/apps/sim/app/api/schedules/[id]/status/route.ts +++ b/apps/sim/app/api/schedules/[id]/status/route.ts @@ -3,9 +3,9 @@ import { workflow, workflowSchedule } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('ScheduleStatusAPI') diff --git a/apps/sim/app/api/schedules/execute/route.test.ts b/apps/sim/app/api/schedules/execute/route.test.ts index 5f43cde8b6..43d5367a2b 100644 --- a/apps/sim/app/api/schedules/execute/route.test.ts +++ b/apps/sim/app/api/schedules/execute/route.test.ts @@ -42,7 +42,7 @@ describe('Scheduled Workflow Execution API Route', () => { executeScheduleJob: mockExecuteScheduleJob, })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { TRIGGER_DEV_ENABLED: false, }, @@ -119,7 +119,7 @@ describe('Scheduled Workflow Execution API Route', () => { }, })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { TRIGGER_DEV_ENABLED: true, }, @@ -191,7 +191,7 @@ describe('Scheduled Workflow Execution API Route', () => { executeScheduleJob: vi.fn().mockResolvedValue(undefined), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { TRIGGER_DEV_ENABLED: false, }, @@ -250,7 +250,7 @@ describe('Scheduled Workflow Execution API Route', () => { executeScheduleJob: vi.fn().mockResolvedValue(undefined), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { TRIGGER_DEV_ENABLED: false, }, diff --git a/apps/sim/app/api/schedules/execute/route.ts b/apps/sim/app/api/schedules/execute/route.ts index 8fe872c0b5..4368ab192e 100644 --- a/apps/sim/app/api/schedules/execute/route.ts +++ b/apps/sim/app/api/schedules/execute/route.ts @@ -3,9 +3,9 @@ import { tasks } from '@trigger.dev/sdk' import { and, eq, isNull, lt, lte, not, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' -import { env, isTruthy } from '@/lib/env' +import { env, isTruthy } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { executeScheduleJob } from '@/background/schedule-execution' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/schedules/route.test.ts b/apps/sim/app/api/schedules/route.test.ts index cc5a510acd..650eb0017b 100644 --- a/apps/sim/app/api/schedules/route.test.ts +++ b/apps/sim/app/api/schedules/route.test.ts @@ -25,7 +25,7 @@ describe('Schedule Configuration API Route', () => { }), })) - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: vi.fn().mockResolvedValue('admin'), // User has admin permissions })) @@ -112,7 +112,7 @@ describe('Schedule Configuration API Route', () => { }, })) - vi.doMock('@/lib/schedules/utils', () => ({ + vi.doMock('@/lib/workflows/schedules/utils', () => ({ getScheduleTimeValues: vi.fn().mockReturnValue({ scheduleTime: '09:30', minutesInterval: 15, diff --git a/apps/sim/app/api/schedules/route.ts b/apps/sim/app/api/schedules/route.ts index 011297ddb0..65c0ad30c1 100644 --- a/apps/sim/app/api/schedules/route.ts +++ b/apps/sim/app/api/schedules/route.ts @@ -4,8 +4,8 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import { type BlockState, calculateNextRunTime, @@ -13,8 +13,8 @@ import { getScheduleTimeValues, getSubBlockValue, validateCronExpression, -} from '@/lib/schedules/utils' -import { generateRequestId } from '@/lib/utils' +} from '@/lib/workflows/schedules/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('ScheduledAPI') @@ -373,7 +373,7 @@ export async function POST(req: NextRequest) { }) try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.schedule.created', { 'workflow.id': workflowId, 'schedule.type': scheduleType || 'daily', diff --git a/apps/sim/app/api/stars/route.ts b/apps/sim/app/api/stars/route.ts index f4fce257f7..e0e9d48ea8 100644 --- a/apps/sim/app/api/stars/route.ts +++ b/apps/sim/app/api/stars/route.ts @@ -1,5 +1,5 @@ import { NextResponse } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' function formatStarCount(num: number): string { if (num < 1000) return String(num) diff --git a/apps/sim/app/api/telemetry/route.ts b/apps/sim/app/api/telemetry/route.ts index d2fc0c43c9..f711d3d0c2 100644 --- a/apps/sim/app/api/telemetry/route.ts +++ b/apps/sim/app/api/telemetry/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' -import { env } from '@/lib/env' -import { isProd } from '@/lib/environment' +import { env } from '@/lib/core/config/env' +import { isProd } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('TelemetryAPI') diff --git a/apps/sim/app/api/templates/[id]/approve/route.ts b/apps/sim/app/api/templates/[id]/approve/route.ts index 0f36e1dc1a..cce2fd08a1 100644 --- a/apps/sim/app/api/templates/[id]/approve/route.ts +++ b/apps/sim/app/api/templates/[id]/approve/route.ts @@ -3,8 +3,8 @@ import { templates, user } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('TemplateApprovalAPI') diff --git a/apps/sim/app/api/templates/[id]/reject/route.ts b/apps/sim/app/api/templates/[id]/reject/route.ts index db29efa54b..8d9cea574e 100644 --- a/apps/sim/app/api/templates/[id]/reject/route.ts +++ b/apps/sim/app/api/templates/[id]/reject/route.ts @@ -3,8 +3,8 @@ import { templates, user } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('TemplateRejectionAPI') diff --git a/apps/sim/app/api/templates/[id]/route.ts b/apps/sim/app/api/templates/[id]/route.ts index 22821fc53e..e2801c66d5 100644 --- a/apps/sim/app/api/templates/[id]/route.ts +++ b/apps/sim/app/api/templates/[id]/route.ts @@ -4,12 +4,12 @@ import { and, eq, or, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { extractRequiredCredentials, sanitizeCredentials, -} from '@/lib/workflows/credential-extractor' +} from '@/lib/workflows/credentials/credential-extractor' const logger = createLogger('TemplateByIdAPI') @@ -163,7 +163,7 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{ // Only update the state if explicitly requested and the template has a connected workflow if (updateState && existingTemplate[0].workflowId) { // Load the current workflow state from normalized tables - const { loadWorkflowFromNormalizedTables } = await import('@/lib/workflows/db-helpers') + const { loadWorkflowFromNormalizedTables } = await import('@/lib/workflows/persistence/utils') const normalizedData = await loadWorkflowFromNormalizedTables(existingTemplate[0].workflowId) if (normalizedData) { diff --git a/apps/sim/app/api/templates/[id]/star/route.ts b/apps/sim/app/api/templates/[id]/star/route.ts index 9bcf55e319..26fd3a9b4a 100644 --- a/apps/sim/app/api/templates/[id]/star/route.ts +++ b/apps/sim/app/api/templates/[id]/star/route.ts @@ -4,8 +4,8 @@ import { and, eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('TemplateStarAPI') diff --git a/apps/sim/app/api/templates/[id]/use/route.ts b/apps/sim/app/api/templates/[id]/use/route.ts index 4047e9f3da..d32572611b 100644 --- a/apps/sim/app/api/templates/[id]/use/route.ts +++ b/apps/sim/app/api/templates/[id]/use/route.ts @@ -4,10 +4,10 @@ import { eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' -import { regenerateWorkflowStateIds } from '@/lib/workflows/db-helpers' +import { regenerateWorkflowStateIds } from '@/lib/workflows/persistence/utils' const logger = createLogger('TemplateUseAPI') @@ -171,7 +171,7 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{ // Track template usage try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') const templateState = templateData.state as any trackPlatformEvent('platform.template.used', { 'template.id': id, diff --git a/apps/sim/app/api/templates/approved/sanitized/route.ts b/apps/sim/app/api/templates/approved/sanitized/route.ts index 7615f145b8..d8ddb6a97f 100644 --- a/apps/sim/app/api/templates/approved/sanitized/route.ts +++ b/apps/sim/app/api/templates/approved/sanitized/route.ts @@ -3,9 +3,9 @@ import { templates } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { checkInternalApiKey } from '@/lib/copilot/utils' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' const logger = createLogger('TemplatesSanitizedAPI') diff --git a/apps/sim/app/api/templates/route.ts b/apps/sim/app/api/templates/route.ts index 6d805d0127..ee4df30e9e 100644 --- a/apps/sim/app/api/templates/route.ts +++ b/apps/sim/app/api/templates/route.ts @@ -13,12 +13,12 @@ import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { extractRequiredCredentials, sanitizeCredentials, -} from '@/lib/workflows/credential-extractor' +} from '@/lib/workflows/credentials/credential-extractor' const logger = createLogger('TemplatesAPI') diff --git a/apps/sim/app/api/tools/asana/add-comment/route.ts b/apps/sim/app/api/tools/asana/add-comment/route.ts index 2bc422a5f4..fa9bf681f2 100644 --- a/apps/sim/app/api/tools/asana/add-comment/route.ts +++ b/apps/sim/app/api/tools/asana/add-comment/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/create-task/route.ts b/apps/sim/app/api/tools/asana/create-task/route.ts index 956b64bdff..70bd00f1b4 100644 --- a/apps/sim/app/api/tools/asana/create-task/route.ts +++ b/apps/sim/app/api/tools/asana/create-task/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/get-projects/route.ts b/apps/sim/app/api/tools/asana/get-projects/route.ts index 32e132d474..5e93e93c4b 100644 --- a/apps/sim/app/api/tools/asana/get-projects/route.ts +++ b/apps/sim/app/api/tools/asana/get-projects/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/get-task/route.ts b/apps/sim/app/api/tools/asana/get-task/route.ts index 816ac5ede7..8122986e9e 100644 --- a/apps/sim/app/api/tools/asana/get-task/route.ts +++ b/apps/sim/app/api/tools/asana/get-task/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/search-tasks/route.ts b/apps/sim/app/api/tools/asana/search-tasks/route.ts index bec2f71bb9..c6e7d8cb62 100644 --- a/apps/sim/app/api/tools/asana/search-tasks/route.ts +++ b/apps/sim/app/api/tools/asana/search-tasks/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/asana/update-task/route.ts b/apps/sim/app/api/tools/asana/update-task/route.ts index 4aac2bc9fb..2eca4d7c78 100644 --- a/apps/sim/app/api/tools/asana/update-task/route.ts +++ b/apps/sim/app/api/tools/asana/update-task/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/confluence/attachment/route.ts b/apps/sim/app/api/tools/confluence/attachment/route.ts index 798bb7858e..bfaa2e82a2 100644 --- a/apps/sim/app/api/tools/confluence/attachment/route.ts +++ b/apps/sim/app/api/tools/confluence/attachment/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceAttachmentAPI') diff --git a/apps/sim/app/api/tools/confluence/attachments/route.ts b/apps/sim/app/api/tools/confluence/attachments/route.ts index 40f4981ae3..869c3b988d 100644 --- a/apps/sim/app/api/tools/confluence/attachments/route.ts +++ b/apps/sim/app/api/tools/confluence/attachments/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceAttachmentsAPI') diff --git a/apps/sim/app/api/tools/confluence/comment/route.ts b/apps/sim/app/api/tools/confluence/comment/route.ts index d3a34187d7..94fd963af4 100644 --- a/apps/sim/app/api/tools/confluence/comment/route.ts +++ b/apps/sim/app/api/tools/confluence/comment/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { z } from 'zod' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceCommentAPI') diff --git a/apps/sim/app/api/tools/confluence/comments/route.ts b/apps/sim/app/api/tools/confluence/comments/route.ts index 66245e588f..b9717e73d3 100644 --- a/apps/sim/app/api/tools/confluence/comments/route.ts +++ b/apps/sim/app/api/tools/confluence/comments/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceCommentsAPI') diff --git a/apps/sim/app/api/tools/confluence/create-page/route.ts b/apps/sim/app/api/tools/confluence/create-page/route.ts index 8dd0942f47..f049b86722 100644 --- a/apps/sim/app/api/tools/confluence/create-page/route.ts +++ b/apps/sim/app/api/tools/confluence/create-page/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceCreatePageAPI') diff --git a/apps/sim/app/api/tools/confluence/labels/route.ts b/apps/sim/app/api/tools/confluence/labels/route.ts index 5b438a9292..6ab71167a5 100644 --- a/apps/sim/app/api/tools/confluence/labels/route.ts +++ b/apps/sim/app/api/tools/confluence/labels/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceLabelsAPI') diff --git a/apps/sim/app/api/tools/confluence/page/route.ts b/apps/sim/app/api/tools/confluence/page/route.ts index 5d18cdcb21..d9fdceb0eb 100644 --- a/apps/sim/app/api/tools/confluence/page/route.ts +++ b/apps/sim/app/api/tools/confluence/page/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { z } from 'zod' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluencePageAPI') diff --git a/apps/sim/app/api/tools/confluence/pages/route.ts b/apps/sim/app/api/tools/confluence/pages/route.ts index 30bd72ffbb..67fed46f71 100644 --- a/apps/sim/app/api/tools/confluence/pages/route.ts +++ b/apps/sim/app/api/tools/confluence/pages/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluencePagesAPI') diff --git a/apps/sim/app/api/tools/confluence/search/route.ts b/apps/sim/app/api/tools/confluence/search/route.ts index fb8b3cd90c..1c522898c6 100644 --- a/apps/sim/app/api/tools/confluence/search/route.ts +++ b/apps/sim/app/api/tools/confluence/search/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/confluence/space/route.ts b/apps/sim/app/api/tools/confluence/space/route.ts index 81f6d46c64..75bf8b324d 100644 --- a/apps/sim/app/api/tools/confluence/space/route.ts +++ b/apps/sim/app/api/tools/confluence/space/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceSpaceAPI') diff --git a/apps/sim/app/api/tools/confluence/spaces/route.ts b/apps/sim/app/api/tools/confluence/spaces/route.ts index 064f2697f2..028257e975 100644 --- a/apps/sim/app/api/tools/confluence/spaces/route.ts +++ b/apps/sim/app/api/tools/confluence/spaces/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId } from '@/lib/security/input-validation' import { getConfluenceCloudId } from '@/tools/confluence/utils' const logger = createLogger('ConfluenceSpacesAPI') diff --git a/apps/sim/app/api/tools/custom/route.test.ts b/apps/sim/app/api/tools/custom/route.test.ts index 60cdd1e4d1..5894171a24 100644 --- a/apps/sim/app/api/tools/custom/route.test.ts +++ b/apps/sim/app/api/tools/custom/route.test.ts @@ -204,7 +204,7 @@ describe('Custom Tools API Routes', () => { })) // Mock permissions - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: vi.fn().mockResolvedValue('admin'), })) @@ -233,12 +233,12 @@ describe('Custom Tools API Routes', () => { }) // Mock utils - vi.doMock('@/lib/utils', () => ({ + vi.doMock('@/lib/core/utils/request', () => ({ generateRequestId: vi.fn().mockReturnValue('test-request-id'), })) // Mock custom tools operations - vi.doMock('@/lib/custom-tools/operations', () => ({ + vi.doMock('@/lib/workflows/custom-tools/operations', () => ({ upsertCustomTools: vi.fn().mockResolvedValue(sampleTools), })) }) diff --git a/apps/sim/app/api/tools/custom/route.ts b/apps/sim/app/api/tools/custom/route.ts index 933d56dbc5..0bb32c5148 100644 --- a/apps/sim/app/api/tools/custom/route.ts +++ b/apps/sim/app/api/tools/custom/route.ts @@ -4,10 +4,10 @@ import { and, desc, eq, isNull, or } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' -import { upsertCustomTools } from '@/lib/custom-tools/operations' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { upsertCustomTools } from '@/lib/workflows/custom-tools/operations' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('CustomToolsAPI') diff --git a/apps/sim/app/api/tools/discord/channels/route.ts b/apps/sim/app/api/tools/discord/channels/route.ts index 643860d2fc..25eed7c5c0 100644 --- a/apps/sim/app/api/tools/discord/channels/route.ts +++ b/apps/sim/app/api/tools/discord/channels/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateNumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateNumericId } from '@/lib/security/input-validation' interface DiscordChannel { id: string diff --git a/apps/sim/app/api/tools/discord/send-message/route.ts b/apps/sim/app/api/tools/discord/send-message/route.ts index 5751134b04..205149a7df 100644 --- a/apps/sim/app/api/tools/discord/send-message/route.ts +++ b/apps/sim/app/api/tools/discord/send-message/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/discord/servers/route.ts b/apps/sim/app/api/tools/discord/servers/route.ts index 9588a5a88c..c7fa8c7561 100644 --- a/apps/sim/app/api/tools/discord/servers/route.ts +++ b/apps/sim/app/api/tools/discord/servers/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateNumericId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateNumericId } from '@/lib/security/input-validation' interface DiscordServer { id: string diff --git a/apps/sim/app/api/tools/drive/file/route.ts b/apps/sim/app/api/tools/drive/file/route.ts index 02e116288e..edc1e77f1e 100644 --- a/apps/sim/app/api/tools/drive/file/route.ts +++ b/apps/sim/app/api/tools/drive/file/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/drive/files/route.ts b/apps/sim/app/api/tools/drive/files/route.ts index 74481fefde..a142821b14 100644 --- a/apps/sim/app/api/tools/drive/files/route.ts +++ b/apps/sim/app/api/tools/drive/files/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/add-label/route.ts b/apps/sim/app/api/tools/gmail/add-label/route.ts index 2cfb8c6de0..d4ddcdefb8 100644 --- a/apps/sim/app/api/tools/gmail/add-label/route.ts +++ b/apps/sim/app/api/tools/gmail/add-label/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/archive/route.ts b/apps/sim/app/api/tools/gmail/archive/route.ts index 79af4ff363..2f62d211ed 100644 --- a/apps/sim/app/api/tools/gmail/archive/route.ts +++ b/apps/sim/app/api/tools/gmail/archive/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/delete/route.ts b/apps/sim/app/api/tools/gmail/delete/route.ts index 7d853ee32b..ce3779c9d6 100644 --- a/apps/sim/app/api/tools/gmail/delete/route.ts +++ b/apps/sim/app/api/tools/gmail/delete/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/draft/route.ts b/apps/sim/app/api/tools/gmail/draft/route.ts index eda64213c5..90f849b0d0 100644 --- a/apps/sim/app/api/tools/gmail/draft/route.ts +++ b/apps/sim/app/api/tools/gmail/draft/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { base64UrlEncode, buildMimeMessage, diff --git a/apps/sim/app/api/tools/gmail/label/route.ts b/apps/sim/app/api/tools/gmail/label/route.ts index 2da053cfe2..c7042034c3 100644 --- a/apps/sim/app/api/tools/gmail/label/route.ts +++ b/apps/sim/app/api/tools/gmail/label/route.ts @@ -3,9 +3,9 @@ import { account } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateAlphanumericId } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/labels/route.ts b/apps/sim/app/api/tools/gmail/labels/route.ts index 70a62c7952..e4c8aab4bd 100644 --- a/apps/sim/app/api/tools/gmail/labels/route.ts +++ b/apps/sim/app/api/tools/gmail/labels/route.ts @@ -3,8 +3,8 @@ import { account } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/mark-read/route.ts b/apps/sim/app/api/tools/gmail/mark-read/route.ts index 1ef8926ea3..3525869567 100644 --- a/apps/sim/app/api/tools/gmail/mark-read/route.ts +++ b/apps/sim/app/api/tools/gmail/mark-read/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/mark-unread/route.ts b/apps/sim/app/api/tools/gmail/mark-unread/route.ts index 7c3d1f0818..17aca8e7fc 100644 --- a/apps/sim/app/api/tools/gmail/mark-unread/route.ts +++ b/apps/sim/app/api/tools/gmail/mark-unread/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/move/route.ts b/apps/sim/app/api/tools/gmail/move/route.ts index 57a8369bad..358768fe3e 100644 --- a/apps/sim/app/api/tools/gmail/move/route.ts +++ b/apps/sim/app/api/tools/gmail/move/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/remove-label/route.ts b/apps/sim/app/api/tools/gmail/remove-label/route.ts index 8978e79823..928d44c361 100644 --- a/apps/sim/app/api/tools/gmail/remove-label/route.ts +++ b/apps/sim/app/api/tools/gmail/remove-label/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/gmail/send/route.ts b/apps/sim/app/api/tools/gmail/send/route.ts index eda82deeb4..d9c3dc9ecc 100644 --- a/apps/sim/app/api/tools/gmail/send/route.ts +++ b/apps/sim/app/api/tools/gmail/send/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { base64UrlEncode, buildMimeMessage, diff --git a/apps/sim/app/api/tools/gmail/unarchive/route.ts b/apps/sim/app/api/tools/gmail/unarchive/route.ts index 4e0768657e..28bf5b879c 100644 --- a/apps/sim/app/api/tools/gmail/unarchive/route.ts +++ b/apps/sim/app/api/tools/gmail/unarchive/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/google_calendar/calendars/route.ts b/apps/sim/app/api/tools/google_calendar/calendars/route.ts index 9fdafa9bd5..2e92521db4 100644 --- a/apps/sim/app/api/tools/google_calendar/calendars/route.ts +++ b/apps/sim/app/api/tools/google_calendar/calendars/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/google_drive/upload/route.ts b/apps/sim/app/api/tools/google_drive/upload/route.ts index ffc31e780d..13acfd3b25 100644 --- a/apps/sim/app/api/tools/google_drive/upload/route.ts +++ b/apps/sim/app/api/tools/google_drive/upload/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { GOOGLE_WORKSPACE_MIME_TYPES, handleSheetsFormat, diff --git a/apps/sim/app/api/tools/jira/issue/route.ts b/apps/sim/app/api/tools/jira/issue/route.ts index 60ba1a1365..5e2f8e6436 100644 --- a/apps/sim/app/api/tools/jira/issue/route.ts +++ b/apps/sim/app/api/tools/jira/issue/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jira/issues/route.ts b/apps/sim/app/api/tools/jira/issues/route.ts index 99f58d67ff..68368596cc 100644 --- a/apps/sim/app/api/tools/jira/issues/route.ts +++ b/apps/sim/app/api/tools/jira/issues/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jira/projects/route.ts b/apps/sim/app/api/tools/jira/projects/route.ts index 6f7b856caf..9551cde78d 100644 --- a/apps/sim/app/api/tools/jira/projects/route.ts +++ b/apps/sim/app/api/tools/jira/projects/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jira/update/route.ts b/apps/sim/app/api/tools/jira/update/route.ts index 8601f09149..1a924faa23 100644 --- a/apps/sim/app/api/tools/jira/update/route.ts +++ b/apps/sim/app/api/tools/jira/update/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { z } from 'zod' +import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateJiraCloudId, validateJiraIssueKey } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/jira/write/route.ts b/apps/sim/app/api/tools/jira/write/route.ts index 90683a9892..48b90da5e2 100644 --- a/apps/sim/app/api/tools/jira/write/route.ts +++ b/apps/sim/app/api/tools/jira/write/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' +import { validateAlphanumericId, validateJiraCloudId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateAlphanumericId, validateJiraCloudId } from '@/lib/security/input-validation' import { getJiraCloudId } from '@/tools/jira/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/linear/projects/route.ts b/apps/sim/app/api/tools/linear/projects/route.ts index 72523399d5..51863961d9 100644 --- a/apps/sim/app/api/tools/linear/projects/route.ts +++ b/apps/sim/app/api/tools/linear/projects/route.ts @@ -2,8 +2,8 @@ import type { Project } from '@linear/sdk' import { LinearClient } from '@linear/sdk' import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/linear/teams/route.ts b/apps/sim/app/api/tools/linear/teams/route.ts index c4a1c08434..cf1e36ce20 100644 --- a/apps/sim/app/api/tools/linear/teams/route.ts +++ b/apps/sim/app/api/tools/linear/teams/route.ts @@ -2,8 +2,8 @@ import type { Team } from '@linear/sdk' import { LinearClient } from '@linear/sdk' import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/mail/send/route.ts b/apps/sim/app/api/tools/mail/send/route.ts index 05fe843bf1..ede1dc9a64 100644 --- a/apps/sim/app/api/tools/mail/send/route.ts +++ b/apps/sim/app/api/tools/mail/send/route.ts @@ -2,8 +2,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { Resend } from 'resend' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/microsoft-teams/teams/route.ts b/apps/sim/app/api/tools/microsoft-teams/teams/route.ts index 0cc35c1025..4dc4513535 100644 --- a/apps/sim/app/api/tools/microsoft-teams/teams/route.ts +++ b/apps/sim/app/api/tools/microsoft-teams/teams/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/microsoft_planner/tasks/route.ts b/apps/sim/app/api/tools/microsoft_planner/tasks/route.ts index 82f90022b2..69b075399f 100644 --- a/apps/sim/app/api/tools/microsoft_planner/tasks/route.ts +++ b/apps/sim/app/api/tools/microsoft_planner/tasks/route.ts @@ -4,8 +4,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateMicrosoftGraphId } from '@/lib/security/input-validation' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' import type { PlannerTask } from '@/tools/microsoft_planner/types' diff --git a/apps/sim/app/api/tools/microsoft_teams/delete_chat_message/route.ts b/apps/sim/app/api/tools/microsoft_teams/delete_chat_message/route.ts index 4f62a05534..44f91f1e8f 100644 --- a/apps/sim/app/api/tools/microsoft_teams/delete_chat_message/route.ts +++ b/apps/sim/app/api/tools/microsoft_teams/delete_chat_message/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/microsoft_teams/write_channel/route.ts b/apps/sim/app/api/tools/microsoft_teams/write_channel/route.ts index 1ce0fc88bb..a3f703b30e 100644 --- a/apps/sim/app/api/tools/microsoft_teams/write_channel/route.ts +++ b/apps/sim/app/api/tools/microsoft_teams/write_channel/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { resolveMentionsForChannel, type TeamsMention } from '@/tools/microsoft_teams/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/microsoft_teams/write_chat/route.ts b/apps/sim/app/api/tools/microsoft_teams/write_chat/route.ts index 526af5b853..635f48f917 100644 --- a/apps/sim/app/api/tools/microsoft_teams/write_chat/route.ts +++ b/apps/sim/app/api/tools/microsoft_teams/write_chat/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { resolveMentionsForChat, type TeamsMention } from '@/tools/microsoft_teams/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/mistral/parse/route.ts b/apps/sim/app/api/tools/mistral/parse/route.ts index 2f15da76ee..d3cd52c582 100644 --- a/apps/sim/app/api/tools/mistral/parse/route.ts +++ b/apps/sim/app/api/tools/mistral/parse/route.ts @@ -1,11 +1,11 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' import { StorageService } from '@/lib/uploads' import { extractStorageKey, inferContextFromKey } from '@/lib/uploads/utils/file-utils' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' import { verifyFileAccess } from '@/app/api/files/authorization' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/onedrive/folder/route.ts b/apps/sim/app/api/tools/onedrive/folder/route.ts index 503c1fbf68..7f93d0e3fd 100644 --- a/apps/sim/app/api/tools/onedrive/folder/route.ts +++ b/apps/sim/app/api/tools/onedrive/folder/route.ts @@ -4,8 +4,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateMicrosoftGraphId } from '@/lib/security/input-validation' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/onedrive/upload/route.ts b/apps/sim/app/api/tools/onedrive/upload/route.ts index 1f4a0f9f49..43875ce2a5 100644 --- a/apps/sim/app/api/tools/onedrive/upload/route.ts +++ b/apps/sim/app/api/tools/onedrive/upload/route.ts @@ -2,10 +2,10 @@ import { type NextRequest, NextResponse } from 'next/server' import * as XLSX from 'xlsx' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { normalizeExcelValues } from '@/tools/onedrive/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/copy/route.ts b/apps/sim/app/api/tools/outlook/copy/route.ts index b805e6d4e3..b4435931b5 100644 --- a/apps/sim/app/api/tools/outlook/copy/route.ts +++ b/apps/sim/app/api/tools/outlook/copy/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/delete/route.ts b/apps/sim/app/api/tools/outlook/delete/route.ts index 495a49bde0..7e47dafb02 100644 --- a/apps/sim/app/api/tools/outlook/delete/route.ts +++ b/apps/sim/app/api/tools/outlook/delete/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/draft/route.ts b/apps/sim/app/api/tools/outlook/draft/route.ts index b3ca22a1aa..16ed64c02b 100644 --- a/apps/sim/app/api/tools/outlook/draft/route.ts +++ b/apps/sim/app/api/tools/outlook/draft/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/folders/route.ts b/apps/sim/app/api/tools/outlook/folders/route.ts index 78d75e494d..90e4de55eb 100644 --- a/apps/sim/app/api/tools/outlook/folders/route.ts +++ b/apps/sim/app/api/tools/outlook/folders/route.ts @@ -3,8 +3,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/mark-read/route.ts b/apps/sim/app/api/tools/outlook/mark-read/route.ts index 8186e27746..1873249d7a 100644 --- a/apps/sim/app/api/tools/outlook/mark-read/route.ts +++ b/apps/sim/app/api/tools/outlook/mark-read/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/mark-unread/route.ts b/apps/sim/app/api/tools/outlook/mark-unread/route.ts index c4921f2dfd..7b52941b52 100644 --- a/apps/sim/app/api/tools/outlook/mark-unread/route.ts +++ b/apps/sim/app/api/tools/outlook/mark-unread/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/move/route.ts b/apps/sim/app/api/tools/outlook/move/route.ts index f5bb633359..5cdbc56f76 100644 --- a/apps/sim/app/api/tools/outlook/move/route.ts +++ b/apps/sim/app/api/tools/outlook/move/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/outlook/send/route.ts b/apps/sim/app/api/tools/outlook/send/route.ts index 73248161a1..59293f535b 100644 --- a/apps/sim/app/api/tools/outlook/send/route.ts +++ b/apps/sim/app/api/tools/outlook/send/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/s3/copy-object/route.ts b/apps/sim/app/api/tools/s3/copy-object/route.ts index 2c94f6d689..4c96284be0 100644 --- a/apps/sim/app/api/tools/s3/copy-object/route.ts +++ b/apps/sim/app/api/tools/s3/copy-object/route.ts @@ -2,8 +2,8 @@ import { CopyObjectCommand, type ObjectCannedACL, S3Client } from '@aws-sdk/clie import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/s3/delete-object/route.ts b/apps/sim/app/api/tools/s3/delete-object/route.ts index 8b9879115d..1a3566a020 100644 --- a/apps/sim/app/api/tools/s3/delete-object/route.ts +++ b/apps/sim/app/api/tools/s3/delete-object/route.ts @@ -2,8 +2,8 @@ import { DeleteObjectCommand, S3Client } from '@aws-sdk/client-s3' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/s3/list-objects/route.ts b/apps/sim/app/api/tools/s3/list-objects/route.ts index d4c93185ed..2d773fe30b 100644 --- a/apps/sim/app/api/tools/s3/list-objects/route.ts +++ b/apps/sim/app/api/tools/s3/list-objects/route.ts @@ -2,8 +2,8 @@ import { ListObjectsV2Command, S3Client } from '@aws-sdk/client-s3' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/s3/put-object/route.ts b/apps/sim/app/api/tools/s3/put-object/route.ts index ad03c937c3..3d84b9a23a 100644 --- a/apps/sim/app/api/tools/s3/put-object/route.ts +++ b/apps/sim/app/api/tools/s3/put-object/route.ts @@ -2,10 +2,10 @@ import { type ObjectCannedACL, PutObjectCommand, S3Client } from '@aws-sdk/clien import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/search/route.ts b/apps/sim/app/api/tools/search/route.ts index f3a748e2b9..fb7815da85 100644 --- a/apps/sim/app/api/tools/search/route.ts +++ b/apps/sim/app/api/tools/search/route.ts @@ -2,7 +2,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' import { SEARCH_TOOL_COST } from '@/lib/billing/constants' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { executeTool } from '@/tools' diff --git a/apps/sim/app/api/tools/sharepoint/site/route.ts b/apps/sim/app/api/tools/sharepoint/site/route.ts index 803ba2c820..ffa8d74b61 100644 --- a/apps/sim/app/api/tools/sharepoint/site/route.ts +++ b/apps/sim/app/api/tools/sharepoint/site/route.ts @@ -4,8 +4,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateMicrosoftGraphId } from '@/lib/core/security/input-validation' import { createLogger } from '@/lib/logs/console/logger' -import { validateMicrosoftGraphId } from '@/lib/security/input-validation' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/sharepoint/upload/route.ts b/apps/sim/app/api/tools/sharepoint/upload/route.ts index da9409098f..00a4c7633e 100644 --- a/apps/sim/app/api/tools/sharepoint/upload/route.ts +++ b/apps/sim/app/api/tools/sharepoint/upload/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/add-reaction/route.ts b/apps/sim/app/api/tools/slack/add-reaction/route.ts index 00de3e2430..f6fba4a906 100644 --- a/apps/sim/app/api/tools/slack/add-reaction/route.ts +++ b/apps/sim/app/api/tools/slack/add-reaction/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/channels/route.ts b/apps/sim/app/api/tools/slack/channels/route.ts index 6f171b495b..be572492b9 100644 --- a/apps/sim/app/api/tools/slack/channels/route.ts +++ b/apps/sim/app/api/tools/slack/channels/route.ts @@ -1,7 +1,7 @@ import { NextResponse } from 'next/server' import { authorizeCredentialUse } from '@/lib/auth/credential-access' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/delete-message/route.ts b/apps/sim/app/api/tools/slack/delete-message/route.ts index eb1c202f23..02116bec52 100644 --- a/apps/sim/app/api/tools/slack/delete-message/route.ts +++ b/apps/sim/app/api/tools/slack/delete-message/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/send-message/route.ts b/apps/sim/app/api/tools/slack/send-message/route.ts index a9f3b5f34c..9a82b6e5a7 100644 --- a/apps/sim/app/api/tools/slack/send-message/route.ts +++ b/apps/sim/app/api/tools/slack/send-message/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/slack/update-message/route.ts b/apps/sim/app/api/tools/slack/update-message/route.ts index 7eaab100ee..c40b6d34c0 100644 --- a/apps/sim/app/api/tools/slack/update-message/route.ts +++ b/apps/sim/app/api/tools/slack/update-message/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/sms/send/route.ts b/apps/sim/app/api/tools/sms/send/route.ts index e7fc14d7d5..d16a1c57c1 100644 --- a/apps/sim/app/api/tools/sms/send/route.ts +++ b/apps/sim/app/api/tools/sms/send/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { type SMSOptions, sendSMS } from '@/lib/sms/service' -import { generateRequestId } from '@/lib/utils' +import { type SMSOptions, sendSMS } from '@/lib/messaging/sms/service' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/smtp/send/route.ts b/apps/sim/app/api/tools/smtp/send/route.ts index 49c4eb9b13..d20b27b328 100644 --- a/apps/sim/app/api/tools/smtp/send/route.ts +++ b/apps/sim/app/api/tools/smtp/send/route.ts @@ -2,10 +2,10 @@ import { type NextRequest, NextResponse } from 'next/server' import nodemailer from 'nodemailer' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/stagehand/agent/route.ts b/apps/sim/app/api/tools/stagehand/agent/route.ts index 96d9b2e5e1..fc1ef7e7ea 100644 --- a/apps/sim/app/api/tools/stagehand/agent/route.ts +++ b/apps/sim/app/api/tools/stagehand/agent/route.ts @@ -1,7 +1,7 @@ import { Stagehand } from '@browserbasehq/stagehand' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { ensureZodObject, normalizeUrl } from '@/app/api/tools/stagehand/utils' diff --git a/apps/sim/app/api/tools/stagehand/extract/route.ts b/apps/sim/app/api/tools/stagehand/extract/route.ts index b7a07e636c..0ebdd9896c 100644 --- a/apps/sim/app/api/tools/stagehand/extract/route.ts +++ b/apps/sim/app/api/tools/stagehand/extract/route.ts @@ -1,7 +1,7 @@ import { Stagehand } from '@browserbasehq/stagehand' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { ensureZodObject, normalizeUrl } from '@/app/api/tools/stagehand/utils' diff --git a/apps/sim/app/api/tools/telegram/send-document/route.ts b/apps/sim/app/api/tools/telegram/send-document/route.ts index fc01b6a165..968b110785 100644 --- a/apps/sim/app/api/tools/telegram/send-document/route.ts +++ b/apps/sim/app/api/tools/telegram/send-document/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processFilesToUserFiles } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' import { convertMarkdownToHTML } from '@/tools/telegram/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/thinking/route.ts b/apps/sim/app/api/tools/thinking/route.ts index 02fd5fff75..97e41ff3eb 100644 --- a/apps/sim/app/api/tools/thinking/route.ts +++ b/apps/sim/app/api/tools/thinking/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import type { ThinkingToolParams, ThinkingToolResponse } from '@/tools/thinking/types' const logger = createLogger('ThinkingToolAPI') diff --git a/apps/sim/app/api/tools/vision/analyze/route.ts b/apps/sim/app/api/tools/vision/analyze/route.ts index e05d3f4146..ded0b5dc85 100644 --- a/apps/sim/app/api/tools/vision/analyze/route.ts +++ b/apps/sim/app/api/tools/vision/analyze/route.ts @@ -1,10 +1,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { processSingleFileToUserFile } from '@/lib/uploads/utils/file-utils' import { downloadFileFromStorage } from '@/lib/uploads/utils/file-utils.server' -import { generateRequestId } from '@/lib/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/wealthbox/item/route.ts b/apps/sim/app/api/tools/wealthbox/item/route.ts index 57ecac5baf..12c423fcd5 100644 --- a/apps/sim/app/api/tools/wealthbox/item/route.ts +++ b/apps/sim/app/api/tools/wealthbox/item/route.ts @@ -3,9 +3,9 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateEnum, validatePathSegment } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { validateEnum, validatePathSegment } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/tools/wealthbox/items/route.ts b/apps/sim/app/api/tools/wealthbox/items/route.ts index 579cd90871..b8b7a514dd 100644 --- a/apps/sim/app/api/tools/wealthbox/items/route.ts +++ b/apps/sim/app/api/tools/wealthbox/items/route.ts @@ -3,8 +3,8 @@ import { account } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/user/super-user/route.ts b/apps/sim/app/api/user/super-user/route.ts index 9557c988d5..cc39943434 100644 --- a/apps/sim/app/api/user/super-user/route.ts +++ b/apps/sim/app/api/user/super-user/route.ts @@ -3,8 +3,8 @@ import { user } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('SuperUserAPI') diff --git a/apps/sim/app/api/users/me/api-keys/[id]/route.ts b/apps/sim/app/api/users/me/api-keys/[id]/route.ts index cbd093092e..fb5ea90e8d 100644 --- a/apps/sim/app/api/users/me/api-keys/[id]/route.ts +++ b/apps/sim/app/api/users/me/api-keys/[id]/route.ts @@ -3,8 +3,8 @@ import { apiKey } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('ApiKeyAPI') diff --git a/apps/sim/app/api/users/me/profile/route.ts b/apps/sim/app/api/users/me/profile/route.ts index 364ad230c1..7f6ebe1489 100644 --- a/apps/sim/app/api/users/me/profile/route.ts +++ b/apps/sim/app/api/users/me/profile/route.ts @@ -4,8 +4,8 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('UpdateUserProfileAPI') diff --git a/apps/sim/app/api/users/me/settings/route.ts b/apps/sim/app/api/users/me/settings/route.ts index 6a543f9bf0..1e93894631 100644 --- a/apps/sim/app/api/users/me/settings/route.ts +++ b/apps/sim/app/api/users/me/settings/route.ts @@ -5,8 +5,8 @@ import { nanoid } from 'nanoid' import { NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('UserSettingsAPI') diff --git a/apps/sim/app/api/users/me/settings/unsubscribe/route.ts b/apps/sim/app/api/users/me/settings/unsubscribe/route.ts index 99611f1eed..348802f529 100644 --- a/apps/sim/app/api/users/me/settings/unsubscribe/route.ts +++ b/apps/sim/app/api/users/me/settings/unsubscribe/route.ts @@ -1,15 +1,15 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' -import type { EmailType } from '@/lib/email/mailer' +import { generateRequestId } from '@/lib/core/utils/request' +import { createLogger } from '@/lib/logs/console/logger' +import type { EmailType } from '@/lib/messaging/email/mailer' import { getEmailPreferences, isTransactionalEmail, unsubscribeFromAll, updateEmailPreferences, verifyUnsubscribeToken, -} from '@/lib/email/unsubscribe' -import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' +} from '@/lib/messaging/email/unsubscribe' const logger = createLogger('UnsubscribeAPI') diff --git a/apps/sim/app/api/wand/route.ts b/apps/sim/app/api/wand/route.ts index 88cb8442c4..48f0dd7820 100644 --- a/apps/sim/app/api/wand/route.ts +++ b/apps/sim/app/api/wand/route.ts @@ -4,10 +4,10 @@ import { eq, sql } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import OpenAI, { AzureOpenAI } from 'openai' import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' -import { env } from '@/lib/env' -import { getCostMultiplier, isBillingEnabled } from '@/lib/environment' +import { env } from '@/lib/core/config/env' +import { getCostMultiplier, isBillingEnabled } from '@/lib/core/config/environment' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getModelPricing } from '@/providers/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/webhooks/[id]/route.ts b/apps/sim/app/api/webhooks/[id]/route.ts index cf3e1734a7..286472f25e 100644 --- a/apps/sim/app/api/webhooks/[id]/route.ts +++ b/apps/sim/app/api/webhooks/[id]/route.ts @@ -3,10 +3,10 @@ import { webhook, workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { validateInteger } from '@/lib/core/security/input-validation' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { validateInteger } from '@/lib/security/input-validation' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WebhookAPI') @@ -277,7 +277,7 @@ export async function DELETE( const foundWebhook = webhookData.webhook - const { cleanupExternalWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { cleanupExternalWebhook } = await import('@/lib/webhooks/provider-subscriptions') await cleanupExternalWebhook(foundWebhook, webhookData.workflow, requestId) await db.delete(webhook).where(eq(webhook.id, id)) diff --git a/apps/sim/app/api/webhooks/[id]/test-url/route.ts b/apps/sim/app/api/webhooks/[id]/test-url/route.ts index b844dc8d61..066c6b3cae 100644 --- a/apps/sim/app/api/webhooks/[id]/test-url/route.ts +++ b/apps/sim/app/api/webhooks/[id]/test-url/route.ts @@ -2,11 +2,11 @@ import { db, webhook, workflow } from '@sim/db' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' import { signTestWebhookToken } from '@/lib/webhooks/test-tokens' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('MintWebhookTestUrlAPI') diff --git a/apps/sim/app/api/webhooks/cleanup/idempotency/route.ts b/apps/sim/app/api/webhooks/cleanup/idempotency/route.ts index de9a5f5543..0b6be60936 100644 --- a/apps/sim/app/api/webhooks/cleanup/idempotency/route.ts +++ b/apps/sim/app/api/webhooks/cleanup/idempotency/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' -import { cleanupExpiredIdempotencyKeys, getIdempotencyKeyStats } from '@/lib/idempotency' +import { cleanupExpiredIdempotencyKeys, getIdempotencyKeyStats } from '@/lib/core/idempotency' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('IdempotencyCleanupAPI') diff --git a/apps/sim/app/api/webhooks/poll/gmail/route.ts b/apps/sim/app/api/webhooks/poll/gmail/route.ts index c6fc45412d..d3b97ba306 100644 --- a/apps/sim/app/api/webhooks/poll/gmail/route.ts +++ b/apps/sim/app/api/webhooks/poll/gmail/route.ts @@ -1,8 +1,8 @@ import { nanoid } from 'nanoid' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' +import { acquireLock, releaseLock } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { acquireLock, releaseLock } from '@/lib/redis' import { pollGmailWebhooks } from '@/lib/webhooks/gmail-polling-service' const logger = createLogger('GmailPollingAPI') diff --git a/apps/sim/app/api/webhooks/poll/outlook/route.ts b/apps/sim/app/api/webhooks/poll/outlook/route.ts index dbe01b8786..6ccde73c8b 100644 --- a/apps/sim/app/api/webhooks/poll/outlook/route.ts +++ b/apps/sim/app/api/webhooks/poll/outlook/route.ts @@ -1,8 +1,8 @@ import { nanoid } from 'nanoid' import { type NextRequest, NextResponse } from 'next/server' import { verifyCronAuth } from '@/lib/auth/internal' +import { acquireLock, releaseLock } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { acquireLock, releaseLock } from '@/lib/redis' import { pollOutlookWebhooks } from '@/lib/webhooks/outlook-polling-service' const logger = createLogger('OutlookPollingAPI') diff --git a/apps/sim/app/api/webhooks/route.ts b/apps/sim/app/api/webhooks/route.ts index 53b8d0c820..b1ddfc4982 100644 --- a/apps/sim/app/api/webhooks/route.ts +++ b/apps/sim/app/api/webhooks/route.ts @@ -4,10 +4,10 @@ import { and, desc, eq } from 'drizzle-orm' import { nanoid } from 'nanoid' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { getOAuthToken } from '@/app/api/auth/oauth/utils' const logger = createLogger('WebhooksAPI') @@ -323,7 +323,7 @@ export async function POST(request: NextRequest) { } if (provider === 'microsoft-teams') { - const { createTeamsSubscription } = await import('@/lib/webhooks/webhook-helpers') + const { createTeamsSubscription } = await import('@/lib/webhooks/provider-subscriptions') logger.info(`[${requestId}] Creating Teams subscription before saving to database`) try { await createTeamsSubscription(request, createTempWebhookData(), workflowRecord, requestId) @@ -341,7 +341,7 @@ export async function POST(request: NextRequest) { } if (provider === 'telegram') { - const { createTelegramWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { createTelegramWebhook } = await import('@/lib/webhooks/provider-subscriptions') logger.info(`[${requestId}] Creating Telegram webhook before saving to database`) try { await createTelegramWebhook(request, createTempWebhookData(), requestId) @@ -384,7 +384,7 @@ export async function POST(request: NextRequest) { } if (provider === 'typeform') { - const { createTypeformWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { createTypeformWebhook } = await import('@/lib/webhooks/provider-subscriptions') logger.info(`[${requestId}] Creating Typeform webhook before saving to database`) try { const usedTag = await createTypeformWebhook(request, createTempWebhookData(), requestId) @@ -456,7 +456,7 @@ export async function POST(request: NextRequest) { if (externalSubscriptionCreated) { logger.error(`[${requestId}] DB save failed, cleaning up external subscription`, dbError) try { - const { cleanupExternalWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { cleanupExternalWebhook } = await import('@/lib/webhooks/provider-subscriptions') await cleanupExternalWebhook(createTempWebhookData(), workflowRecord, requestId) } catch (cleanupError) { logger.error( diff --git a/apps/sim/app/api/webhooks/test/[id]/route.ts b/apps/sim/app/api/webhooks/test/[id]/route.ts index d4dda3b5c3..68f37a2792 100644 --- a/apps/sim/app/api/webhooks/test/[id]/route.ts +++ b/apps/sim/app/api/webhooks/test/[id]/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { checkWebhookPreprocessing, findWebhookAndWorkflow, diff --git a/apps/sim/app/api/webhooks/test/route.ts b/apps/sim/app/api/webhooks/test/route.ts index 3de2e19b1b..021dc670bd 100644 --- a/apps/sim/app/api/webhooks/test/route.ts +++ b/apps/sim/app/api/webhooks/test/route.ts @@ -2,9 +2,9 @@ import { db } from '@sim/db' import { webhook } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('WebhookTestAPI') diff --git a/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts b/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts index cbed4a68a8..6b9002bc49 100644 --- a/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts +++ b/apps/sim/app/api/webhooks/trigger/[path]/route.test.ts @@ -159,7 +159,7 @@ vi.mock('@/services/queue', () => ({ }, })) -vi.mock('@/lib/workflows/db-helpers', () => ({ +vi.mock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue({ blocks: {}, edges: [], diff --git a/apps/sim/app/api/webhooks/trigger/[path]/route.ts b/apps/sim/app/api/webhooks/trigger/[path]/route.ts index 26cd3bb882..b7ec7bafbe 100644 --- a/apps/sim/app/api/webhooks/trigger/[path]/route.ts +++ b/apps/sim/app/api/webhooks/trigger/[path]/route.ts @@ -1,6 +1,6 @@ import { type NextRequest, NextResponse } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { checkWebhookPreprocessing, findWebhookAndWorkflow, @@ -9,7 +9,7 @@ import { queueWebhookExecution, verifyProviderAuth, } from '@/lib/webhooks/processor' -import { blockExistsInDeployment } from '@/lib/workflows/db-helpers' +import { blockExistsInDeployment } from '@/lib/workflows/persistence/utils' const logger = createLogger('WebhookTriggerAPI') diff --git a/apps/sim/app/api/workflows/[id]/autolayout/route.ts b/apps/sim/app/api/workflows/[id]/autolayout/route.ts index 57ca10e708..a08c82fb72 100644 --- a/apps/sim/app/api/workflows/[id]/autolayout/route.ts +++ b/apps/sim/app/api/workflows/[id]/autolayout/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { applyAutoLayout } from '@/lib/workflows/autolayout' import { DEFAULT_HORIZONTAL_SPACING, @@ -12,7 +12,7 @@ import { import { loadWorkflowFromNormalizedTables, type NormalizedWorkflowData, -} from '@/lib/workflows/db-helpers' +} from '@/lib/workflows/persistence/utils' import { getWorkflowAccessContext } from '@/lib/workflows/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/workflows/[id]/chat/status/route.ts b/apps/sim/app/api/workflows/[id]/chat/status/route.ts index 6bd8ccbc4c..21b3758a7b 100644 --- a/apps/sim/app/api/workflows/[id]/chat/status/route.ts +++ b/apps/sim/app/api/workflows/[id]/chat/status/route.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { chat } from '@sim/db/schema' import { eq } from 'drizzle-orm' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' const logger = createLogger('ChatStatusAPI') diff --git a/apps/sim/app/api/workflows/[id]/deploy/route.ts b/apps/sim/app/api/workflows/[id]/deploy/route.ts index e3a4e23230..58a291ea26 100644 --- a/apps/sim/app/api/workflows/[id]/deploy/route.ts +++ b/apps/sim/app/api/workflows/[id]/deploy/route.ts @@ -1,9 +1,9 @@ import { db, workflow, workflowDeploymentVersion } from '@sim/db' import { and, desc, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { deployWorkflow } from '@/lib/workflows/db-helpers' +import { deployWorkflow } from '@/lib/workflows/persistence/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' @@ -52,7 +52,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{ .limit(1) if (active?.state) { - const { loadWorkflowFromNormalizedTables } = await import('@/lib/workflows/db-helpers') + const { loadWorkflowFromNormalizedTables } = await import('@/lib/workflows/persistence/utils') const normalizedData = await loadWorkflowFromNormalizedTables(id) if (normalizedData) { const currentState = { @@ -171,7 +171,7 @@ export async function DELETE( // Track workflow undeployment try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.workflow.undeployed', { 'workflow.id': id, }) diff --git a/apps/sim/app/api/workflows/[id]/deployed/route.ts b/apps/sim/app/api/workflows/[id]/deployed/route.ts index b3afeeaa04..735b481e62 100644 --- a/apps/sim/app/api/workflows/[id]/deployed/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployed/route.ts @@ -2,8 +2,8 @@ import { db, workflowDeploymentVersion } from '@sim/db' import { and, desc, eq } from 'drizzle-orm' import type { NextRequest, NextResponse } from 'next/server' import { verifyInternalToken } from '@/lib/auth/internal' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/deployments/[version]/activate/route.ts b/apps/sim/app/api/workflows/[id]/deployments/[version]/activate/route.ts index ceb51049d8..4961ec65d0 100644 --- a/apps/sim/app/api/workflows/[id]/deployments/[version]/activate/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployments/[version]/activate/route.ts @@ -1,8 +1,8 @@ import { db, workflow, workflowDeploymentVersion } from '@sim/db' import { and, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/deployments/[version]/revert/route.ts b/apps/sim/app/api/workflows/[id]/deployments/[version]/revert/route.ts index 01c0e0705b..a3153290ca 100644 --- a/apps/sim/app/api/workflows/[id]/deployments/[version]/revert/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployments/[version]/revert/route.ts @@ -1,10 +1,10 @@ import { db, workflow, workflowDeploymentVersion } from '@sim/db' import { and, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { saveWorkflowToNormalizedTables } from '@/lib/workflows/db-helpers' +import { saveWorkflowToNormalizedTables } from '@/lib/workflows/persistence/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/deployments/[version]/route.ts b/apps/sim/app/api/workflows/[id]/deployments/[version]/route.ts index 65783c9ff3..3206798d70 100644 --- a/apps/sim/app/api/workflows/[id]/deployments/[version]/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployments/[version]/route.ts @@ -2,8 +2,8 @@ import { db, workflowDeploymentVersion } from '@sim/db' import { and, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/deployments/route.ts b/apps/sim/app/api/workflows/[id]/deployments/route.ts index cfa5c182e5..a74c015ffb 100644 --- a/apps/sim/app/api/workflows/[id]/deployments/route.ts +++ b/apps/sim/app/api/workflows/[id]/deployments/route.ts @@ -1,8 +1,8 @@ import { db, user, workflowDeploymentVersion } from '@sim/db' import { desc, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { validateWorkflowPermissions } from '@/lib/workflows/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/duplicate/route.ts b/apps/sim/app/api/workflows/[id]/duplicate/route.ts index 20eacd7367..8e1bfe6497 100644 --- a/apps/sim/app/api/workflows/[id]/duplicate/route.ts +++ b/apps/sim/app/api/workflows/[id]/duplicate/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { duplicateWorkflow } from '@/lib/workflows/duplicate' +import { duplicateWorkflow } from '@/lib/workflows/persistence/duplicate' const logger = createLogger('WorkflowDuplicateAPI') diff --git a/apps/sim/app/api/workflows/[id]/execute/route.ts b/apps/sim/app/api/workflows/[id]/execute/route.ts index 0ac192b6a5..1b9fa2f7ff 100644 --- a/apps/sim/app/api/workflows/[id]/execute/route.ts +++ b/apps/sim/app/api/workflows/[id]/execute/route.ts @@ -1,21 +1,26 @@ +import { tasks } from '@trigger.dev/sdk' import { type NextRequest, NextResponse } from 'next/server' import { validate as uuidValidate, v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { checkHybridAuth } from '@/lib/auth/hybrid' +import { env, isTruthy } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' +import { SSE_HEADERS } from '@/lib/core/utils/sse' +import { getBaseUrl } from '@/lib/core/utils/urls' import { processInputFileFields } from '@/lib/execution/files' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' import { LoggingSession } from '@/lib/logs/execution/logging-session' -import { generateRequestId, SSE_HEADERS } from '@/lib/utils' -import { - loadDeployedWorkflowState, - loadWorkflowFromNormalizedTables, -} from '@/lib/workflows/db-helpers' import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' import { type ExecutionEvent, encodeSSEEvent } from '@/lib/workflows/executor/execution-events' import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' -import { createStreamingResponse } from '@/lib/workflows/streaming' +import { + loadDeployedWorkflowState, + loadWorkflowFromNormalizedTables, +} from '@/lib/workflows/persistence/utils' +import { createStreamingResponse } from '@/lib/workflows/streaming/streaming' import { createHttpResponseFromBlock, workflowHasResponseBlock } from '@/lib/workflows/utils' +import type { WorkflowExecutionPayload } from '@/background/workflow-execution' import { type ExecutionMetadata, ExecutionSnapshot } from '@/executor/execution/snapshot' import type { StreamingExecution } from '@/executor/types' import { Serializer } from '@/serializer' @@ -216,6 +221,64 @@ function resolveOutputIds( }) } +type AsyncExecutionParams = { + requestId: string + workflowId: string + userId: string + input: any + triggerType: 'api' | 'webhook' | 'schedule' | 'manual' | 'chat' +} + +/** + * Handles async workflow execution by queueing a background job. + * Returns immediately with a 202 Accepted response containing the job ID. + */ +async function handleAsyncExecution(params: AsyncExecutionParams): Promise { + const { requestId, workflowId, userId, input, triggerType } = params + const useTrigger = isTruthy(env.TRIGGER_DEV_ENABLED) + + if (!useTrigger) { + logger.warn(`[${requestId}] Async mode requested but TRIGGER_DEV_ENABLED is false`) + return NextResponse.json( + { error: 'Async execution is not enabled. Set TRIGGER_DEV_ENABLED=true to use async mode.' }, + { status: 400 } + ) + } + + const payload: WorkflowExecutionPayload = { + workflowId, + userId, + input, + triggerType, + } + + try { + const handle = await tasks.trigger('workflow-execution', payload) + + logger.info(`[${requestId}] Queued async workflow execution`, { + workflowId, + jobId: handle.id, + }) + + return NextResponse.json( + { + success: true, + async: true, + jobId: handle.id, + message: 'Workflow execution queued', + statusUrl: `${getBaseUrl()}/api/jobs/${handle.id}`, + }, + { status: 202 } + ) + } catch (error: any) { + logger.error(`[${requestId}] Failed to queue async execution`, error) + return NextResponse.json( + { error: `Failed to queue async execution: ${error.message}` }, + { status: 500 } + ) + } +} + /** * POST /api/workflows/[id]/execute * @@ -290,6 +353,8 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id: const streamHeader = req.headers.get('X-Stream-Response') === 'true' const enableSSE = streamHeader || streamParam === true + const executionModeHeader = req.headers.get('X-Execution-Mode') + const isAsyncMode = executionModeHeader === 'async' logger.info(`[${requestId}] Starting server-side execution`, { workflowId, @@ -300,6 +365,7 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id: streamParam, streamHeader, enableSSE, + isAsyncMode, }) const executionId = uuidv4() @@ -348,6 +414,16 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id: workspaceId: workflow.workspaceId, }) + if (isAsyncMode) { + return handleAsyncExecution({ + requestId, + workflowId, + userId: actorUserId, + input, + triggerType: loggingTriggerType, + }) + } + let cachedWorkflowData: { blocks: Record edges: any[] diff --git a/apps/sim/app/api/workflows/[id]/log-webhook/[webhookId]/route.ts b/apps/sim/app/api/workflows/[id]/log-webhook/[webhookId]/route.ts index db2100fda1..a957f62c90 100644 --- a/apps/sim/app/api/workflows/[id]/log-webhook/[webhookId]/route.ts +++ b/apps/sim/app/api/workflows/[id]/log-webhook/[webhookId]/route.ts @@ -4,8 +4,8 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { encryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { encryptSecret } from '@/lib/utils' const logger = createLogger('WorkflowLogWebhookUpdate') diff --git a/apps/sim/app/api/workflows/[id]/log-webhook/route.ts b/apps/sim/app/api/workflows/[id]/log-webhook/route.ts index 5287effc7b..51f5bfbbd7 100644 --- a/apps/sim/app/api/workflows/[id]/log-webhook/route.ts +++ b/apps/sim/app/api/workflows/[id]/log-webhook/route.ts @@ -5,8 +5,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { encryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { encryptSecret } from '@/lib/utils' const logger = createLogger('WorkflowLogWebhookAPI') diff --git a/apps/sim/app/api/workflows/[id]/log-webhook/test/route.ts b/apps/sim/app/api/workflows/[id]/log-webhook/test/route.ts index fdd9be09d9..44d93521c0 100644 --- a/apps/sim/app/api/workflows/[id]/log-webhook/test/route.ts +++ b/apps/sim/app/api/workflows/[id]/log-webhook/test/route.ts @@ -5,8 +5,8 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' import { getSession } from '@/lib/auth' +import { decryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { decryptSecret } from '@/lib/utils' const logger = createLogger('WorkflowLogWebhookTestAPI') diff --git a/apps/sim/app/api/workflows/[id]/log/route.ts b/apps/sim/app/api/workflows/[id]/log/route.ts index 66936a3505..8b65b7012d 100644 --- a/apps/sim/app/api/workflows/[id]/log/route.ts +++ b/apps/sim/app/api/workflows/[id]/log/route.ts @@ -1,9 +1,9 @@ import type { NextRequest } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { LoggingSession } from '@/lib/logs/execution/logging-session' import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans' -import { generateRequestId } from '@/lib/utils' import { validateWorkflowAccess } from '@/app/api/workflows/middleware' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' import type { ExecutionResult } from '@/executor/types' diff --git a/apps/sim/app/api/workflows/[id]/route.test.ts b/apps/sim/app/api/workflows/[id]/route.test.ts index c03d50baaf..f2412f32e4 100644 --- a/apps/sim/app/api/workflows/[id]/route.test.ts +++ b/apps/sim/app/api/workflows/[id]/route.test.ts @@ -30,7 +30,7 @@ describe('Workflow By ID API Route', () => { createLogger: vi.fn().mockReturnValue(mockLogger), })) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue(null), })) @@ -128,7 +128,7 @@ describe('Workflow By ID API Route', () => { isWorkspaceOwner: false, }) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue(mockNormalizedData), })) @@ -183,7 +183,7 @@ describe('Workflow By ID API Route', () => { isWorkspaceOwner: false, }) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue(mockNormalizedData), })) @@ -196,7 +196,7 @@ describe('Workflow By ID API Route', () => { isWorkspaceOwner: false, }) - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ getUserEntityPermissions: vi.fn().mockResolvedValue('read'), hasAdminPermission: vi.fn().mockResolvedValue(false), })) @@ -277,7 +277,7 @@ describe('Workflow By ID API Route', () => { isWorkspaceOwner: false, }) - vi.doMock('@/lib/workflows/db-helpers', () => ({ + vi.doMock('@/lib/workflows/persistence/utils', () => ({ loadWorkflowFromNormalizedTables: vi.fn().mockResolvedValue(mockNormalizedData), })) diff --git a/apps/sim/app/api/workflows/[id]/route.ts b/apps/sim/app/api/workflows/[id]/route.ts index 1b51895c46..8cf89b337a 100644 --- a/apps/sim/app/api/workflows/[id]/route.ts +++ b/apps/sim/app/api/workflows/[id]/route.ts @@ -6,10 +6,10 @@ import { z } from 'zod' import { authenticateApiKeyFromHeader, updateApiKeyLastUsed } from '@/lib/api-key/service' import { getSession } from '@/lib/auth' import { verifyInternalToken } from '@/lib/auth/internal' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' import { getWorkflowAccessContext, getWorkflowById } from '@/lib/workflows/utils' const logger = createLogger('WorkflowByIdAPI') @@ -262,7 +262,7 @@ export async function DELETE( // Clean up external webhooks before deleting workflow try { - const { cleanupExternalWebhook } = await import('@/lib/webhooks/webhook-helpers') + const { cleanupExternalWebhook } = await import('@/lib/webhooks/provider-subscriptions') const webhooksToCleanup = await db .select({ webhook: webhook, diff --git a/apps/sim/app/api/workflows/[id]/state/route.ts b/apps/sim/app/api/workflows/[id]/state/route.ts index 9003f79812..0d85044b2b 100644 --- a/apps/sim/app/api/workflows/[id]/state/route.ts +++ b/apps/sim/app/api/workflows/[id]/state/route.ts @@ -4,19 +4,19 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' +import { extractAndPersistCustomTools } from '@/lib/workflows/persistence/custom-tools-persistence' +import { saveWorkflowToNormalizedTables } from '@/lib/workflows/persistence/utils' +import { sanitizeAgentToolsInBlocks } from '@/lib/workflows/sanitization/validation' import { calculateNextRunTime, generateCronExpression, getScheduleTimeValues, validateCronExpression, -} from '@/lib/schedules/utils' -import { generateRequestId } from '@/lib/utils' -import { extractAndPersistCustomTools } from '@/lib/workflows/custom-tools-persistence' -import { saveWorkflowToNormalizedTables } from '@/lib/workflows/db-helpers' +} from '@/lib/workflows/schedules/utils' import { getWorkflowAccessContext } from '@/lib/workflows/utils' -import { sanitizeAgentToolsInBlocks } from '@/lib/workflows/validation' import type { BlockState } from '@/stores/workflows/workflow/types' import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils' import { getTrigger } from '@/triggers' diff --git a/apps/sim/app/api/workflows/[id]/status/route.ts b/apps/sim/app/api/workflows/[id]/status/route.ts index 21b759c7d6..b25b21a6e8 100644 --- a/apps/sim/app/api/workflows/[id]/status/route.ts +++ b/apps/sim/app/api/workflows/[id]/status/route.ts @@ -1,9 +1,9 @@ import { db, workflowDeploymentVersion } from '@sim/db' import { and, desc, eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' import { hasWorkflowChanged } from '@/lib/workflows/utils' import { validateWorkflowAccess } from '@/app/api/workflows/middleware' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' diff --git a/apps/sim/app/api/workflows/[id]/variables/route.ts b/apps/sim/app/api/workflows/[id]/variables/route.ts index c4befb40fa..88f80ce05d 100644 --- a/apps/sim/app/api/workflows/[id]/variables/route.ts +++ b/apps/sim/app/api/workflows/[id]/variables/route.ts @@ -4,8 +4,8 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { getWorkflowAccessContext } from '@/lib/workflows/utils' import type { Variable } from '@/stores/panel/variables/types' diff --git a/apps/sim/app/api/workflows/middleware.ts b/apps/sim/app/api/workflows/middleware.ts index f23510ba19..5c1b941865 100644 --- a/apps/sim/app/api/workflows/middleware.ts +++ b/apps/sim/app/api/workflows/middleware.ts @@ -4,7 +4,7 @@ import { authenticateApiKeyFromHeader, updateApiKeyLastUsed, } from '@/lib/api-key/service' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { getWorkflowById } from '@/lib/workflows/utils' diff --git a/apps/sim/app/api/workflows/public/[id]/route.ts b/apps/sim/app/api/workflows/public/[id]/route.ts index b94c849b45..74b2d6d863 100644 --- a/apps/sim/app/api/workflows/public/[id]/route.ts +++ b/apps/sim/app/api/workflows/public/[id]/route.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { marketplace, workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils' const logger = createLogger('PublicWorkflowAPI') diff --git a/apps/sim/app/api/workflows/route.ts b/apps/sim/app/api/workflows/route.ts index d89af62d51..6b78495c55 100644 --- a/apps/sim/app/api/workflows/route.ts +++ b/apps/sim/app/api/workflows/route.ts @@ -4,9 +4,9 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { verifyWorkspaceMembership } from '@/app/api/workflows/utils' const logger = createLogger('WorkflowAPI') @@ -118,7 +118,7 @@ export async function POST(req: NextRequest) { logger.info(`[${requestId}] Creating workflow ${workflowId} for user ${session.user.id}`) - import('@/lib/telemetry/tracer') + import('@/lib/core/telemetry') .then(({ trackPlatformEvent }) => { trackPlatformEvent('platform.workflow.created', { 'workflow.id': workflowId, diff --git a/apps/sim/app/api/workflows/utils.ts b/apps/sim/app/api/workflows/utils.ts index 10478bcfda..348bedcb1e 100644 --- a/apps/sim/app/api/workflows/utils.ts +++ b/apps/sim/app/api/workflows/utils.ts @@ -1,6 +1,6 @@ import { NextResponse } from 'next/server' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkflowUtils') diff --git a/apps/sim/app/api/workflows/yaml/convert/route.ts b/apps/sim/app/api/workflows/yaml/convert/route.ts index a601a1eb2f..899585dfad 100644 --- a/apps/sim/app/api/workflows/yaml/convert/route.ts +++ b/apps/sim/app/api/workflows/yaml/convert/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' +import { simAgentClient } from '@/lib/copilot/client' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { simAgentClient } from '@/lib/sim-agent/client' -import { generateRequestId } from '@/lib/utils' import { getAllBlocks } from '@/blocks/registry' import type { BlockConfig } from '@/blocks/types' import { resolveOutputType } from '@/blocks/utils' diff --git a/apps/sim/app/api/workflows/yaml/export/route.ts b/apps/sim/app/api/workflows/yaml/export/route.ts index 284da1bf6e..4292e82d4d 100644 --- a/apps/sim/app/api/workflows/yaml/export/route.ts +++ b/apps/sim/app/api/workflows/yaml/export/route.ts @@ -3,11 +3,11 @@ import { workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { simAgentClient } from '@/lib/copilot/client' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { simAgentClient } from '@/lib/sim-agent/client' -import { generateRequestId } from '@/lib/utils' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { getAllBlocks } from '@/blocks/registry' import type { BlockConfig } from '@/blocks/types' import { resolveOutputType } from '@/blocks/utils' diff --git a/apps/sim/app/api/workspaces/[id]/api-keys/[keyId]/route.ts b/apps/sim/app/api/workspaces/[id]/api-keys/[keyId]/route.ts index bca567aa50..34f9909295 100644 --- a/apps/sim/app/api/workspaces/[id]/api-keys/[keyId]/route.ts +++ b/apps/sim/app/api/workspaces/[id]/api-keys/[keyId]/route.ts @@ -4,9 +4,9 @@ import { and, eq, not } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceApiKeyAPI') diff --git a/apps/sim/app/api/workspaces/[id]/api-keys/route.ts b/apps/sim/app/api/workspaces/[id]/api-keys/route.ts index f6e82a658c..11d94cb0fd 100644 --- a/apps/sim/app/api/workspaces/[id]/api-keys/route.ts +++ b/apps/sim/app/api/workspaces/[id]/api-keys/route.ts @@ -6,9 +6,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { createApiKey, getApiKeyDisplayFormat } from '@/lib/api-key/auth' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceApiKeysAPI') diff --git a/apps/sim/app/api/workspaces/[id]/duplicate/route.ts b/apps/sim/app/api/workspaces/[id]/duplicate/route.ts index 0dbd33803c..1354bec588 100644 --- a/apps/sim/app/api/workspaces/[id]/duplicate/route.ts +++ b/apps/sim/app/api/workspaces/[id]/duplicate/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { duplicateWorkspace } from '@/lib/workspaces/duplicate' const logger = createLogger('WorkspaceDuplicateAPI') diff --git a/apps/sim/app/api/workspaces/[id]/environment/route.ts b/apps/sim/app/api/workspaces/[id]/environment/route.ts index 6ea1478ae2..8328cf19e1 100644 --- a/apps/sim/app/api/workspaces/[id]/environment/route.ts +++ b/apps/sim/app/api/workspaces/[id]/environment/route.ts @@ -4,9 +4,10 @@ import { eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' +import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { decryptSecret, encryptSecret, generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceEnvironmentAPI') diff --git a/apps/sim/app/api/workspaces/[id]/files/[fileId]/download/route.ts b/apps/sim/app/api/workspaces/[id]/files/[fileId]/download/route.ts index 59601f9e1e..f3719ab874 100644 --- a/apps/sim/app/api/workspaces/[id]/files/[fileId]/download/route.ts +++ b/apps/sim/app/api/workspaces/[id]/files/[fileId]/download/route.ts @@ -1,8 +1,8 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' import { getWorkspaceFile } from '@/lib/uploads/contexts/workspace' -import { generateRequestId } from '@/lib/utils' import { verifyWorkspaceMembership } from '@/app/api/workflows/utils' export const dynamic = 'force-dynamic' @@ -40,7 +40,7 @@ export async function POST( return NextResponse.json({ error: 'File not found' }, { status: 404 }) } - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') const serveUrl = `${getBaseUrl()}/api/files/serve/${encodeURIComponent(fileRecord.key)}?context=workspace` const viewerUrl = `${getBaseUrl()}/workspace/${workspaceId}/files/${fileId}/view` diff --git a/apps/sim/app/api/workspaces/[id]/files/[fileId]/route.ts b/apps/sim/app/api/workspaces/[id]/files/[fileId]/route.ts index 7b0d409402..cf00bd1dd4 100644 --- a/apps/sim/app/api/workspaces/[id]/files/[fileId]/route.ts +++ b/apps/sim/app/api/workspaces/[id]/files/[fileId]/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import { deleteWorkspaceFile } from '@/lib/uploads/contexts/workspace' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/workspaces/[id]/files/route.ts b/apps/sim/app/api/workspaces/[id]/files/route.ts index 6c971246f9..7527081008 100644 --- a/apps/sim/app/api/workspaces/[id]/files/route.ts +++ b/apps/sim/app/api/workspaces/[id]/files/route.ts @@ -1,9 +1,9 @@ import { type NextRequest, NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' import { listWorkspaceFiles, uploadWorkspaceFile } from '@/lib/uploads/contexts/workspace' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { verifyWorkspaceMembership } from '@/app/api/workflows/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/workspaces/[id]/permissions/route.ts b/apps/sim/app/api/workspaces/[id]/permissions/route.ts index 72b754dd31..4c2e0dae3e 100644 --- a/apps/sim/app/api/workspaces/[id]/permissions/route.ts +++ b/apps/sim/app/api/workspaces/[id]/permissions/route.ts @@ -6,7 +6,10 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { getUsersWithPermissions, hasWorkspaceAdminAccess } from '@/lib/permissions/utils' +import { + getUsersWithPermissions, + hasWorkspaceAdminAccess, +} from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspacesPermissionsAPI') diff --git a/apps/sim/app/api/workspaces/[id]/route.ts b/apps/sim/app/api/workspaces/[id]/route.ts index 83e55a3606..5161915791 100644 --- a/apps/sim/app/api/workspaces/[id]/route.ts +++ b/apps/sim/app/api/workspaces/[id]/route.ts @@ -9,7 +9,7 @@ const logger = createLogger('WorkspaceByIdAPI') import { db } from '@sim/db' import { knowledgeBase, permissions, templates, workspace } from '@sim/db/schema' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const patchWorkspaceSchema = z.object({ name: z.string().trim().min(1).optional(), diff --git a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts index 1213c622a0..4616cf54bc 100644 --- a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts +++ b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.test.ts @@ -57,11 +57,11 @@ describe('Workspace Invitation [invitationId] API Route', () => { })) mockHasWorkspaceAdminAccess = vi.fn() - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ hasWorkspaceAdminAccess: mockHasWorkspaceAdminAccess, })) - vi.doMock('@/lib/env', () => { + vi.doMock('@/lib/core/config/env', () => { const mockEnv = { NEXT_PUBLIC_APP_URL: 'https://test.sim.ai', BILLING_ENABLED: false, @@ -385,10 +385,10 @@ describe('Workspace Invitation [invitationId] API Route', () => { vi.doMock('@/lib/auth', () => ({ getSession: vi.fn().mockResolvedValue({ user: mockUser }), })) - vi.doMock('@/lib/permissions/utils', () => ({ + vi.doMock('@/lib/workspaces/permissions/utils', () => ({ hasWorkspaceAdminAccess: vi.fn(), })) - vi.doMock('@/lib/env', () => { + vi.doMock('@/lib/core/config/env', () => { const mockEnv = { NEXT_PUBLIC_APP_URL: 'https://test.sim.ai', BILLING_ENABLED: false, diff --git a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts index d9d2adead4..986a3efeef 100644 --- a/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts +++ b/apps/sim/app/api/workspaces/invitations/[invitationId]/route.ts @@ -12,11 +12,11 @@ import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { WorkspaceInvitationEmail } from '@/components/emails/workspace-invitation' import { getSession } from '@/lib/auth' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { hasWorkspaceAdminAccess } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' +import { hasWorkspaceAdminAccess } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceInvitationAPI') diff --git a/apps/sim/app/api/workspaces/invitations/route.test.ts b/apps/sim/app/api/workspaces/invitations/route.test.ts index d27221b547..96370bf63d 100644 --- a/apps/sim/app/api/workspaces/invitations/route.test.ts +++ b/apps/sim/app/api/workspaces/invitations/route.test.ts @@ -87,7 +87,7 @@ describe('Workspace Invitations API Route', () => { WorkspaceInvitationEmail: vi.fn(), })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { RESEND_API_KEY: 'test-resend-key', NEXT_PUBLIC_APP_URL: 'https://test.sim.ai', @@ -96,7 +96,7 @@ describe('Workspace Invitations API Route', () => { }, })) - vi.doMock('@/lib/urls/utils', () => ({ + vi.doMock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn().mockReturnValue('sim.ai'), })) diff --git a/apps/sim/app/api/workspaces/invitations/route.ts b/apps/sim/app/api/workspaces/invitations/route.ts index 99b89f2b73..62cfff3d97 100644 --- a/apps/sim/app/api/workspaces/invitations/route.ts +++ b/apps/sim/app/api/workspaces/invitations/route.ts @@ -13,10 +13,10 @@ import { and, eq, inArray } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { WorkspaceInvitationEmail } from '@/components/emails/workspace-invitation' import { getSession } from '@/lib/auth' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' export const dynamic = 'force-dynamic' diff --git a/apps/sim/app/api/workspaces/members/[id]/route.ts b/apps/sim/app/api/workspaces/members/[id]/route.ts index e9816320c2..b835d89336 100644 --- a/apps/sim/app/api/workspaces/members/[id]/route.ts +++ b/apps/sim/app/api/workspaces/members/[id]/route.ts @@ -5,7 +5,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { hasWorkspaceAdminAccess } from '@/lib/permissions/utils' +import { hasWorkspaceAdminAccess } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceMemberAPI') const deleteMemberSchema = z.object({ diff --git a/apps/sim/app/api/workspaces/route.ts b/apps/sim/app/api/workspaces/route.ts index dacadd8ce3..b052d60495 100644 --- a/apps/sim/app/api/workspaces/route.ts +++ b/apps/sim/app/api/workspaces/route.ts @@ -5,8 +5,8 @@ import { NextResponse } from 'next/server' import { z } from 'zod' import { getSession } from '@/lib/auth' import { createLogger } from '@/lib/logs/console/logger' -import { saveWorkflowToNormalizedTables } from '@/lib/workflows/db-helpers' import { buildDefaultWorkflowArtifacts } from '@/lib/workflows/defaults' +import { saveWorkflowToNormalizedTables } from '@/lib/workflows/persistence/utils' const logger = createLogger('Workspaces') diff --git a/apps/sim/app/api/yaml/autolayout/route.ts b/apps/sim/app/api/yaml/autolayout/route.ts index 02855a4b6b..3361813854 100644 --- a/apps/sim/app/api/yaml/autolayout/route.ts +++ b/apps/sim/app/api/yaml/autolayout/route.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { z } from 'zod' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' import { applyAutoLayout } from '@/lib/workflows/autolayout' import { DEFAULT_HORIZONTAL_SPACING, diff --git a/apps/sim/app/chat/[identifier]/chat.tsx b/apps/sim/app/chat/[identifier]/chat.tsx index d0524e8ef2..fe63fbf18f 100644 --- a/apps/sim/app/chat/[identifier]/chat.tsx +++ b/apps/sim/app/chat/[identifier]/chat.tsx @@ -2,8 +2,8 @@ import { type RefObject, useCallback, useEffect, useRef, useState } from 'react' import { v4 as uuidv4 } from 'uuid' +import { noop } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { noop } from '@/lib/utils' import { getFormattedGitHubStars } from '@/app/(landing)/actions/github' import { ChatErrorState, diff --git a/apps/sim/app/chat/components/auth/email/email-auth.tsx b/apps/sim/app/chat/components/auth/email/email-auth.tsx index d8161e5b33..63281b454e 100644 --- a/apps/sim/app/chat/components/auth/email/email-auth.tsx +++ b/apps/sim/app/chat/components/auth/email/email-auth.tsx @@ -6,9 +6,9 @@ import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { InputOTP, InputOTPGroup, InputOTPSlot } from '@/components/ui/input-otp' import { Label } from '@/components/ui/label' -import { quickValidateEmail } from '@/lib/email/validation' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/chat/components/auth/password/password-auth.tsx b/apps/sim/app/chat/components/auth/password/password-auth.tsx index 5820ceefcb..e132e9562b 100644 --- a/apps/sim/app/chat/components/auth/password/password-auth.tsx +++ b/apps/sim/app/chat/components/auth/password/password-auth.tsx @@ -5,8 +5,8 @@ import { Eye, EyeOff } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/chat/components/auth/sso/sso-auth.tsx b/apps/sim/app/chat/components/auth/sso/sso-auth.tsx index 80da21f5d8..fca79215f7 100644 --- a/apps/sim/app/chat/components/auth/sso/sso-auth.tsx +++ b/apps/sim/app/chat/components/auth/sso/sso-auth.tsx @@ -5,9 +5,9 @@ import { useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { quickValidateEmail } from '@/lib/email/validation' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' import { inter } from '@/app/_styles/fonts/inter/inter' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Nav from '@/app/(landing)/components/nav/nav' diff --git a/apps/sim/app/chat/components/voice-interface/voice-interface.tsx b/apps/sim/app/chat/components/voice-interface/voice-interface.tsx index 96c2300a10..a4f2ad095e 100644 --- a/apps/sim/app/chat/components/voice-interface/voice-interface.tsx +++ b/apps/sim/app/chat/components/voice-interface/voice-interface.tsx @@ -3,8 +3,8 @@ import { type RefObject, useCallback, useEffect, useRef, useState } from 'react' import { Mic, MicOff, Phone } from 'lucide-react' import { Button } from '@/components/ui/button' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { ParticlesVisualization } from '@/app/chat/components/voice-interface/components/particles' const logger = createLogger('VoiceInterface') diff --git a/apps/sim/app/invite/[id]/invite.tsx b/apps/sim/app/invite/[id]/invite.tsx index f82b7fa218..8283acd40e 100644 --- a/apps/sim/app/invite/[id]/invite.tsx +++ b/apps/sim/app/invite/[id]/invite.tsx @@ -2,7 +2,7 @@ import { useEffect, useState } from 'react' import { useParams, useRouter, useSearchParams } from 'next/navigation' -import { client, useSession } from '@/lib/auth-client' +import { client, useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { getErrorMessage } from '@/app/invite/[id]/utils' import { InviteLayout, InviteStatusCard } from '@/app/invite/components' diff --git a/apps/sim/app/page.tsx b/apps/sim/app/page.tsx index 1a6df40d40..74c2236e6b 100644 --- a/apps/sim/app/page.tsx +++ b/apps/sim/app/page.tsx @@ -1,5 +1,5 @@ import type { Metadata } from 'next' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import Landing from '@/app/(landing)/landing' const baseUrl = getBaseUrl() diff --git a/apps/sim/app/sitemap.ts b/apps/sim/app/sitemap.ts index cd06767a9b..1f4d4e8a72 100644 --- a/apps/sim/app/sitemap.ts +++ b/apps/sim/app/sitemap.ts @@ -1,6 +1,6 @@ import type { MetadataRoute } from 'next' import { getAllPostMeta } from '@/lib/blog/registry' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' export default async function sitemap(): Promise { const baseUrl = getBaseUrl() diff --git a/apps/sim/app/templates/[id]/template.tsx b/apps/sim/app/templates/[id]/template.tsx index 881141e6af..2f3ff23f15 100644 --- a/apps/sim/app/templates/[id]/template.tsx +++ b/apps/sim/app/templates/[id]/template.tsx @@ -30,11 +30,11 @@ import { DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' import { VerifiedBadge } from '@/components/ui/verified-badge' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' -import type { CredentialRequirement } from '@/lib/workflows/credential-extractor' +import type { CredentialRequirement } from '@/lib/workflows/credentials/credential-extractor' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { getBlock } from '@/blocks/registry' import { useStarTemplate, useTemplate } from '@/hooks/queries/templates' diff --git a/apps/sim/app/templates/components/template-card.tsx b/apps/sim/app/templates/components/template-card.tsx index 1731cc97f1..3bb7c5c49a 100644 --- a/apps/sim/app/templates/components/template-card.tsx +++ b/apps/sim/app/templates/components/template-card.tsx @@ -2,8 +2,8 @@ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Star, User } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { VerifiedBadge } from '@/components/ui/verified-badge' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { getBlock } from '@/blocks/registry' import { useStarTemplate } from '@/hooks/queries/templates' @@ -42,8 +42,8 @@ export function TemplateCardSkeleton({ className }: { className?: string }) {
-
-
+
+
@@ -210,6 +210,7 @@ function TemplateCardInner({ isPannable={false} defaultZoom={0.8} fitPadding={0.2} + lightweight /> ) : (
@@ -269,17 +270,17 @@ function TemplateCardInner({
-
+
{authorImageUrl ? ( -
+
{author}
) : ( -
- +
+
)} -
+
{author} {isVerified && }
diff --git a/apps/sim/app/templates/templates.tsx b/apps/sim/app/templates/templates.tsx index 75b4e5905a..d6e23222cf 100644 --- a/apps/sim/app/templates/templates.tsx +++ b/apps/sim/app/templates/templates.tsx @@ -6,7 +6,7 @@ import { useRouter } from 'next/navigation' import { Button } from '@/components/emcn' import { Input } from '@/components/ui/input' import { createLogger } from '@/lib/logs/console/logger' -import type { CredentialRequirement } from '@/lib/workflows/credential-extractor' +import type { CredentialRequirement } from '@/lib/workflows/credentials/credential-extractor' import type { CreatorProfileDetails } from '@/app/_types/creator-profile' import { TemplateCard, TemplateCardSkeleton } from '@/app/templates/components/template-card' import { useDebounce } from '@/hooks/use-debounce' diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar.tsx index efca6929af..74c0c5b5e9 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/action-bar/action-bar.tsx @@ -2,7 +2,7 @@ import { motion } from 'framer-motion' import { Circle, CircleOff, Trash2 } from 'lucide-react' import { Tooltip } from '@/components/emcn' import { Button } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' interface ActionBarProps { diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry.tsx index a784bf23e1..4026f93fc2 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry.tsx @@ -22,7 +22,7 @@ import { SelectTrigger, SelectValue, } from '@/components/ui' -import { MAX_TAG_SLOTS, type TagSlot } from '@/lib/knowledge/consts' +import { MAX_TAG_SLOTS, type TagSlot } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' import { useKnowledgeBaseTagDefinitions } from '@/hooks/use-knowledge-base-tag-definitions' import { useNextAvailableSlot } from '@/hooks/use-next-available-slot' diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/primary-button/primary-button.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/primary-button/primary-button.tsx index a27a42d6c1..847c6daa4b 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/primary-button/primary-button.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/primary-button/primary-button.tsx @@ -1,7 +1,7 @@ 'use client' import { Button } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface PrimaryButtonProps { children: React.ReactNode diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/components/tag-input/tag-input.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/components/tag-input/tag-input.tsx index adfdb2956c..a104c287b1 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/components/tag-input/tag-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/components/tag-input/tag-input.tsx @@ -6,7 +6,7 @@ import { Button } from '@/components/ui/button' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { TAG_SLOTS, type TagSlot } from '@/lib/knowledge/consts' +import { TAG_SLOTS, type TagSlot } from '@/lib/knowledge/constants' import { useKnowledgeBaseTagDefinitions } from '@/hooks/use-knowledge-base-tag-definitions' export type TagData = { diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/controls.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/controls.tsx index 57962e59f5..7456240e0b 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/controls.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/controls.tsx @@ -2,7 +2,7 @@ import type { ReactNode } from 'react' import { ArrowUp, Loader2, RefreshCw, Search } from 'lucide-react' import { Button, Tooltip } from '@/components/emcn' import { Input } from '@/components/ui/input' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { soehne } from '@/app/_styles/fonts/soehne/soehne' import Timeline from '@/app/workspace/[workspaceId]/logs/components/filters/components/timeline' diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/workflow-details.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/workflow-details.tsx index eb7c302b7b..1904f5d92b 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/workflow-details.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/dashboard/workflow-details.tsx @@ -7,7 +7,7 @@ import 'prismjs/components/prism-javascript' import 'prismjs/components/prism-python' import 'prismjs/components/prism-json' import { CopyButton } from '@/components/ui/copy-button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import LineChart, { type LineChartPoint, } from '@/app/workspace/[workspaceId]/logs/components/dashboard/line-chart' diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx index eb74bdc68b..5551c2f37b 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/filters/filters.tsx @@ -2,8 +2,8 @@ import { TimerOff } from 'lucide-react' import { Button } from '@/components/emcn' -import { isProd } from '@/lib/environment' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { isProd } from '@/lib/core/config/environment' import { FilterSection, FolderFilter, diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas-modal.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas-modal.tsx index c35c5135d1..40c1db6c9d 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas-modal.tsx @@ -5,7 +5,7 @@ import { Maximize2, Minimize2, X } from 'lucide-react' import { Button } from '@/components/emcn' import { Badge } from '@/components/ui/badge' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { FrozenCanvas } from '@/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas' interface FrozenCanvasModalProps { diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas.tsx index 312de84b72..05220d130e 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/frozen-canvas/frozen-canvas.tsx @@ -17,8 +17,9 @@ import { } from 'lucide-react' import { Badge } from '@/components/ui/badge' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' +import { redactApiKeys } from '@/lib/core/security/redaction' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn, redactApiKeys } from '@/lib/utils' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import type { WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/search/search.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/search/search.tsx index 25b37bcf55..21a5fe77f2 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/search/search.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/search/search.tsx @@ -4,6 +4,7 @@ import { useEffect, useMemo, useState } from 'react' import { Search, X } from 'lucide-react' import { useParams } from 'next/navigation' import { Button, Popover, PopoverAnchor, PopoverContent } from '@/components/emcn' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import { getIntegrationMetadata } from '@/lib/logs/get-trigger-options' import { type ParsedFilter, parseQuery } from '@/lib/logs/query-parser' @@ -13,7 +14,6 @@ import { type TriggerData, type WorkflowData, } from '@/lib/logs/search-suggestions' -import { cn } from '@/lib/utils' import { useSearchState } from '@/app/workspace/[workspaceId]/logs/hooks/use-search-state' import { useFolderStore } from '@/stores/folders/store' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/tool-calls/tool-calls-display.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/tool-calls/tool-calls-display.tsx index 83151c99a3..070dae34f9 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/tool-calls/tool-calls-display.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/tool-calls/tool-calls-display.tsx @@ -3,7 +3,7 @@ import { useMemo, useState } from 'react' import { AlertCircle, CheckCircle2, ChevronDown, ChevronRight, Clock } from 'lucide-react' import { CopyButton } from '@/components/ui/copy-button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import type { ToolCall, ToolCallMetadata } from '@/stores/logs/filters/types' interface ToolCallsDisplayProps { diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/components/trace-span-item.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/components/trace-span-item.tsx index fd444d4823..59ccd4d54d 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/components/trace-span-item.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/components/trace-span-item.tsx @@ -10,7 +10,7 @@ import { ConditionalIcon, ConnectIcon, } from '@/components/icons' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { CollapsibleInputOutput, normalizeChildWorkflowSpan, diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/utils.ts b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/utils.ts index 2a339dad87..3342f57f63 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/logs/components/trace-spans/utils.ts @@ -1,4 +1,4 @@ -import { redactApiKeys } from '@/lib/utils' +import { redactApiKeys } from '@/lib/core/security/redaction' import type { TraceSpan } from '@/stores/logs/filters/types' export function getSpanKey(span: TraceSpan): string { diff --git a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx index 0738cd6153..b8ef9d1a80 100644 --- a/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx +++ b/apps/sim/app/workspace/[workspaceId]/logs/logs.tsx @@ -4,9 +4,9 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { AlertCircle, ArrowUpRight, Info, Loader2 } from 'lucide-react' import Link from 'next/link' import { useParams } from 'next/navigation' +import { cn } from '@/lib/core/utils/cn' import { getIntegrationMetadata } from '@/lib/logs/get-trigger-options' import { parseQuery, queryToApiParams } from '@/lib/logs/query-parser' -import { cn } from '@/lib/utils' import Controls from '@/app/workspace/[workspaceId]/logs/components/dashboard/controls' import { AutocompleteSearch } from '@/app/workspace/[workspaceId]/logs/components/search/search' import { Sidebar } from '@/app/workspace/[workspaceId]/logs/components/sidebar/sidebar' diff --git a/apps/sim/app/workspace/[workspaceId]/providers/settings-loader.tsx b/apps/sim/app/workspace/[workspaceId]/providers/settings-loader.tsx index 4187e216f3..705d8993b1 100644 --- a/apps/sim/app/workspace/[workspaceId]/providers/settings-loader.tsx +++ b/apps/sim/app/workspace/[workspaceId]/providers/settings-loader.tsx @@ -1,7 +1,7 @@ 'use client' import { useEffect, useRef } from 'react' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { useGeneralSettings } from '@/hooks/queries/general-settings' /** diff --git a/apps/sim/app/workspace/[workspaceId]/templates/components/navigation-tabs.tsx b/apps/sim/app/workspace/[workspaceId]/templates/components/navigation-tabs.tsx index f3a6271f10..82d87bc008 100644 --- a/apps/sim/app/workspace/[workspaceId]/templates/components/navigation-tabs.tsx +++ b/apps/sim/app/workspace/[workspaceId]/templates/components/navigation-tabs.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface NavigationTab { id: string diff --git a/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx b/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx index c8ce068b90..1e15ddcfa8 100644 --- a/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx @@ -2,8 +2,8 @@ import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Star, User } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { VerifiedBadge } from '@/components/ui/verified-badge' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { getBlock } from '@/blocks/registry' import { useStarTemplate } from '@/hooks/queries/templates' @@ -43,8 +43,8 @@ export function TemplateCardSkeleton({ className }: { className?: string }) {
-
-
+
+
@@ -211,6 +211,7 @@ function TemplateCardInner({ isPannable={false} defaultZoom={0.8} fitPadding={0.2} + lightweight /> ) : (
@@ -270,17 +271,17 @@ function TemplateCardInner({
-
+
{authorImageUrl ? ( -
+
{author}
) : ( -
- +
+
)} -
+
{author} {isVerified && }
diff --git a/apps/sim/app/workspace/[workspaceId]/templates/page.tsx b/apps/sim/app/workspace/[workspaceId]/templates/page.tsx index 3605f98cd0..0e49d77b5e 100644 --- a/apps/sim/app/workspace/[workspaceId]/templates/page.tsx +++ b/apps/sim/app/workspace/[workspaceId]/templates/page.tsx @@ -63,6 +63,7 @@ export default async function TemplatesPage({ params }: TemplatesPageProps) { name: string profileImageUrl?: string | null details?: unknown + verified: boolean } | null views: number stars: number @@ -158,6 +159,7 @@ export default async function TemplatesPage({ params }: TemplatesPageProps) { } | null, referenceType: row.creator.referenceType, referenceId: row.creator.referenceId, + verified: row.creator.verified, } : null, views: row.views, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx index 35c9dd7e2a..ae4e71ae27 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/chat.tsx @@ -13,16 +13,16 @@ import { PopoverTrigger, Trash, } from '@/components/emcn' -import { useSession } from '@/lib/auth-client' -import { createLogger } from '@/lib/logs/console/logger' +import { useSession } from '@/lib/auth/auth-client' +import { cn } from '@/lib/core/utils/cn' import { extractBlockIdFromOutputId, extractPathFromOutputId, parseOutputContentSafely, -} from '@/lib/response-format' -import { cn } from '@/lib/utils' +} from '@/lib/core/utils/response-format' +import { createLogger } from '@/lib/logs/console/logger' import { normalizeInputFormatValue } from '@/lib/workflows/input-format-utils' -import { StartBlockPath, TriggerUtils } from '@/lib/workflows/triggers' +import { StartBlockPath, TriggerUtils } from '@/lib/workflows/triggers/triggers' import { START_BLOCK_RESERVED_FIELDS } from '@/lib/workflows/types' import { ChatMessage, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select.tsx index cceeb25145..239ee18963 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select.tsx @@ -10,7 +10,10 @@ import { PopoverSection, PopoverTrigger, } from '@/components/emcn' -import { extractFieldsFromSchema, parseResponseFormatSafely } from '@/lib/response-format' +import { + extractFieldsFromSchema, + parseResponseFormatSafely, +} from '@/lib/core/utils/response-format' import { getBlock } from '@/blocks' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' import { useSubBlockStore } from '@/stores/workflows/subblock/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/command-list/command-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/command-list/command-list.tsx index 3df6b2f7c2..22ccc5b9ae 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/command-list/command-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/command-list/command-list.tsx @@ -6,8 +6,8 @@ import Image from 'next/image' import { useParams, useRouter } from 'next/navigation' import { Button } from '@/components/emcn' import { AgentIcon } from '@/components/icons' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { useSearchModalStore } from '@/stores/search-modal/store' const logger = createLogger('WorkflowCommandList') diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/cursors/cursors.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/cursors/cursors.tsx index 49b76fed27..a7c46d8a0a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/cursors/cursors.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/cursors/cursors.tsx @@ -2,7 +2,7 @@ import { memo, useMemo } from 'react' import { useViewport } from 'reactflow' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { getUserColor } from '@/app/workspace/[workspaceId]/w/utils/get-user-color' import { useSocket } from '@/app/workspace/providers/socket-provider' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block.tsx index 7e134e3900..9e5e870f3e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block.tsx @@ -2,7 +2,7 @@ import { memo, useCallback, useMemo } from 'react' import ReactMarkdown from 'react-markdown' import type { NodeProps } from 'reactflow' import remarkGfm from 'remark-gfm' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { useBlockCore } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/inline-tool-call/inline-tool-call.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/inline-tool-call/inline-tool-call.tsx index 270775c386..c43ae69edc 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/inline-tool-call/inline-tool-call.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/inline-tool-call/inline-tool-call.tsx @@ -8,7 +8,7 @@ import { GoogleDriveIcon } from '@/components/icons' import { ClientToolCallState } from '@/lib/copilot/tools/client/base-tool' import { getClientTool } from '@/lib/copilot/tools/client/manager' import { getRegisteredTools } from '@/lib/copilot/tools/client/registry' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { CLASS_TOOL_METADATA, useCopilotStore } from '@/stores/panel/copilot/store' import type { CopilotToolCall } from '@/stores/panel/copilot/types' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/plan-mode-section/plan-mode-section.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/plan-mode-section/plan-mode-section.tsx index b9031f9bbe..23f016823f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/plan-mode-section/plan-mode-section.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/plan-mode-section/plan-mode-section.tsx @@ -29,7 +29,7 @@ import { Check, GripHorizontal, Pencil, X } from 'lucide-react' import { Button } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Textarea } from '@/components/ui' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import CopilotMarkdownRenderer from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/copilot-message/components/markdown-renderer' /** diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/todo-list/todo-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/todo-list/todo-list.tsx index a5a173db62..26a7e417b1 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/todo-list/todo-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/todo-list/todo-list.tsx @@ -3,7 +3,7 @@ import { memo, useEffect, useState } from 'react' import { Check, ChevronDown, ChevronRight, Loader2, X } from 'lucide-react' import { Button } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * Represents a single todo item diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components/mode-selector/mode-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components/mode-selector/mode-selector.tsx index 03f1c6e4eb..c6cc61ad29 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components/mode-selector/mode-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/components/mode-selector/mode-selector.tsx @@ -10,7 +10,7 @@ import { PopoverItem, PopoverScrollArea, } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface ModeSelectorProps { /** Current mode - 'ask', 'build', or 'plan' */ diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/user-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/user-input.tsx index 3e203a5085..2176d22e3e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/user-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/components/user-input/user-input.tsx @@ -13,9 +13,9 @@ import { useParams } from 'next/navigation' import { createPortal } from 'react-dom' import { Badge, Button } from '@/components/emcn' import { Textarea } from '@/components/ui' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { AttachedFilesDisplay, ContextPills, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/hooks/use-landing-prompt.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/hooks/use-landing-prompt.ts index 783a938aa5..be11cba04d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/hooks/use-landing-prompt.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/copilot/hooks/use-landing-prompt.ts @@ -1,7 +1,7 @@ 'use client' import { useEffect, useRef } from 'react' -import { LandingPromptStorage } from '@/lib/browser-storage' +import { LandingPromptStorage } from '@/lib/core/utils/browser-storage' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('useLandingPrompt') diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector.tsx index 1bd5d72c26..f5080afef4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector.tsx @@ -3,8 +3,9 @@ import { Check, Copy, Eye, EyeOff, Plus, RefreshCw } from 'lucide-react' import { Button, Input, Label } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Card, CardContent } from '@/components/ui' -import { getEnv, isTruthy } from '@/lib/env' -import { cn, generatePassword } from '@/lib/utils' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { generatePassword } from '@/lib/core/security/encryption' +import { cn } from '@/lib/core/utils/cn' import type { AuthType } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/hooks/hooks/use-chat-form' interface AuthSelectorProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy.tsx index 1ed663db4c..11547a2553 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy.tsx @@ -15,8 +15,8 @@ import { Textarea, } from '@/components/emcn' import { Alert, AlertDescription, Skeleton } from '@/components/ui' +import { getEmailDomain } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getEmailDomain } from '@/lib/urls/utils' import { OutputSelect } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select' import { AuthSelector } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/auth-selector' import { IdentifierInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deploy-status.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deploy-status.tsx index 9251bbfccb..2a5e733305 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deploy-status.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deploy-status.tsx @@ -1,6 +1,6 @@ 'use client' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface DeployStatusProps { needsRedeployment: boolean diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-card.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-card.tsx index b9e0c09df4..2d68a5d747 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-card.tsx @@ -2,8 +2,8 @@ import { useMemo, useState } from 'react' import { Card, CardContent, CardHeader } from '@/components/ui/card' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' import type { WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/example-command.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/example-command.tsx index 36e2b50d1d..c35910e235 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/example-command.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/example-command.tsx @@ -11,7 +11,7 @@ import { DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { OutputSelect } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/chat/components/output-select/output-select' interface ExampleCommandProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input.tsx index 464c1dfe63..d6989bb879 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/identifier-input.tsx @@ -1,7 +1,7 @@ import { useEffect } from 'react' import { Input, Label } from '@/components/emcn' -import { getEmailDomain } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { getEmailDomain } from '@/lib/core/utils/urls' import { useIdentifierValidation } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/control-bar/components/deploy-modal/components/chat-deploy/hooks/use-identifier-validation' interface IdentifierInputProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/success-view.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/success-view.tsx index 4a361022c1..1f8404097e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/success-view.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/success-view.tsx @@ -1,5 +1,5 @@ import { Label } from '@/components/emcn' -import { getBaseDomain, getEmailDomain } from '@/lib/urls/utils' +import { getBaseDomain, getEmailDomain } from '@/lib/core/utils/urls' interface ExistingChat { id: string diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/template-deploy.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/template-deploy.tsx index 76e5e8ebd2..893f2e56e0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/template-deploy.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/template-deploy.tsx @@ -24,7 +24,7 @@ import { SelectValue, } from '@/components/ui' import { TagInput } from '@/components/ui/tag-input' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx index e9d00ebd42..36164f6b67 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/deploy-modal.tsx @@ -11,10 +11,10 @@ import { PopoverTrigger, } from '@/components/emcn' import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import type { WorkflowDeploymentVersionResponse } from '@/lib/workflows/db-helpers' -import { getInputFormatExample as getInputFormatExampleUtil } from '@/lib/workflows/deployment-utils' +import { getInputFormatExample as getInputFormatExampleUtil } from '@/lib/workflows/operations/deployment-utils' +import type { WorkflowDeploymentVersionResponse } from '@/lib/workflows/persistence/utils' import { ChatDeploy } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/chat-deploy' import { DeployedWorkflowModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployed-workflow-modal' import { DeploymentInfo } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/deploy/components/deploy-modal/components/deployment-info' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/code/code.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/code/code.tsx index b18ca98c58..3336dadf80 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/code/code.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/code/code.tsx @@ -13,14 +13,14 @@ import { languages, } from '@/components/emcn/components/code/code' import { Button } from '@/components/ui/button' +import { cn } from '@/lib/core/utils/cn' import { CodeLanguage } from '@/lib/execution/languages' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { isLikelyReferenceSegment, SYSTEM_REFERENCE_PREFIXES, splitReferenceSegment, -} from '@/lib/workflows/references' +} from '@/lib/workflows/sanitization/references' import { checkEnvVarTrigger, EnvVarDropdown, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx index a8e68f47d4..cc277f6532 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/combobox/combobox.tsx @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { useReactFlow } from 'reactflow' import { Combobox, type ComboboxOption } from '@/components/emcn/components' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { SubBlockInputController } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/sub-block-input-controller' import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-value' @@ -11,7 +11,7 @@ import type { SubBlockConfig } from '@/blocks/types' /** * Constants for ComboBox component behavior */ -const DEFAULT_MODEL = 'gpt-4o' +const DEFAULT_MODEL = 'claude-sonnet-4-5' const ZOOM_FACTOR_BASE = 0.96 const MIN_ZOOM = 0.1 const MAX_ZOOM = 1 @@ -99,18 +99,18 @@ export function ComboBox({ /** * Determines the default option value to use. - * Priority: explicit defaultValue > gpt-4o for model field > first option + * Priority: explicit defaultValue > claude-sonnet-4-5 for model field > first option */ const defaultOptionValue = useMemo(() => { if (defaultValue !== undefined) { return defaultValue } - // For model field, default to gpt-4o if available + // For model field, default to claude-sonnet-4-5 if available if (subBlockId === 'model') { - const gpt4o = evaluatedOptions.find((opt) => getOptionValue(opt) === DEFAULT_MODEL) - if (gpt4o) { - return getOptionValue(gpt4o) + const claudeSonnet45 = evaluatedOptions.find((opt) => getOptionValue(opt) === DEFAULT_MODEL) + if (claudeSonnet45) { + return getOptionValue(claudeSonnet45) } } diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx index b44f7ccc21..c215ae6447 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/condition-input/condition-input.tsx @@ -14,13 +14,13 @@ import { languages, } from '@/components/emcn/components/code/code' import { Trash } from '@/components/emcn/icons/trash' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { isLikelyReferenceSegment, SYSTEM_REFERENCE_PREFIXES, splitReferenceSegment, -} from '@/lib/workflows/references' +} from '@/lib/workflows/sanitization/references' import { checkEnvVarTrigger, EnvVarDropdown, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/components/oauth-required-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/components/oauth-required-modal.tsx index 21b3892423..e98c3a880b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/components/oauth-required-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/components/oauth-required-modal.tsx @@ -10,7 +10,7 @@ import { ModalHeader, ModalTitle, } from '@/components/emcn' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { getProviderIdFromServiceId, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx index f6b7d2a35a..52fa2d9b21 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/document-tag-entry/document-tag-entry.tsx @@ -5,8 +5,8 @@ import { Plus } from 'lucide-react' import { Trash } from '@/components/emcn/icons/trash' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' -import { MAX_TAG_SLOTS } from '@/lib/knowledge/consts' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { MAX_TAG_SLOTS } from '@/lib/knowledge/constants' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' import { useSubBlockInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown.tsx index 344867905d..32a6dd33c4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown.tsx @@ -8,7 +8,7 @@ import { PopoverScrollArea, PopoverSection, } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { usePersonalEnvironment, useWorkspaceEnvironment, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx index 7affdd17dd..4b2e9be22c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/eval-input/eval-input.tsx @@ -6,7 +6,7 @@ import { Input } from '@/components/emcn/components/input/input' import { Textarea } from '@/components/emcn/components/textarea/textarea' import { Trash } from '@/components/emcn/icons/trash' import { Label } from '@/components/ui/label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { TagDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' import { useSubBlockInput } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-input' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text.tsx index 6ce3443f39..06820c35ee 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text.tsx @@ -1,7 +1,7 @@ 'use client' import type { ReactNode } from 'react' -import { splitReferenceSegment } from '@/lib/workflows/references' +import { splitReferenceSegment } from '@/lib/workflows/sanitization/references' import { REFERENCE } from '@/executor/consts' import { createCombinedPattern } from '@/executor/utils/reference-validation' import { normalizeBlockName } from '@/stores/workflows/utils' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/grouped-checkbox-list/grouped-checkbox-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/grouped-checkbox-list/grouped-checkbox-list.tsx index 0b0d382e08..b627ba1315 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/grouped-checkbox-list/grouped-checkbox-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/grouped-checkbox-list/grouped-checkbox-list.tsx @@ -2,7 +2,7 @@ import { useMemo, useState } from 'react' import { Settings2 } from 'lucide-react' -import { Button } from '@/components/ui/button' +import { Button } from '@/components/emcn/components' import { Checkbox } from '@/components/ui/checkbox' import { Dialog, @@ -11,6 +11,7 @@ import { DialogTitle, DialogTrigger, } from '@/components/ui/dialog' +import { cn } from '@/lib/core/utils/cn' import { useSubBlockValue } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/hooks/use-sub-block-value' interface GroupedCheckboxListProps { @@ -81,25 +82,38 @@ export function GroupedCheckboxList({ const SelectedCountDisplay = () => { if (noneSelected) { - return None selected + return ( + None selected + ) } if (allSelected) { - return All selected + return ( + + All selected + + ) } - return {selectedValues.length} selected + return ( + + {selectedValues.length} selected + + ) } return ( @@ -137,13 +151,7 @@ export function GroupedCheckboxList({ Select all entities
-