From ee3e1e8cf982a88915130cb36c1646961c0f4ed2 Mon Sep 17 00:00:00 2001 From: Waleed Date: Mon, 1 Dec 2025 14:16:23 -0800 Subject: [PATCH 01/15] fix(docs): update docs to background instead of backgroundColor (#2154) --- apps/docs/components/ui/block-info-card.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/docs/components/ui/block-info-card.tsx b/apps/docs/components/ui/block-info-card.tsx index 6474f24acce..e54286cc8d1 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 ? ( From 304b5d9c7e2970eb4e1428e3a037759602a6f412 Mon Sep 17 00:00:00 2001 From: Waleed Date: Mon, 1 Dec 2025 15:15:13 -0800 Subject: [PATCH 02/15] feat(i18n): update translations (#2153) * feat(i18n): update translations * fix build --------- Co-authored-by: waleedlatif1 --- apps/docs/content/docs/de/tools/dynamodb.mdx | 188 +++++++++++++++++++ apps/docs/content/docs/de/tools/rds.mdx | 168 +++++++++++++++++ apps/docs/content/docs/de/tools/s3.mdx | 2 +- apps/docs/content/docs/es/tools/dynamodb.mdx | 188 +++++++++++++++++++ apps/docs/content/docs/es/tools/rds.mdx | 168 +++++++++++++++++ apps/docs/content/docs/es/tools/s3.mdx | 2 +- apps/docs/content/docs/fr/tools/dynamodb.mdx | 188 +++++++++++++++++++ apps/docs/content/docs/fr/tools/rds.mdx | 168 +++++++++++++++++ apps/docs/content/docs/fr/tools/s3.mdx | 2 +- apps/docs/content/docs/ja/tools/dynamodb.mdx | 188 +++++++++++++++++++ apps/docs/content/docs/ja/tools/rds.mdx | 168 +++++++++++++++++ apps/docs/content/docs/ja/tools/s3.mdx | 2 +- apps/docs/content/docs/zh/tools/dynamodb.mdx | 188 +++++++++++++++++++ apps/docs/content/docs/zh/tools/rds.mdx | 168 +++++++++++++++++ apps/docs/content/docs/zh/tools/s3.mdx | 2 +- apps/docs/i18n.lock | 100 +++++++++- 16 files changed, 1884 insertions(+), 6 deletions(-) create mode 100644 apps/docs/content/docs/de/tools/dynamodb.mdx create mode 100644 apps/docs/content/docs/de/tools/rds.mdx create mode 100644 apps/docs/content/docs/es/tools/dynamodb.mdx create mode 100644 apps/docs/content/docs/es/tools/rds.mdx create mode 100644 apps/docs/content/docs/fr/tools/dynamodb.mdx create mode 100644 apps/docs/content/docs/fr/tools/rds.mdx create mode 100644 apps/docs/content/docs/ja/tools/dynamodb.mdx create mode 100644 apps/docs/content/docs/ja/tools/rds.mdx create mode 100644 apps/docs/content/docs/zh/tools/dynamodb.mdx create mode 100644 apps/docs/content/docs/zh/tools/rds.mdx 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 00000000000..c189187b993 --- /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/rds.mdx b/apps/docs/content/docs/de/tools/rds.mdx new file mode 100644 index 00000000000..27f23e00055 --- /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 e50fe8b93d0..d09f5a1623f 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/es/tools/dynamodb.mdx b/apps/docs/content/docs/es/tools/dynamodb.mdx new file mode 100644 index 00000000000..97a5bd050ee --- /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/rds.mdx b/apps/docs/content/docs/es/tools/rds.mdx new file mode 100644 index 00000000000..9666538be71 --- /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 3ce7241e09d..09651746fb1 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 00000000000..037d3f5f6be --- /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/rds.mdx b/apps/docs/content/docs/fr/tools/rds.mdx new file mode 100644 index 00000000000..dd4ea863fd6 --- /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 4191d12f091..6ccd31470c0 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 00000000000..e15ca2815ab --- /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/rds.mdx b/apps/docs/content/docs/ja/tools/rds.mdx new file mode 100644 index 00000000000..6e06ea152ab --- /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 8bbb99322e7..d472c5f7ad7 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 00000000000..7390c01f403 --- /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/rds.mdx b/apps/docs/content/docs/zh/tools/rds.mdx new file mode 100644 index 00000000000..304aa235e7e --- /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 0f18de05f05..d63a182d41a 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 cdc8deceee4..89f5a7d7180 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 @@ -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 From 0ae7eb197a6e3e543fb8fcc2703e8e0e0b119a26 Mon Sep 17 00:00:00 2001 From: Siddharth Ganesan <33737564+Sg312@users.noreply.github.com> Date: Mon, 1 Dec 2025 18:34:46 -0800 Subject: [PATCH 03/15] improvement(agent): switch default model to claude 4.5 sonnet (#2156) * Switch default model to claude 4.5 sonnet * Fix defaults * Switch back to medium --- .../sub-block/components/combobox/combobox.tsx | 12 ++++++------ apps/sim/blocks/blocks/agent.ts | 7 ++++--- apps/sim/executor/consts.ts | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) 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 a8e68f47d4b..df1ea3712d3 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 @@ -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/blocks/blocks/agent.ts b/apps/sim/blocks/blocks/agent.ts index 7ade8d876aa..3e2c3e08299 100644 --- a/apps/sim/blocks/blocks/agent.ts +++ b/apps/sim/blocks/blocks/agent.ts @@ -90,6 +90,7 @@ export const AgentBlock: BlockConfig = { type: 'combobox', placeholder: 'Type or select a model...', required: true, + defaultValue: 'claude-sonnet-4-5', options: () => { const providersState = useProvidersStore.getState() const baseModels = providersState.providers.base.models @@ -245,7 +246,7 @@ export const AgentBlock: BlockConfig = { type: 'slider', min: 0, max: 1, - defaultValue: 0.5, + defaultValue: 0.3, condition: () => ({ field: 'model', value: (() => { @@ -262,7 +263,7 @@ export const AgentBlock: BlockConfig = { type: 'slider', min: 0, max: 2, - defaultValue: 1, + defaultValue: 0.3, condition: () => ({ field: 'model', value: (() => { @@ -383,7 +384,7 @@ Example 3 (Array Input): ], config: { tool: (params: Record) => { - const model = params.model || 'gpt-4o' + const model = params.model || 'claude-sonnet-4-5' if (!model) { throw new Error('No model selected') } diff --git a/apps/sim/executor/consts.ts b/apps/sim/executor/consts.ts index 95a06ad642a..a31bed2bec2 100644 --- a/apps/sim/executor/consts.ts +++ b/apps/sim/executor/consts.ts @@ -157,7 +157,7 @@ export const HTTP = { } as const export const AGENT = { - DEFAULT_MODEL: 'gpt-4o', + DEFAULT_MODEL: 'claude-sonnet-4-5', DEFAULT_FUNCTION_TIMEOUT: 5000, REQUEST_TIMEOUT: 120000, CUSTOM_TOOL_PREFIX: 'custom_', From 3b4f227e43b99f3b5f24c4aa38660e4317db567d Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 12:37:59 -0800 Subject: [PATCH 04/15] fix(mcp): reuse sessionID for consecutive MCP tool calls, fix dynamic args clearing, fix refreshing tools on save (#2158) * fix(mcp): reuse sessionID for consecutive MCP tool calls, fix dynamic args clearing, fix refreshing tools on save * prevent defaults * fix subblock text area * added placeholders in tool-inp for mcp dynamic args * ack PR comments --- .../mcp-dynamic-args/mcp-dynamic-args.tsx | 59 +++++++- .../components/tool-input/tool-input.tsx | 5 +- apps/sim/hooks/queries/mcp.ts | 8 +- apps/sim/lib/mcp/client.ts | 13 +- apps/sim/lib/mcp/service.ts | 142 ++++++++++++------ 5 files changed, 174 insertions(+), 53 deletions(-) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx index 33707f2d0c7..fd5e8209a07 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx @@ -40,6 +40,7 @@ function McpInputWithTags({ const [cursorPosition, setCursorPosition] = useState(0) const [activeSourceBlockId, setActiveSourceBlockId] = useState(null) const inputRef = useRef(null) + const inputNameRef = useRef(`mcp_input_${Math.random()}`) const handleChange = (e: React.ChangeEvent) => { const newValue = e.target.value @@ -104,11 +105,19 @@ function McpInputWithTags({ onDragOver={handleDragOver} placeholder={placeholder} disabled={disabled} + name={inputNameRef.current} autoComplete='off' + autoCapitalize='off' + spellCheck='false' + data-form-type='other' + data-lpignore='true' + data-1p-ignore + readOnly + onFocus={(e) => e.currentTarget.removeAttribute('readOnly')} className={cn(!isPassword && 'text-transparent caret-foreground')} /> {!isPassword && ( -
+
{formatDisplayText(value?.toString() || '', { accessiblePrefixes, @@ -157,6 +166,7 @@ function McpTextareaWithTags({ const [cursorPosition, setCursorPosition] = useState(0) const [activeSourceBlockId, setActiveSourceBlockId] = useState(null) const textareaRef = useRef(null) + const textareaNameRef = useRef(`mcp_textarea_${Math.random()}`) const handleChange = (e: React.ChangeEvent) => { const newValue = e.target.value @@ -220,9 +230,16 @@ function McpTextareaWithTags({ placeholder={placeholder} disabled={disabled} rows={rows} + name={textareaNameRef.current} + autoComplete='off' + autoCapitalize='off' + spellCheck='false' + data-form-type='other' + data-lpignore='true' + data-1p-ignore className={cn('min-h-[80px] resize-none text-transparent caret-foreground')} /> -
+
{formatDisplayText(value || '', { accessiblePrefixes, highlightAll: !accessiblePrefixes, @@ -298,6 +315,17 @@ export function McpDynamicArgs({ if (disabled) return const current = currentArgs() + + if (value === '' && (current[paramName] === undefined || current[paramName] === null)) { + return + } + + if (value === '') { + const { [paramName]: _, ...rest } = current + setToolArgs(Object.keys(rest).length > 0 ? rest : {}) + return + } + const updated = { ...current, [paramName]: value } setToolArgs(updated) }, @@ -509,7 +537,32 @@ export function McpDynamicArgs({ } return ( -
+
+ {/* Hidden dummy inputs to prevent browser password manager autofill */} + + + {toolSchema.properties && Object.entries(toolSchema.properties).map(([paramName, paramSchema]) => { const inputType = getInputType(paramSchema as any) diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx index e8335071919..5be254f93e1 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx @@ -2107,7 +2107,10 @@ export function ToolInput({ { - // Invalidate servers list to refetch queryClient.invalidateQueries({ queryKey: mcpKeys.servers(variables.workspaceId) }) - // Invalidate tools as new server may provide new tools queryClient.invalidateQueries({ queryKey: mcpKeys.tools(variables.workspaceId) }) }, }) diff --git a/apps/sim/lib/mcp/client.ts b/apps/sim/lib/mcp/client.ts index ca3fc604b2a..812c3c96e5d 100644 --- a/apps/sim/lib/mcp/client.ts +++ b/apps/sim/lib/mcp/client.ts @@ -42,7 +42,13 @@ export class McpClient { '2024-11-05', // Initial stable release ] - constructor(config: McpServerConfig, securityPolicy?: McpSecurityPolicy) { + /** + * Creates a new MCP client + * @param config - Server configuration + * @param securityPolicy - Optional security policy + * @param sessionId - Optional session ID for session restoration (from previous connection) + */ + constructor(config: McpServerConfig, securityPolicy?: McpSecurityPolicy, sessionId?: string) { this.config = config this.connectionStatus = { connected: false } this.securityPolicy = securityPolicy ?? { @@ -59,6 +65,7 @@ export class McpClient { requestInit: { headers: this.config.headers, }, + sessionId, }) this.client = new Client( @@ -255,6 +262,10 @@ export class McpClient { return typeof serverVersion === 'string' ? serverVersion : undefined } + getSessionId(): string | undefined { + return this.transport.sessionId + } + /** * Request user consent for tool execution */ diff --git a/apps/sim/lib/mcp/service.ts b/apps/sim/lib/mcp/service.ts index a8c3ba088df..ac741e11bc5 100644 --- a/apps/sim/lib/mcp/service.ts +++ b/apps/sim/lib/mcp/service.ts @@ -49,10 +49,35 @@ class McpService { private cacheMisses = 0 private entriesEvicted = 0 + private sessionCache = new Map() + constructor() { this.startPeriodicCleanup() } + /** + * Get cached session ID for a server + */ + private getCachedSessionId(serverId: string): string | undefined { + return this.sessionCache.get(serverId) + } + + /** + * Cache session ID for a server + */ + private cacheSessionId(serverId: string, sessionId: string): void { + this.sessionCache.set(serverId, sessionId) + logger.debug(`Cached session ID for server ${serverId}`) + } + + /** + * Clear cached session ID for a server + */ + private clearCachedSessionId(serverId: string): void { + this.sessionCache.delete(serverId) + logger.debug(`Cleared cached session ID for server ${serverId}`) + } + /** * Start periodic cleanup of expired cache entries */ @@ -306,7 +331,7 @@ class McpService { } /** - * Create and connect to an MCP client with security policy + * Create and connect to an MCP client */ private async createClient(config: McpServerConfig): Promise { const securityPolicy = { @@ -316,9 +341,49 @@ class McpService { allowedOrigins: config.url ? [new URL(config.url).origin] : undefined, } - const client = new McpClient(config, securityPolicy) - await client.connect() - return client + const cachedSessionId = this.getCachedSessionId(config.id) + + const client = new McpClient(config, securityPolicy, cachedSessionId) + + try { + await client.connect() + + const newSessionId = client.getSessionId() + if (newSessionId) { + this.cacheSessionId(config.id, newSessionId) + } + + return client + } catch (error) { + if (cachedSessionId && this.isSessionError(error)) { + logger.debug(`Session restoration failed for server ${config.id}, retrying fresh`) + this.clearCachedSessionId(config.id) + + const freshClient = new McpClient(config, securityPolicy) + await freshClient.connect() + + const freshSessionId = freshClient.getSessionId() + if (freshSessionId) { + this.cacheSessionId(config.id, freshSessionId) + } + + return freshClient + } + + throw error + } + } + + private isSessionError(error: unknown): boolean { + if (error instanceof Error) { + const message = error.message.toLowerCase() + return ( + message.includes('no valid session') || + message.includes('invalid session') || + message.includes('session expired') + ) + } + return false } /** @@ -332,33 +397,25 @@ class McpService { ): Promise { const requestId = generateRequestId() - try { - logger.info( - `[${requestId}] Executing MCP tool ${toolCall.name} on server ${serverId} for user ${userId}` - ) + logger.info( + `[${requestId}] Executing MCP tool ${toolCall.name} on server ${serverId} for user ${userId}` + ) - const config = await this.getServerConfig(serverId, workspaceId) - if (!config) { - throw new Error(`Server ${serverId} not found or not accessible`) - } + const config = await this.getServerConfig(serverId, workspaceId) + if (!config) { + throw new Error(`Server ${serverId} not found or not accessible`) + } - const resolvedConfig = await this.resolveConfigEnvVars(config, userId, workspaceId) + const resolvedConfig = await this.resolveConfigEnvVars(config, userId, workspaceId) - const client = await this.createClient(resolvedConfig) + const client = await this.createClient(resolvedConfig) - try { - const result = await client.callTool(toolCall) - logger.info(`[${requestId}] Successfully executed tool ${toolCall.name}`) - return result - } finally { - await client.disconnect() - } - } catch (error) { - logger.error( - `[${requestId}] Failed to execute tool ${toolCall.name} on server ${serverId}:`, - error - ) - throw error + try { + const result = await client.callTool(toolCall) + logger.info(`[${requestId}] Successfully executed tool ${toolCall.name}`) + return result + } finally { + await client.disconnect() } } @@ -442,28 +499,23 @@ class McpService { ): Promise { const requestId = generateRequestId() - try { - logger.info(`[${requestId}] Discovering tools from server ${serverId} for user ${userId}`) + logger.info(`[${requestId}] Discovering tools from server ${serverId} for user ${userId}`) - const config = await this.getServerConfig(serverId, workspaceId) - if (!config) { - throw new Error(`Server ${serverId} not found or not accessible`) - } + const config = await this.getServerConfig(serverId, workspaceId) + if (!config) { + throw new Error(`Server ${serverId} not found or not accessible`) + } - const resolvedConfig = await this.resolveConfigEnvVars(config, userId, workspaceId) + const resolvedConfig = await this.resolveConfigEnvVars(config, userId, workspaceId) - const client = await this.createClient(resolvedConfig) + const client = await this.createClient(resolvedConfig) - try { - const tools = await client.listTools() - logger.info(`[${requestId}] Discovered ${tools.length} tools from server ${config.name}`) - return tools - } finally { - await client.disconnect() - } - } catch (error) { - logger.error(`[${requestId}] Failed to discover tools from server ${serverId}:`, error) - throw error + try { + const tools = await client.listTools() + logger.info(`[${requestId}] Discovered ${tools.length} tools from server ${config.name}`) + return tools + } finally { + await client.disconnect() } } From 6fda9bd72e3097c90364f7b37ccbcc41f8d5779b Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 13:46:00 -0800 Subject: [PATCH 05/15] feat(models): added latest mistral models (#2159) --- apps/sim/providers/models.ts | 187 +++++++++++++++++++++++++++++++---- 1 file changed, 169 insertions(+), 18 deletions(-) diff --git a/apps/sim/providers/models.ts b/apps/sim/providers/models.ts index 4ad5c43f6ce..6111db81896 100644 --- a/apps/sim/providers/models.ts +++ b/apps/sim/providers/models.ts @@ -1029,7 +1029,14 @@ export const PROVIDER_DEFINITIONS: Record = { name: 'Mistral AI', description: "Mistral AI's language models", defaultModel: 'mistral-large-latest', - modelPatterns: [/^mistral/, /^magistral/, /^open-mistral/, /^codestral/, /^ministral/], + modelPatterns: [ + /^mistral/, + /^magistral/, + /^open-mistral/, + /^codestral/, + /^ministral/, + /^devstral/, + ], icon: MistralIcon, capabilities: { toolUsageControl: true, @@ -1038,14 +1045,26 @@ export const PROVIDER_DEFINITIONS: Record = { { id: 'mistral-large-latest', pricing: { - input: 2.0, - output: 6.0, - updatedAt: '2025-10-11', + input: 0.5, + output: 1.5, + updatedAt: '2025-12-02', }, capabilities: { temperature: { min: 0, max: 1 }, }, - contextWindow: 128000, + contextWindow: 256000, + }, + { + id: 'mistral-large-2512', + pricing: { + input: 0.5, + output: 1.5, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 256000, }, { id: 'mistral-large-2411', @@ -1076,7 +1095,31 @@ export const PROVIDER_DEFINITIONS: Record = { pricing: { input: 2.0, output: 5.0, - updatedAt: '2025-10-11', + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 128000, + }, + { + id: 'magistral-small-latest', + pricing: { + input: 0.5, + output: 1.5, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 128000, + }, + { + id: 'magistral-small-2509', + pricing: { + input: 0.5, + output: 1.5, + updatedAt: '2025-12-02', }, capabilities: { temperature: { min: 0, max: 1 }, @@ -1088,7 +1131,7 @@ export const PROVIDER_DEFINITIONS: Record = { pricing: { input: 0.4, output: 2.0, - updatedAt: '2025-10-11', + updatedAt: '2025-12-02', }, capabilities: { temperature: { min: 0, max: 1 }, @@ -1107,12 +1150,24 @@ export const PROVIDER_DEFINITIONS: Record = { }, contextWindow: 128000, }, + { + id: 'mistral-medium-2505', + pricing: { + input: 0.4, + output: 2.0, + updatedAt: '2025-05-07', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 128000, + }, { id: 'mistral-small-latest', pricing: { - input: 0.2, - output: 0.6, - updatedAt: '2025-10-11', + input: 0.1, + output: 0.3, + updatedAt: '2025-12-02', }, capabilities: { temperature: { min: 0, max: 1 }, @@ -1122,9 +1177,9 @@ export const PROVIDER_DEFINITIONS: Record = { { id: 'mistral-small-2506', pricing: { - input: 0.2, - output: 0.6, - updatedAt: '2025-10-11', + input: 0.1, + output: 0.3, + updatedAt: '2025-12-02', }, capabilities: { temperature: { min: 0, max: 1 }, @@ -1168,23 +1223,95 @@ export const PROVIDER_DEFINITIONS: Record = { contextWindow: 256000, }, { - id: 'ministral-8b-latest', + id: 'devstral-small-latest', pricing: { input: 0.1, - output: 0.1, - updatedAt: '2025-10-11', + output: 0.3, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 128000, + }, + { + id: 'devstral-small-2507', + pricing: { + input: 0.1, + output: 0.3, + updatedAt: '2025-07-10', }, capabilities: { temperature: { min: 0, max: 1 }, }, contextWindow: 128000, }, + { + id: 'devstral-medium-2507', + pricing: { + input: 0.5, + output: 1.5, + updatedAt: '2025-07-10', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 128000, + }, + { + id: 'ministral-14b-latest', + pricing: { + input: 0.2, + output: 0.2, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 256000, + }, + { + id: 'ministral-14b-2512', + pricing: { + input: 0.2, + output: 0.2, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 256000, + }, + { + id: 'ministral-8b-latest', + pricing: { + input: 0.15, + output: 0.15, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 256000, + }, + { + id: 'ministral-8b-2512', + pricing: { + input: 0.15, + output: 0.15, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 256000, + }, { id: 'ministral-8b-2410', pricing: { input: 0.1, output: 0.1, - updatedAt: '2025-10-11', + updatedAt: '2025-10-09', }, capabilities: { temperature: { min: 0, max: 1 }, @@ -1193,10 +1320,34 @@ export const PROVIDER_DEFINITIONS: Record = { }, { id: 'ministral-3b-latest', + pricing: { + input: 0.1, + output: 0.1, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 256000, + }, + { + id: 'ministral-3b-2512', + pricing: { + input: 0.1, + output: 0.1, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 256000, + }, + { + id: 'ministral-3b-2410', pricing: { input: 0.04, output: 0.04, - updatedAt: '2025-10-11', + updatedAt: '2025-10-09', }, capabilities: { temperature: { min: 0, max: 1 }, From 41c068c023214584825aa619ea9783eaaea24583 Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 14:17:41 -0800 Subject: [PATCH 06/15] improvement(lib): refactored lib/ to be more aligned with queries and api directory (#2160) * fix(lib): consolidate into core dir in lib/ * refactored lib/ --- .../app/(auth)/components/auth-background.tsx | 2 +- .../components/oauth-provider-checker.tsx | 4 +- .../components/social-login-buttons.tsx | 2 +- .../(auth)/components/sso-login-button.tsx | 4 +- apps/sim/app/(auth)/login/login-form.tsx | 10 +- .../reset-password/reset-password-form.tsx | 2 +- apps/sim/app/(auth)/signup/page.tsx | 2 +- apps/sim/app/(auth)/signup/signup-form.tsx | 8 +- apps/sim/app/(auth)/sso/page.tsx | 2 +- apps/sim/app/(auth)/sso/sso-form.tsx | 8 +- apps/sim/app/(auth)/verify/page.tsx | 4 +- .../sim/app/(auth)/verify/use-verification.ts | 2 +- apps/sim/app/(auth)/verify/verify-content.tsx | 2 +- apps/sim/app/(landing)/careers/page.tsx | 6 +- .../components/background/background.tsx | 2 +- .../components/landing-canvas/dot-pattern.tsx | 2 +- .../app/(landing)/components/hero/hero.tsx | 2 +- .../landing-pricing/landing-pricing.tsx | 2 +- .../app/(landing)/components/legal-layout.tsx | 2 +- apps/sim/app/(landing)/components/nav/nav.tsx | 2 +- apps/sim/app/(landing)/privacy/page.tsx | 2 +- apps/sim/app/(landing)/terms/page.tsx | 2 +- .../app/_shell/providers/posthog-provider.tsx | 2 +- .../app/_shell/providers/session-provider.tsx | 2 +- apps/sim/app/api/__test-utils__/utils.ts | 38 +- .../app/api/auth/oauth/connections/route.ts | 2 +- .../app/api/auth/oauth/credentials/route.ts | 4 +- .../app/api/auth/oauth/disconnect/route.ts | 2 +- .../api/auth/oauth/microsoft/file/route.ts | 4 +- .../api/auth/oauth/microsoft/files/route.ts | 2 +- apps/sim/app/api/auth/oauth/token/route.ts | 2 +- .../api/auth/oauth/wealthbox/item/route.ts | 4 +- .../api/auth/oauth/wealthbox/items/route.ts | 2 +- apps/sim/app/api/auth/sso/register/route.ts | 2 +- .../app/api/auth/trello/authorize/route.ts | 4 +- .../sim/app/api/auth/trello/callback/route.ts | 2 +- apps/sim/app/api/auth/trello/store/route.ts | 2 +- apps/sim/app/api/billing/portal/route.ts | 2 +- apps/sim/app/api/billing/update-cost/route.ts | 4 +- apps/sim/app/api/careers/submit/route.ts | 4 +- .../app/api/chat/[identifier]/otp/route.ts | 6 +- .../app/api/chat/[identifier]/route.test.ts | 15 +- apps/sim/app/api/chat/[identifier]/route.ts | 6 +- .../app/api/chat/manage/[id]/route.test.ts | 8 +- apps/sim/app/api/chat/manage/[id]/route.ts | 8 +- apps/sim/app/api/chat/route.test.ts | 8 +- apps/sim/app/api/chat/route.ts | 8 +- apps/sim/app/api/chat/utils.test.ts | 11 +- apps/sim/app/api/chat/utils.ts | 6 +- .../api/copilot/api-keys/generate/route.ts | 4 +- apps/sim/app/api/copilot/api-keys/route.ts | 4 +- apps/sim/app/api/copilot/chat/route.test.ts | 7 +- apps/sim/app/api/copilot/chat/route.ts | 10 +- .../api/copilot/chat/update-messages/route.ts | 2 +- apps/sim/app/api/copilot/chats/route.ts | 2 +- .../copilot/checkpoints/revert/route.test.ts | 2 +- .../api/copilot/checkpoints/revert/route.ts | 6 +- apps/sim/app/api/copilot/checkpoints/route.ts | 2 +- .../sim/app/api/copilot/confirm/route.test.ts | 17 +- apps/sim/app/api/copilot/confirm/route.ts | 4 +- .../app/api/copilot/context-usage/route.ts | 4 +- .../execute-copilot-server-tool/route.ts | 2 +- apps/sim/app/api/copilot/feedback/route.ts | 2 +- apps/sim/app/api/copilot/stats/route.ts | 6 +- .../api/copilot/tools/mark-complete/route.ts | 6 +- .../api/copilot/training/examples/route.ts | 2 +- apps/sim/app/api/copilot/training/route.ts | 2 +- apps/sim/app/api/creators/[id]/route.ts | 2 +- .../sim/app/api/creators/[id]/verify/route.ts | 2 +- apps/sim/app/api/creators/route.ts | 2 +- apps/sim/app/api/environment/route.ts | 3 +- apps/sim/app/api/files/authorization.ts | 2 +- apps/sim/app/api/files/download/route.ts | 2 +- apps/sim/app/api/files/parse/route.ts | 4 +- apps/sim/app/api/files/upload/route.ts | 2 +- .../app/api/folders/[id]/duplicate/route.ts | 6 +- apps/sim/app/api/folders/[id]/route.test.ts | 2 +- apps/sim/app/api/folders/[id]/route.ts | 2 +- apps/sim/app/api/folders/route.test.ts | 2 +- apps/sim/app/api/folders/route.ts | 2 +- .../app/api/function/execute/route.test.ts | 6 +- apps/sim/app/api/function/execute/route.ts | 6 +- apps/sim/app/api/guardrails/validate/route.ts | 2 +- apps/sim/app/api/help/route.ts | 10 +- apps/sim/app/api/jobs/[jobId]/route.ts | 2 +- .../documents/[documentId]/chunks/route.ts | 2 +- .../[id]/documents/[documentId]/route.ts | 2 +- .../[documentId]/tag-definitions/route.ts | 2 +- .../app/api/knowledge/[id]/documents/route.ts | 4 +- apps/sim/app/api/knowledge/[id]/route.ts | 2 +- .../knowledge/[id]/tag-definitions/route.ts | 2 +- apps/sim/app/api/knowledge/route.ts | 2 +- .../app/api/knowledge/search/route.test.ts | 4 +- apps/sim/app/api/knowledge/search/route.ts | 4 +- .../app/api/knowledge/search/utils.test.ts | 20 +- apps/sim/app/api/knowledge/search/utils.ts | 2 +- apps/sim/app/api/knowledge/utils.test.ts | 10 +- apps/sim/app/api/knowledge/utils.ts | 2 +- apps/sim/app/api/logs/[id]/route.ts | 2 +- apps/sim/app/api/logs/cleanup/route.ts | 2 +- apps/sim/app/api/logs/route.ts | 2 +- apps/sim/app/api/logs/triggers/route.ts | 2 +- apps/sim/app/api/mcp/servers/route.ts | 2 +- apps/sim/app/api/mcp/tools/execute/route.ts | 2 +- apps/sim/app/api/memory/[id]/route.ts | 2 +- apps/sim/app/api/memory/route.ts | 2 +- .../organizations/[id]/invitations/route.ts | 8 +- .../api/organizations/[id]/members/route.ts | 6 +- .../app/api/organizations/[id]/seats/route.ts | 2 +- .../app/api/providers/ollama/models/route.ts | 2 +- apps/sim/app/api/providers/route.ts | 2 +- .../app/api/providers/vllm/models/route.ts | 2 +- apps/sim/app/api/proxy/image/route.ts | 4 +- apps/sim/app/api/proxy/route.ts | 8 +- apps/sim/app/api/proxy/tts/route.ts | 4 +- apps/sim/app/api/proxy/tts/stream/route.ts | 4 +- apps/sim/app/api/proxy/tts/unified/route.ts | 2 +- apps/sim/app/api/proxy/video/route.ts | 2 +- .../[executionId]/[contextId]/route.ts | 2 +- apps/sim/app/api/schedules/[id]/route.ts | 4 +- .../app/api/schedules/[id]/status/route.ts | 4 +- .../app/api/schedules/execute/route.test.ts | 8 +- apps/sim/app/api/schedules/execute/route.ts | 4 +- apps/sim/app/api/schedules/route.test.ts | 4 +- apps/sim/app/api/schedules/route.ts | 8 +- apps/sim/app/api/stars/route.ts | 2 +- apps/sim/app/api/telemetry/route.ts | 4 +- .../app/api/templates/[id]/approve/route.ts | 2 +- .../app/api/templates/[id]/reject/route.ts | 2 +- apps/sim/app/api/templates/[id]/route.ts | 6 +- apps/sim/app/api/templates/[id]/star/route.ts | 2 +- apps/sim/app/api/templates/[id]/use/route.ts | 8 +- .../api/templates/approved/sanitized/route.ts | 4 +- apps/sim/app/api/templates/route.ts | 4 +- .../app/api/tools/asana/add-comment/route.ts | 2 +- .../app/api/tools/asana/create-task/route.ts | 2 +- .../app/api/tools/asana/get-projects/route.ts | 2 +- .../sim/app/api/tools/asana/get-task/route.ts | 2 +- .../app/api/tools/asana/search-tasks/route.ts | 2 +- .../app/api/tools/asana/update-task/route.ts | 2 +- .../api/tools/confluence/attachment/route.ts | 2 +- .../api/tools/confluence/attachments/route.ts | 2 +- .../app/api/tools/confluence/comment/route.ts | 2 +- .../api/tools/confluence/comments/route.ts | 2 +- .../api/tools/confluence/create-page/route.ts | 2 +- .../app/api/tools/confluence/labels/route.ts | 2 +- .../app/api/tools/confluence/page/route.ts | 2 +- .../app/api/tools/confluence/pages/route.ts | 2 +- .../app/api/tools/confluence/search/route.ts | 2 +- .../app/api/tools/confluence/space/route.ts | 2 +- .../app/api/tools/confluence/spaces/route.ts | 2 +- apps/sim/app/api/tools/custom/route.test.ts | 6 +- apps/sim/app/api/tools/custom/route.ts | 6 +- .../app/api/tools/discord/channels/route.ts | 2 +- .../api/tools/discord/send-message/route.ts | 2 +- .../app/api/tools/discord/servers/route.ts | 2 +- apps/sim/app/api/tools/drive/file/route.ts | 4 +- apps/sim/app/api/tools/drive/files/route.ts | 2 +- .../app/api/tools/gmail/add-label/route.ts | 2 +- apps/sim/app/api/tools/gmail/archive/route.ts | 2 +- apps/sim/app/api/tools/gmail/delete/route.ts | 2 +- apps/sim/app/api/tools/gmail/draft/route.ts | 2 +- apps/sim/app/api/tools/gmail/label/route.ts | 4 +- apps/sim/app/api/tools/gmail/labels/route.ts | 2 +- .../app/api/tools/gmail/mark-read/route.ts | 2 +- .../app/api/tools/gmail/mark-unread/route.ts | 2 +- apps/sim/app/api/tools/gmail/move/route.ts | 2 +- .../app/api/tools/gmail/remove-label/route.ts | 2 +- apps/sim/app/api/tools/gmail/send/route.ts | 2 +- .../app/api/tools/gmail/unarchive/route.ts | 2 +- .../tools/google_calendar/calendars/route.ts | 2 +- .../api/tools/google_drive/upload/route.ts | 2 +- apps/sim/app/api/tools/jira/issue/route.ts | 2 +- apps/sim/app/api/tools/jira/issues/route.ts | 2 +- apps/sim/app/api/tools/jira/projects/route.ts | 2 +- apps/sim/app/api/tools/jira/update/route.ts | 2 +- apps/sim/app/api/tools/jira/write/route.ts | 2 +- .../app/api/tools/linear/projects/route.ts | 2 +- apps/sim/app/api/tools/linear/teams/route.ts | 2 +- apps/sim/app/api/tools/mail/send/route.ts | 2 +- .../api/tools/microsoft-teams/teams/route.ts | 2 +- .../tools/microsoft_planner/tasks/route.ts | 2 +- .../delete_chat_message/route.ts | 2 +- .../microsoft_teams/write_channel/route.ts | 2 +- .../tools/microsoft_teams/write_chat/route.ts | 2 +- apps/sim/app/api/tools/mistral/parse/route.ts | 4 +- .../app/api/tools/onedrive/folder/route.ts | 2 +- .../app/api/tools/onedrive/upload/route.ts | 2 +- apps/sim/app/api/tools/outlook/copy/route.ts | 2 +- .../sim/app/api/tools/outlook/delete/route.ts | 2 +- apps/sim/app/api/tools/outlook/draft/route.ts | 2 +- .../app/api/tools/outlook/folders/route.ts | 2 +- .../app/api/tools/outlook/mark-read/route.ts | 2 +- .../api/tools/outlook/mark-unread/route.ts | 2 +- apps/sim/app/api/tools/outlook/move/route.ts | 2 +- apps/sim/app/api/tools/outlook/send/route.ts | 2 +- .../sim/app/api/tools/s3/copy-object/route.ts | 2 +- .../app/api/tools/s3/delete-object/route.ts | 2 +- .../app/api/tools/s3/list-objects/route.ts | 2 +- apps/sim/app/api/tools/s3/put-object/route.ts | 2 +- apps/sim/app/api/tools/search/route.ts | 2 +- .../app/api/tools/sharepoint/site/route.ts | 2 +- .../app/api/tools/sharepoint/upload/route.ts | 2 +- .../app/api/tools/slack/add-reaction/route.ts | 2 +- .../sim/app/api/tools/slack/channels/route.ts | 2 +- .../api/tools/slack/delete-message/route.ts | 2 +- .../app/api/tools/slack/send-message/route.ts | 2 +- .../api/tools/slack/update-message/route.ts | 2 +- apps/sim/app/api/tools/sms/send/route.ts | 6 +- apps/sim/app/api/tools/smtp/send/route.ts | 2 +- .../app/api/tools/stagehand/agent/route.ts | 2 +- .../app/api/tools/stagehand/extract/route.ts | 2 +- .../api/tools/telegram/send-document/route.ts | 2 +- apps/sim/app/api/tools/thinking/route.ts | 2 +- .../sim/app/api/tools/vision/analyze/route.ts | 2 +- .../sim/app/api/tools/wealthbox/item/route.ts | 4 +- .../app/api/tools/wealthbox/items/route.ts | 2 +- apps/sim/app/api/user/super-user/route.ts | 2 +- .../app/api/users/me/api-keys/[id]/route.ts | 2 +- apps/sim/app/api/users/me/profile/route.ts | 2 +- apps/sim/app/api/users/me/settings/route.ts | 2 +- .../users/me/settings/unsubscribe/route.ts | 8 +- apps/sim/app/api/wand/route.ts | 6 +- apps/sim/app/api/webhooks/[id]/route.ts | 8 +- .../app/api/webhooks/[id]/test-url/route.ts | 6 +- .../api/webhooks/cleanup/idempotency/route.ts | 4 +- apps/sim/app/api/webhooks/poll/gmail/route.ts | 2 +- .../app/api/webhooks/poll/outlook/route.ts | 2 +- apps/sim/app/api/webhooks/route.ts | 14 +- apps/sim/app/api/webhooks/test/[id]/route.ts | 2 +- apps/sim/app/api/webhooks/test/route.ts | 4 +- .../api/webhooks/trigger/[path]/route.test.ts | 2 +- .../app/api/webhooks/trigger/[path]/route.ts | 4 +- .../api/workflows/[id]/autolayout/route.ts | 4 +- .../api/workflows/[id]/chat/status/route.ts | 2 +- .../app/api/workflows/[id]/deploy/route.ts | 8 +- .../app/api/workflows/[id]/deployed/route.ts | 2 +- .../deployments/[version]/activate/route.ts | 2 +- .../deployments/[version]/revert/route.ts | 6 +- .../[id]/deployments/[version]/route.ts | 2 +- .../api/workflows/[id]/deployments/route.ts | 2 +- .../app/api/workflows/[id]/duplicate/route.ts | 4 +- .../app/api/workflows/[id]/execute/route.ts | 13 +- .../[id]/log-webhook/[webhookId]/route.ts | 2 +- .../api/workflows/[id]/log-webhook/route.ts | 2 +- .../workflows/[id]/log-webhook/test/route.ts | 2 +- apps/sim/app/api/workflows/[id]/log/route.ts | 2 +- apps/sim/app/api/workflows/[id]/route.test.ts | 10 +- apps/sim/app/api/workflows/[id]/route.ts | 8 +- .../sim/app/api/workflows/[id]/state/route.ts | 12 +- .../app/api/workflows/[id]/status/route.ts | 4 +- .../app/api/workflows/[id]/variables/route.ts | 2 +- apps/sim/app/api/workflows/middleware.ts | 2 +- .../app/api/workflows/public/[id]/route.ts | 2 +- apps/sim/app/api/workflows/route.ts | 6 +- apps/sim/app/api/workflows/utils.ts | 2 +- .../app/api/workflows/yaml/convert/route.ts | 4 +- .../app/api/workflows/yaml/export/route.ts | 8 +- .../workspaces/[id]/api-keys/[keyId]/route.ts | 4 +- .../app/api/workspaces/[id]/api-keys/route.ts | 4 +- .../api/workspaces/[id]/duplicate/route.ts | 2 +- .../api/workspaces/[id]/environment/route.ts | 5 +- .../[id]/files/[fileId]/download/route.ts | 4 +- .../workspaces/[id]/files/[fileId]/route.ts | 4 +- .../app/api/workspaces/[id]/files/route.ts | 4 +- .../api/workspaces/[id]/permissions/route.ts | 5 +- apps/sim/app/api/workspaces/[id]/route.ts | 2 +- .../invitations/[invitationId]/route.test.ts | 8 +- .../invitations/[invitationId]/route.ts | 8 +- .../api/workspaces/invitations/route.test.ts | 4 +- .../app/api/workspaces/invitations/route.ts | 6 +- .../app/api/workspaces/members/[id]/route.ts | 2 +- apps/sim/app/api/workspaces/route.ts | 2 +- apps/sim/app/api/yaml/autolayout/route.ts | 2 +- apps/sim/app/chat/[identifier]/chat.tsx | 2 +- .../chat/components/auth/email/email-auth.tsx | 4 +- .../auth/password/password-auth.tsx | 2 +- .../app/chat/components/auth/sso/sso-auth.tsx | 4 +- .../voice-interface/voice-interface.tsx | 2 +- apps/sim/app/invite/[id]/invite.tsx | 2 +- apps/sim/app/page.tsx | 2 +- apps/sim/app/sitemap.ts | 2 +- apps/sim/app/templates/[id]/template.tsx | 8 +- .../templates/components/template-card.tsx | 2 +- apps/sim/app/templates/templates.tsx | 2 +- .../[id]/components/action-bar/action-bar.tsx | 2 +- .../document-tag-entry/document-tag-entry.tsx | 2 +- .../primary-button/primary-button.tsx | 2 +- .../components/tag-input/tag-input.tsx | 2 +- .../logs/components/dashboard/controls.tsx | 2 +- .../components/dashboard/workflow-details.tsx | 2 +- .../logs/components/filters/filters.tsx | 4 +- .../frozen-canvas/frozen-canvas-modal.tsx | 2 +- .../frozen-canvas/frozen-canvas.tsx | 3 +- .../logs/components/search/search.tsx | 2 +- .../tool-calls/tool-calls-display.tsx | 2 +- .../components/trace-span-item.tsx | 2 +- .../logs/components/trace-spans/utils.ts | 2 +- .../app/workspace/[workspaceId]/logs/logs.tsx | 2 +- .../providers/settings-loader.tsx | 2 +- .../templates/components/navigation-tabs.tsx | 2 +- .../templates/components/template-card.tsx | 2 +- .../w/[workflowId]/components/chat/chat.tsx | 10 +- .../output-select/output-select.tsx | 5 +- .../components/command-list/command-list.tsx | 2 +- .../components/cursors/cursors.tsx | 2 +- .../components/note-block/note-block.tsx | 2 +- .../inline-tool-call/inline-tool-call.tsx | 2 +- .../plan-mode-section/plan-mode-section.tsx | 2 +- .../components/todo-list/todo-list.tsx | 2 +- .../mode-selector/mode-selector.tsx | 2 +- .../components/user-input/user-input.tsx | 4 +- .../copilot/hooks/use-landing-prompt.ts | 2 +- .../deploy-modal/components/auth-selector.tsx | 5 +- .../deploy-modal/components/chat-deploy.tsx | 2 +- .../deploy-modal/components/deploy-status.tsx | 2 +- .../components/deployed-workflow-card.tsx | 2 +- .../components/example-command.tsx | 2 +- .../components/identifier-input.tsx | 4 +- .../deploy-modal/components/success-view.tsx | 2 +- .../components/template-deploy.tsx | 2 +- .../components/deploy-modal/deploy-modal.tsx | 6 +- .../sub-block/components/code/code.tsx | 4 +- .../components/combobox/combobox.tsx | 2 +- .../condition-input/condition-input.tsx | 4 +- .../components/oauth-required-modal.tsx | 2 +- .../document-tag-entry/document-tag-entry.tsx | 4 +- .../sub-block/components/env-var-dropdown.tsx | 2 +- .../components/eval-input/eval-input.tsx | 2 +- .../sub-block/components/formatted-text.tsx | 2 +- .../input-mapping/input-mapping.tsx | 2 +- .../components/long-input/long-input.tsx | 2 +- .../mcp-dynamic-args/mcp-dynamic-args.tsx | 2 +- .../messages-input/messages-input.tsx | 2 +- .../schedule-save/schedule-save.tsx | 4 +- .../components/short-input/short-input.tsx | 2 +- .../components/starter/input-format.tsx | 2 +- .../sub-block/components/table/table.tsx | 2 +- .../components/tag-dropdown/tag-dropdown.tsx | 11 +- .../components/time-input/time-input.tsx | 2 +- .../components/code-editor/code-editor.tsx | 2 +- .../custom-tool-modal/custom-tool-modal.tsx | 2 +- .../components/tool-command/tool-command.tsx | 2 +- .../components/tool-input/tool-input.tsx | 2 +- .../components/trigger-save/trigger-save.tsx | 2 +- .../variables-input/variables-input.tsx | 2 +- .../editor/components/sub-block/sub-block.tsx | 2 +- .../editor/hooks/use-block-connections.ts | 9 +- .../hooks/use-editor-subblock-layout.ts | 2 +- .../editor/hooks/use-subflow-editor.ts | 2 +- .../panel/components/toolbar/toolbar.tsx | 2 +- .../workflow-controls/workflow-controls.tsx | 2 +- .../components/subflows/subflow-node.tsx | 2 +- .../training-controls/training-controls.tsx | 2 +- .../training-floating-button.tsx | 2 +- .../training-controls/training-modal.tsx | 4 +- .../components/variables/variables.tsx | 3 +- .../wand-prompt-bar/wand-prompt-bar.tsx | 2 +- .../webhook-settings/webhook-settings.tsx | 3 +- .../components/action-bar/action-bar.tsx | 2 +- .../workflow-block/hooks/use-schedule-info.ts | 2 +- .../workflow-block/workflow-block.tsx | 4 +- .../use-accessible-reference-prefixes.ts | 4 +- .../hooks/use-block-connections.ts | 6 +- .../hooks/use-block-dimensions.ts | 2 +- .../hooks/use-block-output-fields.ts | 6 +- .../[workflowId]/hooks/use-node-utilities.ts | 2 +- .../hooks/use-workflow-execution.ts | 16 +- .../w/[workflowId]/utils/block-ring-utils.ts | 2 +- .../[workspaceId]/w/[workflowId]/workflow.tsx | 2 +- .../components-new/help-modal/help-modal.tsx | 2 +- .../search-modal/search-modal.tsx | 4 +- .../components/account/account.tsx | 4 +- .../components/api-keys/api-keys.tsx | 2 +- .../creator-profile/creator-profile.tsx | 2 +- .../components/credentials/credentials.tsx | 2 +- .../settings-modal/components/files/files.tsx | 4 +- .../components/general/general.tsx | 4 +- .../settings-navigation.tsx | 14 +- .../components/shared/usage-header.tsx | 4 +- .../settings-modal/components/sso/sso.tsx | 12 +- .../cancel-subscription.tsx | 8 +- .../components/plan-card/plan-card.tsx | 2 +- .../components/usage-limit/usage-limit.tsx | 2 +- .../components/subscription/subscription.tsx | 10 +- .../member-invitation-card.tsx | 4 +- .../components/team-members/team-members.tsx | 2 +- .../team-seats-overview.tsx | 2 +- .../components/team-seats/team-seats.tsx | 2 +- .../components/team-usage/team-usage.tsx | 6 +- .../team-management/team-management.tsx | 11 +- .../settings-modal/settings-modal.tsx | 2 +- .../usage-indicator/rotating-digit.tsx | 2 +- .../usage-indicator/usage-indicator.tsx | 6 +- .../workflow-item/avatars/avatars.tsx | 2 +- .../components/invite-modal/invite-modal.tsx | 8 +- .../components/create-menu/create-menu.tsx | 4 +- .../keyboard-shortcut/keyboard-shortcut.tsx | 2 +- .../components/document-list.tsx | 2 +- .../knowledge-base-tags.tsx | 2 +- .../knowledge-tags/knowledge-tags.tsx | 2 +- .../navigation-item/navigation-item.tsx | 2 +- .../subscription-modal/subscription-modal.tsx | 8 +- .../workflow-list/workflow-list.tsx | 2 +- .../workspace-header/workspace-header.tsx | 2 +- .../workspace-selector/workspace-selector.tsx | 6 +- .../w/components/sidebar/sidebar-new.tsx | 4 +- .../w/components/sidebar/sidebar.tsx | 6 +- .../workflow-preview/workflow-preview.tsx | 2 +- .../w/hooks/use-export-workflow.ts | 2 +- .../w/hooks/use-export-workspace.ts | 5 +- .../w/hooks/use-import-workflow.ts | 2 +- .../w/hooks/use-import-workspace.ts | 5 +- apps/sim/app/workspace/layout.tsx | 2 +- apps/sim/app/workspace/page.tsx | 2 +- .../workspace/providers/socket-provider.tsx | 2 +- apps/sim/background/knowledge-processing.ts | 2 +- apps/sim/background/logs-webhook-delivery.ts | 2 +- apps/sim/background/schedule-execution.ts | 13 +- apps/sim/background/webhook-execution.ts | 8 +- apps/sim/blocks/blocks/agent.ts | 2 +- apps/sim/blocks/blocks/evaluator.ts | 2 +- apps/sim/blocks/blocks/guardrails.ts | 2 +- apps/sim/blocks/blocks/router.ts | 2 +- apps/sim/blocks/blocks/translate.ts | 2 +- apps/sim/components.json | 2 +- .../components/analytics/onedollarstats.tsx | 2 +- .../emails/batch-invitation-email.tsx | 2 +- .../billing/enterprise-subscription-email.tsx | 2 +- .../billing/free-tier-upgrade-email.tsx | 2 +- .../emails/billing/payment-failed-email.tsx | 2 +- .../emails/billing/plan-welcome-email.tsx | 2 +- .../emails/billing/usage-threshold-email.tsx | 2 +- .../careers/careers-confirmation-email.tsx | 2 +- .../careers/careers-submission-email.tsx | 2 +- apps/sim/components/emails/footer.tsx | 4 +- .../emails/help-confirmation-email.tsx | 2 +- .../components/emails/invitation-email.tsx | 2 +- .../emails/otp-verification-email.tsx | 2 +- apps/sim/components/emails/render-email.ts | 2 +- .../emails/reset-password-email.tsx | 2 +- .../emails/workspace-invitation.tsx | 2 +- .../emcn/components/badge/badge.tsx | 2 +- .../emcn/components/button/button.tsx | 2 +- .../components/emcn/components/code/code.tsx | 2 +- .../emcn/components/combobox/combobox.tsx | 2 +- .../emcn/components/input/input.tsx | 2 +- .../emcn/components/label/label.tsx | 2 +- .../emcn/components/modal/modal.tsx | 2 +- .../emcn/components/popover/popover.tsx | 2 +- .../emcn/components/textarea/textarea.tsx | 2 +- .../emcn/components/tooltip/tooltip.tsx | 2 +- apps/sim/components/ui/alert-dialog.tsx | 2 +- apps/sim/components/ui/alert.tsx | 2 +- apps/sim/components/ui/avatar.tsx | 2 +- apps/sim/components/ui/badge.tsx | 2 +- apps/sim/components/ui/breadcrumb.tsx | 2 +- apps/sim/components/ui/button.tsx | 2 +- apps/sim/components/ui/card.tsx | 2 +- apps/sim/components/ui/checkbox.tsx | 2 +- apps/sim/components/ui/code-block.tsx | 2 +- apps/sim/components/ui/color-picker.tsx | 4 +- apps/sim/components/ui/command.tsx | 2 +- apps/sim/components/ui/dialog.tsx | 2 +- apps/sim/components/ui/dropdown-menu.tsx | 2 +- apps/sim/components/ui/form.tsx | 2 +- apps/sim/components/ui/input-otp.tsx | 2 +- apps/sim/components/ui/input.tsx | 2 +- apps/sim/components/ui/label.tsx | 2 +- apps/sim/components/ui/notice.tsx | 2 +- apps/sim/components/ui/popover.tsx | 2 +- apps/sim/components/ui/progress.tsx | 2 +- apps/sim/components/ui/radio-group.tsx | 2 +- apps/sim/components/ui/scroll-area.tsx | 2 +- apps/sim/components/ui/select.tsx | 2 +- apps/sim/components/ui/separator.tsx | 2 +- apps/sim/components/ui/sheet.tsx | 2 +- apps/sim/components/ui/skeleton.tsx | 2 +- apps/sim/components/ui/slider.tsx | 2 +- apps/sim/components/ui/switch.tsx | 2 +- apps/sim/components/ui/table.tsx | 2 +- apps/sim/components/ui/tabs.tsx | 2 +- apps/sim/components/ui/tag-input.tsx | 2 +- apps/sim/components/ui/textarea.tsx | 2 +- apps/sim/components/ui/toggle.tsx | 2 +- apps/sim/components/ui/tool-call.tsx | 2 +- apps/sim/components/ui/verified-badge.tsx | 2 +- apps/sim/drizzle.config.ts | 2 +- .../__test-utils__/mock-dependencies.ts | 7 +- apps/sim/executor/execution/block-executor.ts | 2 +- apps/sim/executor/execution/executor.ts | 2 +- .../handlers/agent/agent-handler.test.ts | 4 +- .../human-in-the-loop-handler.ts | 2 +- .../handlers/router/router-handler.ts | 2 +- apps/sim/executor/utils/http.ts | 2 +- .../executor/utils/reference-validation.ts | 2 +- apps/sim/executor/utils/start-block.test.ts | 2 +- apps/sim/executor/utils/start-block.ts | 4 +- .../executor/variables/resolvers/workflow.ts | 2 +- apps/sim/hooks/queries/copilot-keys.ts | 2 +- apps/sim/hooks/queries/oauth-connections.ts | 2 +- apps/sim/hooks/queries/organization.ts | 2 +- apps/sim/hooks/use-collaborative-workflow.ts | 6 +- apps/sim/{lib => hooks}/use-forwarded-ref.ts | 0 .../use-knowledge-base-tag-definitions.ts | 2 +- apps/sim/hooks/use-tag-definitions.ts | 2 +- apps/sim/hooks/use-undo-redo.ts | 4 +- apps/sim/hooks/use-user-permissions.ts | 2 +- apps/sim/hooks/use-webhook-management.ts | 2 +- apps/sim/instrumentation-client.ts | 2 +- apps/sim/instrumentation-node.ts | 2 +- apps/sim/lib/api-key/auth.ts | 2 +- apps/sim/lib/api-key/crypto.ts | 2 +- apps/sim/lib/api-key/service.ts | 2 +- apps/sim/lib/{ => auth}/auth-client.ts | 6 +- apps/sim/lib/{ => auth}/auth.ts | 14 +- apps/sim/lib/auth/credential-access.ts | 2 +- apps/sim/lib/auth/index.ts | 1 + apps/sim/lib/auth/internal.ts | 2 +- .../{sso/consts.ts => auth/sso/constants.ts} | 0 .../lib/billing/calculations/usage-monitor.ts | 2 +- .../{subscription => billing/client}/index.ts | 16 +- .../{subscription => billing/client}/types.ts | 0 .../client}/upgrade.ts | 2 +- .../client}/usage-visualization.ts | 0 .../helpers.ts => billing/client/utils.ts} | 2 +- apps/sim/lib/billing/core/subscription.ts | 6 +- apps/sim/lib/billing/core/usage.ts | 8 +- apps/sim/lib/billing/plans.ts | 2 +- apps/sim/lib/billing/storage/limits.ts | 4 +- apps/sim/lib/billing/storage/tracking.ts | 2 +- apps/sim/lib/billing/stripe-client.ts | 2 +- apps/sim/lib/billing/subscriptions/utils.ts | 2 +- apps/sim/lib/billing/threshold-billing.ts | 2 +- .../lib/billing/validation/seat-management.ts | 2 +- apps/sim/lib/billing/webhooks/enterprise.ts | 4 +- apps/sim/lib/billing/webhooks/invoices.ts | 6 +- apps/sim/lib/branding/branding.ts | 2 +- apps/sim/lib/branding/metadata.ts | 2 +- apps/sim/lib/chunkers/docs-chunker.ts | 2 +- apps/sim/lib/copilot/auth/permissions.ts | 2 +- .../utils.ts => copilot/chat-title.ts} | 2 +- apps/sim/lib/{sim-agent => copilot}/client.ts | 6 +- .../lib/{sim-agent => copilot}/constants.ts | 0 apps/sim/lib/copilot/process-contents.ts | 4 +- .../copilot/{auth.ts => request-helpers.ts} | 2 +- .../tools/client/workflow/deploy-workflow.ts | 2 +- .../tools/client/workflow/edit-workflow.ts | 2 +- .../client/workflow/get-user-workflow.ts | 2 +- .../client/workflow/get-workflow-from-name.ts | 2 +- .../tools/server/docs/search-documentation.ts | 2 +- .../tools/server/other/search-online.ts | 2 +- .../tools/server/user/get-credentials.ts | 2 +- .../server/user/set-environment-variables.ts | 2 +- .../tools/server/workflow/edit-workflow.ts | 8 +- apps/sim/lib/copilot/utils.ts | 2 +- apps/sim/lib/core/config/api-keys.ts | 42 ++ apps/sim/lib/{ => core/config}/env.ts | 0 apps/sim/lib/{ => core/config}/environment.ts | 0 apps/sim/lib/{ => core/config}/redis.ts | 2 +- .../sim/lib/{ => core}/idempotency/cleanup.ts | 0 apps/sim/lib/{ => core}/idempotency/index.ts | 0 .../sim/lib/{ => core}/idempotency/service.ts | 2 +- apps/sim/lib/{ => core}/security/csp.ts | 2 +- apps/sim/lib/core/security/encryption.ts | 84 +++ .../security/input-validation.test.ts | 2 +- .../{ => core}/security/input-validation.ts | 0 apps/sim/lib/core/security/redaction.ts | 34 + .../tracer.ts => core/telemetry.ts} | 0 apps/sim/lib/{ => core}/utils.test.ts | 19 +- .../lib/{ => core/utils}/browser-storage.ts | 0 apps/sim/lib/core/utils/cn.ts | 9 + apps/sim/lib/core/utils/display-filters.ts | 85 +++ apps/sim/lib/core/utils/formatting.ts | 141 ++++ apps/sim/lib/core/utils/optimistic-update.ts | 103 +++ apps/sim/lib/core/utils/request.ts | 11 + .../lib/{ => core/utils}/response-format.ts | 0 apps/sim/lib/core/utils/scheduling.ts | 51 ++ apps/sim/lib/core/utils/sse.ts | 21 + .../{theme-sync.ts => core/utils/theme.ts} | 0 .../lib/{urls/utils.ts => core/utils/urls.ts} | 4 +- apps/sim/lib/core/utils/validation.ts | 33 + apps/sim/lib/environment/utils.ts | 2 +- apps/sim/lib/execution/e2b.ts | 2 +- apps/sim/lib/execution/files.ts | 2 +- .../lib/guardrails/validate_hallucination.ts | 2 +- apps/sim/lib/knowledge/chunks/service.ts | 2 +- .../lib/knowledge/{consts.ts => constants.ts} | 0 .../knowledge/documents/document-processor.ts | 4 +- apps/sim/lib/knowledge/documents/queue.ts | 2 +- apps/sim/lib/knowledge/documents/service.ts | 8 +- .../utils.ts => knowledge/embeddings.ts} | 2 +- apps/sim/lib/knowledge/service.ts | 2 +- apps/sim/lib/knowledge/tags/service.ts | 2 +- apps/sim/lib/logs/console/logger.ts | 2 +- apps/sim/lib/logs/execution/logger.ts | 5 +- .../sim/lib/logs/execution/logging-factory.ts | 2 +- .../sim/lib/logs/execution/logging-session.ts | 4 +- apps/sim/lib/mcp/middleware.ts | 4 +- apps/sim/lib/mcp/service.ts | 4 +- .../lib/{ => messaging}/email/mailer.test.ts | 10 +- apps/sim/lib/{ => messaging}/email/mailer.ts | 8 +- .../{ => messaging}/email/unsubscribe.test.ts | 6 +- .../lib/{ => messaging}/email/unsubscribe.ts | 4 +- .../lib/{ => messaging}/email/utils.test.ts | 22 +- apps/sim/lib/{ => messaging}/email/utils.ts | 4 +- .../{ => messaging}/email/validation.test.ts | 2 +- .../lib/{ => messaging}/email/validation.ts | 0 apps/sim/lib/{ => messaging}/sms/service.ts | 2 +- apps/sim/lib/oauth/oauth.test.ts | 2 +- apps/sim/lib/oauth/oauth.ts | 2 +- apps/sim/lib/organization/utils.ts | 37 -- apps/sim/lib/sim-agent/index.ts | 11 - apps/sim/lib/uploads/config.ts | 2 +- .../execution/execution-file-manager.ts | 9 +- .../lib/uploads/contexts/execution/index.ts | 2 +- .../{execution-file-helpers.ts => utils.ts} | 0 apps/sim/lib/uploads/core/setup.server.ts | 2 +- apps/sim/lib/uploads/core/storage-service.ts | 2 +- .../lib/uploads/providers/blob/client.test.ts | 2 +- .../lib/uploads/providers/s3/client.test.ts | 6 +- apps/sim/lib/uploads/providers/s3/client.ts | 2 +- .../lib/uploads/utils/file-utils.server.ts | 2 +- apps/sim/lib/utils.ts | 608 ------------------ .../sim/lib/webhooks/gmail-polling-service.ts | 4 +- .../lib/webhooks/outlook-polling-service.ts | 4 +- apps/sim/lib/webhooks/processor.ts | 2 +- ...k-helpers.ts => provider-subscriptions.ts} | 2 +- apps/sim/lib/webhooks/test-tokens.ts | 2 +- .../sim/lib/workflows/autolayout/constants.ts | 4 +- .../lib/workflows/autolayout/containers.ts | 2 +- apps/sim/lib/workflows/autolayout/targeted.ts | 2 +- apps/sim/lib/workflows/autolayout/utils.ts | 2 +- .../blocks/block-dimensions.ts | 0 .../workflows/{ => blocks}/block-outputs.ts | 6 +- .../blocks}/block-path-calculator.ts | 0 .../{ => credentials}/credential-extractor.ts | 0 .../{ => credentials}/credential-resolver.ts | 0 .../custom-tools/operations.ts | 2 +- apps/sim/lib/workflows/defaults.ts | 2 +- .../lib/workflows/executor/execution-core.ts | 4 +- .../{ => operations}/deployment-utils.ts | 2 +- .../{ => operations}/import-export.ts | 2 +- .../{ => operations}/socket-operations.ts | 2 +- .../custom-tools-persistence.ts | 2 +- .../workflows/{ => persistence}/duplicate.ts | 2 +- .../utils.test.ts} | 2 +- .../{db-helpers.ts => persistence/utils.ts} | 4 +- .../{ => sanitization}/json-sanitizer.ts | 2 +- .../{ => sanitization}/references.test.ts | 5 +- .../{ => sanitization}/references.ts | 0 .../{ => sanitization}/validation.ts | 0 .../{ => workflows}/schedules/utils.test.ts | 2 +- .../lib/{ => workflows}/schedules/utils.ts | 2 +- .../workflows/{ => streaming}/streaming.ts | 6 +- .../training/compute-edit-sequence.ts | 2 +- .../{ => triggers}/execution-events.ts | 0 .../workflows/{ => triggers}/trigger-utils.ts | 6 +- .../lib/workflows/{ => triggers}/triggers.ts | 0 apps/sim/lib/workflows/utils.ts | 4 +- .../variables/variable-manager.test.ts | 2 +- .../variables/variable-manager.ts | 0 apps/sim/lib/workspaces/duplicate.ts | 4 +- apps/sim/lib/workspaces/naming.ts | 2 +- .../{ => workspaces}/organization/index.ts | 14 +- .../{ => workspaces}/organization/types.ts | 0 .../organization/utils.ts} | 33 +- .../permissions/utils.test.ts | 2 +- .../lib/{ => workspaces}/permissions/utils.ts | 0 .../presence-colors.ts | 0 apps/sim/middleware.ts | 4 +- apps/sim/next.config.ts | 6 +- apps/sim/providers/azure-openai/index.ts | 2 +- apps/sim/providers/index.ts | 2 +- apps/sim/providers/ollama/index.ts | 2 +- apps/sim/providers/utils.test.ts | 2 +- apps/sim/providers/utils.ts | 6 +- apps/sim/providers/vllm/index.ts | 2 +- apps/sim/scripts/export-workflow.ts | 4 +- apps/sim/scripts/process-docs.ts | 2 +- apps/sim/serializer/index.ts | 2 +- apps/sim/services/queue/types.ts | 2 +- apps/sim/socket-server/config/socket.ts | 6 +- apps/sim/socket-server/database/operations.ts | 6 +- apps/sim/socket-server/index.ts | 2 +- .../socket-server/middleware/permissions.ts | 2 +- apps/sim/socket-server/rooms/manager.ts | 2 +- apps/sim/stores/copilot-training/store.ts | 2 +- apps/sim/stores/terminal/console/store.ts | 2 +- apps/sim/stores/workflow-diff/store.ts | 4 +- apps/sim/stores/workflows/json/store.ts | 5 +- apps/sim/stores/workflows/registry/store.ts | 2 +- apps/sim/stores/workflows/workflow/store.ts | 4 +- apps/sim/telemetry.config.ts | 2 +- apps/sim/tools/http/utils.ts | 4 +- apps/sim/tools/index.ts | 4 +- apps/sim/tools/mistral/parser.ts | 2 +- apps/sim/tools/openai/image.ts | 2 +- apps/sim/tools/trello/add_comment.ts | 2 +- apps/sim/tools/trello/create_card.ts | 2 +- apps/sim/tools/trello/get_actions.ts | 2 +- apps/sim/tools/trello/list_cards.ts | 2 +- apps/sim/tools/trello/list_lists.ts | 2 +- apps/sim/tools/trello/update_card.ts | 2 +- apps/sim/tools/utils.ts | 2 +- apps/sim/trigger.config.ts | 2 +- apps/sim/triggers/index.ts | 2 +- 707 files changed, 1772 insertions(+), 1749 deletions(-) rename apps/sim/{lib => hooks}/use-forwarded-ref.ts (100%) rename apps/sim/lib/{ => auth}/auth-client.ts (90%) rename apps/sim/lib/{ => auth}/auth.ts (99%) create mode 100644 apps/sim/lib/auth/index.ts rename apps/sim/lib/{sso/consts.ts => auth/sso/constants.ts} (100%) rename apps/sim/lib/{subscription => billing/client}/index.ts (64%) rename apps/sim/lib/{subscription => billing/client}/types.ts (100%) rename apps/sim/lib/{subscription => billing/client}/upgrade.ts (99%) rename apps/sim/lib/{subscription => billing/client}/usage-visualization.ts (100%) rename apps/sim/lib/{subscription/helpers.ts => billing/client/utils.ts} (99%) rename apps/sim/lib/{sim-agent/utils.ts => copilot/chat-title.ts} (97%) rename apps/sim/lib/{sim-agent => copilot}/client.ts (95%) rename apps/sim/lib/{sim-agent => copilot}/constants.ts (100%) rename apps/sim/lib/copilot/{auth.ts => request-helpers.ts} (97%) create mode 100644 apps/sim/lib/core/config/api-keys.ts rename apps/sim/lib/{ => core/config}/env.ts (100%) rename apps/sim/lib/{ => core/config}/environment.ts (100%) rename apps/sim/lib/{ => core/config}/redis.ts (99%) rename apps/sim/lib/{ => core}/idempotency/cleanup.ts (100%) rename apps/sim/lib/{ => core}/idempotency/index.ts (100%) rename apps/sim/lib/{ => core}/idempotency/service.ts (99%) rename apps/sim/lib/{ => core}/security/csp.ts (99%) create mode 100644 apps/sim/lib/core/security/encryption.ts rename apps/sim/lib/{ => core}/security/input-validation.test.ts (99%) rename apps/sim/lib/{ => core}/security/input-validation.ts (100%) create mode 100644 apps/sim/lib/core/security/redaction.ts rename apps/sim/lib/{telemetry/tracer.ts => core/telemetry.ts} (100%) rename apps/sim/lib/{ => core}/utils.test.ts (96%) rename apps/sim/lib/{ => core/utils}/browser-storage.ts (100%) create mode 100644 apps/sim/lib/core/utils/cn.ts create mode 100644 apps/sim/lib/core/utils/display-filters.ts create mode 100644 apps/sim/lib/core/utils/formatting.ts create mode 100644 apps/sim/lib/core/utils/optimistic-update.ts create mode 100644 apps/sim/lib/core/utils/request.ts rename apps/sim/lib/{ => core/utils}/response-format.ts (100%) create mode 100644 apps/sim/lib/core/utils/scheduling.ts create mode 100644 apps/sim/lib/core/utils/sse.ts rename apps/sim/lib/{theme-sync.ts => core/utils/theme.ts} (100%) rename apps/sim/lib/{urls/utils.ts => core/utils/urls.ts} (94%) create mode 100644 apps/sim/lib/core/utils/validation.ts rename apps/sim/lib/knowledge/{consts.ts => constants.ts} (100%) rename apps/sim/lib/{embeddings/utils.ts => knowledge/embeddings.ts} (99%) rename apps/sim/lib/{ => messaging}/email/mailer.test.ts (98%) rename apps/sim/lib/{ => messaging}/email/mailer.ts (98%) rename apps/sim/lib/{ => messaging}/email/unsubscribe.test.ts (96%) rename apps/sim/lib/{ => messaging}/email/unsubscribe.ts (98%) rename apps/sim/lib/{ => messaging}/email/utils.test.ts (87%) rename apps/sim/lib/{ => messaging}/email/utils.ts (76%) rename apps/sim/lib/{ => messaging}/email/validation.test.ts (97%) rename apps/sim/lib/{ => messaging}/email/validation.ts (100%) rename apps/sim/lib/{ => messaging}/sms/service.ts (99%) delete mode 100644 apps/sim/lib/organization/utils.ts delete mode 100644 apps/sim/lib/sim-agent/index.ts rename apps/sim/lib/uploads/contexts/execution/{execution-file-helpers.ts => utils.ts} (100%) delete mode 100644 apps/sim/lib/utils.ts rename apps/sim/lib/webhooks/{webhook-helpers.ts => provider-subscriptions.ts} (99%) rename apps/sim/lib/{ => workflows}/blocks/block-dimensions.ts (100%) rename apps/sim/lib/workflows/{ => blocks}/block-outputs.ts (98%) rename apps/sim/lib/{ => workflows/blocks}/block-path-calculator.ts (100%) rename apps/sim/lib/workflows/{ => credentials}/credential-extractor.ts (100%) rename apps/sim/lib/workflows/{ => credentials}/credential-resolver.ts (100%) rename apps/sim/lib/{ => workflows}/custom-tools/operations.ts (97%) rename apps/sim/lib/workflows/{ => operations}/deployment-utils.ts (99%) rename apps/sim/lib/workflows/{ => operations}/import-export.ts (98%) rename apps/sim/lib/workflows/{ => operations}/socket-operations.ts (97%) rename apps/sim/lib/workflows/{ => persistence}/custom-tools-persistence.ts (98%) rename apps/sim/lib/workflows/{ => persistence}/duplicate.ts (99%) rename apps/sim/lib/workflows/{db-helpers.test.ts => persistence/utils.test.ts} (99%) rename apps/sim/lib/workflows/{db-helpers.ts => persistence/utils.ts} (99%) rename apps/sim/lib/workflows/{ => sanitization}/json-sanitizer.ts (99%) rename apps/sim/lib/workflows/{ => sanitization}/references.test.ts (92%) rename apps/sim/lib/workflows/{ => sanitization}/references.ts (100%) rename apps/sim/lib/workflows/{ => sanitization}/validation.ts (100%) rename apps/sim/lib/{ => workflows}/schedules/utils.test.ts (99%) rename apps/sim/lib/{ => workflows}/schedules/utils.ts (99%) rename apps/sim/lib/workflows/{ => streaming}/streaming.ts (98%) rename apps/sim/lib/workflows/{ => triggers}/execution-events.ts (100%) rename apps/sim/lib/workflows/{ => triggers}/trigger-utils.ts (99%) rename apps/sim/lib/workflows/{ => triggers}/triggers.ts (100%) rename apps/sim/lib/{ => workflows}/variables/variable-manager.test.ts (99%) rename apps/sim/lib/{ => workflows}/variables/variable-manager.ts (100%) rename apps/sim/lib/{ => workspaces}/organization/index.ts (65%) rename apps/sim/lib/{ => workspaces}/organization/types.ts (100%) rename apps/sim/lib/{organization/helpers.ts => workspaces/organization/utils.ts} (61%) rename apps/sim/lib/{ => workspaces}/permissions/utils.test.ts (99%) rename apps/sim/lib/{ => workspaces}/permissions/utils.ts (100%) rename apps/sim/lib/{collaboration => workspaces}/presence-colors.ts (100%) diff --git a/apps/sim/app/(auth)/components/auth-background.tsx b/apps/sim/app/(auth)/components/auth-background.tsx index ec12774a19c..a06ec0cdbf3 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 43766112bbd..5651e1d5ec8 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 19d2a8cb5ca..541c242a12d 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 eeaa650a7df..395a8d45417 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 37a948f4f97..bb3d22d1f6f 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 5c8a30e842f..7f5b8647d59 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 6e0734a1f9b..f8878e8aa8b 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 c908d006a97..654676f0e66 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 ba8b82d0222..18ff14f9053 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 497a4d8c270..ae699134e62 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 c841e42c35d..0c9eeca10d0 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 af88eb4289a..fd30e960f33 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 d622f4257d8..7259205bc8e 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 f5316152644..78318e7d7cb 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 03920259f51..5fae578aecf 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 46af1c5173f..d3ce55cc3da 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 c925147e6fd..7c94b011e31 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 012f5b6de72..2b26ba9e47a 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 d817fd60f53..f75599d20bd 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 721cd5dd7f6..1725c2b1646 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 1586afcb983..7f6a0ee7d6b 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 47ffd72d1bc..9b56a567ee2 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 01261cbeba9..6e7ae038ebf 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 19d881516aa..70fe344bd0b 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 781b122f146..8b85d79dc5d 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 0a824ebcbf9..8ec7c859931 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 21f02d9de8b..6f5f40de810 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 265e86f4808..39f3b8648bd 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 c6400477ce0..4bb6de84ce9 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 020fec07c29..a5fe8788758 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 f70955b5fbc..b89aff1aa95 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 8cead83d0fc..4337033779b 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 eea0ebff831..83ba588ba25 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 0e8c18815c0..ccda1314b1f 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 5172db53f62..d3c05f91371 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 e1732b9ffe5..2aa76dc8ad6 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 11ba70af08b..7bebff65915 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 959a83cd7f4..c68b24e6691 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 75c7979a293..c22a21cdbb7 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 bf0d492e056..5ed4b418ce1 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 8ba425972d5..37412a55f90 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 c7cc5754e46..7e119786b32 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 cac8f60dff4..60a4c0ae789 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 e5fe704ad54..7c1c3ff9fbb 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 5048030782e..c624582e978 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 567d02c2f11..7156c80c724 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 ea0153fdebb..a2476424ced 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 bc7bca71a23..9faa65b1ead 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 88c2062f32d..1e41f920120 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 081f345b50c..2971babf496 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 3de2b0feb04..9e61ba281e2 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 80b30dabf5f..c680890bd84 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 d20145e097a..8981c5dd241 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 f58e2f7a53a..bc17ddad527 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 49301e8db12..e51d3fb5971 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 6d2d3e89b72..97254139858 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 a6a7f299985..e47f2f6d114 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 55722b430e6..5110ae12f94 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 75db10f4dfe..6fc1bfa7e82 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 a58426f8520..fed0ad3dff3 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 fdac63b8361..edb2b31c59d 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 333e5bed432..c4bdbf4d8cb 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 a71e293f890..86a95a9fc0f 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 643900c32c6..ea52c1c58b9 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 601a652d0a1..93bfef7d2d4 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 cb5919af418..7d735427df8 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 278132e48cc..aed162af6aa 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 886f5b7ddf2..c55b915cbf0 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 9e29bbdfe57..2bb13115bd5 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 13c6d34f184..96548e83e32 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 c26c1dbfd65..6425305f3b0 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 d40635b7f1c..6083a92c747 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 0d2642965a4..38de9b4021e 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 b1c5d5cc3e5..a81560ea41c 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 c2f629fa4ed..89d911e89df 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 eff6180644a..914485a3b63 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 9fdd18cd409..5b5f3c8c28e 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 faa15aaa796..8c42b965699 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 6f59c4a888e..d7da4f779c1 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 7e11b178235..050d8524d70 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 0d8345632ca..a8aff5f9fbc 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 8a0f7058a04..5a6e5d87191 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 83c27eb1395..93be5e8b474 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 ad90a3230c9..27a9d03afad 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 bf5fd3ed931..faa4f174393 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 9a9b50636b6..659328ddaf2 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 4bd4307d145..66f15071c31 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 18bb9988f5f..5403857e488 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 4c93d1dd294..6229650101e 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 bce2006b32d..6e006d1a819 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 41762ab6215..6e45c64d133 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 31ad4936001..d79520f2ed4 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 50c3c3a7f0c..3195988f08b 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 645ecd040ce..1bd86c40a4c 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 c95a07fceb2..1834873f52e 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 365623e87cf..b25b07fb271 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 3e4112f73b0..7ac7c4f4afe 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 29ec910b254..d1fc0d867d1 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 015197597a0..82e8deb09d6 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 bbc4eb44610..7f55cfd373c 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 3d7e532825c..5f187515db8 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 f5562049ac3..ace20752aa2 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 8e30ef80225..370ddac5813 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 63845865fc8..48205811d4a 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 4408ad3d073..73b31024f0a 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 3b7c6214277..065ee646611 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 1506a891641..5a61a277a59 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 43e69e48137..9b54abf6070 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 8812b3673fc..c107b42a819 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 767d8a4eefd..16a448028bf 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 ba98cfa9a25..6b95f67e9fa 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 71c4dd04a2a..843ea9fa67e 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 c4f0b91e66a..70d1fd81d31 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 efe50d029cf..96e59273bb6 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 ee92b9acd0c..f3db903461f 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 1f090d36d6e..84c8c05b0f1 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 dadfe50f502..9937a513a3c 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 fe3bf433f19..01f75fdba93 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 71855197566..8fcdfe59d81 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 abf50d91556..cd500051787 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 3f3d3d7b29b..59c7533b6ea 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 5f43cde8b61..43d5367a2b7 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 8fe872c0b56..4368ab192e6 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 cc5a510acd2..650eb0017bf 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 011297ddb0f..65c0ad30c11 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 f4fce257f71..e0e9d48ea85 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 d2fc0c43c9b..f711d3d0c21 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 0f36e1dc1ae..cce2fd08a16 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 db29efa54b8..8d9cea574e0 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 22821fc53e9..e2801c66d5e 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 9bcf55e3199..26fd3a9b4a4 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 4047e9f3daa..d32572611bf 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 7615f145b86..d8ddb6a97fa 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 6d805d0127d..ee4df30e9e4 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 2bc422a5f4d..fa9bf681f2c 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 956b64bdffe..70bd00f1b42 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 32e132d4748..5e93e93c4b6 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 816ac5ede76..8122986e9e5 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 bec2f71bb99..c6e7d8cb62f 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 4aac2bc9fbe..2eca4d7c782 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 798bb7858ec..bfaa2e82a2a 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 40f4981ae36..869c3b988de 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 d3a34187d70..94fd963af45 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 66245e588f9..b9717e73d37 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 8dd0942f47a..f049b867223 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 5b438a9292e..6ab71167a5d 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 5d18cdcb213..d9fdceb0eb9 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 30bd72ffbb4..67fed46f71d 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 fb8b3cd90ce..1c522898c6b 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 81f6d46c64f..75bf8b324d5 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 064f2697f29..028257e975d 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 60cdd1e4d1d..5894171a242 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 933d56dbc53..0bb32c5148d 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 643860d2fc9..25eed7c5c0d 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 5751134b04f..205149a7dfb 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 9588a5a88cc..c7fa8c75610 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 02e116288ef..edc1e77f1e5 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 74481fefde2..a142821b143 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 2cfb8c6de03..d4ddcdefb86 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 79af4ff363d..2f62d211eda 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 7d853ee32be..ce3779c9d61 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 eda64213c59..90f849b0d06 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 2da053cfe2d..c7042034c34 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 70a62c7952c..e4c8aab4bdc 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 1ef8926ea37..3525869567d 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 7c3d1f0818a..17aca8e7fcc 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 57a8369badf..358768fe3e2 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 8978e79823d..928d44c361a 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 eda82deeb46..d9c3dc9ecc8 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 4e0768657ec..28bf5b879ce 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 9fdafa9bd51..2e92521db4d 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 ffc31e780d8..13acfd3b251 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 60ba1a13656..5e2f8e64363 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 99f58d67ffe..68368596cc0 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 6f7b856cafa..9551cde78dd 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 8601f09149f..1a924faa236 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 90683a9892d..48b90da5e25 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 72523399d52..51863961d99 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 c4a1c084348..cf1e36ce208 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 05fe843bf1c..ede1dc9a645 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 0cc35c1025d..4dc45135350 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 82f90022b2f..69b075399fb 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 4f62a055344..44f91f1e8fc 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 1ce0fc88bb7..a3f703b30e9 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 526af5b853b..635f48f9174 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 2f15da76ee6..d3cd52c582c 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 503c1fbf685..7f93d0e3fd8 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 1f4a0f9f49a..43875ce2a5d 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 b805e6d4e36..b4435931b5d 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 495a49bde0e..7e47dafb021 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 b3ca22a1aac..16ed64c02b5 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 78d75e494d7..90e4de55ebe 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 8186e277465..1873249d7a2 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 c4921f2dfd7..7b52941b524 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 f5bb6333595..5cdbc56f760 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 73248161a19..59293f535bf 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 2c94f6d6898..4c96284be0f 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 8b9879115d6..1a3566a020b 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 d4c93185ed0..2d773fe30b8 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 ad03c937c3b..3d84b9a23a6 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 f3a748e2b9e..fb7815da858 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 803ba2c8203..ffa8d74b614 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 da9409098fc..00a4c7633ed 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 00de3e2430e..f6fba4a9062 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 6f171b495be..be572492b94 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 eb1c202f236..02116bec525 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 a9f3b5f34cb..9a82b6e5a7b 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 7eaab100eec..c40b6d34c0b 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 e7fc14d7d50..d16a1c57c12 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 49c4eb9b136..d20b27b3284 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 96d9b2e5e19..fc1ef7e7eab 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 b7a07e636c9..0ebdd9896c0 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 fc01b6a1653..968b110785f 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 02fd5fff75c..97e41ff3ebe 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 e05d3f4146c..ded0b5dc85b 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 57ecac5baf4..12c423fcd50 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 579cd908715..b8b7a514dd3 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 9557c988d50..cc399434346 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 cbd093092ec..fb5ea90e8df 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 364ad230c1e..7f6ebe1489c 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 6a543f9bf0a..1e93894631c 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 99611f1eedc..348802f529a 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 88cb8442c46..48f0dd7820f 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 cf3e1734a72..286472f25ef 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 b844dc8d612..066c6b3cae3 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 de9a5f5543e..0b6be60936f 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 c6fc45412df..d3b97ba3065 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 dbe01b8786e..6ccde73c8b3 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 53b8d0c8202..b1ddfc49824 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 d4dda3b5c39..68f37a27927 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 3de2e19b1b6..021dc670bdd 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 cbed4a68a8c..6b9002bc491 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 26cd3bb882d..b7ec7bafbe2 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 57ca10e708a..a08c82fb720 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 6bd8ccbc4c3..21b3758a7bd 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 e3a4e232304..58a291ea267 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 b3afeeaa040..735b481e620 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 ceb51049d8a..4961ec65d09 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 01c0e0705b6..a3153290ca6 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 65783c9ff3d..3206798d700 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 cfa5c182e53..a74c015ffbb 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 20eacd7367f..8e1bfe64976 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 0ac192b6a5e..ada7b7c5be7 100644 --- a/apps/sim/app/api/workflows/[id]/execute/route.ts +++ b/apps/sim/app/api/workflows/[id]/execute/route.ts @@ -2,19 +2,20 @@ 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 { generateRequestId } from '@/lib/core/utils/request' +import { SSE_HEADERS } from '@/lib/core/utils/sse' 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 ExecutionMetadata, ExecutionSnapshot } from '@/executor/execution/snapshot' import type { StreamingExecution } from '@/executor/types' 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 db2100fda17..a957f62c900 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 5287effc7b5..51f5bfbbd7e 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 fdd9be09d9d..44d93521c00 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 66936a35054..8b65b7012df 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 c03d50baaff..f2412f32e4a 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 1b51895c467..8cf89b337ab 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 9003f798124..0d85044b2bb 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 21b759c7d60..b25b21a6e8d 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 c4befb40fa1..88f80ce05d5 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 f23510ba197..5c1b9418657 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 b94c849b450..74b2d6d8633 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 d89af62d51d..6b78495c554 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 10478bcfdaa..348bedcb1e8 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 a601a1eb2f5..899585dfad9 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 284da1bf6e7..4292e82d4d8 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 bca567aa50c..34f99092956 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 f6e82a658c7..11d94cb0fd4 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 0dbd33803cf..1354bec588d 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 6ea1478ae22..8328cf19e13 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 59601f9e1e6..f3719ab874d 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 7b0d409402f..cf00bd1dd45 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 6c971246f92..75270810088 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 72b754dd316..4c2e0dae3e6 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 83e55a3606e..51619157919 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 1213c622a0a..4616cf54bca 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 d9d2adead46..986a3efeefa 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 d27221b5474..96370bf63d9 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 99b89f2b735..62cfff3d973 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 e9816320c24..b835d893367 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 dacadd8ce35..b052d604958 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 02855a4b6bb..33618138547 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 d0524e8ef2d..fe63fbf18f9 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 d8161e5b33a..63281b454e7 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 5820ceefcb3..e132e9562b5 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 80da21f5d88..fca79215f72 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 96c2300a10f..a4f2ad095e4 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 f82b7fa2183..8283acd40e2 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 1a6df40d401..74c2236e6bb 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 cd06767a9b7..1f4d4e8a72d 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 881141e6af7..2f3ff23f15f 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 1731cc97f1d..67b8bf71d9b 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' diff --git a/apps/sim/app/templates/templates.tsx b/apps/sim/app/templates/templates.tsx index 75b4e5905a5..d6e23222cf3 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 efca6929afe..74c0c5b5e96 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 a784bf23e12..4026f93fc2f 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 a27a42d6c1f..847c6daa4b5 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 adfdb2956c6..a104c287b15 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 57962e59f5e..7456240e0be 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 eb7c302b7ba..1904f5d92be 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 eb74bdc68b5..5551c2f37bc 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 c35c5135d11..40c1db6c9d4 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 312de84b723..05220d130e9 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 25b37bcf558..21a5fe77f2b 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 83151c99a3a..070dae34f92 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 fd444d48239..59ccd4d54d3 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 2a339dad87b..3342f57f63c 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 0738cd61532..b8ef9d1a80e 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 4187e216f30..705d8993b17 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 f3a6271f101..82d87bc008c 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 c8ce068b904..d0f0bead47a 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' 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 35c9dd7e2aa..ae4e71ae276 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 cceeb251452..239ee18963d 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 3df6b2f7c2f..22ccc5b9ae9 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 49b76fed27d..a7c46d8a0ae 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 7e134e39002..9e5e870f3e8 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 270775c3864..c43ae69edce 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 b9031f9bbe8..23f016823f1 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 a5a173db629..26a7e417b1d 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 03f1c6e4eb5..c6cc61ad294 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 3e203a50851..2176d22e3e6 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 783a938aa5c..be11cba04da 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 1bd5d72c26b..f5080afef4c 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 1ed663db4cd..11547a25538 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 9251bbfccbb..2a5e733305a 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 b9e0c09df4c..2d68a5d747b 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 36e2b50d1dc..c35910e2350 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 464c1dfe634..d6989bb879a 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 4a361022c19..1f8404097e4 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 76e5e8ebd2f..893f2e56e0e 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 e9d00ebd42d..36164f6b67c 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 b18ca98c58a..3336dadf805 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 df1ea3712d3..cc277f65329 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' 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 b44f7ccc215..c215ae64476 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 21b3892423a..e98c3a880bd 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 f6b7d2a35a4..52fa2d9b214 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 344867905d9..32a6dd33c46 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 7affdd17dd1..4b2e9be22c3 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 6ce3443f39d..06820c35ee0 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/input-mapping/input-mapping.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx index 94ee8070680..ed5a437b917 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/input-mapping/input-mapping.tsx @@ -2,7 +2,7 @@ import { useEffect, useMemo, useRef, useState } from 'react' import { Badge } from '@/components/emcn' import { Input } from '@/components/emcn/components/input/input' 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/long-input/long-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx index 1ae3e3590b2..6e6112c4ba0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/long-input/long-input.tsx @@ -10,8 +10,8 @@ import { import { ChevronsUpDown, Wand2 } from 'lucide-react' import { Textarea } from '@/components/emcn' 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 { 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 { 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/mcp-dynamic-args/mcp-dynamic-args.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx index fd5e8209a07..4b71c5fd679 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/mcp-dynamic-args/mcp-dynamic-args.tsx @@ -3,8 +3,8 @@ import { useParams } from 'next/navigation' import { Combobox, Input, Label, Textarea } from '@/components/emcn/components' import { Slider } from '@/components/ui/slider' import { Switch } from '@/components/ui/switch' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { formatDisplayText } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/formatted-text' import { checkTagTrigger, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx index 67ca40be54f..33a4d64cb0b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/messages-input/messages-input.tsx @@ -2,7 +2,7 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { ChevronDown, ChevronsUpDown, ChevronUp, Plus } from 'lucide-react' import { Button, Popover, PopoverContent, PopoverItem, PopoverTrigger } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { EnvVarDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown' 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' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/schedule-save/schedule-save.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/schedule-save/schedule-save.tsx index dc0e26a765f..2d18d2e9c2e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/schedule-save/schedule-save.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/schedule-save/schedule-save.tsx @@ -11,9 +11,9 @@ import { } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Alert, AlertDescription } from '@/components/ui/alert' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { parseCronToHumanReadable } from '@/lib/schedules/utils' -import { cn } from '@/lib/utils' +import { parseCronToHumanReadable } from '@/lib/workflows/schedules/utils' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useScheduleManagement } from '@/hooks/use-schedule-management' import { useSubBlockStore } from '@/stores/workflows/subblock/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/short-input/short-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/short-input/short-input.tsx index f917cc0eeaa..0a2f6ad988f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/short-input/short-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/short-input/short-input.tsx @@ -3,7 +3,7 @@ import { Check, Copy, Wand2 } from 'lucide-react' import { useReactFlow } from 'reactflow' import { Input } from '@/components/emcn/components/input/input' import { Button } from '@/components/ui/button' -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' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx index 3420d6a62b3..8d6524e48a9 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/starter/input-format.tsx @@ -13,7 +13,7 @@ import { } from '@/components/emcn/components/code/code' import type { ComboboxOption } from '@/components/emcn/components/combobox/combobox' 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/table/table.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx index a5e3ff5a636..ad3595f7c69 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/table/table.tsx @@ -3,8 +3,8 @@ import { useParams } from 'next/navigation' import { Button } from '@/components/emcn/components/button/button' import { Trash } from '@/components/emcn/icons/trash' import { Input } from '@/components/ui/input' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { EnvVarDropdown } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/env-var-dropdown' 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' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown.tsx index 8130beef1c2..b72c66d1f6c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown.tsx @@ -11,11 +11,14 @@ import { PopoverSection, usePopoverContext, } from '@/components/emcn' +import { cn } from '@/lib/core/utils/cn' +import { + extractFieldsFromSchema, + parseResponseFormatSafely, +} from '@/lib/core/utils/response-format' import { createLogger } from '@/lib/logs/console/logger' -import { extractFieldsFromSchema, parseResponseFormatSafely } from '@/lib/response-format' -import { cn } from '@/lib/utils' -import { getBlockOutputPaths, getBlockOutputType } from '@/lib/workflows/block-outputs' -import { TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { getBlockOutputPaths, getBlockOutputType } from '@/lib/workflows/blocks/block-outputs' +import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers' import { KeyboardNavigationHandler } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/components/keyboard-navigation-handler' import type { BlockTagGroup, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/time-input/time-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/time-input/time-input.tsx index 764f189d23a..ef018e66324 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/time-input/time-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/time-input/time-input.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import { Button, Input, Popover, PopoverContent, PopoverTrigger } from '@/components/emcn' -import { cn } from '@/lib/utils' +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 TimeInputProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/code-editor/code-editor.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/code-editor/code-editor.tsx index d6e4e771f9a..2c68e264f89 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/code-editor/code-editor.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/code-editor/code-editor.tsx @@ -12,7 +12,7 @@ import { languages, } from '@/components/emcn/components/code/code' import { Button } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface CodeEditorProps { value: string diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx index 0c80099fa91..fbdde60322a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/custom-tool-modal/custom-tool-modal.tsx @@ -27,8 +27,8 @@ import { DialogTitle, } from '@/components/ui/dialog' 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 { checkEnvVarTrigger, EnvVarDropdown, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tool-command/tool-command.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tool-command/tool-command.tsx index 585402cdde3..08d223219f4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tool-command/tool-command.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tool-command/tool-command.tsx @@ -7,7 +7,7 @@ import React, { useMemo, useState, } from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' type CommandContextType = { searchQuery: string diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx index 5be254f93e1..8f97804302b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx @@ -15,6 +15,7 @@ import { } from '@/components/emcn' import { Switch } from '@/components/ui/switch' import { Toggle } from '@/components/ui/toggle' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import { getCanonicalScopesForProvider, @@ -22,7 +23,6 @@ import { type OAuthProvider, type OAuthService, } from '@/lib/oauth/oauth' -import { cn } from '@/lib/utils' import { ChannelSelectorInput, CheckboxList, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/trigger-save/trigger-save.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/trigger-save/trigger-save.tsx index 8c5fbbf7fd2..6991ee6213b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/trigger-save/trigger-save.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/trigger-save/trigger-save.tsx @@ -9,8 +9,8 @@ import { } from '@/components/emcn/components' import { Trash } from '@/components/emcn/icons/trash' import { Alert, AlertDescription } from '@/components/ui/alert' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useTriggerConfigAggregation } from '@/hooks/use-trigger-config-aggregation' import { useWebhookManagement } from '@/hooks/use-webhook-management' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx index 48e07c76dbf..a905da653e3 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/variables-input/variables-input.tsx @@ -5,7 +5,7 @@ import { Badge, Button, Combobox, Input } from '@/components/emcn' import { Trash } from '@/components/emcn/icons/trash' import { Label } from '@/components/ui/label' import { Textarea } from '@/components/ui/textarea' -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 { checkTagTrigger, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx index 7a9f6222301..33e497d96ed 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/sub-block.tsx @@ -2,7 +2,7 @@ import { type JSX, type MouseEvent, memo, useRef, useState } from 'react' import { AlertTriangle, Wand2 } from 'lucide-react' import { Label, Tooltip } from '@/components/emcn/components' import { Button } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import type { FieldDiffStatus } from '@/lib/workflows/diff/types' import { ChannelSelectorInput, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections.ts index eb3bcfdeb90..5f1d854ebec 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-block-connections.ts @@ -1,7 +1,10 @@ import { useShallow } from 'zustand/react/shallow' -import { BlockPathCalculator } from '@/lib/block-path-calculator' -import { extractFieldsFromSchema, parseResponseFormatSafely } from '@/lib/response-format' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' +import { + extractFieldsFromSchema, + parseResponseFormatSafely, +} from '@/lib/core/utils/response-format' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' import { useSubBlockStore } from '@/stores/workflows/subblock/store' import { useWorkflowStore } from '@/stores/workflows/workflow/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-editor-subblock-layout.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-editor-subblock-layout.ts index d0c9d860148..d41139bb952 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-editor-subblock-layout.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-editor-subblock-layout.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import type { BlockConfig, SubBlockConfig, SubBlockType } from '@/blocks/types' import { useWorkflowDiffStore } from '@/stores/workflow-diff' import { mergeSubblockState } from '@/stores/workflows/utils' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-subflow-editor.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-subflow-editor.ts index cecc220ffaa..85bf822007b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-subflow-editor.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/hooks/use-subflow-editor.ts @@ -4,7 +4,7 @@ import { isLikelyReferenceSegment, SYSTEM_REFERENCE_PREFIXES, splitReferenceSegment, -} from '@/lib/workflows/references' +} from '@/lib/workflows/sanitization/references' import { checkTagTrigger } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tag-dropdown/tag-dropdown' import { useAccessibleReferencePrefixes } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes' import { createEnvVarPattern, createReferencePattern } from '@/executor/utils/reference-validation' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/toolbar.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/toolbar.tsx index cb01d75f8eb..ba06408056f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/toolbar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/toolbar/toolbar.tsx @@ -16,7 +16,7 @@ import { getBlocksForSidebar, getTriggersForSidebar, hasTriggerCapability, -} from '@/lib/workflows/trigger-utils' +} from '@/lib/workflows/triggers/trigger-utils' import { calculateTriggerHeights, useToolbarItemInteractions, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/workflow-controls/workflow-controls.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/workflow-controls/workflow-controls.tsx index 88d5c5bc41c..d5c05894f2d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/workflow-controls/workflow-controls.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/workflow-controls/workflow-controls.tsx @@ -6,7 +6,7 @@ import { useStore } from 'reactflow' import { Button, Redo, Undo } from '@/components/emcn' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useUndoRedoStore } from '@/stores/undo-redo' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx index de23983551a..3df3d38a364 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node.tsx @@ -2,7 +2,7 @@ import { memo, useMemo, useRef } from 'react' import { RepeatIcon, SplitIcon } from 'lucide-react' import { Handle, type NodeProps, Position, useReactFlow } from 'reactflow' import { Button, Trash } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { type DiffStatus, hasDiffStatus } from '@/lib/workflows/diff/types' import { useCurrentWorkflow } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-controls.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-controls.tsx index c9e98a9d0bc..4136b93590d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-controls.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-controls.tsx @@ -1,7 +1,7 @@ 'use client' import { useEffect, useState } from 'react' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { TrainingFloatingButton } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button' import { TrainingModal } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal' import { useCopilotTrainingStore } from '@/stores/copilot-training/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button.tsx index 0cc54a95a1a..f555eb60e19 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-floating-button.tsx @@ -3,7 +3,7 @@ import { Database, Pause } 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 { useCopilotTrainingStore } from '@/stores/copilot-training/store' interface TrainingFloatingButtonProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal.tsx index e18bb69c9a2..1327d7d1c55 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/training-controls/training-modal.tsx @@ -27,9 +27,9 @@ import { Label } from '@/components/ui/label' import { ScrollArea } from '@/components/ui/scroll-area' import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' import { Textarea } from '@/components/ui/textarea' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { formatEditSequence } from '@/lib/workflows/training/compute-edit-sequence' import { useCurrentWorkflow } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-current-workflow' import { useCopilotTrainingStore } from '@/stores/copilot-training/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/variables/variables.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/variables/variables.tsx index 4dfc5129bfc..bbd33012bdc 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/variables/variables.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/variables/variables.tsx @@ -17,7 +17,8 @@ import { } from '@/components/emcn' import { Label } from '@/components/emcn/components/label/label' import { Trash } from '@/components/emcn/icons/trash' -import { cn, validateName } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { validateName } from '@/lib/core/utils/validation' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useVariablesStore as usePanelVariablesStore } from '@/stores/panel/variables/store' import { getVariablesPosition, useVariablesStore } from '@/stores/variables/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/wand-prompt-bar/wand-prompt-bar.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/wand-prompt-bar/wand-prompt-bar.tsx index 16c3fc9288b..a15022ea524 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/wand-prompt-bar/wand-prompt-bar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/wand-prompt-bar/wand-prompt-bar.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from 'react' import { SendIcon, XIcon } from 'lucide-react' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface WandPromptBarProps { isVisible: boolean diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/webhook-settings/webhook-settings.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/webhook-settings/webhook-settings.tsx index 81c44cfd635..89dec614064 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/webhook-settings/webhook-settings.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/webhook-settings/webhook-settings.tsx @@ -35,8 +35,9 @@ import { Skeleton, Switch, } from '@/components/ui' +import { generatePassword } from '@/lib/core/security/encryption' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn, generatePassword } from '@/lib/utils' import type { LogLevel as StoreLogLevel, TriggerType as StoreTriggerType, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/action-bar/action-bar.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/action-bar/action-bar.tsx index c7cb27ccf6a..7452dd4ef6d 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/action-bar/action-bar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/components/action-bar/action-bar.tsx @@ -1,7 +1,7 @@ import { memo, useCallback } from 'react' import { ArrowLeftRight, ArrowUpDown, Circle, CircleOff, LogOut } from 'lucide-react' import { Button, Duplicate, Tooltip, Trash2 } from '@/components/emcn' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow' import { useWorkflowStore } from '@/stores/workflows/workflow/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/hooks/use-schedule-info.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/hooks/use-schedule-info.ts index 8a61fd9ceb6..459dbffd0db 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/hooks/use-schedule-info.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/hooks/use-schedule-info.ts @@ -1,6 +1,6 @@ import { useCallback, useEffect, useState } from 'react' import { createLogger } from '@/lib/logs/console/logger' -import { parseCronToHumanReadable } from '@/lib/schedules/utils' +import { parseCronToHumanReadable } from '@/lib/workflows/schedules/utils' import type { ScheduleInfo } from '../types' const logger = createLogger('useScheduleInfo') diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx index 5a3e43ca813..1d7eb9963da 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block.tsx @@ -3,11 +3,11 @@ import { useParams } from 'next/navigation' import { Handle, type NodeProps, Position, useUpdateNodeInternals } from 'reactflow' import { Badge } from '@/components/emcn/components/badge/badge' import { Tooltip } from '@/components/emcn/components/tooltip/tooltip' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import { createMcpToolId } from '@/lib/mcp/utils' import { getProviderIdFromServiceId } from '@/lib/oauth' -import { cn } from '@/lib/utils' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { ActionBar, diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes.ts index c51ea06ac12..313df16c6d4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-accessible-reference-prefixes.ts @@ -1,7 +1,7 @@ import { useMemo } from 'react' import { useShallow } from 'zustand/react/shallow' -import { BlockPathCalculator } from '@/lib/block-path-calculator' -import { SYSTEM_REFERENCE_PREFIXES } from '@/lib/workflows/references' +import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator' +import { SYSTEM_REFERENCE_PREFIXES } from '@/lib/workflows/sanitization/references' import { normalizeBlockName } from '@/stores/workflows/utils' import { useWorkflowStore } from '@/stores/workflows/workflow/store' import type { Loop, Parallel } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-connections.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-connections.ts index a0bdf640473..5671a4caa96 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-connections.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-connections.ts @@ -1,8 +1,8 @@ import { useShallow } from 'zustand/react/shallow' -import { BlockPathCalculator } from '@/lib/block-path-calculator' import { createLogger } from '@/lib/logs/console/logger' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' -import { TriggerUtils } from '@/lib/workflows/triggers' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' import { useSubBlockStore } from '@/stores/workflows/subblock/store' import { useWorkflowStore } from '@/stores/workflows/workflow/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-dimensions.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-dimensions.ts index d8857c37d8e..e6167df3e99 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-dimensions.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-dimensions.ts @@ -3,7 +3,7 @@ import { useUpdateNodeInternals } from 'reactflow' import { useWorkflowStore } from '@/stores/workflows/workflow/store' // Re-export for backwards compatibility -export { BLOCK_DIMENSIONS } from '@/lib/blocks/block-dimensions' +export { BLOCK_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' interface BlockDimensions { width: number diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-output-fields.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-output-fields.ts index 622fed70ef0..321e507ec0a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-output-fields.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-block-output-fields.ts @@ -1,9 +1,9 @@ 'use client' import { useMemo } from 'react' -import { extractFieldsFromSchema } from '@/lib/response-format' -import { getBlockOutputPaths, getBlockOutputs } from '@/lib/workflows/block-outputs' -import { TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { extractFieldsFromSchema } from '@/lib/core/utils/response-format' +import { getBlockOutputPaths, getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers' import type { SchemaField } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/connection-blocks/components/field-item/field-item' import { getBlock } from '@/blocks' import type { BlockConfig } from '@/blocks/types' diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-node-utilities.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-node-utilities.ts index 07ce2736c93..78f00863930 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-node-utilities.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-node-utilities.ts @@ -1,7 +1,7 @@ import { useCallback } from 'react' import { useReactFlow } from 'reactflow' -import { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' import { createLogger } from '@/lib/logs/console/logger' +import { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' const logger = createLogger('NodeUtilities') diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts index 574cd0b6573..042be27bf45 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-workflow-execution.ts @@ -8,8 +8,12 @@ import { extractTriggerMockPayload, selectBestTrigger, triggerNeedsMockPayload, -} from '@/lib/workflows/trigger-utils' -import { resolveStartCandidates, StartBlockPath, TriggerUtils } from '@/lib/workflows/triggers' +} from '@/lib/workflows/triggers/trigger-utils' +import { + resolveStartCandidates, + StartBlockPath, + TriggerUtils, +} from '@/lib/workflows/triggers/triggers' import { useCurrentWorkflow } from '@/app/workspace/[workspaceId]/w/[workflowId]/hooks/use-current-workflow' import type { BlockLog, ExecutionResult, StreamingExecution } from '@/executor/types' import { subscriptionKeys } from '@/hooks/queries/subscription' @@ -309,7 +313,7 @@ export function useWorkflowExecution() { if (isChatExecution) { const stream = new ReadableStream({ async start(controller) { - const { encodeSSE } = await import('@/lib/utils') + const { encodeSSE } = await import('@/lib/core/utils/sse') const executionId = uuidv4() const streamedContent = new Map() const streamReadingPromises: Promise[] = [] @@ -458,7 +462,7 @@ export function useWorkflowExecution() { if (!selectedOutputs?.length) return const { extractBlockIdFromOutputId, extractPathFromOutputId, traverseObjectPath } = - await import('@/lib/response-format') + await import('@/lib/core/utils/response-format') // Check if this block's output is selected const matchingOutputs = selectedOutputs.filter( @@ -564,7 +568,7 @@ export function useWorkflowExecution() { queryClient.invalidateQueries({ queryKey: subscriptionKeys.user() }) queryClient.invalidateQueries({ queryKey: subscriptionKeys.usage() }) - const { encodeSSE } = await import('@/lib/utils') + const { encodeSSE } = await import('@/lib/core/utils/sse') controller.enqueue(encodeSSE({ event: 'final', data: result })) // Note: Logs are already persisted server-side via execution-core.ts } @@ -583,7 +587,7 @@ export function useWorkflowExecution() { } // Send the error as final event so downstream handlers can treat it uniformly - const { encodeSSE } = await import('@/lib/utils') + const { encodeSSE } = await import('@/lib/core/utils/sse') controller.enqueue(encodeSSE({ event: 'final', data: errorResult })) // Do not error the controller to allow consumers to process the final event diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts index b3b7ab814ce..8b6cc5f1f44 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/utils/block-ring-utils.ts @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export type BlockDiffStatus = 'new' | 'edited' | null | undefined diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx index b9d335d88d7..13fc26e11e9 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/workflow.tsx @@ -12,7 +12,7 @@ import ReactFlow, { } from 'reactflow' import 'reactflow/dist/style.css' import { createLogger } from '@/lib/logs/console/logger' -import { TriggerUtils } from '@/lib/workflows/triggers' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { CommandList, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx index 172e1b50097..e29dcc4022a 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/help-modal/help-modal.tsx @@ -17,8 +17,8 @@ import { Textarea, } from '@/components/emcn' 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' const logger = createLogger('HelpModal') diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-modal.tsx index 6129da68fc3..22b41815892 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-modal.tsx @@ -7,8 +7,8 @@ import { BookOpen, Layout, RepeatIcon, ScrollText, Search, SplitIcon } from 'luc import { useParams, useRouter } from 'next/navigation' import { Dialog, DialogPortal, DialogTitle } from '@/components/ui/dialog' import { useBrandConfig } from '@/lib/branding/branding' -import { cn } from '@/lib/utils' -import { getTriggersForSidebar, hasTriggerCapability } from '@/lib/workflows/trigger-utils' +import { cn } from '@/lib/core/utils/cn' +import { getTriggersForSidebar, hasTriggerCapability } from '@/lib/workflows/triggers/trigger-utils' import { searchItems } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/search-modal/search-utils' import { getAllBlocks } from '@/blocks' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/account.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/account.tsx index d2747bb0639..7da137cda02 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/account.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/account.tsx @@ -8,10 +8,10 @@ import { Button } from '@/components/emcn' import { AgentIcon } from '@/components/icons' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' -import { signOut } from '@/lib/auth-client' +import { signOut } from '@/lib/auth/auth-client' import { useBrandConfig } from '@/lib/branding/branding' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { useProfilePictureUpload } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/hooks/use-profile-picture-upload' import { useUpdateUserProfile, useUserProfile } from '@/hooks/queries/user-profile' import { clearUserData } from '@/stores' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/api-keys/api-keys.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/api-keys/api-keys.tsx index 0ace598589d..569d5770090 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/api-keys/api-keys.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/api-keys/api-keys.tsx @@ -14,7 +14,7 @@ import { } from '@/components/emcn' import { Tooltip } from '@/components/emcn/components/tooltip/tooltip' import { Input, Label, Skeleton, Switch } from '@/components/ui' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/creator-profile/creator-profile.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/creator-profile/creator-profile.tsx index cb9cbd063c7..f309a725b20 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/creator-profile/creator-profile.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/creator-profile/creator-profile.tsx @@ -9,7 +9,7 @@ import { z } from 'zod' import { Button, Combobox, Input, Textarea } from '@/components/emcn' import { AgentIcon } from '@/components/icons' import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import type { CreatorProfileDetails } from '@/app/_types/creator-profile' import { useProfilePictureUpload } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/account/hooks/use-profile-picture-upload' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/credentials/credentials.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/credentials/credentials.tsx index 25c4c61df47..7e1e7cdbf54 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/credentials/credentials.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/credentials/credentials.tsx @@ -5,9 +5,9 @@ import { Check, ChevronDown, ExternalLink, Search } from 'lucide-react' import { useRouter, useSearchParams } from 'next/navigation' import { Button } from '@/components/emcn' import { Input, Label } from '@/components/ui' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import { OAUTH_PROVIDERS } from '@/lib/oauth/oauth' -import { cn } from '@/lib/utils' import { type ServiceInfo, useConnectOAuthService, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/files/files.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/files/files.tsx index 9c8e8f11521..640f613f813 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/files/files.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/files/files.tsx @@ -13,11 +13,11 @@ import { TableHeader, TableRow, } from '@/components/ui/table' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' import type { WorkspaceFileRecord } from '@/lib/uploads/contexts/workspace' import { getFileExtension } from '@/lib/uploads/utils/file-utils' -import { cn } from '@/lib/utils' import { getDocumentIcon } from '@/app/workspace/[workspaceId]/knowledge/components' import { useDeleteWorkspaceFile, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/general/general.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/general/general.tsx index 658df0cdc92..37ce2dc2978 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/general/general.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/general/general.tsx @@ -12,8 +12,8 @@ import { Label } from '@/components/ui/label' // SelectValue, // } from '@/components/ui/select' import { Switch } from '@/components/ui/switch' -import { useSession } from '@/lib/auth-client' -import { getEnv, isTruthy } from '@/lib/env' +import { useSession } from '@/lib/auth/auth-client' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { useGeneralSettings, useUpdateGeneralSetting } from '@/hooks/queries/general-settings' const TOOLTIPS = { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/settings-navigation/settings-navigation.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/settings-navigation/settings-navigation.tsx index 2f198c8b2dc..04bf7e9b10e 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/settings-navigation/settings-navigation.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/settings-navigation/settings-navigation.tsx @@ -17,12 +17,12 @@ import { Waypoints, Wrench, } from 'lucide-react' -import { useSession } from '@/lib/auth-client' -import { getEnv, isTruthy } from '@/lib/env' -import { isHosted } from '@/lib/environment' -import { getUserRole } from '@/lib/organization/helpers' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { cn } from '@/lib/utils' +import { useSession } from '@/lib/auth/auth-client' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { isHosted } from '@/lib/core/config/environment' +import { cn } from '@/lib/core/utils/cn' +import { getUserRole } from '@/lib/workspaces/organization/utils' import { generalSettingsKeys } from '@/hooks/queries/general-settings' import { organizationKeys, useOrganizations } from '@/hooks/queries/organization' import { ssoKeys, useSSOProviders } from '@/hooks/queries/sso' @@ -273,7 +273,7 @@ export function SettingsNavigation({ queryClient.prefetchQuery({ queryKey: organizationKeys.lists(), queryFn: async () => { - const { client } = await import('@/lib/auth-client') + const { client } = await import('@/lib/auth/auth-client') const [orgsResponse, activeOrgResponse, billingResponse] = await Promise.all([ client.organization.list(), client.organization.getFullOrganization(), diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx index a7275686e4e..062a978fbdb 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header.tsx @@ -2,8 +2,8 @@ import type { ReactNode } from 'react' import { Badge } from '@/components/emcn' -import { calculateFilledPills, USAGE_PILL_COUNT } from '@/lib/subscription/usage-visualization' -import { cn } from '@/lib/utils' +import { calculateFilledPills, USAGE_PILL_COUNT } from '@/lib/billing/client/usage-visualization' +import { cn } from '@/lib/core/utils/cn' const GRADIENT_BADGE_STYLES = 'gradient-text h-[1.125rem] rounded-[6px] border-gradient-primary/20 bg-gradient-to-b from-gradient-primary via-gradient-secondary to-gradient-primary px-2 py-0 font-medium text-xs cursor-pointer' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/sso/sso.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/sso/sso.tsx index 26f90dba4ff..842ccb678cc 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/sso/sso.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/sso/sso.tsx @@ -5,13 +5,13 @@ import { Check, ChevronDown, Copy, Eye, EyeOff } from 'lucide-react' import { Button, Combobox, Input, Label } from '@/components/emcn' import { Alert, AlertDescription } from '@/components/ui' import { Skeleton } from '@/components/ui/skeleton' -import { useSession } from '@/lib/auth-client' -import { isBillingEnabled } from '@/lib/environment' +import { useSession } from '@/lib/auth/auth-client' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { isBillingEnabled } from '@/lib/core/config/environment' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getUserRole } from '@/lib/organization/helpers' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' +import { getUserRole } from '@/lib/workspaces/organization/utils' import { useOrganizations } from '@/hooks/queries/organization' import { useConfigureSSO, useSSOProviders } from '@/hooks/queries/sso' import { useSubscriptionData } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/cancel-subscription/cancel-subscription.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/cancel-subscription/cancel-subscription.tsx index 293b7aa97d0..2e014e6b5fd 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/cancel-subscription/cancel-subscription.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/cancel-subscription/cancel-subscription.tsx @@ -11,11 +11,11 @@ import { ModalHeader, ModalTitle, } from '@/components/emcn' -import { useSession, useSubscription } from '@/lib/auth-client' +import { useSession, useSubscription } from '@/lib/auth/auth-client' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' import { organizationKeys, useOrganizations } from '@/hooks/queries/organization' import { subscriptionKeys, useSubscriptionData } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/plan-card/plan-card.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/plan-card/plan-card.tsx index 46009c821ae..244c5123beb 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/plan-card/plan-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/plan-card/plan-card.tsx @@ -3,7 +3,7 @@ import type { ReactNode } from 'react' import type { LucideIcon } from 'lucide-react' import { Button } from '@/components/ui' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export interface PlanFeature { icon: LucideIcon diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/usage-limit/usage-limit.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/usage-limit/usage-limit.tsx index 8539c8a5a17..134624d4a29 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/usage-limit/usage-limit.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/components/usage-limit/usage-limit.tsx @@ -3,8 +3,8 @@ import { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react' import { Check, Pencil, X } 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 { useUpdateOrganizationUsageLimit } from '@/hooks/queries/organization' import { useUpdateUsageLimit } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/subscription.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/subscription.tsx index eb535903572..4b6d2c63011 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/subscription.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/subscription/subscription.tsx @@ -11,12 +11,12 @@ import { SelectTrigger, SelectValue, } from '@/components/ui/select' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' +import { useSubscriptionUpgrade } from '@/lib/billing/client/upgrade' +import { cn } from '@/lib/core/utils/cn' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getUserRole } from '@/lib/organization/helpers' -import { useSubscriptionUpgrade } from '@/lib/subscription/upgrade' -import { getBaseUrl } from '@/lib/urls/utils' -import { cn } from '@/lib/utils' +import { getUserRole } from '@/lib/workspaces/organization/utils' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { UsageHeader } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/member-invitation-card/member-invitation-card.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/member-invitation-card/member-invitation-card.tsx index 78ee9adf79d..c577713a3ce 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/member-invitation-card/member-invitation-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/member-invitation-card/member-invitation-card.tsx @@ -9,8 +9,8 @@ import { PopoverTrigger, } from '@/components/emcn' import { Checkbox } from '@/components/ui/checkbox' -import { quickValidateEmail } from '@/lib/email/validation' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { quickValidateEmail } from '@/lib/messaging/email/validation' type PermissionType = 'read' | 'write' | 'admin' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-members/team-members.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-members/team-members.tsx index be14eabb72a..69d08e37053 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-members/team-members.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-members/team-members.tsx @@ -2,7 +2,7 @@ import { useState } from 'react' import { Button } from '@/components/emcn' import { UserAvatar } from '@/components/user-avatar/user-avatar' import { createLogger } from '@/lib/logs/console/logger' -import type { Invitation, Member, Organization } from '@/lib/organization' +import type { Invitation, Member, Organization } from '@/lib/workspaces/organization' import { useCancelInvitation, useOrganizationMembers } from '@/hooks/queries/organization' const logger = createLogger('TeamMembers') diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx index 08a13ed2442..7240f9797ad 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats-overview/team-seats-overview.tsx @@ -1,7 +1,7 @@ import { Badge, Button } from '@/components/emcn' import { Skeleton } from '@/components/ui/skeleton' import { checkEnterprisePlan } from '@/lib/billing/subscriptions/utils' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const PILL_COUNT = 8 diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats/team-seats.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats/team-seats.tsx index cd4c8d6f100..e29d657a575 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats/team-seats.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-seats/team-seats.tsx @@ -13,7 +13,7 @@ import { } from '@/components/emcn' import { Label } from '@/components/ui/label' import { DEFAULT_TEAM_TIER_COST_LIMIT } from '@/lib/billing/constants' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' interface TeamSeatsProps { open: boolean diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx index b1255e63127..8db05bf9e20 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/components/team-usage/team-usage.tsx @@ -1,8 +1,8 @@ import { useRef } from 'react' import { Skeleton } from '@/components/ui/skeleton' -import { useActiveOrganization } from '@/lib/auth-client' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { getBaseUrl } from '@/lib/urls/utils' +import { useActiveOrganization } from '@/lib/auth/auth-client' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import { UsageHeader } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/shared/usage-header' import { UsageLimit, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/team-management.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/team-management.tsx index 784758df484..5ddb240cbe2 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/team-management.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/components/team-management/team-management.tsx @@ -1,11 +1,16 @@ import { useCallback, useEffect, useState } from 'react' import { Skeleton } from '@/components/ui' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { DEFAULT_TEAM_TIER_COST_LIMIT } from '@/lib/billing/constants' import { checkEnterprisePlan } from '@/lib/billing/subscriptions/utils' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { generateSlug, getUsedSeats, getUserRole, isAdminOrOwner } from '@/lib/organization' +import { + generateSlug, + getUsedSeats, + getUserRole, + isAdminOrOwner, +} from '@/lib/workspaces/organization' import { MemberInvitationCard, NoOrganizationView, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/settings-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/settings-modal.tsx index 0e092b80e4d..3330879cf23 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/settings-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/settings-modal/settings-modal.tsx @@ -3,7 +3,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import * as VisuallyHidden from '@radix-ui/react-visually-hidden' import { Modal, ModalContent, ModalDescription, ModalTitle } from '@/components/emcn' -import { getEnv, isTruthy } from '@/lib/env' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { Account, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit.tsx index 202743c9db0..48eb7458859 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit.tsx @@ -1,6 +1,6 @@ 'use client' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export interface RotatingDigitProps { value: number | string diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/usage-indicator.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/usage-indicator.tsx index 7f01e43be5c..d0c624c05da 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/usage-indicator.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/usage-indicator.tsx @@ -4,14 +4,14 @@ import { useEffect, useMemo, useState } from 'react' import { useQueryClient } from '@tanstack/react-query' import { Button } from '@/components/emcn' import { Skeleton } from '@/components/ui' -import { createLogger } from '@/lib/logs/console/logger' +import { isUsageAtLimit, USAGE_PILL_COLORS } from '@/lib/billing/client/usage-visualization' import { canUpgrade, getBillingStatus, getSubscriptionStatus, getUsage, -} from '@/lib/subscription/helpers' -import { isUsageAtLimit, USAGE_PILL_COLORS } from '@/lib/subscription/usage-visualization' +} from '@/lib/billing/client/utils' +import { createLogger } from '@/lib/logs/console/logger' import { RotatingDigit } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/usage-indicator/rotating-digit' import { useSocket } from '@/app/workspace/providers/socket-provider' import { subscriptionKeys, useSubscriptionData } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workflow-list/components/workflow-item/avatars/avatars.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workflow-list/components/workflow-item/avatars/avatars.tsx index 077ed8970bd..f843e62a810 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workflow-list/components/workflow-item/avatars/avatars.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workflow-list/components/workflow-item/avatars/avatars.tsx @@ -3,7 +3,7 @@ import { type CSSProperties, useEffect, useMemo, useState } from 'react' import Image from 'next/image' import { Tooltip } from '@/components/emcn' -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/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal.tsx index cc18ec15f13..31e3abb3306 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal.tsx @@ -5,11 +5,11 @@ import { Loader2, RotateCw, X } from 'lucide-react' import { useParams } from 'next/navigation' import { Badge, Button, Input, Modal, ModalContent, Tooltip } from '@/components/emcn' import { Skeleton } from '@/components/ui/skeleton' -import { useSession } from '@/lib/auth-client' -import { quickValidateEmail } from '@/lib/email/validation' +import { useSession } from '@/lib/auth/auth-client' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import type { PermissionType } from '@/lib/permissions/utils' -import { cn } from '@/lib/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' +import type { PermissionType } from '@/lib/workspaces/permissions/utils' import { useUserPermissionsContext, useWorkspacePermissionsContext, diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/create-menu.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/create-menu.tsx index a355f6f243b..7d214f9a97c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/create-menu.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/create-menu/create-menu.tsx @@ -5,13 +5,13 @@ import { Download, Folder, Plus } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { Button } from '@/components/ui/button' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { extractWorkflowName, extractWorkflowsFromFiles, extractWorkflowsFromZip, -} from '@/lib/workflows/import-export' +} from '@/lib/workflows/operations/import-export' import { generateFolderName } from '@/lib/workspaces/naming' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { useCreateFolder } from '@/hooks/queries/folders' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/keyboard-shortcut/keyboard-shortcut.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/keyboard-shortcut/keyboard-shortcut.tsx index 734dec1432a..d864fcf6aa6 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/keyboard-shortcut/keyboard-shortcut.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/keyboard-shortcut/keyboard-shortcut.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface KeyboardShortcutProps { shortcut: string diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list.tsx index 389a3ee7f5c..730006c1d80 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { getDocumentIcon } from '@/app/workspace/[workspaceId]/knowledge/components/icons/document-icons' interface Document { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/knowledge-base-tags.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/knowledge-base-tags.tsx index df57a2cade2..307c2176214 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/knowledge-base-tags.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/knowledge-base-tags.tsx @@ -33,7 +33,7 @@ import { AlertDialogTitle, } from '@/components/ui/alert-dialog' import { ScrollArea } from '@/components/ui/scroll-area' -import { MAX_TAG_SLOTS } from '@/lib/knowledge/consts' +import { MAX_TAG_SLOTS } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { DocumentList } from '@/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-base-tags/components/document-list' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-tags/knowledge-tags.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-tags/knowledge-tags.tsx index 1cb522a2cc5..94538e2ac1b 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-tags/knowledge-tags.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/knowledge-tags/knowledge-tags.tsx @@ -17,7 +17,7 @@ import { SelectValue, } from '@/components/ui' import { ScrollArea } from '@/components/ui/scroll-area' -import { MAX_TAG_SLOTS, TAG_SLOTS, type TagSlot } from '@/lib/knowledge/consts' +import { MAX_TAG_SLOTS, TAG_SLOTS, type TagSlot } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' import type { DocumentTag } from '@/app/workspace/[workspaceId]/knowledge/components/document-tag-entry/document-tag-entry' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/navigation-item/navigation-item.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/navigation-item/navigation-item.tsx index ca0e00428ec..95c2b8703bd 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/navigation-item/navigation-item.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/navigation-item/navigation-item.tsx @@ -1,6 +1,6 @@ import { Tooltip } from '@/components/emcn' import { Button } from '@/components/ui' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface NavigationItemProps { item: { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/subscription-modal/subscription-modal.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/subscription-modal/subscription-modal.tsx index d09a6721a9e..04b2b1a6575 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/subscription-modal/subscription-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/subscription-modal/subscription-modal.tsx @@ -23,11 +23,11 @@ import { AlertDialogTitle, } from '@/components/ui/alert-dialog' import { Button } from '@/components/ui/button' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' +import { useSubscriptionUpgrade } from '@/lib/billing/client/upgrade' +import { getSubscriptionStatus } from '@/lib/billing/client/utils' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { getSubscriptionStatus } from '@/lib/subscription/helpers' -import { useSubscriptionUpgrade } from '@/lib/subscription/upgrade' -import { cn } from '@/lib/utils' import { useOrganizations } from '@/hooks/queries/organization' import { useSubscriptionData } from '@/hooks/queries/subscription' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/workflow-list.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/workflow-list.tsx index 527270dfe50..4f4128e58b0 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/workflow-list.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workflow-list/workflow-list.tsx @@ -5,7 +5,7 @@ import clsx from 'clsx' import Link from 'next/link' import { useParams, usePathname } from 'next/navigation' import { Skeleton } from '@/components/ui/skeleton' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import type { WorkflowMetadata } from '@/stores/workflows/registry/types' interface WorkflowItemProps { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx index aee51725635..7e8b1978b97 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-header/workspace-header.tsx @@ -5,7 +5,7 @@ import { ChevronDown, ChevronUp, PanelLeft } from 'lucide-react' import { Tooltip } from '@/components/emcn' import { Button } from '@/components/ui/button' import { Skeleton } from '@/components/ui/skeleton' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' /** * Workspace entity interface diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/workspace-selector.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/workspace-selector.tsx index b370e767b6f..834cd91bcaf 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/workspace-selector.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/components/workspace-selector/workspace-selector.tsx @@ -15,9 +15,9 @@ import { Button as UIButton } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { ScrollArea } from '@/components/ui/scroll-area' import { Skeleton } from '@/components/ui/skeleton' -import { isDev } from '@/lib/environment' +import { isDev } 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 { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { InviteModal } from '@/app/workspace/[workspaceId]/w/components/sidebar/components-new/workspace-header/components/invite-modal/invite-modal' @@ -309,7 +309,7 @@ export function WorkspaceSelector({ setIsExporting(true) try { - const { exportWorkspaceToZip } = await import('@/lib/workflows/import-export') + const { exportWorkspaceToZip } = await import('@/lib/workflows/operations/import-export') const { useFolderStore } = await import('@/stores/folders/store') const workflowsUrl = new URL('/api/workflows', window.location.origin) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar-new.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar-new.tsx index 6162db6f862..c59aa829f68 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar-new.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar-new.tsx @@ -4,8 +4,8 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { ArrowDown, Plus, Search } from 'lucide-react' import { useParams, useRouter } from 'next/navigation' import { Button, FolderPlus, Tooltip } from '@/components/emcn' -import { useSession } from '@/lib/auth-client' -import { getEnv, isTruthy } from '@/lib/env' +import { useSession } from '@/lib/auth/auth-client' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { useRegisterGlobalCommands } from '@/app/workspace/[workspaceId]/providers/global-commands-provider' import { createCommands } from '@/app/workspace/[workspaceId]/utils/commands-utils' diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx index 40f6715a94a..a22ecc7337c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/sidebar/sidebar.tsx @@ -4,10 +4,10 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react' import { Search } from 'lucide-react' import { useParams, usePathname, useRouter } from 'next/navigation' import { ScrollArea } from '@/components/ui' -import { useSession } from '@/lib/auth-client' -import { getEnv, isTruthy } from '@/lib/env' +import { useSession } from '@/lib/auth/auth-client' +import { canUpgrade, getBillingStatus } from '@/lib/billing/client/utils' +import { getEnv, isTruthy } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { canUpgrade, getBillingStatus } from '@/lib/subscription/helpers' import { generateWorkspaceName } from '@/lib/workspaces/naming' import { useUserPermissionsContext } from '@/app/workspace/[workspaceId]/providers/workspace-permissions-provider' import { diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx index 33dfa4b7ac2..ca4674596f6 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx @@ -12,8 +12,8 @@ import ReactFlow, { } from 'reactflow' import 'reactflow/dist/style.css' +import { cn } from '@/lib/core/utils/cn' import { createLogger } from '@/lib/logs/console/logger' -import { cn } from '@/lib/utils' import { NoteBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/note-block/note-block' import { SubflowNodeComponent } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node' import { WorkflowBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workflow.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workflow.ts index 453d7c87183..31b654d3164 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workflow.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workflow.ts @@ -1,7 +1,7 @@ import { useCallback, useState } from 'react' import JSZip from 'jszip' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeForExport } from '@/lib/workflows/json-sanitizer' +import { sanitizeForExport } from '@/lib/workflows/sanitization/json-sanitizer' import { useFolderStore } from '@/stores/folders/store' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workspace.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workspace.ts index 6581f0eae06..e82b5b75297 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workspace.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-export-workspace.ts @@ -1,6 +1,9 @@ import { useCallback, useState } from 'react' import { createLogger } from '@/lib/logs/console/logger' -import { exportWorkspaceToZip, type WorkflowExportData } from '@/lib/workflows/import-export' +import { + exportWorkspaceToZip, + type WorkflowExportData, +} from '@/lib/workflows/operations/import-export' const logger = createLogger('useExportWorkspace') diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workflow.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workflow.ts index 361b21e236c..921f3f7a0bd 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workflow.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workflow.ts @@ -6,7 +6,7 @@ import { extractWorkflowName, extractWorkflowsFromFiles, extractWorkflowsFromZip, -} from '@/lib/workflows/import-export' +} from '@/lib/workflows/operations/import-export' import { folderKeys, useCreateFolder } from '@/hooks/queries/folders' import { useCreateWorkflow, workflowKeys } from '@/hooks/queries/workflows' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' diff --git a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts index 518d390d6b8..0a9d1bf63e4 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts +++ b/apps/sim/app/workspace/[workspaceId]/w/hooks/use-import-workspace.ts @@ -1,7 +1,10 @@ import { useCallback, useState } from 'react' import { useRouter } from 'next/navigation' import { createLogger } from '@/lib/logs/console/logger' -import { extractWorkflowName, extractWorkflowsFromZip } from '@/lib/workflows/import-export' +import { + extractWorkflowName, + extractWorkflowsFromZip, +} from '@/lib/workflows/operations/import-export' import { useCreateFolder } from '@/hooks/queries/folders' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' import { parseWorkflowJson } from '@/stores/workflows/json/importer' diff --git a/apps/sim/app/workspace/layout.tsx b/apps/sim/app/workspace/layout.tsx index e15dd21384d..a6ed2dc8140 100644 --- a/apps/sim/app/workspace/layout.tsx +++ b/apps/sim/app/workspace/layout.tsx @@ -1,6 +1,6 @@ 'use client' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { SocketProvider } from '@/app/workspace/providers/socket-provider' interface WorkspaceRootLayoutProps { diff --git a/apps/sim/app/workspace/page.tsx b/apps/sim/app/workspace/page.tsx index 5e9ddf0e3a1..8119142e47a 100644 --- a/apps/sim/app/workspace/page.tsx +++ b/apps/sim/app/workspace/page.tsx @@ -3,7 +3,7 @@ import { useEffect } from 'react' import { Loader2 } from 'lucide-react' import { useRouter } from 'next/navigation' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('WorkspacePage') diff --git a/apps/sim/app/workspace/providers/socket-provider.tsx b/apps/sim/app/workspace/providers/socket-provider.tsx index 5f8feb11152..df89bee5c1e 100644 --- a/apps/sim/app/workspace/providers/socket-provider.tsx +++ b/apps/sim/app/workspace/providers/socket-provider.tsx @@ -11,7 +11,7 @@ import { } from 'react' import { useParams } from 'next/navigation' import { io, type Socket } from 'socket.io-client' -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('SocketContext') diff --git a/apps/sim/background/knowledge-processing.ts b/apps/sim/background/knowledge-processing.ts index f5b2d6880d5..2d5e9a98212 100644 --- a/apps/sim/background/knowledge-processing.ts +++ b/apps/sim/background/knowledge-processing.ts @@ -1,5 +1,5 @@ import { task } from '@trigger.dev/sdk' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { processDocumentAsync } from '@/lib/knowledge/documents/service' import { createLogger } from '@/lib/logs/console/logger' diff --git a/apps/sim/background/logs-webhook-delivery.ts b/apps/sim/background/logs-webhook-delivery.ts index 9ad0df2d916..394af902ec3 100644 --- a/apps/sim/background/logs-webhook-delivery.ts +++ b/apps/sim/background/logs-webhook-delivery.ts @@ -8,9 +8,9 @@ import { import { task, wait } from '@trigger.dev/sdk' import { and, eq, isNull, lte, or, sql } from 'drizzle-orm' import { v4 as uuidv4 } from 'uuid' +import { decryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' import type { WorkflowExecutionLog } from '@/lib/logs/types' -import { decryptSecret } from '@/lib/utils' const logger = createLogger('LogsWebhookDelivery') diff --git a/apps/sim/background/schedule-execution.ts b/apps/sim/background/schedule-execution.ts index e6cfd408ce6..34a352e8e71 100644 --- a/apps/sim/background/schedule-execution.ts +++ b/apps/sim/background/schedule-execution.ts @@ -4,20 +4,23 @@ import { Cron } from 'croner' import { eq } from 'drizzle-orm' import { v4 as uuidv4 } from 'uuid' import type { ZodRecord, ZodString } from 'zod' +import { decryptSecret } from '@/lib/core/security/encryption' import { getPersonalAndWorkspaceEnv } from '@/lib/environment/utils' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' import { LoggingSession } from '@/lib/logs/execution/logging-session' +import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' +import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' +import { + blockExistsInDeployment, + loadDeployedWorkflowState, +} from '@/lib/workflows/persistence/utils' import { type BlockState, calculateNextRunTime as calculateNextTime, getScheduleTimeValues, getSubBlockValue, -} from '@/lib/schedules/utils' -import { decryptSecret } from '@/lib/utils' -import { blockExistsInDeployment, loadDeployedWorkflowState } from '@/lib/workflows/db-helpers' -import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' -import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' +} from '@/lib/workflows/schedules/utils' import { type ExecutionMetadata, ExecutionSnapshot } from '@/executor/execution/snapshot' import { mergeSubblockState } from '@/stores/workflows/server-utils' diff --git a/apps/sim/background/webhook-execution.ts b/apps/sim/background/webhook-execution.ts index 74428f0d01a..ea8bc11d28a 100644 --- a/apps/sim/background/webhook-execution.ts +++ b/apps/sim/background/webhook-execution.ts @@ -3,19 +3,19 @@ import { webhook, workflow as workflowTable } from '@sim/db/schema' import { task } from '@trigger.dev/sdk' import { eq } from 'drizzle-orm' import { v4 as uuidv4 } from 'uuid' +import { IdempotencyService, webhookIdempotency } from '@/lib/core/idempotency' import { processExecutionFiles } from '@/lib/execution/files' -import { IdempotencyService, webhookIdempotency } from '@/lib/idempotency' 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 { WebhookAttachmentProcessor } from '@/lib/webhooks/attachment-processor' import { fetchAndProcessAirtablePayloads, formatWebhookInput } from '@/lib/webhooks/utils.server' +import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' +import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' import { loadDeployedWorkflowState, loadWorkflowFromNormalizedTables, -} from '@/lib/workflows/db-helpers' -import { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' -import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' +} from '@/lib/workflows/persistence/utils' import { getWorkflowById } from '@/lib/workflows/utils' import { type ExecutionMetadata, ExecutionSnapshot } from '@/executor/execution/snapshot' import type { ExecutionResult } from '@/executor/types' diff --git a/apps/sim/blocks/blocks/agent.ts b/apps/sim/blocks/blocks/agent.ts index 3e2c3e08299..d57b7d3021b 100644 --- a/apps/sim/blocks/blocks/agent.ts +++ b/apps/sim/blocks/blocks/agent.ts @@ -1,5 +1,5 @@ import { AgentIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import type { BlockConfig } from '@/blocks/types' import { AuthMode } from '@/blocks/types' diff --git a/apps/sim/blocks/blocks/evaluator.ts b/apps/sim/blocks/blocks/evaluator.ts index 2ea9f6ec896..fa291521c92 100644 --- a/apps/sim/blocks/blocks/evaluator.ts +++ b/apps/sim/blocks/blocks/evaluator.ts @@ -1,5 +1,5 @@ import { ChartBarIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import type { BlockConfig, ParamType } from '@/blocks/types' import type { ProviderId } from '@/providers/types' diff --git a/apps/sim/blocks/blocks/guardrails.ts b/apps/sim/blocks/blocks/guardrails.ts index 3a39892ccc2..5af165f3eec 100644 --- a/apps/sim/blocks/blocks/guardrails.ts +++ b/apps/sim/blocks/blocks/guardrails.ts @@ -1,5 +1,5 @@ import { ShieldCheckIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import type { BlockConfig } from '@/blocks/types' import { getHostedModels, getProviderIcon } from '@/providers/utils' import { useProvidersStore } from '@/stores/providers/store' diff --git a/apps/sim/blocks/blocks/router.ts b/apps/sim/blocks/blocks/router.ts index 2e6d829bbde..31daa27e2d3 100644 --- a/apps/sim/blocks/blocks/router.ts +++ b/apps/sim/blocks/blocks/router.ts @@ -1,5 +1,5 @@ import { ConnectIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { AuthMode, type BlockConfig } from '@/blocks/types' import type { ProviderId } from '@/providers/types' import { diff --git a/apps/sim/blocks/blocks/translate.ts b/apps/sim/blocks/blocks/translate.ts index 65ff1f8c080..7b81ec6a66e 100644 --- a/apps/sim/blocks/blocks/translate.ts +++ b/apps/sim/blocks/blocks/translate.ts @@ -1,5 +1,5 @@ import { TranslateIcon } from '@/components/icons' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { AuthMode, type BlockConfig } from '@/blocks/types' import { getAllModelProviders, diff --git a/apps/sim/components.json b/apps/sim/components.json index 111910b2cc2..eea8c1fbb86 100644 --- a/apps/sim/components.json +++ b/apps/sim/components.json @@ -12,7 +12,7 @@ }, "aliases": { "components": "@/components", - "utils": "@/lib/utils", + "utils": "@/lib/core/utils/cn", "ui": "@/components/ui", "lib": "@/lib", "hooks": "@/hooks", diff --git a/apps/sim/components/analytics/onedollarstats.tsx b/apps/sim/components/analytics/onedollarstats.tsx index 8bf27d2bf0f..2a22093be50 100644 --- a/apps/sim/components/analytics/onedollarstats.tsx +++ b/apps/sim/components/analytics/onedollarstats.tsx @@ -2,7 +2,7 @@ import { useEffect } from 'react' import { configure } from 'onedollarstats' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' export function OneDollarStats() { useEffect(() => { diff --git a/apps/sim/components/emails/batch-invitation-email.tsx b/apps/sim/components/emails/batch-invitation-email.tsx index 9ec2f16ef29..fa67ae096c2 100644 --- a/apps/sim/components/emails/batch-invitation-email.tsx +++ b/apps/sim/components/emails/batch-invitation-email.tsx @@ -14,7 +14,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface WorkspaceInvitation { workspaceId: string diff --git a/apps/sim/components/emails/billing/enterprise-subscription-email.tsx b/apps/sim/components/emails/billing/enterprise-subscription-email.tsx index dc09fe20dc5..f65930ad208 100644 --- a/apps/sim/components/emails/billing/enterprise-subscription-email.tsx +++ b/apps/sim/components/emails/billing/enterprise-subscription-email.tsx @@ -15,7 +15,7 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface EnterpriseSubscriptionEmailProps { userName?: string diff --git a/apps/sim/components/emails/billing/free-tier-upgrade-email.tsx b/apps/sim/components/emails/billing/free-tier-upgrade-email.tsx index 592f4a13239..857a3e9a9a7 100644 --- a/apps/sim/components/emails/billing/free-tier-upgrade-email.tsx +++ b/apps/sim/components/emails/billing/free-tier-upgrade-email.tsx @@ -15,7 +15,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface FreeTierUpgradeEmailProps { userName?: string diff --git a/apps/sim/components/emails/billing/payment-failed-email.tsx b/apps/sim/components/emails/billing/payment-failed-email.tsx index 1d7f41810fd..17d9087a201 100644 --- a/apps/sim/components/emails/billing/payment-failed-email.tsx +++ b/apps/sim/components/emails/billing/payment-failed-email.tsx @@ -15,7 +15,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface PaymentFailedEmailProps { userName?: string diff --git a/apps/sim/components/emails/billing/plan-welcome-email.tsx b/apps/sim/components/emails/billing/plan-welcome-email.tsx index ca3745cbfbe..fbac398b81e 100644 --- a/apps/sim/components/emails/billing/plan-welcome-email.tsx +++ b/apps/sim/components/emails/billing/plan-welcome-email.tsx @@ -15,7 +15,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface PlanWelcomeEmailProps { planName: 'Pro' | 'Team' diff --git a/apps/sim/components/emails/billing/usage-threshold-email.tsx b/apps/sim/components/emails/billing/usage-threshold-email.tsx index d1b9f3b1223..1885e2e60ad 100644 --- a/apps/sim/components/emails/billing/usage-threshold-email.tsx +++ b/apps/sim/components/emails/billing/usage-threshold-email.tsx @@ -15,7 +15,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface UsageThresholdEmailProps { userName?: string diff --git a/apps/sim/components/emails/careers/careers-confirmation-email.tsx b/apps/sim/components/emails/careers/careers-confirmation-email.tsx index 0577686da6e..6c15c1c09a9 100644 --- a/apps/sim/components/emails/careers/careers-confirmation-email.tsx +++ b/apps/sim/components/emails/careers/careers-confirmation-email.tsx @@ -14,7 +14,7 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface CareersConfirmationEmailProps { name: string diff --git a/apps/sim/components/emails/careers/careers-submission-email.tsx b/apps/sim/components/emails/careers/careers-submission-email.tsx index 5d3e79d89b9..9beed5d3ade 100644 --- a/apps/sim/components/emails/careers/careers-submission-email.tsx +++ b/apps/sim/components/emails/careers/careers-submission-email.tsx @@ -13,7 +13,7 @@ import { import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface CareersSubmissionEmailProps { name: string diff --git a/apps/sim/components/emails/footer.tsx b/apps/sim/components/emails/footer.tsx index 7ee919fcfb5..6b45e7e0111 100644 --- a/apps/sim/components/emails/footer.tsx +++ b/apps/sim/components/emails/footer.tsx @@ -1,7 +1,7 @@ import { Container, Img, Link, Section, Text } from '@react-email/components' import { getBrandConfig } from '@/lib/branding/branding' -import { isHosted } from '@/lib/environment' -import { getBaseUrl } from '@/lib/urls/utils' +import { isHosted } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' interface UnsubscribeOptions { unsubscribeToken?: string diff --git a/apps/sim/components/emails/help-confirmation-email.tsx b/apps/sim/components/emails/help-confirmation-email.tsx index f6b6320564f..834fd233ec1 100644 --- a/apps/sim/components/emails/help-confirmation-email.tsx +++ b/apps/sim/components/emails/help-confirmation-email.tsx @@ -14,7 +14,7 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface HelpConfirmationEmailProps { userEmail?: string diff --git a/apps/sim/components/emails/invitation-email.tsx b/apps/sim/components/emails/invitation-email.tsx index d8eb567398e..a698fa3b826 100644 --- a/apps/sim/components/emails/invitation-email.tsx +++ b/apps/sim/components/emails/invitation-email.tsx @@ -15,8 +15,8 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' interface InvitationEmailProps { inviterName?: string diff --git a/apps/sim/components/emails/otp-verification-email.tsx b/apps/sim/components/emails/otp-verification-email.tsx index 913a2936fb0..1fdaa87ffe7 100644 --- a/apps/sim/components/emails/otp-verification-email.tsx +++ b/apps/sim/components/emails/otp-verification-email.tsx @@ -13,7 +13,7 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface OTPVerificationEmailProps { otp: string diff --git a/apps/sim/components/emails/render-email.ts b/apps/sim/components/emails/render-email.ts index 313a74f145c..48fd0bbc120 100644 --- a/apps/sim/components/emails/render-email.ts +++ b/apps/sim/components/emails/render-email.ts @@ -11,7 +11,7 @@ import { } from '@/components/emails' import FreeTierUpgradeEmail from '@/components/emails/billing/free-tier-upgrade-email' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' export async function renderOTPEmail( otp: string, diff --git a/apps/sim/components/emails/reset-password-email.tsx b/apps/sim/components/emails/reset-password-email.tsx index db921ef5e9b..92d86b1ca8d 100644 --- a/apps/sim/components/emails/reset-password-email.tsx +++ b/apps/sim/components/emails/reset-password-email.tsx @@ -15,7 +15,7 @@ import { format } from 'date-fns' import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' interface ResetPasswordEmailProps { username?: string diff --git a/apps/sim/components/emails/workspace-invitation.tsx b/apps/sim/components/emails/workspace-invitation.tsx index 89ff2ac28e7..61e2429ff2f 100644 --- a/apps/sim/components/emails/workspace-invitation.tsx +++ b/apps/sim/components/emails/workspace-invitation.tsx @@ -14,8 +14,8 @@ import { import { baseStyles } from '@/components/emails/base-styles' import EmailFooter from '@/components/emails/footer' import { getBrandConfig } from '@/lib/branding/branding' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('WorkspaceInvitationEmail') diff --git a/apps/sim/components/emcn/components/badge/badge.tsx b/apps/sim/components/emcn/components/badge/badge.tsx index 9bd5bbabc2e..0508f92cd7a 100644 --- a/apps/sim/components/emcn/components/badge/badge.tsx +++ b/apps/sim/components/emcn/components/badge/badge.tsx @@ -1,6 +1,6 @@ import type * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const badgeVariants = cva( 'inline-flex items-center px-[9px] py-[2.25px] text-[13px] font-medium gap-[4px] rounded-[40px] focus:outline-none transition-colors', diff --git a/apps/sim/components/emcn/components/button/button.tsx b/apps/sim/components/emcn/components/button/button.tsx index 91e55bddcd0..553d165e1d2 100644 --- a/apps/sim/components/emcn/components/button/button.tsx +++ b/apps/sim/components/emcn/components/button/button.tsx @@ -1,6 +1,6 @@ import type * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const buttonVariants = cva( 'inline-flex items-center text-[var(--text-secondary)] hover:text-[var(--text-primary)] dark:hover:text-[var(--text-primary)] dark:text-[var(--text-secondary)] justify-center font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 outline-none focus:outline-none focus-visible:outline-none rounded-[4px] px-[8px] py-[6px] text-[12px]', diff --git a/apps/sim/components/emcn/components/code/code.tsx b/apps/sim/components/emcn/components/code/code.tsx index 7f883837df2..addaf40b464 100644 --- a/apps/sim/components/emcn/components/code/code.tsx +++ b/apps/sim/components/emcn/components/code/code.tsx @@ -3,7 +3,7 @@ import { highlight, languages } from 'prismjs' import 'prismjs/components/prism-javascript' import 'prismjs/components/prism-python' import 'prismjs/components/prism-json' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import './code.css' /** diff --git a/apps/sim/components/emcn/components/combobox/combobox.tsx b/apps/sim/components/emcn/components/combobox/combobox.tsx index af21d087f41..e44d0c5ddb5 100644 --- a/apps/sim/components/emcn/components/combobox/combobox.tsx +++ b/apps/sim/components/emcn/components/combobox/combobox.tsx @@ -14,7 +14,7 @@ import { } from 'react' import { cva, type VariantProps } from 'class-variance-authority' import { Check, ChevronDown, Loader2 } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' import { Input } from '../input/input' import { Popover, PopoverAnchor, PopoverContent, PopoverScrollArea } from '../popover/popover' diff --git a/apps/sim/components/emcn/components/input/input.tsx b/apps/sim/components/emcn/components/input/input.tsx index 0b9a2551a18..98283704991 100644 --- a/apps/sim/components/emcn/components/input/input.tsx +++ b/apps/sim/components/emcn/components/input/input.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const inputVariants = cva( 'flex w-full rounded-[4px] border border-[var(--surface-11)] bg-[var(--surface-6)] dark:bg-[var(--surface-9)] px-[8px] py-[6px] font-medium font-sans text-sm text-foreground transition-colors placeholder:text-[var(--text-muted)] dark:placeholder:text-[var(--text-muted)] outline-none focus:outline-none focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50', diff --git a/apps/sim/components/emcn/components/label/label.tsx b/apps/sim/components/emcn/components/label/label.tsx index ad87c3860dd..eeb5dbbfb67 100644 --- a/apps/sim/components/emcn/components/label/label.tsx +++ b/apps/sim/components/emcn/components/label/label.tsx @@ -1,7 +1,7 @@ 'use client' import * as LabelPrimitive from '@radix-ui/react-label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export interface LabelProps extends React.ComponentPropsWithoutRef {} diff --git a/apps/sim/components/emcn/components/modal/modal.tsx b/apps/sim/components/emcn/components/modal/modal.tsx index 2c736407c24..debada65939 100644 --- a/apps/sim/components/emcn/components/modal/modal.tsx +++ b/apps/sim/components/emcn/components/modal/modal.tsx @@ -37,7 +37,7 @@ import * as React from 'react' import * as DialogPrimitive from '@radix-ui/react-dialog' import { X } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * Modal z-index configuration diff --git a/apps/sim/components/emcn/components/popover/popover.tsx b/apps/sim/components/emcn/components/popover/popover.tsx index 9be2759f151..21e034b7075 100644 --- a/apps/sim/components/emcn/components/popover/popover.tsx +++ b/apps/sim/components/emcn/components/popover/popover.tsx @@ -52,7 +52,7 @@ import * as React from 'react' import * as PopoverPrimitive from '@radix-ui/react-popover' import { Check, ChevronLeft, ChevronRight, Search } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * Shared base styles for all popover interactive items. diff --git a/apps/sim/components/emcn/components/textarea/textarea.tsx b/apps/sim/components/emcn/components/textarea/textarea.tsx index 8d68b915db9..55b969d05d8 100644 --- a/apps/sim/components/emcn/components/textarea/textarea.tsx +++ b/apps/sim/components/emcn/components/textarea/textarea.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const textareaVariants = cva( 'flex w-full rounded-[4px] border border-[var(--surface-11)] bg-[var(--surface-6)] dark:bg-[var(--surface-9)] px-[8px] py-[8px] font-medium font-sans text-sm text-[var(--text-primary)] transition-colors placeholder:text-[var(--text-muted)] dark:placeholder:text-[var(--text-muted)] outline-none focus:outline-none focus-visible:outline-none focus-visible:ring-0 focus-visible:ring-offset-0 resize overflow-auto disabled:cursor-not-allowed disabled:opacity-50', diff --git a/apps/sim/components/emcn/components/tooltip/tooltip.tsx b/apps/sim/components/emcn/components/tooltip/tooltip.tsx index 0a395b464c8..60a8d0d7660 100644 --- a/apps/sim/components/emcn/components/tooltip/tooltip.tsx +++ b/apps/sim/components/emcn/components/tooltip/tooltip.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as TooltipPrimitive from '@radix-ui/react-tooltip' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' /** * Tooltip provider component that must wrap your app or tooltip usage area. diff --git a/apps/sim/components/ui/alert-dialog.tsx b/apps/sim/components/ui/alert-dialog.tsx index 1c5fa954159..0832617d868 100644 --- a/apps/sim/components/ui/alert-dialog.tsx +++ b/apps/sim/components/ui/alert-dialog.tsx @@ -4,7 +4,7 @@ import * as React from 'react' import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog' import { X } from 'lucide-react' import { buttonVariants } from '@/components/ui/button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const AlertDialog = AlertDialogPrimitive.Root diff --git a/apps/sim/components/ui/alert.tsx b/apps/sim/components/ui/alert.tsx index 9bf24b2b01c..03e20be2906 100644 --- a/apps/sim/components/ui/alert.tsx +++ b/apps/sim/components/ui/alert.tsx @@ -1,6 +1,6 @@ import * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const alertVariants = cva( 'relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground', diff --git a/apps/sim/components/ui/avatar.tsx b/apps/sim/components/ui/avatar.tsx index 6ecb2013110..9c21457ce57 100644 --- a/apps/sim/components/ui/avatar.tsx +++ b/apps/sim/components/ui/avatar.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as AvatarPrimitive from '@radix-ui/react-avatar' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const avatarStatusVariants = cva( 'flex items-center rounded-full size-2 border-2 border-background', diff --git a/apps/sim/components/ui/badge.tsx b/apps/sim/components/ui/badge.tsx index e26d4647bd4..5aec0acf32b 100644 --- a/apps/sim/components/ui/badge.tsx +++ b/apps/sim/components/ui/badge.tsx @@ -1,6 +1,6 @@ import type * as React from 'react' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const badgeVariants = cva( 'inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2', diff --git a/apps/sim/components/ui/breadcrumb.tsx b/apps/sim/components/ui/breadcrumb.tsx index 8609298f4c8..56bba3ca1c9 100644 --- a/apps/sim/components/ui/breadcrumb.tsx +++ b/apps/sim/components/ui/breadcrumb.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { Slot } from '@radix-ui/react-slot' import { ChevronRight, MoreHorizontal } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Breadcrumb = React.forwardRef< HTMLElement, diff --git a/apps/sim/components/ui/button.tsx b/apps/sim/components/ui/button.tsx index 7ece855e4b2..735d5d909e4 100644 --- a/apps/sim/components/ui/button.tsx +++ b/apps/sim/components/ui/button.tsx @@ -1,7 +1,7 @@ import * as React from 'react' import { Slot } from '@radix-ui/react-slot' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const buttonVariants = cva( 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', diff --git a/apps/sim/components/ui/card.tsx b/apps/sim/components/ui/card.tsx index 32aa74e0458..3fab3a3a40c 100644 --- a/apps/sim/components/ui/card.tsx +++ b/apps/sim/components/ui/card.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Card = React.forwardRef>( ({ className, ...props }, ref) => ( diff --git a/apps/sim/components/ui/checkbox.tsx b/apps/sim/components/ui/checkbox.tsx index 7a0f9adb948..e3f5cb3bfd0 100644 --- a/apps/sim/components/ui/checkbox.tsx +++ b/apps/sim/components/ui/checkbox.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as CheckboxPrimitive from '@radix-ui/react-checkbox' import { Check } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Checkbox = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/code-block.tsx b/apps/sim/components/ui/code-block.tsx index 12b744f61a8..fdabac45b41 100644 --- a/apps/sim/components/ui/code-block.tsx +++ b/apps/sim/components/ui/code-block.tsx @@ -1,6 +1,6 @@ import type React from 'react' import { CopyButton } from '@/components/ui/copy-button' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface CodeBlockProps extends React.HTMLAttributes { code: string diff --git a/apps/sim/components/ui/color-picker.tsx b/apps/sim/components/ui/color-picker.tsx index b9938e1a5c7..64ac30d8110 100644 --- a/apps/sim/components/ui/color-picker.tsx +++ b/apps/sim/components/ui/color-picker.tsx @@ -6,8 +6,8 @@ import type { ButtonProps } from '@/components/ui/button' import { Button } from '@/components/ui/button' import { Input } from '@/components/ui/input' import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' -import { useForwardedRef } from '@/lib/use-forwarded-ref' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' +import { useForwardedRef } from '@/hooks/use-forwarded-ref' interface ColorPickerProps { value: string diff --git a/apps/sim/components/ui/command.tsx b/apps/sim/components/ui/command.tsx index 6b82b0bdb4c..1819e736f27 100644 --- a/apps/sim/components/ui/command.tsx +++ b/apps/sim/components/ui/command.tsx @@ -7,7 +7,7 @@ import type { DialogProps } from '@radix-ui/react-dialog' import { Command as CommandPrimitive } from 'cmdk' import { Search } from 'lucide-react' import { Dialog, DialogContent } from '@/components/ui/dialog' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' // This file is not typed correctly from shadcn, so we're disabling the type checker // @ts-nocheck diff --git a/apps/sim/components/ui/dialog.tsx b/apps/sim/components/ui/dialog.tsx index ab299dfc76b..4e69d43bf58 100644 --- a/apps/sim/components/ui/dialog.tsx +++ b/apps/sim/components/ui/dialog.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as DialogPrimitive from '@radix-ui/react-dialog' import { X } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Dialog = DialogPrimitive.Root diff --git a/apps/sim/components/ui/dropdown-menu.tsx b/apps/sim/components/ui/dropdown-menu.tsx index dea7de6c3c7..6cea410abe8 100644 --- a/apps/sim/components/ui/dropdown-menu.tsx +++ b/apps/sim/components/ui/dropdown-menu.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' import { Check, ChevronRight, Circle } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const DropdownMenu = DropdownMenuPrimitive.Root diff --git a/apps/sim/components/ui/form.tsx b/apps/sim/components/ui/form.tsx index 5150e7d9d6d..d0cd9c2f760 100644 --- a/apps/sim/components/ui/form.tsx +++ b/apps/sim/components/ui/form.tsx @@ -12,7 +12,7 @@ import { useFormContext, } from 'react-hook-form' import { Label } from '@/components/ui/label' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Form = FormProvider diff --git a/apps/sim/components/ui/input-otp.tsx b/apps/sim/components/ui/input-otp.tsx index 52bbd95efce..56399cfded3 100644 --- a/apps/sim/components/ui/input-otp.tsx +++ b/apps/sim/components/ui/input-otp.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import { OTPInput, OTPInputContext } from 'input-otp' import { Minus } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const InputOTP = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/input.tsx b/apps/sim/components/ui/input.tsx index 8624a7a51d5..e1e4c2b7936 100644 --- a/apps/sim/components/ui/input.tsx +++ b/apps/sim/components/ui/input.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Input = React.forwardRef>( ({ className, type, autoComplete = 'off', ...props }, ref) => { diff --git a/apps/sim/components/ui/label.tsx b/apps/sim/components/ui/label.tsx index 200a9e240f7..8ea90a4b3a3 100644 --- a/apps/sim/components/ui/label.tsx +++ b/apps/sim/components/ui/label.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as LabelPrimitive from '@radix-ui/react-label' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const labelVariants = cva( 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70' diff --git a/apps/sim/components/ui/notice.tsx b/apps/sim/components/ui/notice.tsx index 2d7342d7ed2..f224397bb20 100644 --- a/apps/sim/components/ui/notice.tsx +++ b/apps/sim/components/ui/notice.tsx @@ -1,6 +1,6 @@ import type React from 'react' import { AlertCircle, AlertTriangle, Check, Info } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' export type NoticeVariant = 'info' | 'warning' | 'success' | 'error' | 'default' diff --git a/apps/sim/components/ui/popover.tsx b/apps/sim/components/ui/popover.tsx index 8b4612d64f7..296abb4bbf0 100644 --- a/apps/sim/components/ui/popover.tsx +++ b/apps/sim/components/ui/popover.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as PopoverPrimitive from '@radix-ui/react-popover' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Popover = PopoverPrimitive.Root diff --git a/apps/sim/components/ui/progress.tsx b/apps/sim/components/ui/progress.tsx index 28ef70b5475..df6dc5ac6fb 100644 --- a/apps/sim/components/ui/progress.tsx +++ b/apps/sim/components/ui/progress.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as ProgressPrimitive from '@radix-ui/react-progress' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface ProgressProps extends React.ComponentPropsWithoutRef { indicatorClassName?: string diff --git a/apps/sim/components/ui/radio-group.tsx b/apps/sim/components/ui/radio-group.tsx index d21d908faa4..b5c6a8cd70e 100644 --- a/apps/sim/components/ui/radio-group.tsx +++ b/apps/sim/components/ui/radio-group.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as RadioGroupPrimitive from '@radix-ui/react-radio-group' import { Circle } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const RadioGroup = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/scroll-area.tsx b/apps/sim/components/ui/scroll-area.tsx index e0c23ea3dd5..d4fb41e9597 100644 --- a/apps/sim/components/ui/scroll-area.tsx +++ b/apps/sim/components/ui/scroll-area.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const ScrollArea = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/select.tsx b/apps/sim/components/ui/select.tsx index 5f585a3e232..bf6e2ece629 100644 --- a/apps/sim/components/ui/select.tsx +++ b/apps/sim/components/ui/select.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as SelectPrimitive from '@radix-ui/react-select' import { Check, ChevronDown, ChevronUp } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Select = SelectPrimitive.Root diff --git a/apps/sim/components/ui/separator.tsx b/apps/sim/components/ui/separator.tsx index b4976174619..957f8fe0cd6 100644 --- a/apps/sim/components/ui/separator.tsx +++ b/apps/sim/components/ui/separator.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as SeparatorPrimitive from '@radix-ui/react-separator' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Separator = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/sheet.tsx b/apps/sim/components/ui/sheet.tsx index 85655e9c184..3ccf58c3e3e 100644 --- a/apps/sim/components/ui/sheet.tsx +++ b/apps/sim/components/ui/sheet.tsx @@ -4,7 +4,7 @@ import * as React from 'react' import * as SheetPrimitive from '@radix-ui/react-dialog' import { cva, type VariantProps } from 'class-variance-authority' import { X } from 'lucide-react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Sheet = SheetPrimitive.Root diff --git a/apps/sim/components/ui/skeleton.tsx b/apps/sim/components/ui/skeleton.tsx index 7347fdff94b..c7c73d16304 100644 --- a/apps/sim/components/ui/skeleton.tsx +++ b/apps/sim/components/ui/skeleton.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' function Skeleton({ className, ...props }: React.HTMLAttributes) { return
diff --git a/apps/sim/components/ui/slider.tsx b/apps/sim/components/ui/slider.tsx index 471aa4b12b8..c131ff22202 100644 --- a/apps/sim/components/ui/slider.tsx +++ b/apps/sim/components/ui/slider.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as SliderPrimitive from '@radix-ui/react-slider' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Slider = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/switch.tsx b/apps/sim/components/ui/switch.tsx index 113c38ada28..7f2f60b9dfb 100644 --- a/apps/sim/components/ui/switch.tsx +++ b/apps/sim/components/ui/switch.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as SwitchPrimitives from '@radix-ui/react-switch' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Switch = React.forwardRef< React.ElementRef, diff --git a/apps/sim/components/ui/table.tsx b/apps/sim/components/ui/table.tsx index 0dd713cd5b6..a90905fa027 100644 --- a/apps/sim/components/ui/table.tsx +++ b/apps/sim/components/ui/table.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Table = React.forwardRef>( ({ className, ...props }, ref) => ( diff --git a/apps/sim/components/ui/tabs.tsx b/apps/sim/components/ui/tabs.tsx index d60a8c8c6b7..eee254f5feb 100644 --- a/apps/sim/components/ui/tabs.tsx +++ b/apps/sim/components/ui/tabs.tsx @@ -2,7 +2,7 @@ import * as React from 'react' import * as TabsPrimitive from '@radix-ui/react-tabs' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Tabs = TabsPrimitive.Root diff --git a/apps/sim/components/ui/tag-input.tsx b/apps/sim/components/ui/tag-input.tsx index 0b725b60531..2a9a516da1e 100644 --- a/apps/sim/components/ui/tag-input.tsx +++ b/apps/sim/components/ui/tag-input.tsx @@ -4,7 +4,7 @@ import { type KeyboardEvent, useRef, useState } from 'react' import { X } from 'lucide-react' import { Badge } from '@/components/ui/badge' import { Input } from '@/components/ui/input' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface TagInputProps { value: string[] diff --git a/apps/sim/components/ui/textarea.tsx b/apps/sim/components/ui/textarea.tsx index ba9ec4cf8c6..796ce2425b6 100644 --- a/apps/sim/components/ui/textarea.tsx +++ b/apps/sim/components/ui/textarea.tsx @@ -1,5 +1,5 @@ import * as React from 'react' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' const Textarea = React.forwardRef>( ({ className, ...props }, ref) => { diff --git a/apps/sim/components/ui/toggle.tsx b/apps/sim/components/ui/toggle.tsx index 7cc8d27bb89..2c8ebb45987 100644 --- a/apps/sim/components/ui/toggle.tsx +++ b/apps/sim/components/ui/toggle.tsx @@ -3,7 +3,7 @@ import * as React from 'react' import * as TogglePrimitive from '@radix-ui/react-toggle' import { cva, type VariantProps } from 'class-variance-authority' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' // TODO: FIX STYLING const toggleVariants = cva( diff --git a/apps/sim/components/ui/tool-call.tsx b/apps/sim/components/ui/tool-call.tsx index 510acce351b..99b47c2ba09 100644 --- a/apps/sim/components/ui/tool-call.tsx +++ b/apps/sim/components/ui/tool-call.tsx @@ -6,7 +6,7 @@ import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/components/ui/collapsible' import type { ToolCallGroup, ToolCallState } from '@/lib/copilot/types' -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface ToolCallProps { toolCall: ToolCallState diff --git a/apps/sim/components/ui/verified-badge.tsx b/apps/sim/components/ui/verified-badge.tsx index e17dd53d0aa..347f524609f 100644 --- a/apps/sim/components/ui/verified-badge.tsx +++ b/apps/sim/components/ui/verified-badge.tsx @@ -1,4 +1,4 @@ -import { cn } from '@/lib/utils' +import { cn } from '@/lib/core/utils/cn' interface VerifiedBadgeProps { className?: string diff --git a/apps/sim/drizzle.config.ts b/apps/sim/drizzle.config.ts index 3f0cfbd8986..d93370d17e1 100644 --- a/apps/sim/drizzle.config.ts +++ b/apps/sim/drizzle.config.ts @@ -1,5 +1,5 @@ import type { Config } from 'drizzle-kit' -import { env } from './lib/env' +import { env } from './lib/core/config/env' export default { schema: '../../packages/db/schema.ts', diff --git a/apps/sim/executor/__test-utils__/mock-dependencies.ts b/apps/sim/executor/__test-utils__/mock-dependencies.ts index 2d3939dedad..039ea27b108 100644 --- a/apps/sim/executor/__test-utils__/mock-dependencies.ts +++ b/apps/sim/executor/__test-utils__/mock-dependencies.ts @@ -31,8 +31,11 @@ vi.mock('@/tools/utils', () => ({ })) // Utils -vi.mock('@/lib/utils', () => ({ - isHosted: vi.fn().mockReturnValue(false), +vi.mock('@/lib/core/config/environment', () => ({ + isHosted: false, +})) + +vi.mock('@/lib/core/config/api-keys', () => ({ getRotatingApiKey: vi.fn(), })) diff --git a/apps/sim/executor/execution/block-executor.ts b/apps/sim/executor/execution/block-executor.ts index 59e6d5474bc..5949b41cf45 100644 --- a/apps/sim/executor/execution/block-executor.ts +++ b/apps/sim/executor/execution/block-executor.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { BlockType, buildResumeApiUrl, diff --git a/apps/sim/executor/execution/executor.ts b/apps/sim/executor/execution/executor.ts index 5039fc839ac..44697eb429e 100644 --- a/apps/sim/executor/execution/executor.ts +++ b/apps/sim/executor/execution/executor.ts @@ -1,5 +1,5 @@ import { createLogger } from '@/lib/logs/console/logger' -import { StartBlockPath } from '@/lib/workflows/triggers' +import { StartBlockPath } from '@/lib/workflows/triggers/triggers' import type { BlockOutput } from '@/blocks/types' import { DAGBuilder } from '@/executor/dag/builder' import { BlockExecutor } from '@/executor/execution/block-executor' diff --git a/apps/sim/executor/handlers/agent/agent-handler.test.ts b/apps/sim/executor/handlers/agent/agent-handler.test.ts index f1234a5851a..72df94c7222 100644 --- a/apps/sim/executor/handlers/agent/agent-handler.test.ts +++ b/apps/sim/executor/handlers/agent/agent-handler.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { getAllBlocks } from '@/blocks' import { BlockType } from '@/executor/consts' import { AgentBlockHandler } from '@/executor/handlers/agent/agent-handler' @@ -11,7 +11,7 @@ import { executeTool } from '@/tools' process.env.NEXT_PUBLIC_APP_URL = 'http://localhost:3000' -vi.mock('@/lib/environment', () => ({ +vi.mock('@/lib/core/config/environment', () => ({ isHosted: vi.fn().mockReturnValue(false), isProd: vi.fn().mockReturnValue(false), isDev: vi.fn().mockReturnValue(true), diff --git a/apps/sim/executor/handlers/human-in-the-loop/human-in-the-loop-handler.ts b/apps/sim/executor/handlers/human-in-the-loop/human-in-the-loop-handler.ts index 918f250a113..be354f59205 100644 --- a/apps/sim/executor/handlers/human-in-the-loop/human-in-the-loop-handler.ts +++ b/apps/sim/executor/handlers/human-in-the-loop/human-in-the-loop-handler.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import type { BlockOutput } from '@/blocks/types' import { BlockType, diff --git a/apps/sim/executor/handlers/router/router-handler.ts b/apps/sim/executor/handlers/router/router-handler.ts index 05ade6613d1..cc21c2132c3 100644 --- a/apps/sim/executor/handlers/router/router-handler.ts +++ b/apps/sim/executor/handlers/router/router-handler.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { generateRouterPrompt } from '@/blocks/blocks/router' import type { BlockOutput } from '@/blocks/types' import { BlockType, DEFAULTS, HTTP, isAgentBlockType, ROUTER } from '@/executor/consts' diff --git a/apps/sim/executor/utils/http.ts b/apps/sim/executor/utils/http.ts index 937e05bbbf8..d9db5a1fd9a 100644 --- a/apps/sim/executor/utils/http.ts +++ b/apps/sim/executor/utils/http.ts @@ -1,5 +1,5 @@ import { generateInternalToken } from '@/lib/auth/internal' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' import { HTTP } from '@/executor/consts' export async function buildAuthHeaders(): Promise> { diff --git a/apps/sim/executor/utils/reference-validation.ts b/apps/sim/executor/utils/reference-validation.ts index 906af328769..d1f72ce0c1c 100644 --- a/apps/sim/executor/utils/reference-validation.ts +++ b/apps/sim/executor/utils/reference-validation.ts @@ -1,4 +1,4 @@ -import { isLikelyReferenceSegment } from '@/lib/workflows/references' +import { isLikelyReferenceSegment } from '@/lib/workflows/sanitization/references' import { REFERENCE } from '@/executor/consts' /** diff --git a/apps/sim/executor/utils/start-block.test.ts b/apps/sim/executor/utils/start-block.test.ts index f1403548be2..aee3f798f69 100644 --- a/apps/sim/executor/utils/start-block.test.ts +++ b/apps/sim/executor/utils/start-block.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { StartBlockPath } from '@/lib/workflows/triggers' +import { StartBlockPath } from '@/lib/workflows/triggers/triggers' import type { UserFile } from '@/executor/types' import { buildResolutionFromBlock, diff --git a/apps/sim/executor/utils/start-block.ts b/apps/sim/executor/utils/start-block.ts index ce20328a406..17192906b80 100644 --- a/apps/sim/executor/utils/start-block.ts +++ b/apps/sim/executor/utils/start-block.ts @@ -1,10 +1,10 @@ -import { isUserFile } from '@/lib/utils' +import { isUserFile } from '@/lib/core/utils/display-filters' import { classifyStartBlockType, getLegacyStarterMode, resolveStartCandidates, StartBlockPath, -} from '@/lib/workflows/triggers' +} from '@/lib/workflows/triggers/triggers' import type { InputFormatField } from '@/lib/workflows/types' import type { NormalizedBlockOutput, UserFile } from '@/executor/types' import type { SerializedBlock } from '@/serializer/types' diff --git a/apps/sim/executor/variables/resolvers/workflow.ts b/apps/sim/executor/variables/resolvers/workflow.ts index 60e8070c2ed..e1c7536827f 100644 --- a/apps/sim/executor/variables/resolvers/workflow.ts +++ b/apps/sim/executor/variables/resolvers/workflow.ts @@ -1,5 +1,5 @@ import { createLogger } from '@/lib/logs/console/logger' -import { VariableManager } from '@/lib/variables/variable-manager' +import { VariableManager } from '@/lib/workflows/variables/variable-manager' import { isReference, parseReferencePath, REFERENCE } from '@/executor/consts' import { navigatePath, diff --git a/apps/sim/hooks/queries/copilot-keys.ts b/apps/sim/hooks/queries/copilot-keys.ts index e1690c142c1..210effc6328 100644 --- a/apps/sim/hooks/queries/copilot-keys.ts +++ b/apps/sim/hooks/queries/copilot-keys.ts @@ -1,5 +1,5 @@ import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { isHosted } from '@/lib/environment' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('CopilotKeysQuery') diff --git a/apps/sim/hooks/queries/oauth-connections.ts b/apps/sim/hooks/queries/oauth-connections.ts index 9405511a64f..70b9932e3f9 100644 --- a/apps/sim/hooks/queries/oauth-connections.ts +++ b/apps/sim/hooks/queries/oauth-connections.ts @@ -1,5 +1,5 @@ import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { OAUTH_PROVIDERS, type OAuthServiceConfig } from '@/lib/oauth/oauth' diff --git a/apps/sim/hooks/queries/organization.ts b/apps/sim/hooks/queries/organization.ts index 95d13115e3e..8ccdabc3895 100644 --- a/apps/sim/hooks/queries/organization.ts +++ b/apps/sim/hooks/queries/organization.ts @@ -1,5 +1,5 @@ import { keepPreviousData, useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('OrganizationQueries') diff --git a/apps/sim/hooks/use-collaborative-workflow.ts b/apps/sim/hooks/use-collaborative-workflow.ts index 2fb8b9b7c1a..149965ec72f 100644 --- a/apps/sim/hooks/use-collaborative-workflow.ts +++ b/apps/sim/hooks/use-collaborative-workflow.ts @@ -1,9 +1,9 @@ import { useCallback, useEffect, useRef } from 'react' import type { Edge } from 'reactflow' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' -import { TriggerUtils } from '@/lib/workflows/triggers' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { useSocket } from '@/app/workspace/providers/socket-provider' import { getBlock } from '@/blocks' import { useUndoRedo } from '@/hooks/use-undo-redo' diff --git a/apps/sim/lib/use-forwarded-ref.ts b/apps/sim/hooks/use-forwarded-ref.ts similarity index 100% rename from apps/sim/lib/use-forwarded-ref.ts rename to apps/sim/hooks/use-forwarded-ref.ts diff --git a/apps/sim/hooks/use-knowledge-base-tag-definitions.ts b/apps/sim/hooks/use-knowledge-base-tag-definitions.ts index f29eb7e9210..57c0cac368e 100644 --- a/apps/sim/hooks/use-knowledge-base-tag-definitions.ts +++ b/apps/sim/hooks/use-knowledge-base-tag-definitions.ts @@ -1,7 +1,7 @@ 'use client' import { useCallback, useEffect, useState } from 'react' -import type { TagSlot } from '@/lib/knowledge/consts' +import type { TagSlot } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('useKnowledgeBaseTagDefinitions') diff --git a/apps/sim/hooks/use-tag-definitions.ts b/apps/sim/hooks/use-tag-definitions.ts index 24b36a3c011..5e15b2786d6 100644 --- a/apps/sim/hooks/use-tag-definitions.ts +++ b/apps/sim/hooks/use-tag-definitions.ts @@ -1,7 +1,7 @@ 'use client' import { useCallback, useEffect, useState } from 'react' -import type { TagSlot } from '@/lib/knowledge/consts' +import type { TagSlot } from '@/lib/knowledge/constants' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('useTagDefinitions') diff --git a/apps/sim/hooks/use-undo-redo.ts b/apps/sim/hooks/use-undo-redo.ts index 1e4a3d86781..00351362689 100644 --- a/apps/sim/hooks/use-undo-redo.ts +++ b/apps/sim/hooks/use-undo-redo.ts @@ -1,8 +1,8 @@ import { useCallback } from 'react' import type { Edge } from 'reactflow' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' -import { enqueueReplaceWorkflowState } from '@/lib/workflows/socket-operations' +import { enqueueReplaceWorkflowState } from '@/lib/workflows/operations/socket-operations' import { useOperationQueue } from '@/stores/operation-queue/store' import { createOperationEntry, diff --git a/apps/sim/hooks/use-user-permissions.ts b/apps/sim/hooks/use-user-permissions.ts index 14bcf665cd7..2ee2bb2bff1 100644 --- a/apps/sim/hooks/use-user-permissions.ts +++ b/apps/sim/hooks/use-user-permissions.ts @@ -1,5 +1,5 @@ import { useMemo } from 'react' -import { useSession } from '@/lib/auth-client' +import { useSession } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import type { PermissionType, WorkspacePermissions } from '@/hooks/use-workspace-permissions' diff --git a/apps/sim/hooks/use-webhook-management.ts b/apps/sim/hooks/use-webhook-management.ts index 8c0ea53fd4d..d29018c4e21 100644 --- a/apps/sim/hooks/use-webhook-management.ts +++ b/apps/sim/hooks/use-webhook-management.ts @@ -1,7 +1,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react' import { useParams } from 'next/navigation' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { getBlock } from '@/blocks' import { populateTriggerFieldsFromConfig } from '@/hooks/use-trigger-config-aggregation' import { useSubBlockStore } from '@/stores/workflows/subblock/store' diff --git a/apps/sim/instrumentation-client.ts b/apps/sim/instrumentation-client.ts index 4f5852ae472..59cfe3017f3 100644 --- a/apps/sim/instrumentation-client.ts +++ b/apps/sim/instrumentation-client.ts @@ -2,7 +2,7 @@ * Sim Telemetry - Client-side Instrumentation */ -import { env } from './lib/env' +import { env } from './lib/core/config/env' if (typeof window !== 'undefined') { const TELEMETRY_STATUS_KEY = 'simstudio-telemetry-status' diff --git a/apps/sim/instrumentation-node.ts b/apps/sim/instrumentation-node.ts index 23d21093848..86c10996e6c 100644 --- a/apps/sim/instrumentation-node.ts +++ b/apps/sim/instrumentation-node.ts @@ -3,7 +3,7 @@ */ import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api' -import { env } from './lib/env' +import { env } from './lib/core/config/env' import { createLogger } from './lib/logs/console/logger' diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR) diff --git a/apps/sim/lib/api-key/auth.ts b/apps/sim/lib/api-key/auth.ts index 20c773a90d5..0ea9ec058db 100644 --- a/apps/sim/lib/api-key/auth.ts +++ b/apps/sim/lib/api-key/auth.ts @@ -6,7 +6,7 @@ import { isEncryptedApiKeyFormat, isLegacyApiKeyFormat, } from '@/lib/api-key/crypto' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('ApiKeyAuth') diff --git a/apps/sim/lib/api-key/crypto.ts b/apps/sim/lib/api-key/crypto.ts index 5ff470bf42f..aaa3de3b895 100644 --- a/apps/sim/lib/api-key/crypto.ts +++ b/apps/sim/lib/api-key/crypto.ts @@ -1,5 +1,5 @@ import { createCipheriv, createDecipheriv, randomBytes } from 'crypto' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('ApiKeyCrypto') diff --git a/apps/sim/lib/api-key/service.ts b/apps/sim/lib/api-key/service.ts index aa503452af6..7136f6f64e2 100644 --- a/apps/sim/lib/api-key/service.ts +++ b/apps/sim/lib/api-key/service.ts @@ -3,7 +3,7 @@ import { apiKey as apiKeyTable } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' import { authenticateApiKey } from '@/lib/api-key/auth' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import { getWorkspaceBillingSettings } from '@/lib/workspaces/utils' const logger = createLogger('ApiKeyService') diff --git a/apps/sim/lib/auth-client.ts b/apps/sim/lib/auth/auth-client.ts similarity index 90% rename from apps/sim/lib/auth-client.ts rename to apps/sim/lib/auth/auth-client.ts index a3c1f8efed4..817902a0b42 100644 --- a/apps/sim/lib/auth-client.ts +++ b/apps/sim/lib/auth/auth-client.ts @@ -9,9 +9,9 @@ import { } from 'better-auth/client/plugins' import { createAuthClient } from 'better-auth/react' import type { auth } from '@/lib/auth' -import { env } from '@/lib/env' -import { isBillingEnabled } from '@/lib/environment' -import { getBaseUrl } from '@/lib/urls/utils' +import { env } from '@/lib/core/config/env' +import { isBillingEnabled } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { SessionContext, type SessionHookResult } from '@/app/_shell/providers/session-provider' export const client = createAuthClient({ diff --git a/apps/sim/lib/auth.ts b/apps/sim/lib/auth/auth.ts similarity index 99% rename from apps/sim/lib/auth.ts rename to apps/sim/lib/auth/auth.ts index a22affc1290..650d9acd085 100644 --- a/apps/sim/lib/auth.ts +++ b/apps/sim/lib/auth/auth.ts @@ -38,14 +38,14 @@ import { handleSubscriptionCreated, handleSubscriptionDeleted, } from '@/lib/billing/webhooks/subscription' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' -import { quickValidateEmail } from '@/lib/email/validation' -import { env, isTruthy } from '@/lib/env' -import { isBillingEnabled, isEmailVerificationEnabled } from '@/lib/environment' +import { env, isTruthy } from '@/lib/core/config/env' +import { isBillingEnabled, isEmailVerificationEnabled } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { SSO_TRUSTED_PROVIDERS } from '@/lib/sso/consts' -import { getBaseUrl } from '@/lib/urls/utils' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' +import { quickValidateEmail } from '@/lib/messaging/email/validation' +import { SSO_TRUSTED_PROVIDERS } from './sso/constants' const logger = createLogger('Auth') diff --git a/apps/sim/lib/auth/credential-access.ts b/apps/sim/lib/auth/credential-access.ts index adf9d1a392c..be7b7e1bd2f 100644 --- a/apps/sim/lib/auth/credential-access.ts +++ b/apps/sim/lib/auth/credential-access.ts @@ -3,7 +3,7 @@ import { account, workflow as workflowTable } from '@sim/db/schema' import { eq } from 'drizzle-orm' import type { NextRequest } from 'next/server' import { checkHybridAuth } from '@/lib/auth/hybrid' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' export interface CredentialAccessResult { ok: boolean diff --git a/apps/sim/lib/auth/index.ts b/apps/sim/lib/auth/index.ts new file mode 100644 index 00000000000..84c42e215ba --- /dev/null +++ b/apps/sim/lib/auth/index.ts @@ -0,0 +1 @@ +export { auth, getSession, signIn, signUp } from './auth' diff --git a/apps/sim/lib/auth/internal.ts b/apps/sim/lib/auth/internal.ts index c9c5f5b94bf..cba5036dc85 100644 --- a/apps/sim/lib/auth/internal.ts +++ b/apps/sim/lib/auth/internal.ts @@ -1,6 +1,6 @@ import { jwtVerify, SignJWT } from 'jose' 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('CronAuth') diff --git a/apps/sim/lib/sso/consts.ts b/apps/sim/lib/auth/sso/constants.ts similarity index 100% rename from apps/sim/lib/sso/consts.ts rename to apps/sim/lib/auth/sso/constants.ts diff --git a/apps/sim/lib/billing/calculations/usage-monitor.ts b/apps/sim/lib/billing/calculations/usage-monitor.ts index 46f0c021c4b..956468d9ad1 100644 --- a/apps/sim/lib/billing/calculations/usage-monitor.ts +++ b/apps/sim/lib/billing/calculations/usage-monitor.ts @@ -3,7 +3,7 @@ import { member, organization, userStats } from '@sim/db/schema' import { eq, inArray } from 'drizzle-orm' import { getOrganizationSubscription, getPlanPricing } from '@/lib/billing/core/billing' import { getUserUsageLimit } from '@/lib/billing/core/usage' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('UsageMonitor') diff --git a/apps/sim/lib/subscription/index.ts b/apps/sim/lib/billing/client/index.ts similarity index 64% rename from apps/sim/lib/subscription/index.ts rename to apps/sim/lib/billing/client/index.ts index e4e10afceb2..24ef12179f5 100644 --- a/apps/sim/lib/subscription/index.ts +++ b/apps/sim/lib/billing/client/index.ts @@ -1,4 +1,9 @@ -// Export helper functions for subscription data +export type { + BillingStatus, + SubscriptionData, + UsageData, + UsageLimitData, +} from './types' export { canUpgrade, getBillingStatus, @@ -8,11 +13,4 @@ export { getUsage, isAtLeastPro, isAtLeastTeam, -} from '@/lib/subscription/helpers' -// Export types -export type { - BillingStatus, - SubscriptionData, - UsageData, - UsageLimitData, -} from '@/lib/subscription/types' +} from './utils' diff --git a/apps/sim/lib/subscription/types.ts b/apps/sim/lib/billing/client/types.ts similarity index 100% rename from apps/sim/lib/subscription/types.ts rename to apps/sim/lib/billing/client/types.ts diff --git a/apps/sim/lib/subscription/upgrade.ts b/apps/sim/lib/billing/client/upgrade.ts similarity index 99% rename from apps/sim/lib/subscription/upgrade.ts rename to apps/sim/lib/billing/client/upgrade.ts index 6ad93e6e21b..297efe3bb68 100644 --- a/apps/sim/lib/subscription/upgrade.ts +++ b/apps/sim/lib/billing/client/upgrade.ts @@ -1,6 +1,6 @@ import { useCallback } from 'react' import { useQueryClient } from '@tanstack/react-query' -import { client, useSession, useSubscription } from '@/lib/auth-client' +import { client, useSession, useSubscription } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { organizationKeys } from '@/hooks/queries/organization' diff --git a/apps/sim/lib/subscription/usage-visualization.ts b/apps/sim/lib/billing/client/usage-visualization.ts similarity index 100% rename from apps/sim/lib/subscription/usage-visualization.ts rename to apps/sim/lib/billing/client/usage-visualization.ts diff --git a/apps/sim/lib/subscription/helpers.ts b/apps/sim/lib/billing/client/utils.ts similarity index 99% rename from apps/sim/lib/subscription/helpers.ts rename to apps/sim/lib/billing/client/utils.ts index 60558f28f89..6ac38e90d6e 100644 --- a/apps/sim/lib/subscription/helpers.ts +++ b/apps/sim/lib/billing/client/utils.ts @@ -4,7 +4,7 @@ */ import { DEFAULT_FREE_CREDITS } from '@/lib/billing/constants' -import type { BillingStatus, SubscriptionData, UsageData } from '@/lib/subscription/types' +import type { BillingStatus, SubscriptionData, UsageData } from './types' const defaultUsage: UsageData = { current: 0, diff --git a/apps/sim/lib/billing/core/subscription.ts b/apps/sim/lib/billing/core/subscription.ts index dda969d1142..4aa977abe9d 100644 --- a/apps/sim/lib/billing/core/subscription.ts +++ b/apps/sim/lib/billing/core/subscription.ts @@ -9,9 +9,9 @@ import { getPerUserMinimumLimit, } from '@/lib/billing/subscriptions/utils' import type { UserSubscriptionState } from '@/lib/billing/types' -import { isProd } from '@/lib/environment' +import { isProd } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('SubscriptionCore') @@ -301,7 +301,7 @@ export async function sendPlanWelcomeEmail(subscription: any): Promise { const { getEmailSubject, renderPlanWelcomeEmail } = await import( '@/components/emails/render-email' ) - const { sendEmail } = await import('@/lib/email/mailer') + const { sendEmail } = await import('@/lib/messaging/email/mailer') const baseUrl = getBaseUrl() const html = await renderPlanWelcomeEmail({ diff --git a/apps/sim/lib/billing/core/usage.ts b/apps/sim/lib/billing/core/usage.ts index 2a0eab57f49..0c493cb3ab3 100644 --- a/apps/sim/lib/billing/core/usage.ts +++ b/apps/sim/lib/billing/core/usage.ts @@ -13,11 +13,11 @@ import { getPerUserMinimumLimit, } from '@/lib/billing/subscriptions/utils' import type { BillingData, UsageData, UsageLimitInfo } from '@/lib/billing/types' -import { sendEmail } from '@/lib/email/mailer' -import { getEmailPreferences } from '@/lib/email/unsubscribe' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' +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 { getEmailPreferences } from '@/lib/messaging/email/unsubscribe' const logger = createLogger('UsageManagement') diff --git a/apps/sim/lib/billing/plans.ts b/apps/sim/lib/billing/plans.ts index ca02eccb3e5..d8f88ec4933 100644 --- a/apps/sim/lib/billing/plans.ts +++ b/apps/sim/lib/billing/plans.ts @@ -3,7 +3,7 @@ import { getProTierLimit, getTeamTierLimitPerSeat, } from '@/lib/billing/subscriptions/utils' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' export interface BillingPlan { name: string diff --git a/apps/sim/lib/billing/storage/limits.ts b/apps/sim/lib/billing/storage/limits.ts index 6ba7851e9bf..f188f8bc240 100644 --- a/apps/sim/lib/billing/storage/limits.ts +++ b/apps/sim/lib/billing/storage/limits.ts @@ -12,8 +12,8 @@ import { } from '@sim/db/consts' import { organization, subscription, userStats } from '@sim/db/schema' import { eq } from 'drizzle-orm' -import { getEnv } from '@/lib/env' -import { isBillingEnabled } from '@/lib/environment' +import { getEnv } from '@/lib/core/config/env' +import { isBillingEnabled } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('StorageLimits') diff --git a/apps/sim/lib/billing/storage/tracking.ts b/apps/sim/lib/billing/storage/tracking.ts index 1aad79dbbeb..b094769e706 100644 --- a/apps/sim/lib/billing/storage/tracking.ts +++ b/apps/sim/lib/billing/storage/tracking.ts @@ -7,7 +7,7 @@ import { db } from '@sim/db' import { organization, userStats } from '@sim/db/schema' import { eq, sql } from 'drizzle-orm' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('StorageTracking') diff --git a/apps/sim/lib/billing/stripe-client.ts b/apps/sim/lib/billing/stripe-client.ts index 7a93a0bf451..264d922d681 100644 --- a/apps/sim/lib/billing/stripe-client.ts +++ b/apps/sim/lib/billing/stripe-client.ts @@ -1,5 +1,5 @@ import Stripe from 'stripe' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('StripeClient') diff --git a/apps/sim/lib/billing/subscriptions/utils.ts b/apps/sim/lib/billing/subscriptions/utils.ts index baabb5e4212..e218cef73a9 100644 --- a/apps/sim/lib/billing/subscriptions/utils.ts +++ b/apps/sim/lib/billing/subscriptions/utils.ts @@ -4,7 +4,7 @@ import { DEFAULT_PRO_TIER_COST_LIMIT, DEFAULT_TEAM_TIER_COST_LIMIT, } from '@/lib/billing/constants' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' /** * Get the free tier limit from env or fallback to default diff --git a/apps/sim/lib/billing/threshold-billing.ts b/apps/sim/lib/billing/threshold-billing.ts index 28ca37055f9..515a4a5077b 100644 --- a/apps/sim/lib/billing/threshold-billing.ts +++ b/apps/sim/lib/billing/threshold-billing.ts @@ -6,7 +6,7 @@ import { DEFAULT_OVERAGE_THRESHOLD } from '@/lib/billing/constants' import { calculateSubscriptionOverage, getPlanPricing } from '@/lib/billing/core/billing' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { requireStripeClient } from '@/lib/billing/stripe-client' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('ThresholdBilling') diff --git a/apps/sim/lib/billing/validation/seat-management.ts b/apps/sim/lib/billing/validation/seat-management.ts index be4dd4b31da..923c08b93f6 100644 --- a/apps/sim/lib/billing/validation/seat-management.ts +++ b/apps/sim/lib/billing/validation/seat-management.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { invitation, member, organization, subscription, user, userStats } from '@sim/db/schema' import { and, count, eq } from 'drizzle-orm' import { getOrganizationSubscription } from '@/lib/billing/core/billing' -import { quickValidateEmail } from '@/lib/email/validation' import { createLogger } from '@/lib/logs/console/logger' +import { quickValidateEmail } from '@/lib/messaging/email/validation' const logger = createLogger('SeatManagement') diff --git a/apps/sim/lib/billing/webhooks/enterprise.ts b/apps/sim/lib/billing/webhooks/enterprise.ts index 0ee325d6fa7..1f06806d9dc 100644 --- a/apps/sim/lib/billing/webhooks/enterprise.ts +++ b/apps/sim/lib/billing/webhooks/enterprise.ts @@ -6,9 +6,9 @@ import { getEmailSubject, renderEnterpriseSubscriptionEmail, } from '@/components/emails/render-email' -import { sendEmail } from '@/lib/email/mailer' -import { getFromEmailAddress } from '@/lib/email/utils' import { createLogger } from '@/lib/logs/console/logger' +import { sendEmail } from '@/lib/messaging/email/mailer' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' import type { EnterpriseSubscriptionMetadata } from '../types' const logger = createLogger('BillingEnterprise') diff --git a/apps/sim/lib/billing/webhooks/invoices.ts b/apps/sim/lib/billing/webhooks/invoices.ts index 9d39d8817c5..8d272aad627 100644 --- a/apps/sim/lib/billing/webhooks/invoices.ts +++ b/apps/sim/lib/billing/webhooks/invoices.ts @@ -12,10 +12,10 @@ import type Stripe from 'stripe' import PaymentFailedEmail from '@/components/emails/billing/payment-failed-email' import { calculateSubscriptionOverage } from '@/lib/billing/core/billing' import { requireStripeClient } from '@/lib/billing/stripe-client' -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('StripeInvoiceWebhooks') diff --git a/apps/sim/lib/branding/branding.ts b/apps/sim/lib/branding/branding.ts index 2b46ef3317d..e6964c05c0e 100644 --- a/apps/sim/lib/branding/branding.ts +++ b/apps/sim/lib/branding/branding.ts @@ -1,4 +1,4 @@ -import { getEnv } from '@/lib/env' +import { getEnv } from '@/lib/core/config/env' export interface ThemeColors { primaryColor?: string diff --git a/apps/sim/lib/branding/metadata.ts b/apps/sim/lib/branding/metadata.ts index 34f7ff10242..bfe0863f9fd 100644 --- a/apps/sim/lib/branding/metadata.ts +++ b/apps/sim/lib/branding/metadata.ts @@ -1,6 +1,6 @@ import type { Metadata } from 'next' import { getBrandConfig } from '@/lib/branding/branding' -import { getBaseUrl } from '@/lib/urls/utils' +import { getBaseUrl } from '@/lib/core/utils/urls' /** * Generate dynamic metadata based on brand configuration diff --git a/apps/sim/lib/chunkers/docs-chunker.ts b/apps/sim/lib/chunkers/docs-chunker.ts index e0da5528004..e8d43b9aad1 100644 --- a/apps/sim/lib/chunkers/docs-chunker.ts +++ b/apps/sim/lib/chunkers/docs-chunker.ts @@ -2,7 +2,7 @@ import fs from 'fs/promises' import path from 'path' import { TextChunker } from '@/lib/chunkers/text-chunker' import type { DocChunk, DocsChunkerOptions } from '@/lib/chunkers/types' -import { generateEmbeddings } from '@/lib/embeddings/utils' +import { generateEmbeddings } from '@/lib/knowledge/embeddings' import { createLogger } from '@/lib/logs/console/logger' interface HeaderInfo { diff --git a/apps/sim/lib/copilot/auth/permissions.ts b/apps/sim/lib/copilot/auth/permissions.ts index 2cbf7f2f3e0..204db549eda 100644 --- a/apps/sim/lib/copilot/auth/permissions.ts +++ b/apps/sim/lib/copilot/auth/permissions.ts @@ -2,7 +2,7 @@ import { db } from '@sim/db' import { workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions, type PermissionType } from '@/lib/permissions/utils' +import { getUserEntityPermissions, type PermissionType } from '@/lib/workspaces/permissions/utils' const logger = createLogger('CopilotPermissions') diff --git a/apps/sim/lib/sim-agent/utils.ts b/apps/sim/lib/copilot/chat-title.ts similarity index 97% rename from apps/sim/lib/sim-agent/utils.ts rename to apps/sim/lib/copilot/chat-title.ts index 3e4c2e1c57b..430cf73065f 100644 --- a/apps/sim/lib/sim-agent/utils.ts +++ b/apps/sim/lib/copilot/chat-title.ts @@ -1,5 +1,5 @@ import OpenAI, { AzureOpenAI } from 'openai' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('SimAgentUtils') diff --git a/apps/sim/lib/sim-agent/client.ts b/apps/sim/lib/copilot/client.ts similarity index 95% rename from apps/sim/lib/sim-agent/client.ts rename to apps/sim/lib/copilot/client.ts index 9f298e2709a..4b7864248c1 100644 --- a/apps/sim/lib/sim-agent/client.ts +++ b/apps/sim/lib/copilot/client.ts @@ -1,7 +1,7 @@ -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 { SIM_AGENT_API_URL_DEFAULT } from '@/lib/sim-agent/constants' -import { generateRequestId } from '@/lib/utils' +import { SIM_AGENT_API_URL_DEFAULT } from './constants' const logger = createLogger('SimAgentClient') diff --git a/apps/sim/lib/sim-agent/constants.ts b/apps/sim/lib/copilot/constants.ts similarity index 100% rename from apps/sim/lib/sim-agent/constants.ts rename to apps/sim/lib/copilot/constants.ts diff --git a/apps/sim/lib/copilot/process-contents.ts b/apps/sim/lib/copilot/process-contents.ts index cac8a1d0523..3bf6cf564fb 100644 --- a/apps/sim/lib/copilot/process-contents.ts +++ b/apps/sim/lib/copilot/process-contents.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { copilotChats, document, knowledgeBase, templates } from '@sim/db/schema' import { and, eq, isNull } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import type { ChatContext } from '@/stores/panel/copilot/types' export type AgentContextType = diff --git a/apps/sim/lib/copilot/auth.ts b/apps/sim/lib/copilot/request-helpers.ts similarity index 97% rename from apps/sim/lib/copilot/auth.ts rename to apps/sim/lib/copilot/request-helpers.ts index 622632a2928..bb2536f02b5 100644 --- a/apps/sim/lib/copilot/auth.ts +++ b/apps/sim/lib/copilot/request-helpers.ts @@ -1,7 +1,7 @@ import { type NextRequest, NextResponse } from 'next/server' import { authenticateApiKeyFromHeader, updateApiKeyLastUsed } from '@/lib/api-key/service' import { getSession } from '@/lib/auth' -import { generateRequestId } from '@/lib/utils' +import { generateRequestId } from '@/lib/core/utils/request' export type { NotificationStatus } from '@/lib/copilot/types' diff --git a/apps/sim/lib/copilot/tools/client/workflow/deploy-workflow.ts b/apps/sim/lib/copilot/tools/client/workflow/deploy-workflow.ts index 9f2fbefadeb..28cd675775e 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/deploy-workflow.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/deploy-workflow.ts @@ -5,7 +5,7 @@ import { ClientToolCallState, } from '@/lib/copilot/tools/client/base-tool' import { createLogger } from '@/lib/logs/console/logger' -import { getInputFormatExample } from '@/lib/workflows/deployment-utils' +import { getInputFormatExample } from '@/lib/workflows/operations/deployment-utils' import { useCopilotStore } from '@/stores/panel/copilot/store' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' diff --git a/apps/sim/lib/copilot/tools/client/workflow/edit-workflow.ts b/apps/sim/lib/copilot/tools/client/workflow/edit-workflow.ts index fef18c7315b..dedb8edc381 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/edit-workflow.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/edit-workflow.ts @@ -7,7 +7,7 @@ import { import { ExecuteResponseSuccessSchema } from '@/lib/copilot/tools/shared/schemas' import { createLogger } from '@/lib/logs/console/logger' import { stripWorkflowDiffMarkers } from '@/lib/workflows/diff' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { useWorkflowDiffStore } from '@/stores/workflow-diff/store' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' import { mergeSubblockState } from '@/stores/workflows/utils' diff --git a/apps/sim/lib/copilot/tools/client/workflow/get-user-workflow.ts b/apps/sim/lib/copilot/tools/client/workflow/get-user-workflow.ts index 531b10e7197..b66d03f7da7 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/get-user-workflow.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/get-user-workflow.ts @@ -6,7 +6,7 @@ import { } from '@/lib/copilot/tools/client/base-tool' import { createLogger } from '@/lib/logs/console/logger' import { stripWorkflowDiffMarkers } from '@/lib/workflows/diff' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' import { mergeSubblockState } from '@/stores/workflows/utils' import { useWorkflowStore } from '@/stores/workflows/workflow/store' diff --git a/apps/sim/lib/copilot/tools/client/workflow/get-workflow-from-name.ts b/apps/sim/lib/copilot/tools/client/workflow/get-workflow-from-name.ts index 161b925c28a..b310748a38a 100644 --- a/apps/sim/lib/copilot/tools/client/workflow/get-workflow-from-name.ts +++ b/apps/sim/lib/copilot/tools/client/workflow/get-workflow-from-name.ts @@ -5,7 +5,7 @@ import { ClientToolCallState, } from '@/lib/copilot/tools/client/base-tool' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { useWorkflowRegistry } from '@/stores/workflows/registry/store' const logger = createLogger('GetWorkflowFromNameClientTool') diff --git a/apps/sim/lib/copilot/tools/server/docs/search-documentation.ts b/apps/sim/lib/copilot/tools/server/docs/search-documentation.ts index c0cccf4f1ad..4702edd8bbd 100644 --- a/apps/sim/lib/copilot/tools/server/docs/search-documentation.ts +++ b/apps/sim/lib/copilot/tools/server/docs/search-documentation.ts @@ -23,7 +23,7 @@ export const searchDocumentationServerTool: BaseServerTool | Array<{ name: string; value: string }> diff --git a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts index 2e6e5ed0f47..6d18c49aedb 100644 --- a/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts +++ b/apps/sim/lib/copilot/tools/server/workflow/edit-workflow.ts @@ -4,10 +4,10 @@ import { workflow as workflowTable } from '@sim/db/schema' import { eq } from 'drizzle-orm' import type { BaseServerTool } from '@/lib/copilot/tools/server/base-tool' import { createLogger } from '@/lib/logs/console/logger' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' -import { extractAndPersistCustomTools } from '@/lib/workflows/custom-tools-persistence' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' -import { validateWorkflowState } from '@/lib/workflows/validation' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { extractAndPersistCustomTools } from '@/lib/workflows/persistence/custom-tools-persistence' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' +import { validateWorkflowState } from '@/lib/workflows/sanitization/validation' import { getAllBlocks } from '@/blocks/registry' import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils' import { TRIGGER_RUNTIME_SUBBLOCK_IDS } from '@/triggers/consts' diff --git a/apps/sim/lib/copilot/utils.ts b/apps/sim/lib/copilot/utils.ts index 07a4254cdc7..6e2357611e4 100644 --- a/apps/sim/lib/copilot/utils.ts +++ b/apps/sim/lib/copilot/utils.ts @@ -1,5 +1,5 @@ import type { NextRequest } from 'next/server' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' export function checkInternalApiKey(req: NextRequest) { const apiKey = req.headers.get('x-api-key') diff --git a/apps/sim/lib/core/config/api-keys.ts b/apps/sim/lib/core/config/api-keys.ts new file mode 100644 index 00000000000..f17e4843921 --- /dev/null +++ b/apps/sim/lib/core/config/api-keys.ts @@ -0,0 +1,42 @@ +import { env } from '@/lib/core/config/env' + +/** + * Rotates through available API keys for a provider + * @param provider - The provider to get a key for (e.g., 'openai') + * @returns The selected API key + * @throws Error if no API keys are configured for rotation + */ +export function getRotatingApiKey(provider: string): string { + if (provider !== 'openai' && provider !== 'anthropic' && provider !== 'gemini') { + throw new Error(`No rotation implemented for provider: ${provider}`) + } + + const keys = [] + + if (provider === 'openai') { + if (env.OPENAI_API_KEY_1) keys.push(env.OPENAI_API_KEY_1) + if (env.OPENAI_API_KEY_2) keys.push(env.OPENAI_API_KEY_2) + if (env.OPENAI_API_KEY_3) keys.push(env.OPENAI_API_KEY_3) + } else if (provider === 'anthropic') { + if (env.ANTHROPIC_API_KEY_1) keys.push(env.ANTHROPIC_API_KEY_1) + if (env.ANTHROPIC_API_KEY_2) keys.push(env.ANTHROPIC_API_KEY_2) + if (env.ANTHROPIC_API_KEY_3) keys.push(env.ANTHROPIC_API_KEY_3) + } else if (provider === 'gemini') { + if (env.GEMINI_API_KEY_1) keys.push(env.GEMINI_API_KEY_1) + if (env.GEMINI_API_KEY_2) keys.push(env.GEMINI_API_KEY_2) + if (env.GEMINI_API_KEY_3) keys.push(env.GEMINI_API_KEY_3) + } + + if (keys.length === 0) { + throw new Error( + `No API keys configured for rotation. Please configure ${provider.toUpperCase()}_API_KEY_1, ${provider.toUpperCase()}_API_KEY_2, or ${provider.toUpperCase()}_API_KEY_3.` + ) + } + + // Simple round-robin rotation based on current minute + // This distributes load across keys and is stateless + const currentMinute = new Date().getMinutes() + const keyIndex = currentMinute % keys.length + + return keys[keyIndex] +} diff --git a/apps/sim/lib/env.ts b/apps/sim/lib/core/config/env.ts similarity index 100% rename from apps/sim/lib/env.ts rename to apps/sim/lib/core/config/env.ts diff --git a/apps/sim/lib/environment.ts b/apps/sim/lib/core/config/environment.ts similarity index 100% rename from apps/sim/lib/environment.ts rename to apps/sim/lib/core/config/environment.ts diff --git a/apps/sim/lib/redis.ts b/apps/sim/lib/core/config/redis.ts similarity index 99% rename from apps/sim/lib/redis.ts rename to apps/sim/lib/core/config/redis.ts index 4944329a48c..19fdc16a8df 100644 --- a/apps/sim/lib/redis.ts +++ b/apps/sim/lib/core/config/redis.ts @@ -1,5 +1,5 @@ import Redis from 'ioredis' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('Redis') diff --git a/apps/sim/lib/idempotency/cleanup.ts b/apps/sim/lib/core/idempotency/cleanup.ts similarity index 100% rename from apps/sim/lib/idempotency/cleanup.ts rename to apps/sim/lib/core/idempotency/cleanup.ts diff --git a/apps/sim/lib/idempotency/index.ts b/apps/sim/lib/core/idempotency/index.ts similarity index 100% rename from apps/sim/lib/idempotency/index.ts rename to apps/sim/lib/core/idempotency/index.ts diff --git a/apps/sim/lib/idempotency/service.ts b/apps/sim/lib/core/idempotency/service.ts similarity index 99% rename from apps/sim/lib/idempotency/service.ts rename to apps/sim/lib/core/idempotency/service.ts index 31495c2a998..bc9fbf0eaed 100644 --- a/apps/sim/lib/idempotency/service.ts +++ b/apps/sim/lib/core/idempotency/service.ts @@ -2,8 +2,8 @@ import { randomUUID } from 'crypto' import { db } from '@sim/db' import { idempotencyKey } from '@sim/db/schema' import { and, eq } from 'drizzle-orm' +import { getRedisClient } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient } from '@/lib/redis' import { extractProviderIdentifierFromBody } from '@/lib/webhooks/provider-utils' const logger = createLogger('IdempotencyService') diff --git a/apps/sim/lib/security/csp.ts b/apps/sim/lib/core/security/csp.ts similarity index 99% rename from apps/sim/lib/security/csp.ts rename to apps/sim/lib/core/security/csp.ts index 3c502e15296..01ce111f14f 100644 --- a/apps/sim/lib/security/csp.ts +++ b/apps/sim/lib/core/security/csp.ts @@ -1,4 +1,4 @@ -import { env, getEnv } from '../env' +import { env, getEnv } from '../config/env' /** * Content Security Policy (CSP) configuration builder diff --git a/apps/sim/lib/core/security/encryption.ts b/apps/sim/lib/core/security/encryption.ts new file mode 100644 index 00000000000..5ff0c9c845f --- /dev/null +++ b/apps/sim/lib/core/security/encryption.ts @@ -0,0 +1,84 @@ +import { createCipheriv, createDecipheriv, randomBytes } from 'crypto' +import { env } from '@/lib/core/config/env' +import { createLogger } from '@/lib/logs/console/logger' + +const logger = createLogger('Encryption') + +function getEncryptionKey(): Buffer { + const key = env.ENCRYPTION_KEY + if (!key || key.length !== 64) { + throw new Error('ENCRYPTION_KEY must be set to a 64-character hex string (32 bytes)') + } + return Buffer.from(key, 'hex') +} + +/** + * Encrypts a secret using AES-256-GCM + * @param secret - The secret to encrypt + * @returns A promise that resolves to an object containing the encrypted secret and IV + */ +export async function encryptSecret(secret: string): Promise<{ encrypted: string; iv: string }> { + const iv = randomBytes(16) + const key = getEncryptionKey() + + const cipher = createCipheriv('aes-256-gcm', key, iv) + let encrypted = cipher.update(secret, 'utf8', 'hex') + encrypted += cipher.final('hex') + + const authTag = cipher.getAuthTag() + + // Format: iv:encrypted:authTag + return { + encrypted: `${iv.toString('hex')}:${encrypted}:${authTag.toString('hex')}`, + iv: iv.toString('hex'), + } +} + +/** + * Decrypts an encrypted secret + * @param encryptedValue - The encrypted value in format "iv:encrypted:authTag" + * @returns A promise that resolves to an object containing the decrypted secret + */ +export async function decryptSecret(encryptedValue: string): Promise<{ decrypted: string }> { + const parts = encryptedValue.split(':') + const ivHex = parts[0] + const authTagHex = parts[parts.length - 1] + const encrypted = parts.slice(1, -1).join(':') + + if (!ivHex || !encrypted || !authTagHex) { + throw new Error('Invalid encrypted value format. Expected "iv:encrypted:authTag"') + } + + const key = getEncryptionKey() + const iv = Buffer.from(ivHex, 'hex') + const authTag = Buffer.from(authTagHex, 'hex') + + try { + const decipher = createDecipheriv('aes-256-gcm', key, iv) + decipher.setAuthTag(authTag) + + let decrypted = decipher.update(encrypted, 'hex', 'utf8') + decrypted += decipher.final('utf8') + + return { decrypted } + } catch (error: any) { + logger.error('Decryption error:', { error: error.message }) + throw error + } +} + +/** + * Generates a secure random password + * @param length - The length of the password (default: 24) + * @returns A new secure password string + */ +export function generatePassword(length = 24): string { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_-+=' + let result = '' + + for (let i = 0; i < length; i++) { + result += chars.charAt(Math.floor(Math.random() * chars.length)) + } + + return result +} diff --git a/apps/sim/lib/security/input-validation.test.ts b/apps/sim/lib/core/security/input-validation.test.ts similarity index 99% rename from apps/sim/lib/security/input-validation.test.ts rename to apps/sim/lib/core/security/input-validation.test.ts index 2a9b5b4df73..e8250f34da5 100644 --- a/apps/sim/lib/security/input-validation.test.ts +++ b/apps/sim/lib/core/security/input-validation.test.ts @@ -8,7 +8,7 @@ import { validateNumericId, validatePathSegment, validateUUID, -} from '@/lib/security/input-validation' +} from '@/lib/core/security/input-validation' describe('validatePathSegment', () => { describe('valid inputs', () => { diff --git a/apps/sim/lib/security/input-validation.ts b/apps/sim/lib/core/security/input-validation.ts similarity index 100% rename from apps/sim/lib/security/input-validation.ts rename to apps/sim/lib/core/security/input-validation.ts diff --git a/apps/sim/lib/core/security/redaction.ts b/apps/sim/lib/core/security/redaction.ts new file mode 100644 index 00000000000..64e795deb22 --- /dev/null +++ b/apps/sim/lib/core/security/redaction.ts @@ -0,0 +1,34 @@ +/** + * Recursively redacts API keys in an object + * @param obj The object to redact API keys from + * @returns A new object with API keys redacted + */ +export const redactApiKeys = (obj: any): any => { + if (!obj || typeof obj !== 'object') { + return obj + } + + if (Array.isArray(obj)) { + return obj.map(redactApiKeys) + } + + const result: Record = {} + + for (const [key, value] of Object.entries(obj)) { + if ( + key.toLowerCase() === 'apikey' || + key.toLowerCase() === 'api_key' || + key.toLowerCase() === 'access_token' || + /\bsecret\b/i.test(key.toLowerCase()) || + /\bpassword\b/i.test(key.toLowerCase()) + ) { + result[key] = '***REDACTED***' + } else if (typeof value === 'object' && value !== null) { + result[key] = redactApiKeys(value) + } else { + result[key] = value + } + } + + return result +} diff --git a/apps/sim/lib/telemetry/tracer.ts b/apps/sim/lib/core/telemetry.ts similarity index 100% rename from apps/sim/lib/telemetry/tracer.ts rename to apps/sim/lib/core/telemetry.ts diff --git a/apps/sim/lib/utils.test.ts b/apps/sim/lib/core/utils.test.ts similarity index 96% rename from apps/sim/lib/utils.test.ts rename to apps/sim/lib/core/utils.test.ts index 4b04c23858f..7b69a51ace1 100644 --- a/apps/sim/lib/utils.test.ts +++ b/apps/sim/lib/core/utils.test.ts @@ -1,20 +1,17 @@ import { afterEach, describe, expect, it, vi } from 'vitest' +import { getRotatingApiKey } from '@/lib/core/config/api-keys' +import { decryptSecret, encryptSecret } from '@/lib/core/security/encryption' +import { redactApiKeys } from '@/lib/core/security/redaction' +import { cn } from '@/lib/core/utils/cn' import { - cn, - convertScheduleOptionsToCron, - decryptSecret, - encryptSecret, formatDate, formatDateTime, formatDuration, formatTime, - getInvalidCharacters, - getRotatingApiKey, getTimezoneAbbreviation, - isValidName, - redactApiKeys, - validateName, -} from '@/lib/utils' +} from '@/lib/core/utils/formatting' +import { convertScheduleOptionsToCron } from '@/lib/core/utils/scheduling' +import { getInvalidCharacters, isValidName, validateName } from '@/lib/core/utils/validation' vi.mock('crypto', () => ({ createCipheriv: vi.fn().mockReturnValue({ @@ -34,7 +31,7 @@ vi.mock('crypto', () => ({ }), })) -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { ENCRYPTION_KEY: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef', OPENAI_API_KEY_1: 'test-openai-key-1', diff --git a/apps/sim/lib/browser-storage.ts b/apps/sim/lib/core/utils/browser-storage.ts similarity index 100% rename from apps/sim/lib/browser-storage.ts rename to apps/sim/lib/core/utils/browser-storage.ts diff --git a/apps/sim/lib/core/utils/cn.ts b/apps/sim/lib/core/utils/cn.ts new file mode 100644 index 00000000000..952d546a76e --- /dev/null +++ b/apps/sim/lib/core/utils/cn.ts @@ -0,0 +1,9 @@ +import { type ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +/** + * Combines class names using clsx and tailwind-merge + */ +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} diff --git a/apps/sim/lib/core/utils/display-filters.ts b/apps/sim/lib/core/utils/display-filters.ts new file mode 100644 index 00000000000..c55a7669cff --- /dev/null +++ b/apps/sim/lib/core/utils/display-filters.ts @@ -0,0 +1,85 @@ +/** + * Type guard to check if an object is a UserFile + */ +export function isUserFile(candidate: unknown): candidate is { + id: string + name: string + url: string + key: string + size: number + type: string + context?: string +} { + if (!candidate || typeof candidate !== 'object') { + return false + } + + const value = candidate as Record + return ( + typeof value.id === 'string' && + typeof value.key === 'string' && + typeof value.url === 'string' && + typeof value.name === 'string' + ) +} + +/** + * Filter function that transforms UserFile objects for display + * Removes internal fields: key, context + * Keeps user-friendly fields: id, name, url, size, type + */ +function filterUserFile(data: any): any { + if (isUserFile(data)) { + const { id, name, url, size, type } = data + return { id, name, url, size, type } + } + return data +} + +/** + * Registry of filter functions to apply to data for cleaner display in logs/console. + * Add new filter functions here to handle additional data types. + */ +const DISPLAY_FILTERS = [ + filterUserFile, + // Add more filters here as needed +] + +/** + * Generic helper to filter internal/technical fields from data for cleaner display in logs and console. + * Applies all registered filters recursively to the data structure. + * + * To add a new filter: + * 1. Create a filter function that checks and transforms a specific data type + * 2. Add it to the DISPLAY_FILTERS array above + * + * @param data - Data to filter (objects, arrays, primitives) + * @returns Filtered data with internal fields removed + */ +export function filterForDisplay(data: any): any { + if (!data || typeof data !== 'object') { + return data + } + + // Apply all registered filters + const filtered = data + for (const filterFn of DISPLAY_FILTERS) { + const result = filterFn(filtered) + if (result !== filtered) { + // Filter matched and transformed the data + return result + } + } + + // No filters matched - recursively filter nested structures + if (Array.isArray(filtered)) { + return filtered.map(filterForDisplay) + } + + // Recursively filter object properties + const result: any = {} + for (const [key, value] of Object.entries(filtered)) { + result[key] = filterForDisplay(value) + } + return result +} diff --git a/apps/sim/lib/core/utils/formatting.ts b/apps/sim/lib/core/utils/formatting.ts new file mode 100644 index 00000000000..5543026f56a --- /dev/null +++ b/apps/sim/lib/core/utils/formatting.ts @@ -0,0 +1,141 @@ +/** + * Get a user-friendly timezone abbreviation + * @param timezone - IANA timezone string + * @param date - Date to check for DST + * @returns A simplified timezone string (e.g., "PST" instead of "America/Los_Angeles") + */ +export function getTimezoneAbbreviation(timezone: string, date: Date = new Date()): string { + if (timezone === 'UTC') return 'UTC' + + // Common timezone mappings + const timezoneMap: Record = { + 'America/Los_Angeles': { standard: 'PST', daylight: 'PDT' }, + 'America/Denver': { standard: 'MST', daylight: 'MDT' }, + 'America/Chicago': { standard: 'CST', daylight: 'CDT' }, + 'America/New_York': { standard: 'EST', daylight: 'EDT' }, + 'Europe/London': { standard: 'GMT', daylight: 'BST' }, + 'Europe/Paris': { standard: 'CET', daylight: 'CEST' }, + 'Asia/Tokyo': { standard: 'JST', daylight: 'JST' }, // Japan doesn't use DST + 'Australia/Sydney': { standard: 'AEST', daylight: 'AEDT' }, + 'Asia/Singapore': { standard: 'SGT', daylight: 'SGT' }, // Singapore doesn't use DST + } + + // If we have a mapping for this timezone + if (timezone in timezoneMap) { + // January 1 is guaranteed to be standard time in northern hemisphere + // July 1 is guaranteed to be daylight time in northern hemisphere (if observed) + const januaryDate = new Date(date.getFullYear(), 0, 1) + const julyDate = new Date(date.getFullYear(), 6, 1) + + // Get offset in January (standard time) + const januaryFormatter = new Intl.DateTimeFormat('en-US', { + timeZone: timezone, + timeZoneName: 'short', + }) + + // Get offset in July (likely daylight time) + const julyFormatter = new Intl.DateTimeFormat('en-US', { + timeZone: timezone, + timeZoneName: 'short', + }) + + // If offsets are different, timezone observes DST + const isDSTObserved = januaryFormatter.format(januaryDate) !== julyFormatter.format(julyDate) + + // If DST is observed, check if current date is in DST by comparing its offset + // with January's offset (standard time) + if (isDSTObserved) { + const currentFormatter = new Intl.DateTimeFormat('en-US', { + timeZone: timezone, + timeZoneName: 'short', + }) + + const isDST = currentFormatter.format(date) !== januaryFormatter.format(januaryDate) + return isDST ? timezoneMap[timezone].daylight : timezoneMap[timezone].standard + } + + // If DST is not observed, always use standard + return timezoneMap[timezone].standard + } + + // For unknown timezones, use full IANA name + return timezone +} + +/** + * Format a date into a human-readable format + * @param date - The date to format + * @param timezone - Optional IANA timezone string (e.g., 'America/Los_Angeles', 'UTC') + * @returns A formatted date string in the format "MMM D, YYYY h:mm A" + */ +export function formatDateTime(date: Date, timezone?: string): string { + const formattedDate = date.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + hour: 'numeric', + minute: '2-digit', + hour12: true, + timeZone: timezone || undefined, + }) + + // If timezone is provided, add a friendly timezone abbreviation + if (timezone) { + const tzAbbr = getTimezoneAbbreviation(timezone, date) + return `${formattedDate} ${tzAbbr}` + } + + return formattedDate +} + +/** + * Format a date into a short format + * @param date - The date to format + * @returns A formatted date string in the format "MMM D, YYYY" + */ +export function formatDate(date: Date): string { + return date.toLocaleString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric', + }) +} + +/** + * Format a time into a short format + * @param date - The date to format + * @returns A formatted time string in the format "h:mm A" + */ +export function formatTime(date: Date): string { + return date.toLocaleString('en-US', { + hour: 'numeric', + minute: '2-digit', + hour12: true, + }) +} + +/** + * Format a duration in milliseconds to a human-readable format + * @param durationMs - The duration in milliseconds + * @returns A formatted duration string + */ +export function formatDuration(durationMs: number): string { + if (durationMs < 1000) { + return `${durationMs}ms` + } + + const seconds = Math.floor(durationMs / 1000) + if (seconds < 60) { + return `${seconds}s` + } + + const minutes = Math.floor(seconds / 60) + const remainingSeconds = seconds % 60 + if (minutes < 60) { + return `${minutes}m ${remainingSeconds}s` + } + + const hours = Math.floor(minutes / 60) + const remainingMinutes = minutes % 60 + return `${hours}h ${remainingMinutes}m` +} diff --git a/apps/sim/lib/core/utils/optimistic-update.ts b/apps/sim/lib/core/utils/optimistic-update.ts new file mode 100644 index 00000000000..e0776c718f7 --- /dev/null +++ b/apps/sim/lib/core/utils/optimistic-update.ts @@ -0,0 +1,103 @@ +import { createLogger } from '@/lib/logs/console/logger' + +const logger = createLogger('OptimisticUpdate') + +/** + * Options for performing an optimistic update with automatic rollback on error + */ +export interface OptimisticUpdateOptions { + /** + * Function that returns the current state value (for rollback purposes) + */ + getCurrentState: () => T + /** + * Function that performs the optimistic update to the UI state + */ + optimisticUpdate: () => void + /** + * Async function that performs the actual API call + */ + apiCall: () => Promise + /** + * Function that rolls back the state to the original value + * @param originalValue - The value returned by getCurrentState before the update + */ + rollback: (originalValue: T) => void + /** + * Optional error message to log if the operation fails + */ + errorMessage?: string + /** + * Optional callback to execute on error (e.g., show toast notification) + */ + onError?: (error: Error, originalValue: T) => void + /** + * Optional callback that always runs regardless of success or error (e.g., to clear loading states) + */ + onComplete?: () => void +} + +/** + * Performs an optimistic update with automatic rollback on error. + * This utility standardizes the pattern of: + * 1. Save current state + * 2. Update UI optimistically + * 3. Make API call + * 4. Rollback on error + * + * @example + * ```typescript + * await withOptimisticUpdate({ + * getCurrentState: () => get().folders[id], + * optimisticUpdate: () => set(state => ({ + * folders: { ...state.folders, [id]: { ...folder, name: newName } } + * })), + * apiCall: async () => { + * await fetch(`/api/folders/${id}`, { + * method: 'PUT', + * body: JSON.stringify({ name: newName }) + * }) + * }, + * rollback: (originalFolder) => set(state => ({ + * folders: { ...state.folders, [id]: originalFolder } + * })), + * errorMessage: 'Failed to rename folder', + * onError: (error) => toast.error('Could not rename folder') + * }) + * ``` + */ +export async function withOptimisticUpdate(options: OptimisticUpdateOptions): Promise { + const { + getCurrentState, + optimisticUpdate, + apiCall, + rollback, + errorMessage, + onError, + onComplete, + } = options + + const originalValue = getCurrentState() + + optimisticUpdate() + + try { + await apiCall() + } catch (error) { + rollback(originalValue) + + if (errorMessage) { + logger.error(errorMessage, { error }) + } + + if (onError && error instanceof Error) { + onError(error, originalValue) + } + + throw error + } finally { + if (onComplete) { + onComplete() + } + } +} diff --git a/apps/sim/lib/core/utils/request.ts b/apps/sim/lib/core/utils/request.ts new file mode 100644 index 00000000000..6e64b9b108e --- /dev/null +++ b/apps/sim/lib/core/utils/request.ts @@ -0,0 +1,11 @@ +/** + * Generate a short request ID for correlation + */ +export function generateRequestId(): string { + return crypto.randomUUID().slice(0, 8) +} + +/** + * No-operation function for use as default callback + */ +export const noop = () => {} diff --git a/apps/sim/lib/response-format.ts b/apps/sim/lib/core/utils/response-format.ts similarity index 100% rename from apps/sim/lib/response-format.ts rename to apps/sim/lib/core/utils/response-format.ts diff --git a/apps/sim/lib/core/utils/scheduling.ts b/apps/sim/lib/core/utils/scheduling.ts new file mode 100644 index 00000000000..ad24ae7d2ba --- /dev/null +++ b/apps/sim/lib/core/utils/scheduling.ts @@ -0,0 +1,51 @@ +/** + * Converts schedule options to a cron expression + */ +export function convertScheduleOptionsToCron( + scheduleType: string, + options: Record +): string { + switch (scheduleType) { + case 'minutes': { + const interval = options.minutesInterval || '15' + // For example, if options.minutesStartingAt is provided, use that as the start minute. + return `*/${interval} * * * *` + } + case 'hourly': { + // When scheduling hourly, take the specified minute offset + return `${options.hourlyMinute || '00'} * * * *` + } + case 'daily': { + // Expected dailyTime in HH:MM + const [minute, hour] = (options.dailyTime || '00:09').split(':') + return `${minute || '00'} ${hour || '09'} * * *` + } + case 'weekly': { + // Expected weeklyDay as MON, TUE, etc. and weeklyDayTime in HH:MM + const dayMap: Record = { + MON: 1, + TUE: 2, + WED: 3, + THU: 4, + FRI: 5, + SAT: 6, + SUN: 0, + } + const day = dayMap[options.weeklyDay || 'MON'] + const [minute, hour] = (options.weeklyDayTime || '00:09').split(':') + return `${minute || '00'} ${hour || '09'} * * ${day}` + } + case 'monthly': { + // Expected monthlyDay and monthlyTime in HH:MM + const day = options.monthlyDay || '1' + const [minute, hour] = (options.monthlyTime || '00:09').split(':') + return `${minute || '00'} ${hour || '09'} ${day} * *` + } + case 'custom': { + // Use the provided cron expression directly + return options.cronExpression + } + default: + throw new Error('Unsupported schedule type') + } +} diff --git a/apps/sim/lib/core/utils/sse.ts b/apps/sim/lib/core/utils/sse.ts new file mode 100644 index 00000000000..93041ca279a --- /dev/null +++ b/apps/sim/lib/core/utils/sse.ts @@ -0,0 +1,21 @@ +/** + * Standard headers for Server-Sent Events responses + */ +export const SSE_HEADERS = { + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + Connection: 'keep-alive', + 'X-Accel-Buffering': 'no', +} as const + +/** + * Encodes data as a Server-Sent Events (SSE) message. + * Formats the data as a JSON string prefixed with "data:" and suffixed with two newlines, + * then encodes it as a Uint8Array for streaming. + * + * @param data - The data to encode and send via SSE + * @returns The encoded SSE message as a Uint8Array + */ +export function encodeSSE(data: any): Uint8Array { + return new TextEncoder().encode(`data: ${JSON.stringify(data)}\n\n`) +} diff --git a/apps/sim/lib/theme-sync.ts b/apps/sim/lib/core/utils/theme.ts similarity index 100% rename from apps/sim/lib/theme-sync.ts rename to apps/sim/lib/core/utils/theme.ts diff --git a/apps/sim/lib/urls/utils.ts b/apps/sim/lib/core/utils/urls.ts similarity index 94% rename from apps/sim/lib/urls/utils.ts rename to apps/sim/lib/core/utils/urls.ts index 0b623b1ebf0..e740ac52fc9 100644 --- a/apps/sim/lib/urls/utils.ts +++ b/apps/sim/lib/core/utils/urls.ts @@ -1,5 +1,5 @@ -import { getEnv } from '@/lib/env' -import { isProd } from '@/lib/environment' +import { getEnv } from '@/lib/core/config/env' +import { isProd } from '@/lib/core/config/environment' /** * Returns the base URL of the application from NEXT_PUBLIC_APP_URL diff --git a/apps/sim/lib/core/utils/validation.ts b/apps/sim/lib/core/utils/validation.ts new file mode 100644 index 00000000000..b8b221fac07 --- /dev/null +++ b/apps/sim/lib/core/utils/validation.ts @@ -0,0 +1,33 @@ +/** + * Validates a name by removing any characters that could cause issues + * with variable references or node naming. + * + * @param name - The name to validate + * @returns The validated name with invalid characters removed, trimmed, and collapsed whitespace + */ +export function validateName(name: string): string { + return name + .replace(/[^a-zA-Z0-9_\s]/g, '') // Remove invalid characters + .replace(/\s+/g, ' ') // Collapse multiple spaces into single spaces +} + +/** + * Checks if a name contains invalid characters + * + * @param name - The name to check + * @returns True if the name is valid, false otherwise + */ +export function isValidName(name: string): boolean { + return /^[a-zA-Z0-9_\s]*$/.test(name) +} + +/** + * Gets a list of invalid characters in a name + * + * @param name - The name to check + * @returns Array of invalid characters found + */ +export function getInvalidCharacters(name: string): string[] { + const invalidChars = name.match(/[^a-zA-Z0-9_\s]/g) + return invalidChars ? [...new Set(invalidChars)] : [] +} diff --git a/apps/sim/lib/environment/utils.ts b/apps/sim/lib/environment/utils.ts index 74e25f59fdb..764361cd2c7 100644 --- a/apps/sim/lib/environment/utils.ts +++ b/apps/sim/lib/environment/utils.ts @@ -1,8 +1,8 @@ import { db } from '@sim/db' import { environment, workspaceEnvironment } from '@sim/db/schema' import { eq } from 'drizzle-orm' +import { decryptSecret } from '@/lib/core/security/encryption' import { createLogger } from '@/lib/logs/console/logger' -import { decryptSecret } from '@/lib/utils' const logger = createLogger('EnvironmentUtils') diff --git a/apps/sim/lib/execution/e2b.ts b/apps/sim/lib/execution/e2b.ts index c11995ee665..fb6312c6d22 100644 --- a/apps/sim/lib/execution/e2b.ts +++ b/apps/sim/lib/execution/e2b.ts @@ -1,5 +1,5 @@ import { Sandbox } from '@e2b/code-interpreter' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { CodeLanguage } from '@/lib/execution/languages' import { createLogger } from '@/lib/logs/console/logger' diff --git a/apps/sim/lib/execution/files.ts b/apps/sim/lib/execution/files.ts index efa84af5e69..718d1e203a2 100644 --- a/apps/sim/lib/execution/files.ts +++ b/apps/sim/lib/execution/files.ts @@ -1,7 +1,7 @@ import { v4 as uuidv4 } from 'uuid' import { createLogger } from '@/lib/logs/console/logger' import { uploadExecutionFile } from '@/lib/uploads/contexts/execution' -import { TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { TRIGGER_TYPES } from '@/lib/workflows/triggers/triggers' import type { InputFormatField } from '@/lib/workflows/types' import type { UserFile } from '@/executor/types' import type { SerializedBlock } from '@/serializer/types' diff --git a/apps/sim/lib/guardrails/validate_hallucination.ts b/apps/sim/lib/guardrails/validate_hallucination.ts index 409b8bb2ef1..fd57526db7b 100644 --- a/apps/sim/lib/guardrails/validate_hallucination.ts +++ b/apps/sim/lib/guardrails/validate_hallucination.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { executeProviderRequest } from '@/providers' import { getApiKey, getProviderFromModel } from '@/providers/utils' diff --git a/apps/sim/lib/knowledge/chunks/service.ts b/apps/sim/lib/knowledge/chunks/service.ts index b63f7dbde16..50cd0bc5947 100644 --- a/apps/sim/lib/knowledge/chunks/service.ts +++ b/apps/sim/lib/knowledge/chunks/service.ts @@ -2,7 +2,6 @@ import { createHash, randomUUID } from 'crypto' import { db } from '@sim/db' import { document, embedding } from '@sim/db/schema' import { and, asc, eq, ilike, inArray, sql } from 'drizzle-orm' -import { generateEmbeddings } from '@/lib/embeddings/utils' import type { BatchOperationResult, ChunkData, @@ -10,6 +9,7 @@ import type { ChunkQueryResult, CreateChunkData, } from '@/lib/knowledge/chunks/types' +import { generateEmbeddings } from '@/lib/knowledge/embeddings' import { createLogger } from '@/lib/logs/console/logger' import { estimateTokenCount } from '@/lib/tokenization/estimators' diff --git a/apps/sim/lib/knowledge/consts.ts b/apps/sim/lib/knowledge/constants.ts similarity index 100% rename from apps/sim/lib/knowledge/consts.ts rename to apps/sim/lib/knowledge/constants.ts diff --git a/apps/sim/lib/knowledge/documents/document-processor.ts b/apps/sim/lib/knowledge/documents/document-processor.ts index c11ce78dc81..f3473b5b246 100644 --- a/apps/sim/lib/knowledge/documents/document-processor.ts +++ b/apps/sim/lib/knowledge/documents/document-processor.ts @@ -1,5 +1,5 @@ import { type Chunk, JsonYamlChunker, StructuredDataChunker, TextChunker } from '@/lib/chunkers' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { parseBuffer, parseFile } from '@/lib/file-parsers' import { retryWithExponentialBackoff } from '@/lib/knowledge/documents/utils' import { createLogger } from '@/lib/logs/console/logger' @@ -400,7 +400,7 @@ async function parseWithMistralOCR( const isInternalRoute = url.startsWith('/') if (isInternalRoute) { - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') url = `${getBaseUrl()}${url}` } diff --git a/apps/sim/lib/knowledge/documents/queue.ts b/apps/sim/lib/knowledge/documents/queue.ts index 93fa4e6013a..caf05fe66db 100644 --- a/apps/sim/lib/knowledge/documents/queue.ts +++ b/apps/sim/lib/knowledge/documents/queue.ts @@ -1,5 +1,5 @@ +import { getRedisClient } from '@/lib/core/config/redis' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient } from '@/lib/redis' const logger = createLogger('DocumentQueue') diff --git a/apps/sim/lib/knowledge/documents/service.ts b/apps/sim/lib/knowledge/documents/service.ts index 77c83875fd5..cee66e1ed71 100644 --- a/apps/sim/lib/knowledge/documents/service.ts +++ b/apps/sim/lib/knowledge/documents/service.ts @@ -3,15 +3,15 @@ import { db } from '@sim/db' import { document, embedding, knowledgeBase, knowledgeBaseTagDefinitions } from '@sim/db/schema' import { tasks } from '@trigger.dev/sdk' import { and, asc, desc, eq, inArray, isNull, sql } from 'drizzle-orm' -import { generateEmbeddings } from '@/lib/embeddings/utils' -import { env } from '@/lib/env' -import { getSlotsForFieldType, type TAG_SLOT_CONFIG } from '@/lib/knowledge/consts' +import { env } from '@/lib/core/config/env' +import { getRedisClient } from '@/lib/core/config/redis' +import { getSlotsForFieldType, type TAG_SLOT_CONFIG } from '@/lib/knowledge/constants' import { processDocument } from '@/lib/knowledge/documents/document-processor' import { DocumentProcessingQueue } from '@/lib/knowledge/documents/queue' import type { DocumentSortField, SortOrder } from '@/lib/knowledge/documents/types' +import { generateEmbeddings } from '@/lib/knowledge/embeddings' import { getNextAvailableSlot } from '@/lib/knowledge/tags/service' import { createLogger } from '@/lib/logs/console/logger' -import { getRedisClient } from '@/lib/redis' import type { DocumentProcessingPayload } from '@/background/knowledge-processing' const logger = createLogger('DocumentService') diff --git a/apps/sim/lib/embeddings/utils.ts b/apps/sim/lib/knowledge/embeddings.ts similarity index 99% rename from apps/sim/lib/embeddings/utils.ts rename to apps/sim/lib/knowledge/embeddings.ts index 76c24b117a7..a867d701e4a 100644 --- a/apps/sim/lib/embeddings/utils.ts +++ b/apps/sim/lib/knowledge/embeddings.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { isRetryableError, retryWithExponentialBackoff } from '@/lib/knowledge/documents/utils' import { createLogger } from '@/lib/logs/console/logger' import { batchByTokenLimit, getTotalTokenCount } from '@/lib/tokenization' diff --git a/apps/sim/lib/knowledge/service.ts b/apps/sim/lib/knowledge/service.ts index 52b8585c7a8..bb43dab6726 100644 --- a/apps/sim/lib/knowledge/service.ts +++ b/apps/sim/lib/knowledge/service.ts @@ -8,7 +8,7 @@ import type { KnowledgeBaseWithCounts, } from '@/lib/knowledge/types' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('KnowledgeBaseService') diff --git a/apps/sim/lib/knowledge/tags/service.ts b/apps/sim/lib/knowledge/tags/service.ts index 17ce0f962a3..dd9dca19410 100644 --- a/apps/sim/lib/knowledge/tags/service.ts +++ b/apps/sim/lib/knowledge/tags/service.ts @@ -6,7 +6,7 @@ import { getSlotsForFieldType, SUPPORTED_FIELD_TYPES, type TAG_SLOT_CONFIG, -} from '@/lib/knowledge/consts' +} from '@/lib/knowledge/constants' import type { BulkTagDefinitionsData, DocumentTagDefinition } from '@/lib/knowledge/tags/types' import type { CreateTagDefinitionData, diff --git a/apps/sim/lib/logs/console/logger.ts b/apps/sim/lib/logs/console/logger.ts index 0c218d2ba11..5046ae818cf 100644 --- a/apps/sim/lib/logs/console/logger.ts +++ b/apps/sim/lib/logs/console/logger.ts @@ -5,7 +5,7 @@ * It is separate from the user-facing logging system in logging.ts. */ import chalk from 'chalk' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' /** * LogLevel enum defines the severity levels for logging diff --git a/apps/sim/lib/logs/execution/logger.ts b/apps/sim/lib/logs/execution/logger.ts index 3b0b978a7b0..046cd77e69e 100644 --- a/apps/sim/lib/logs/execution/logger.ts +++ b/apps/sim/lib/logs/execution/logger.ts @@ -12,7 +12,9 @@ import { v4 as uuidv4 } from 'uuid' import { getHighestPrioritySubscription } from '@/lib/billing/core/subscription' import { checkUsageStatus, maybeSendUsageThresholdEmail } from '@/lib/billing/core/usage' import { checkAndBillOverageThreshold } from '@/lib/billing/threshold-billing' -import { isBillingEnabled } from '@/lib/environment' +import { isBillingEnabled } from '@/lib/core/config/environment' +import { redactApiKeys } from '@/lib/core/security/redaction' +import { filterForDisplay } from '@/lib/core/utils/display-filters' import { createLogger } from '@/lib/logs/console/logger' import { emitWorkflowExecutionCompleted } from '@/lib/logs/events' import { snapshotService } from '@/lib/logs/execution/snapshot/service' @@ -26,7 +28,6 @@ import type { WorkflowExecutionSnapshot, WorkflowState, } from '@/lib/logs/types' -import { filterForDisplay, redactApiKeys } from '@/lib/utils' export interface ToolCall { name: string diff --git a/apps/sim/lib/logs/execution/logging-factory.ts b/apps/sim/lib/logs/execution/logging-factory.ts index ba208619e41..0cc5a243dd0 100644 --- a/apps/sim/lib/logs/execution/logging-factory.ts +++ b/apps/sim/lib/logs/execution/logging-factory.ts @@ -1,6 +1,6 @@ import { BASE_EXECUTION_CHARGE } from '@/lib/billing/constants' import type { ExecutionEnvironment, ExecutionTrigger, WorkflowState } from '@/lib/logs/types' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' export function createTriggerObject( type: ExecutionTrigger['type'], diff --git a/apps/sim/lib/logs/execution/logging-session.ts b/apps/sim/lib/logs/execution/logging-session.ts index 227e55fa5c9..d19904e5da8 100644 --- a/apps/sim/lib/logs/execution/logging-session.ts +++ b/apps/sim/lib/logs/execution/logging-session.ts @@ -140,7 +140,7 @@ export class LoggingSession { // Track workflow execution outcome if (traceSpans && traceSpans.length > 0) { try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') // Determine status from trace spans const hasErrors = traceSpans.some((span: any) => { @@ -227,7 +227,7 @@ export class LoggingSession { // Track workflow execution error outcome try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') trackPlatformEvent('platform.workflow.executed', { 'workflow.id': this.workflowId, 'execution.duration_ms': Math.max(1, durationMs), diff --git a/apps/sim/lib/mcp/middleware.ts b/apps/sim/lib/mcp/middleware.ts index 4cb109b4a9f..82b0fc6e044 100644 --- a/apps/sim/lib/mcp/middleware.ts +++ b/apps/sim/lib/mcp/middleware.ts @@ -1,9 +1,9 @@ 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 { createMcpErrorResponse } from '@/lib/mcp/utils' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { generateRequestId } from '@/lib/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('McpAuthMiddleware') diff --git a/apps/sim/lib/mcp/service.ts b/apps/sim/lib/mcp/service.ts index ac741e11bc5..64e9afb5d1a 100644 --- a/apps/sim/lib/mcp/service.ts +++ b/apps/sim/lib/mcp/service.ts @@ -5,7 +5,8 @@ import { db } from '@sim/db' import { mcpServers } from '@sim/db/schema' import { and, eq, isNull } from 'drizzle-orm' -import { isTest } from '@/lib/environment' +import { isTest } from '@/lib/core/config/environment' +import { generateRequestId } from '@/lib/core/utils/request' import { getEffectiveDecryptedEnv } from '@/lib/environment/utils' import { createLogger } from '@/lib/logs/console/logger' import { McpClient } from '@/lib/mcp/client' @@ -18,7 +19,6 @@ import type { McpTransport, } from '@/lib/mcp/types' import { MCP_CONSTANTS } from '@/lib/mcp/utils' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('McpService') diff --git a/apps/sim/lib/email/mailer.test.ts b/apps/sim/lib/messaging/email/mailer.test.ts similarity index 98% rename from apps/sim/lib/email/mailer.test.ts rename to apps/sim/lib/messaging/email/mailer.test.ts index c9c4ca17e61..021e513e6bb 100644 --- a/apps/sim/lib/email/mailer.test.ts +++ b/apps/sim/lib/messaging/email/mailer.test.ts @@ -26,12 +26,12 @@ vi.mock('@azure/communication-email', () => { } }) -vi.mock('@/lib/email/unsubscribe', () => ({ +vi.mock('@/lib/messaging/email/unsubscribe', () => ({ isUnsubscribed: vi.fn(), generateUnsubscribeToken: vi.fn(), })) -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { RESEND_API_KEY: 'test-api-key', AZURE_ACS_CONNECTION_STRING: 'test-azure-connection-string', @@ -41,13 +41,13 @@ vi.mock('@/lib/env', () => ({ }, })) -vi.mock('@/lib/urls/utils', () => ({ +vi.mock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn().mockReturnValue('sim.ai'), getBaseUrl: vi.fn().mockReturnValue('https://test.sim.ai'), })) -import { type EmailType, sendBatchEmails, sendEmail } from '@/lib/email/mailer' -import { generateUnsubscribeToken, isUnsubscribed } from '@/lib/email/unsubscribe' +import { type EmailType, sendBatchEmails, sendEmail } from '@/lib/messaging/email/mailer' +import { generateUnsubscribeToken, isUnsubscribed } from '@/lib/messaging/email/unsubscribe' describe('mailer', () => { const testEmailOptions = { diff --git a/apps/sim/lib/email/mailer.ts b/apps/sim/lib/messaging/email/mailer.ts similarity index 98% rename from apps/sim/lib/email/mailer.ts rename to apps/sim/lib/messaging/email/mailer.ts index 08f49226cc0..6f3333f3442 100644 --- a/apps/sim/lib/email/mailer.ts +++ b/apps/sim/lib/messaging/email/mailer.ts @@ -1,10 +1,10 @@ import { EmailClient, type EmailMessage } from '@azure/communication-email' import { Resend } from 'resend' -import { generateUnsubscribeToken, isUnsubscribed } from '@/lib/email/unsubscribe' -import { getFromEmailAddress } from '@/lib/email/utils' -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' +import { generateUnsubscribeToken, isUnsubscribed } from '@/lib/messaging/email/unsubscribe' +import { getFromEmailAddress } from '@/lib/messaging/email/utils' const logger = createLogger('Mailer') diff --git a/apps/sim/lib/email/unsubscribe.test.ts b/apps/sim/lib/messaging/email/unsubscribe.test.ts similarity index 96% rename from apps/sim/lib/email/unsubscribe.test.ts rename to apps/sim/lib/messaging/email/unsubscribe.test.ts index 390c0801b30..11aba184eef 100644 --- a/apps/sim/lib/email/unsubscribe.test.ts +++ b/apps/sim/lib/messaging/email/unsubscribe.test.ts @@ -1,12 +1,12 @@ import { describe, expect, it, vi } from 'vitest' -import type { EmailType } from '@/lib/email/mailer' +import type { EmailType } from '@/lib/messaging/email/mailer' import { generateUnsubscribeToken, isTransactionalEmail, verifyUnsubscribeToken, -} from '@/lib/email/unsubscribe' +} from '@/lib/messaging/email/unsubscribe' -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { BETTER_AUTH_SECRET: 'test-secret-key', }, diff --git a/apps/sim/lib/email/unsubscribe.ts b/apps/sim/lib/messaging/email/unsubscribe.ts similarity index 98% rename from apps/sim/lib/email/unsubscribe.ts rename to apps/sim/lib/messaging/email/unsubscribe.ts index 837d0071da2..4a522705e28 100644 --- a/apps/sim/lib/email/unsubscribe.ts +++ b/apps/sim/lib/messaging/email/unsubscribe.ts @@ -2,9 +2,9 @@ import { createHash, randomBytes } from 'crypto' import { db } from '@sim/db' import { settings, user } from '@sim/db/schema' import { eq } from 'drizzle-orm' -import type { EmailType } from '@/lib/email/mailer' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' +import type { EmailType } from '@/lib/messaging/email/mailer' const logger = createLogger('Unsubscribe') diff --git a/apps/sim/lib/email/utils.test.ts b/apps/sim/lib/messaging/email/utils.test.ts similarity index 87% rename from apps/sim/lib/email/utils.test.ts rename to apps/sim/lib/messaging/email/utils.test.ts index 4937c4227e1..bbf429c5d10 100644 --- a/apps/sim/lib/email/utils.test.ts +++ b/apps/sim/lib/messaging/email/utils.test.ts @@ -1,7 +1,7 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' // Mock the env module -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: undefined, EMAIL_DOMAIN: undefined, @@ -9,7 +9,7 @@ vi.mock('@/lib/env', () => ({ })) // Mock the getEmailDomain function -vi.mock('@/lib/urls/utils', () => ({ +vi.mock('@/lib/core/utils/urls', () => ({ getEmailDomain: vi.fn().mockReturnValue('fallback.com'), })) @@ -21,7 +21,7 @@ describe('getFromEmailAddress', () => { it('should return FROM_EMAIL_ADDRESS when set', async () => { // Mock env with FROM_EMAIL_ADDRESS - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: 'Sim ', EMAIL_DOMAIN: 'example.com', @@ -35,7 +35,7 @@ describe('getFromEmailAddress', () => { }) it('should return simple email format when FROM_EMAIL_ADDRESS is set without display name', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: 'noreply@sim.ai', EMAIL_DOMAIN: 'example.com', @@ -49,7 +49,7 @@ describe('getFromEmailAddress', () => { }) it('should return Azure ACS format when FROM_EMAIL_ADDRESS is set', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: 'DoNotReply@customer.azurecomm.net', EMAIL_DOMAIN: 'example.com', @@ -63,7 +63,7 @@ describe('getFromEmailAddress', () => { }) it('should construct from EMAIL_DOMAIN when FROM_EMAIL_ADDRESS is not set', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: undefined, EMAIL_DOMAIN: 'example.com', @@ -77,7 +77,7 @@ describe('getFromEmailAddress', () => { }) it('should use getEmailDomain fallback when both FROM_EMAIL_ADDRESS and EMAIL_DOMAIN are not set', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: undefined, EMAIL_DOMAIN: undefined, @@ -85,7 +85,7 @@ describe('getFromEmailAddress', () => { })) const mockGetEmailDomain = vi.fn().mockReturnValue('fallback.com') - vi.doMock('@/lib/urls/utils', () => ({ + vi.doMock('@/lib/core/utils/urls', () => ({ getEmailDomain: mockGetEmailDomain, })) @@ -97,7 +97,7 @@ describe('getFromEmailAddress', () => { }) it('should prioritize FROM_EMAIL_ADDRESS over EMAIL_DOMAIN when both are set', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: 'Custom ', EMAIL_DOMAIN: 'ignored.com', @@ -111,7 +111,7 @@ describe('getFromEmailAddress', () => { }) it('should handle empty string FROM_EMAIL_ADDRESS by falling back to EMAIL_DOMAIN', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: '', EMAIL_DOMAIN: 'fallback.com', @@ -125,7 +125,7 @@ describe('getFromEmailAddress', () => { }) it('should handle whitespace-only FROM_EMAIL_ADDRESS by falling back to EMAIL_DOMAIN', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { FROM_EMAIL_ADDRESS: ' ', EMAIL_DOMAIN: 'fallback.com', diff --git a/apps/sim/lib/email/utils.ts b/apps/sim/lib/messaging/email/utils.ts similarity index 76% rename from apps/sim/lib/email/utils.ts rename to apps/sim/lib/messaging/email/utils.ts index 27f19c4928a..4b342c5d495 100644 --- a/apps/sim/lib/email/utils.ts +++ b/apps/sim/lib/messaging/email/utils.ts @@ -1,5 +1,5 @@ -import { env } from '@/lib/env' -import { getEmailDomain } from '@/lib/urls/utils' +import { env } from '@/lib/core/config/env' +import { getEmailDomain } from '@/lib/core/utils/urls' /** * Get the from email address, preferring FROM_EMAIL_ADDRESS over EMAIL_DOMAIN diff --git a/apps/sim/lib/email/validation.test.ts b/apps/sim/lib/messaging/email/validation.test.ts similarity index 97% rename from apps/sim/lib/email/validation.test.ts rename to apps/sim/lib/messaging/email/validation.test.ts index 50d97a0c672..d8b9e7b3404 100644 --- a/apps/sim/lib/email/validation.test.ts +++ b/apps/sim/lib/messaging/email/validation.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { quickValidateEmail, validateEmail } from '@/lib/email/validation' +import { quickValidateEmail, validateEmail } from '@/lib/messaging/email/validation' describe('Email Validation', () => { describe('validateEmail', () => { diff --git a/apps/sim/lib/email/validation.ts b/apps/sim/lib/messaging/email/validation.ts similarity index 100% rename from apps/sim/lib/email/validation.ts rename to apps/sim/lib/messaging/email/validation.ts diff --git a/apps/sim/lib/sms/service.ts b/apps/sim/lib/messaging/sms/service.ts similarity index 99% rename from apps/sim/lib/sms/service.ts rename to apps/sim/lib/messaging/sms/service.ts index 6e410cc55ca..3900b8e9922 100644 --- a/apps/sim/lib/sms/service.ts +++ b/apps/sim/lib/messaging/sms/service.ts @@ -1,5 +1,5 @@ import { Twilio } from 'twilio' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('SMSService') diff --git a/apps/sim/lib/oauth/oauth.test.ts b/apps/sim/lib/oauth/oauth.test.ts index 9e23ec15b1b..4acee4d3485 100644 --- a/apps/sim/lib/oauth/oauth.test.ts +++ b/apps/sim/lib/oauth/oauth.test.ts @@ -1,6 +1,6 @@ import { afterEach, beforeEach, describe, expect, it, type Mock, vi } from 'vitest' -vi.mock('@/lib/env', () => ({ +vi.mock('@/lib/core/config/env', () => ({ env: { GOOGLE_CLIENT_ID: 'google_client_id', GOOGLE_CLIENT_SECRET: 'google_client_secret', diff --git a/apps/sim/lib/oauth/oauth.ts b/apps/sim/lib/oauth/oauth.ts index ed51f344339..69d65ffc88e 100644 --- a/apps/sim/lib/oauth/oauth.ts +++ b/apps/sim/lib/oauth/oauth.ts @@ -34,7 +34,7 @@ import { WebflowIcon, xIcon, } from '@/components/icons' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('OAuth') diff --git a/apps/sim/lib/organization/utils.ts b/apps/sim/lib/organization/utils.ts deleted file mode 100644 index 446d7f5ffa2..00000000000 --- a/apps/sim/lib/organization/utils.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { quickValidateEmail } from '@/lib/email/validation' -import type { Organization } from '@/lib/organization/types' - -/** - * Calculate seat usage for an organization - */ -export function calculateSeatUsage(org?: Organization | null) { - const members = org?.members?.length ?? 0 - const pending = org?.invitations?.filter((inv) => inv.status === 'pending').length ?? 0 - return { used: members + pending, members, pending } -} - -/** - * Generate a URL-friendly slug from a name - */ -export function generateSlug(name: string): string { - return name - .toLowerCase() - .replace(/[^a-z0-9]/g, '-') // Replace non-alphanumeric with hyphens - .replace(/-+/g, '-') // Replace consecutive hyphens with single hyphen - .replace(/^-|-$/g, '') // Remove leading and trailing hyphens -} - -/** - * Validate organization slug format - */ -export function validateSlug(slug: string): boolean { - const slugRegex = /^[a-z0-9-_]+$/ - return slugRegex.test(slug) -} - -/** - * Validate email format - */ -export function validateEmail(email: string): boolean { - return quickValidateEmail(email.trim().toLowerCase()).isValid -} diff --git a/apps/sim/lib/sim-agent/index.ts b/apps/sim/lib/sim-agent/index.ts deleted file mode 100644 index f2fe623f023..00000000000 --- a/apps/sim/lib/sim-agent/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Export the main client and types - -export type { SimAgentRequest, SimAgentResponse } from './client' -export { SimAgentClient, simAgentClient } from './client' -export { SIM_AGENT_API_URL_DEFAULT, SIM_AGENT_VERSION } from './constants' - -// Import for default export -import { simAgentClient } from './client' - -// Re-export for convenience -export default simAgentClient diff --git a/apps/sim/lib/uploads/config.ts b/apps/sim/lib/uploads/config.ts index 0de71198f59..09759bc4c49 100644 --- a/apps/sim/lib/uploads/config.ts +++ b/apps/sim/lib/uploads/config.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { StorageConfig, StorageContext } from '@/lib/uploads/shared/types' export type { StorageConfig, StorageContext } from '@/lib/uploads/shared/types' diff --git a/apps/sim/lib/uploads/contexts/execution/execution-file-manager.ts b/apps/sim/lib/uploads/contexts/execution/execution-file-manager.ts index 0eb6419510e..52c2d457cf3 100644 --- a/apps/sim/lib/uploads/contexts/execution/execution-file-manager.ts +++ b/apps/sim/lib/uploads/contexts/execution/execution-file-manager.ts @@ -1,10 +1,7 @@ +import { isUserFile } from '@/lib/core/utils/display-filters' import { createLogger } from '@/lib/logs/console/logger' -import type { ExecutionContext } from '@/lib/uploads/contexts/execution/execution-file-helpers' -import { - generateExecutionFileKey, - generateFileId, -} from '@/lib/uploads/contexts/execution/execution-file-helpers' -import { isUserFile } from '@/lib/utils' +import type { ExecutionContext } from '@/lib/uploads/contexts/execution/utils' +import { generateExecutionFileKey, generateFileId } from '@/lib/uploads/contexts/execution/utils' import type { UserFile } from '@/executor/types' const logger = createLogger('ExecutionFileStorage') diff --git a/apps/sim/lib/uploads/contexts/execution/index.ts b/apps/sim/lib/uploads/contexts/execution/index.ts index 5cfea0f0fbd..20b2c1b79bf 100644 --- a/apps/sim/lib/uploads/contexts/execution/index.ts +++ b/apps/sim/lib/uploads/contexts/execution/index.ts @@ -1,2 +1,2 @@ -export * from './execution-file-helpers' export * from './execution-file-manager' +export * from './utils' diff --git a/apps/sim/lib/uploads/contexts/execution/execution-file-helpers.ts b/apps/sim/lib/uploads/contexts/execution/utils.ts similarity index 100% rename from apps/sim/lib/uploads/contexts/execution/execution-file-helpers.ts rename to apps/sim/lib/uploads/contexts/execution/utils.ts diff --git a/apps/sim/lib/uploads/core/setup.server.ts b/apps/sim/lib/uploads/core/setup.server.ts index 36b1a12206e..7f144cfc337 100644 --- a/apps/sim/lib/uploads/core/setup.server.ts +++ b/apps/sim/lib/uploads/core/setup.server.ts @@ -1,7 +1,7 @@ import { existsSync } from 'fs' import { mkdir } from 'fs/promises' import path, { join } from 'path' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { getStorageProvider, USE_BLOB_STORAGE, USE_S3_STORAGE } from '@/lib/uploads/config' diff --git a/apps/sim/lib/uploads/core/storage-service.ts b/apps/sim/lib/uploads/core/storage-service.ts index 3db903ff5c2..aaa9dca6af8 100644 --- a/apps/sim/lib/uploads/core/storage-service.ts +++ b/apps/sim/lib/uploads/core/storage-service.ts @@ -444,7 +444,7 @@ export async function generatePresignedDownloadUrl( return getPresignedUrlWithConfig(key, createBlobConfig(config), expirationSeconds) } - const { getBaseUrl } = await import('@/lib/urls/utils') + const { getBaseUrl } = await import('@/lib/core/utils/urls') const baseUrl = getBaseUrl() return `${baseUrl}/api/files/serve/${encodeURIComponent(key)}` } diff --git a/apps/sim/lib/uploads/providers/blob/client.test.ts b/apps/sim/lib/uploads/providers/blob/client.test.ts index 01c5ecd73d5..b90b4d58220 100644 --- a/apps/sim/lib/uploads/providers/blob/client.test.ts +++ b/apps/sim/lib/uploads/providers/blob/client.test.ts @@ -54,7 +54,7 @@ describe('Azure Blob Storage Client', () => { toString: () => 'sv=2021-06-08&se=2023-01-01T00%3A00%3A00Z&sr=b&sp=r&sig=test', }) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { AZURE_ACCOUNT_NAME: 'testaccount', AZURE_ACCOUNT_KEY: 'testkey', diff --git a/apps/sim/lib/uploads/providers/s3/client.test.ts b/apps/sim/lib/uploads/providers/s3/client.test.ts index aefd7ea42ad..881481b1be4 100644 --- a/apps/sim/lib/uploads/providers/s3/client.test.ts +++ b/apps/sim/lib/uploads/providers/s3/client.test.ts @@ -31,7 +31,7 @@ describe('S3 Client', () => { getSignedUrl: mockGetSignedUrl, })) - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { S3_BUCKET_NAME: 'test-bucket', AWS_REGION: 'test-region', @@ -298,7 +298,7 @@ describe('S3 Client', () => { describe('s3Client initialization', () => { it('should initialize with correct configuration when credentials are available', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { S3_BUCKET_NAME: 'test-bucket', AWS_REGION: 'test-region', @@ -331,7 +331,7 @@ describe('S3 Client', () => { }) it('should initialize without credentials when env vars are not available', async () => { - vi.doMock('@/lib/env', () => ({ + vi.doMock('@/lib/core/config/env', () => ({ env: { S3_BUCKET_NAME: 'test-bucket', AWS_REGION: 'test-region', diff --git a/apps/sim/lib/uploads/providers/s3/client.ts b/apps/sim/lib/uploads/providers/s3/client.ts index e866d899c02..800477b1a9b 100644 --- a/apps/sim/lib/uploads/providers/s3/client.ts +++ b/apps/sim/lib/uploads/providers/s3/client.ts @@ -9,7 +9,7 @@ import { UploadPartCommand, } from '@aws-sdk/client-s3' import { getSignedUrl } from '@aws-sdk/s3-request-presigner' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { S3_CONFIG, S3_KB_CONFIG } from '@/lib/uploads/config' import type { S3Config, diff --git a/apps/sim/lib/uploads/utils/file-utils.server.ts b/apps/sim/lib/uploads/utils/file-utils.server.ts index ebd651197ec..f021e07b217 100644 --- a/apps/sim/lib/uploads/utils/file-utils.server.ts +++ b/apps/sim/lib/uploads/utils/file-utils.server.ts @@ -2,7 +2,7 @@ import type { Logger } from '@/lib/logs/console/logger' import type { StorageContext } from '@/lib/uploads' -import { isExecutionFile } from '@/lib/uploads/contexts/execution/execution-file-helpers' +import { isExecutionFile } from '@/lib/uploads/contexts/execution/utils' import { inferContextFromKey } from '@/lib/uploads/utils/file-utils' import type { UserFile } from '@/executor/types' diff --git a/apps/sim/lib/utils.ts b/apps/sim/lib/utils.ts deleted file mode 100644 index 17ed8c30d30..00000000000 --- a/apps/sim/lib/utils.ts +++ /dev/null @@ -1,608 +0,0 @@ -import { createCipheriv, createDecipheriv, randomBytes } from 'crypto' -import { type ClassValue, clsx } from 'clsx' -import { twMerge } from 'tailwind-merge' -import { env } from '@/lib/env' -import { createLogger } from '@/lib/logs/console/logger' - -const logger = createLogger('Utils') - -export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) -} - -function getEncryptionKey(): Buffer { - const key = env.ENCRYPTION_KEY - if (!key || key.length !== 64) { - throw new Error('ENCRYPTION_KEY must be set to a 64-character hex string (32 bytes)') - } - return Buffer.from(key, 'hex') -} - -/** - * Encrypts a secret using AES-256-GCM - * @param secret - The secret to encrypt - * @returns A promise that resolves to an object containing the encrypted secret and IV - */ -export async function encryptSecret(secret: string): Promise<{ encrypted: string; iv: string }> { - const iv = randomBytes(16) - const key = getEncryptionKey() - - const cipher = createCipheriv('aes-256-gcm', key, iv) - let encrypted = cipher.update(secret, 'utf8', 'hex') - encrypted += cipher.final('hex') - - const authTag = cipher.getAuthTag() - - // Format: iv:encrypted:authTag - return { - encrypted: `${iv.toString('hex')}:${encrypted}:${authTag.toString('hex')}`, - iv: iv.toString('hex'), - } -} - -/** - * Decrypts an encrypted secret - * @param encryptedValue - The encrypted value in format "iv:encrypted:authTag" - * @returns A promise that resolves to an object containing the decrypted secret - */ -export async function decryptSecret(encryptedValue: string): Promise<{ decrypted: string }> { - const parts = encryptedValue.split(':') - const ivHex = parts[0] - const authTagHex = parts[parts.length - 1] - const encrypted = parts.slice(1, -1).join(':') - - if (!ivHex || !encrypted || !authTagHex) { - throw new Error('Invalid encrypted value format. Expected "iv:encrypted:authTag"') - } - - const key = getEncryptionKey() - const iv = Buffer.from(ivHex, 'hex') - const authTag = Buffer.from(authTagHex, 'hex') - - try { - const decipher = createDecipheriv('aes-256-gcm', key, iv) - decipher.setAuthTag(authTag) - - let decrypted = decipher.update(encrypted, 'hex', 'utf8') - decrypted += decipher.final('utf8') - - return { decrypted } - } catch (error: any) { - logger.error('Decryption error:', { error: error.message }) - throw error - } -} - -export function convertScheduleOptionsToCron( - scheduleType: string, - options: Record -): string { - switch (scheduleType) { - case 'minutes': { - const interval = options.minutesInterval || '15' - // For example, if options.minutesStartingAt is provided, use that as the start minute. - return `*/${interval} * * * *` - } - case 'hourly': { - // When scheduling hourly, take the specified minute offset - return `${options.hourlyMinute || '00'} * * * *` - } - case 'daily': { - // Expected dailyTime in HH:MM - const [minute, hour] = (options.dailyTime || '00:09').split(':') - return `${minute || '00'} ${hour || '09'} * * *` - } - case 'weekly': { - // Expected weeklyDay as MON, TUE, etc. and weeklyDayTime in HH:MM - const dayMap: Record = { - MON: 1, - TUE: 2, - WED: 3, - THU: 4, - FRI: 5, - SAT: 6, - SUN: 0, - } - const day = dayMap[options.weeklyDay || 'MON'] - const [minute, hour] = (options.weeklyDayTime || '00:09').split(':') - return `${minute || '00'} ${hour || '09'} * * ${day}` - } - case 'monthly': { - // Expected monthlyDay and monthlyTime in HH:MM - const day = options.monthlyDay || '1' - const [minute, hour] = (options.monthlyTime || '00:09').split(':') - return `${minute || '00'} ${hour || '09'} ${day} * *` - } - case 'custom': { - // Use the provided cron expression directly - return options.cronExpression - } - default: - throw new Error('Unsupported schedule type') - } -} - -/** - * Get a user-friendly timezone abbreviation - * @param timezone - IANA timezone string - * @param date - Date to check for DST - * @returns A simplified timezone string (e.g., "PST" instead of "America/Los_Angeles") - */ -export function getTimezoneAbbreviation(timezone: string, date: Date = new Date()): string { - if (timezone === 'UTC') return 'UTC' - - // Common timezone mappings - const timezoneMap: Record = { - 'America/Los_Angeles': { standard: 'PST', daylight: 'PDT' }, - 'America/Denver': { standard: 'MST', daylight: 'MDT' }, - 'America/Chicago': { standard: 'CST', daylight: 'CDT' }, - 'America/New_York': { standard: 'EST', daylight: 'EDT' }, - 'Europe/London': { standard: 'GMT', daylight: 'BST' }, - 'Europe/Paris': { standard: 'CET', daylight: 'CEST' }, - 'Asia/Tokyo': { standard: 'JST', daylight: 'JST' }, // Japan doesn't use DST - 'Australia/Sydney': { standard: 'AEST', daylight: 'AEDT' }, - 'Asia/Singapore': { standard: 'SGT', daylight: 'SGT' }, // Singapore doesn't use DST - } - - // If we have a mapping for this timezone - if (timezone in timezoneMap) { - // January 1 is guaranteed to be standard time in northern hemisphere - // July 1 is guaranteed to be daylight time in northern hemisphere (if observed) - const januaryDate = new Date(date.getFullYear(), 0, 1) - const julyDate = new Date(date.getFullYear(), 6, 1) - - // Get offset in January (standard time) - const januaryFormatter = new Intl.DateTimeFormat('en-US', { - timeZone: timezone, - timeZoneName: 'short', - }) - - // Get offset in July (likely daylight time) - const julyFormatter = new Intl.DateTimeFormat('en-US', { - timeZone: timezone, - timeZoneName: 'short', - }) - - // If offsets are different, timezone observes DST - const isDSTObserved = januaryFormatter.format(januaryDate) !== julyFormatter.format(julyDate) - - // If DST is observed, check if current date is in DST by comparing its offset - // with January's offset (standard time) - if (isDSTObserved) { - const currentFormatter = new Intl.DateTimeFormat('en-US', { - timeZone: timezone, - timeZoneName: 'short', - }) - - const isDST = currentFormatter.format(date) !== januaryFormatter.format(januaryDate) - return isDST ? timezoneMap[timezone].daylight : timezoneMap[timezone].standard - } - - // If DST is not observed, always use standard - return timezoneMap[timezone].standard - } - - // For unknown timezones, use full IANA name - return timezone -} - -/** - * Format a date into a human-readable format - * @param date - The date to format - * @param timezone - Optional IANA timezone string (e.g., 'America/Los_Angeles', 'UTC') - * @returns A formatted date string in the format "MMM D, YYYY h:mm A" - */ -export function formatDateTime(date: Date, timezone?: string): string { - const formattedDate = date.toLocaleString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric', - hour: 'numeric', - minute: '2-digit', - hour12: true, - timeZone: timezone || undefined, - }) - - // If timezone is provided, add a friendly timezone abbreviation - if (timezone) { - const tzAbbr = getTimezoneAbbreviation(timezone, date) - return `${formattedDate} ${tzAbbr}` - } - - return formattedDate -} - -/** - * Format a date into a short format - * @param date - The date to format - * @returns A formatted date string in the format "MMM D, YYYY" - */ -export function formatDate(date: Date): string { - return date.toLocaleString('en-US', { - month: 'short', - day: 'numeric', - year: 'numeric', - }) -} - -/** - * Format a time into a short format - * @param date - The date to format - * @returns A formatted time string in the format "h:mm A" - */ -export function formatTime(date: Date): string { - return date.toLocaleString('en-US', { - hour: 'numeric', - minute: '2-digit', - hour12: true, - }) -} - -/** - * Format a duration in milliseconds to a human-readable format - * @param durationMs - The duration in milliseconds - * @returns A formatted duration string - */ -export function formatDuration(durationMs: number): string { - if (durationMs < 1000) { - return `${durationMs}ms` - } - - const seconds = Math.floor(durationMs / 1000) - if (seconds < 60) { - return `${seconds}s` - } - - const minutes = Math.floor(seconds / 60) - const remainingSeconds = seconds % 60 - if (minutes < 60) { - return `${minutes}m ${remainingSeconds}s` - } - - const hours = Math.floor(minutes / 60) - const remainingMinutes = minutes % 60 - return `${hours}h ${remainingMinutes}m` -} - -/** - * Generates a secure random password - * @param length - The length of the password (default: 24) - * @returns A new secure password string - */ -export function generatePassword(length = 24): string { - const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_-+=' - let result = '' - - for (let i = 0; i < length; i++) { - result += chars.charAt(Math.floor(Math.random() * chars.length)) - } - - return result -} - -/** - * Rotates through available API keys for a provider - * @param provider - The provider to get a key for (e.g., 'openai') - * @returns The selected API key - * @throws Error if no API keys are configured for rotation - */ -export function getRotatingApiKey(provider: string): string { - if (provider !== 'openai' && provider !== 'anthropic' && provider !== 'gemini') { - throw new Error(`No rotation implemented for provider: ${provider}`) - } - - const keys = [] - - if (provider === 'openai') { - if (env.OPENAI_API_KEY_1) keys.push(env.OPENAI_API_KEY_1) - if (env.OPENAI_API_KEY_2) keys.push(env.OPENAI_API_KEY_2) - if (env.OPENAI_API_KEY_3) keys.push(env.OPENAI_API_KEY_3) - } else if (provider === 'anthropic') { - if (env.ANTHROPIC_API_KEY_1) keys.push(env.ANTHROPIC_API_KEY_1) - if (env.ANTHROPIC_API_KEY_2) keys.push(env.ANTHROPIC_API_KEY_2) - if (env.ANTHROPIC_API_KEY_3) keys.push(env.ANTHROPIC_API_KEY_3) - } else if (provider === 'gemini') { - if (env.GEMINI_API_KEY_1) keys.push(env.GEMINI_API_KEY_1) - if (env.GEMINI_API_KEY_2) keys.push(env.GEMINI_API_KEY_2) - if (env.GEMINI_API_KEY_3) keys.push(env.GEMINI_API_KEY_3) - } - - if (keys.length === 0) { - throw new Error( - `No API keys configured for rotation. Please configure ${provider.toUpperCase()}_API_KEY_1, ${provider.toUpperCase()}_API_KEY_2, or ${provider.toUpperCase()}_API_KEY_3.` - ) - } - - // Simple round-robin rotation based on current minute - // This distributes load across keys and is stateless - const currentMinute = new Date().getMinutes() - const keyIndex = currentMinute % keys.length - - return keys[keyIndex] -} - -/** - * Recursively redacts API keys in an object - * @param obj The object to redact API keys from - * @returns A new object with API keys redacted - */ -export const redactApiKeys = (obj: any): any => { - if (!obj || typeof obj !== 'object') { - return obj - } - - if (Array.isArray(obj)) { - return obj.map(redactApiKeys) - } - - const result: Record = {} - - for (const [key, value] of Object.entries(obj)) { - if ( - key.toLowerCase() === 'apikey' || - key.toLowerCase() === 'api_key' || - key.toLowerCase() === 'access_token' || - /\bsecret\b/i.test(key.toLowerCase()) || - /\bpassword\b/i.test(key.toLowerCase()) - ) { - result[key] = '***REDACTED***' - } else if (typeof value === 'object' && value !== null) { - result[key] = redactApiKeys(value) - } else { - result[key] = value - } - } - - return result -} - -/** - * Type guard to check if an object is a UserFile - */ -export function isUserFile(candidate: unknown): candidate is { - id: string - name: string - url: string - key: string - size: number - type: string - context?: string -} { - if (!candidate || typeof candidate !== 'object') { - return false - } - - const value = candidate as Record - return ( - typeof value.id === 'string' && - typeof value.key === 'string' && - typeof value.url === 'string' && - typeof value.name === 'string' - ) -} - -/** - * Filter function that transforms UserFile objects for display - * Removes internal fields: key, context - * Keeps user-friendly fields: id, name, url, size, type - */ -function filterUserFile(data: any): any { - if (isUserFile(data)) { - const { id, name, url, size, type } = data - return { id, name, url, size, type } - } - return data -} - -/** - * Registry of filter functions to apply to data for cleaner display in logs/console. - * Add new filter functions here to handle additional data types. - */ -const DISPLAY_FILTERS = [ - filterUserFile, - // Add more filters here as needed -] - -/** - * Generic helper to filter internal/technical fields from data for cleaner display in logs and console. - * Applies all registered filters recursively to the data structure. - * - * To add a new filter: - * 1. Create a filter function that checks and transforms a specific data type - * 2. Add it to the DISPLAY_FILTERS array above - * - * @param data - Data to filter (objects, arrays, primitives) - * @returns Filtered data with internal fields removed - */ -export function filterForDisplay(data: any): any { - if (!data || typeof data !== 'object') { - return data - } - - // Apply all registered filters - const filtered = data - for (const filterFn of DISPLAY_FILTERS) { - const result = filterFn(filtered) - if (result !== filtered) { - // Filter matched and transformed the data - return result - } - } - - // No filters matched - recursively filter nested structures - if (Array.isArray(filtered)) { - return filtered.map(filterForDisplay) - } - - // Recursively filter object properties - const result: any = {} - for (const [key, value] of Object.entries(filtered)) { - result[key] = filterForDisplay(value) - } - return result -} - -/** - * Validates a name by removing any characters that could cause issues - * with variable references or node naming. - * - * @param name - The name to validate - * @returns The validated name with invalid characters removed, trimmed, and collapsed whitespace - */ -export function validateName(name: string): string { - return name - .replace(/[^a-zA-Z0-9_\s]/g, '') // Remove invalid characters - .replace(/\s+/g, ' ') // Collapse multiple spaces into single spaces -} - -/** - * Checks if a name contains invalid characters - * - * @param name - The name to check - * @returns True if the name is valid, false otherwise - */ -export function isValidName(name: string): boolean { - return /^[a-zA-Z0-9_\s]*$/.test(name) -} - -export const SSE_HEADERS = { - 'Content-Type': 'text/event-stream', - 'Cache-Control': 'no-cache', - Connection: 'keep-alive', - 'X-Accel-Buffering': 'no', -} as const - -/** - * Encodes data as a Server-Sent Events (SSE) message. - * Formats the data as a JSON string prefixed with "data:" and suffixed with two newlines, - * then encodes it as a Uint8Array for streaming. - * - * @param data - The data to encode and send via SSE - * @returns The encoded SSE message as a Uint8Array - */ -export function encodeSSE(data: any): Uint8Array { - return new TextEncoder().encode(`data: ${JSON.stringify(data)}\n\n`) -} - -/** - * Gets a list of invalid characters in a name - * - * @param name - The name to check - * @returns Array of invalid characters found - */ -export function getInvalidCharacters(name: string): string[] { - const invalidChars = name.match(/[^a-zA-Z0-9_\s]/g) - return invalidChars ? [...new Set(invalidChars)] : [] -} - -/** - * Generate a short request ID for correlation - */ -export function generateRequestId(): string { - return crypto.randomUUID().slice(0, 8) -} - -/** - * No-operation function for use as default callback - */ -export const noop = () => {} - -/** - * Options for performing an optimistic update with automatic rollback on error - */ -export interface OptimisticUpdateOptions { - /** - * Function that returns the current state value (for rollback purposes) - */ - getCurrentState: () => T - /** - * Function that performs the optimistic update to the UI state - */ - optimisticUpdate: () => void - /** - * Async function that performs the actual API call - */ - apiCall: () => Promise - /** - * Function that rolls back the state to the original value - * @param originalValue - The value returned by getCurrentState before the update - */ - rollback: (originalValue: T) => void - /** - * Optional error message to log if the operation fails - */ - errorMessage?: string - /** - * Optional callback to execute on error (e.g., show toast notification) - */ - onError?: (error: Error, originalValue: T) => void - /** - * Optional callback that always runs regardless of success or error (e.g., to clear loading states) - */ - onComplete?: () => void -} - -/** - * Performs an optimistic update with automatic rollback on error. - * This utility standardizes the pattern of: - * 1. Save current state - * 2. Update UI optimistically - * 3. Make API call - * 4. Rollback on error - * - * @example - * ```typescript - * await withOptimisticUpdate({ - * getCurrentState: () => get().folders[id], - * optimisticUpdate: () => set(state => ({ - * folders: { ...state.folders, [id]: { ...folder, name: newName } } - * })), - * apiCall: async () => { - * await fetch(`/api/folders/${id}`, { - * method: 'PUT', - * body: JSON.stringify({ name: newName }) - * }) - * }, - * rollback: (originalFolder) => set(state => ({ - * folders: { ...state.folders, [id]: originalFolder } - * })), - * errorMessage: 'Failed to rename folder', - * onError: (error) => toast.error('Could not rename folder') - * }) - * ``` - */ -export async function withOptimisticUpdate(options: OptimisticUpdateOptions): Promise { - const { - getCurrentState, - optimisticUpdate, - apiCall, - rollback, - errorMessage, - onError, - onComplete, - } = options - - const originalValue = getCurrentState() - - optimisticUpdate() - - try { - await apiCall() - } catch (error) { - rollback(originalValue) - - if (errorMessage) { - logger.error(errorMessage, { error }) - } - - if (onError && error instanceof Error) { - onError(error, originalValue) - } - - throw error - } finally { - if (onComplete) { - onComplete() - } - } -} diff --git a/apps/sim/lib/webhooks/gmail-polling-service.ts b/apps/sim/lib/webhooks/gmail-polling-service.ts index b3d7f134e0d..efbe26115a3 100644 --- a/apps/sim/lib/webhooks/gmail-polling-service.ts +++ b/apps/sim/lib/webhooks/gmail-polling-service.ts @@ -2,9 +2,9 @@ import { db } from '@sim/db' import { account, webhook } from '@sim/db/schema' import { and, eq, sql } from 'drizzle-orm' import { nanoid } from 'nanoid' -import { pollingIdempotency } from '@/lib/idempotency/service' +import { pollingIdempotency } from '@/lib/core/idempotency/service' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { getOAuthToken, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' import type { GmailAttachment } from '@/tools/gmail/types' import { downloadAttachments, extractAttachmentInfo } from '@/tools/gmail/utils' diff --git a/apps/sim/lib/webhooks/outlook-polling-service.ts b/apps/sim/lib/webhooks/outlook-polling-service.ts index 9ffdc06b5d4..c679562f962 100644 --- a/apps/sim/lib/webhooks/outlook-polling-service.ts +++ b/apps/sim/lib/webhooks/outlook-polling-service.ts @@ -3,9 +3,9 @@ import { account, webhook } from '@sim/db/schema' import { and, eq, sql } from 'drizzle-orm' import { htmlToText } from 'html-to-text' import { nanoid } from 'nanoid' -import { pollingIdempotency } from '@/lib/idempotency' +import { pollingIdempotency } from '@/lib/core/idempotency' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { getOAuthToken, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' const logger = createLogger('OutlookPollingService') diff --git a/apps/sim/lib/webhooks/processor.ts b/apps/sim/lib/webhooks/processor.ts index e961247cb4a..6b762821b4b 100644 --- a/apps/sim/lib/webhooks/processor.ts +++ b/apps/sim/lib/webhooks/processor.ts @@ -3,7 +3,7 @@ import { tasks } from '@trigger.dev/sdk' import { and, eq } from 'drizzle-orm' import { type NextRequest, NextResponse } from 'next/server' import { v4 as uuidv4 } from 'uuid' -import { env, isTruthy } from '@/lib/env' +import { env, isTruthy } from '@/lib/core/config/env' import { preprocessExecution } from '@/lib/execution/preprocessing' import { createLogger } from '@/lib/logs/console/logger' import { convertSquareBracketsToTwiML } from '@/lib/webhooks/utils' diff --git a/apps/sim/lib/webhooks/webhook-helpers.ts b/apps/sim/lib/webhooks/provider-subscriptions.ts similarity index 99% rename from apps/sim/lib/webhooks/webhook-helpers.ts rename to apps/sim/lib/webhooks/provider-subscriptions.ts index eb5edee7685..087d9e79756 100644 --- a/apps/sim/lib/webhooks/webhook-helpers.ts +++ b/apps/sim/lib/webhooks/provider-subscriptions.ts @@ -1,6 +1,6 @@ import type { NextRequest } from 'next/server' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { getOAuthToken, refreshAccessTokenIfNeeded } from '@/app/api/auth/oauth/utils' const teamsLogger = createLogger('TeamsSubscription') diff --git a/apps/sim/lib/webhooks/test-tokens.ts b/apps/sim/lib/webhooks/test-tokens.ts index a11ccbf31e2..26495bde1e6 100644 --- a/apps/sim/lib/webhooks/test-tokens.ts +++ b/apps/sim/lib/webhooks/test-tokens.ts @@ -1,5 +1,5 @@ import { jwtVerify, SignJWT } from 'jose' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' type TestTokenPayload = { typ: 'webhook_test' diff --git a/apps/sim/lib/workflows/autolayout/constants.ts b/apps/sim/lib/workflows/autolayout/constants.ts index a97051287b5..0d92258975e 100644 --- a/apps/sim/lib/workflows/autolayout/constants.ts +++ b/apps/sim/lib/workflows/autolayout/constants.ts @@ -2,11 +2,11 @@ * Autolayout Constants * * Layout algorithm specific constants for spacing, padding, and overlap detection. - * Block dimensions are imported from the shared source: @/lib/blocks/block-dimensions + * Block dimensions are imported from the shared source: @/lib/workflows/blocks/block-dimensions */ // Re-export block dimensions for autolayout consumers -export { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' +export { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' /** * Horizontal spacing between layers (columns) diff --git a/apps/sim/lib/workflows/autolayout/containers.ts b/apps/sim/lib/workflows/autolayout/containers.ts index 311b4362112..53cfd0c0bcb 100644 --- a/apps/sim/lib/workflows/autolayout/containers.ts +++ b/apps/sim/lib/workflows/autolayout/containers.ts @@ -1,4 +1,3 @@ -import { CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' import { createLogger } from '@/lib/logs/console/logger' import { CONTAINER_PADDING_X, @@ -8,6 +7,7 @@ import { import { layoutBlocksCore } from '@/lib/workflows/autolayout/core' import type { Edge, LayoutOptions } from '@/lib/workflows/autolayout/types' import { filterLayoutEligibleBlockIds, getBlocksByParent } from '@/lib/workflows/autolayout/utils' +import { CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' import type { BlockState } from '@/stores/workflows/workflow/types' const logger = createLogger('AutoLayout:Containers') diff --git a/apps/sim/lib/workflows/autolayout/targeted.ts b/apps/sim/lib/workflows/autolayout/targeted.ts index d9b7f977da7..f53e7df7a0c 100644 --- a/apps/sim/lib/workflows/autolayout/targeted.ts +++ b/apps/sim/lib/workflows/autolayout/targeted.ts @@ -1,4 +1,3 @@ -import { CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' import { createLogger } from '@/lib/logs/console/logger' import { CONTAINER_PADDING, @@ -14,6 +13,7 @@ import { isContainerType, shouldSkipAutoLayout, } from '@/lib/workflows/autolayout/utils' +import { CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' import type { BlockState } from '@/stores/workflows/workflow/types' const logger = createLogger('AutoLayout:Targeted') diff --git a/apps/sim/lib/workflows/autolayout/utils.ts b/apps/sim/lib/workflows/autolayout/utils.ts index 52b6f3b712e..32f1d3b1612 100644 --- a/apps/sim/lib/workflows/autolayout/utils.ts +++ b/apps/sim/lib/workflows/autolayout/utils.ts @@ -1,4 +1,3 @@ -import { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/blocks/block-dimensions' import { AUTO_LAYOUT_EXCLUDED_TYPES, CONTAINER_BLOCK_TYPES, @@ -9,6 +8,7 @@ import { ROOT_PADDING_Y, } from '@/lib/workflows/autolayout/constants' import type { BlockMetrics, BoundingBox, GraphNode } from '@/lib/workflows/autolayout/types' +import { BLOCK_DIMENSIONS, CONTAINER_DIMENSIONS } from '@/lib/workflows/blocks/block-dimensions' import type { BlockState } from '@/stores/workflows/workflow/types' // Re-export layout constants for backwards compatibility diff --git a/apps/sim/lib/blocks/block-dimensions.ts b/apps/sim/lib/workflows/blocks/block-dimensions.ts similarity index 100% rename from apps/sim/lib/blocks/block-dimensions.ts rename to apps/sim/lib/workflows/blocks/block-dimensions.ts diff --git a/apps/sim/lib/workflows/block-outputs.ts b/apps/sim/lib/workflows/blocks/block-outputs.ts similarity index 98% rename from apps/sim/lib/workflows/block-outputs.ts rename to apps/sim/lib/workflows/blocks/block-outputs.ts index 3027e113ff9..789ad7410f0 100644 --- a/apps/sim/lib/workflows/block-outputs.ts +++ b/apps/sim/lib/workflows/blocks/block-outputs.ts @@ -1,5 +1,9 @@ import { normalizeInputFormatValue } from '@/lib/workflows/input-format-utils' -import { classifyStartBlockType, StartBlockPath, TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { + classifyStartBlockType, + StartBlockPath, + TRIGGER_TYPES, +} from '@/lib/workflows/triggers/triggers' import { type InputFormatField, START_BLOCK_RESERVED_FIELDS, diff --git a/apps/sim/lib/block-path-calculator.ts b/apps/sim/lib/workflows/blocks/block-path-calculator.ts similarity index 100% rename from apps/sim/lib/block-path-calculator.ts rename to apps/sim/lib/workflows/blocks/block-path-calculator.ts diff --git a/apps/sim/lib/workflows/credential-extractor.ts b/apps/sim/lib/workflows/credentials/credential-extractor.ts similarity index 100% rename from apps/sim/lib/workflows/credential-extractor.ts rename to apps/sim/lib/workflows/credentials/credential-extractor.ts diff --git a/apps/sim/lib/workflows/credential-resolver.ts b/apps/sim/lib/workflows/credentials/credential-resolver.ts similarity index 100% rename from apps/sim/lib/workflows/credential-resolver.ts rename to apps/sim/lib/workflows/credentials/credential-resolver.ts diff --git a/apps/sim/lib/custom-tools/operations.ts b/apps/sim/lib/workflows/custom-tools/operations.ts similarity index 97% rename from apps/sim/lib/custom-tools/operations.ts rename to apps/sim/lib/workflows/custom-tools/operations.ts index af841446917..c5b97bf7527 100644 --- a/apps/sim/lib/custom-tools/operations.ts +++ b/apps/sim/lib/workflows/custom-tools/operations.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { customTools } from '@sim/db/schema' import { and, desc, eq, isNull } from 'drizzle-orm' import { nanoid } from 'nanoid' +import { generateRequestId } from '@/lib/core/utils/request' import { createLogger } from '@/lib/logs/console/logger' -import { generateRequestId } from '@/lib/utils' const logger = createLogger('CustomToolsOperations') diff --git a/apps/sim/lib/workflows/defaults.ts b/apps/sim/lib/workflows/defaults.ts index 8b15deb8b38..cfb0a20bbf6 100644 --- a/apps/sim/lib/workflows/defaults.ts +++ b/apps/sim/lib/workflows/defaults.ts @@ -1,4 +1,4 @@ -import { getBlockOutputs } from '@/lib/workflows/block-outputs' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' import { getBlock } from '@/blocks' import type { BlockConfig, SubBlockConfig } from '@/blocks/types' import type { BlockState, SubBlockState, WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/lib/workflows/executor/execution-core.ts b/apps/sim/lib/workflows/executor/execution-core.ts index e018b2d9bc8..1096aa16237 100644 --- a/apps/sim/lib/workflows/executor/execution-core.ts +++ b/apps/sim/lib/workflows/executor/execution-core.ts @@ -12,8 +12,8 @@ import { buildTraceSpans } from '@/lib/logs/execution/trace-spans/trace-spans' import { loadDeployedWorkflowState, loadWorkflowFromNormalizedTables, -} from '@/lib/workflows/db-helpers' -import { TriggerUtils } from '@/lib/workflows/triggers' +} from '@/lib/workflows/persistence/utils' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { updateWorkflowRunCounts } from '@/lib/workflows/utils' import { Executor } from '@/executor' import type { ExecutionCallbacks, ExecutionSnapshot } from '@/executor/execution/snapshot' diff --git a/apps/sim/lib/workflows/deployment-utils.ts b/apps/sim/lib/workflows/operations/deployment-utils.ts similarity index 99% rename from apps/sim/lib/workflows/deployment-utils.ts rename to apps/sim/lib/workflows/operations/deployment-utils.ts index b4fdf193ba6..f46238bad08 100644 --- a/apps/sim/lib/workflows/deployment-utils.ts +++ b/apps/sim/lib/workflows/operations/deployment-utils.ts @@ -1,5 +1,5 @@ import { createLogger } from '@/lib/logs/console/logger' -import { resolveStartCandidates, StartBlockPath } from '@/lib/workflows/triggers' +import { resolveStartCandidates, StartBlockPath } from '@/lib/workflows/triggers/triggers' import { useSubBlockStore } from '@/stores/workflows/subblock/store' import { useWorkflowStore } from '@/stores/workflows/workflow/store' diff --git a/apps/sim/lib/workflows/import-export.ts b/apps/sim/lib/workflows/operations/import-export.ts similarity index 98% rename from apps/sim/lib/workflows/import-export.ts rename to apps/sim/lib/workflows/operations/import-export.ts index 1dbb592b4ea..eddc21d93e4 100644 --- a/apps/sim/lib/workflows/import-export.ts +++ b/apps/sim/lib/workflows/operations/import-export.ts @@ -1,6 +1,6 @@ import JSZip from 'jszip' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeForExport } from '@/lib/workflows/json-sanitizer' +import { sanitizeForExport } from '@/lib/workflows/sanitization/json-sanitizer' import type { WorkflowState } from '@/stores/workflows/workflow/types' const logger = createLogger('WorkflowImportExport') diff --git a/apps/sim/lib/workflows/socket-operations.ts b/apps/sim/lib/workflows/operations/socket-operations.ts similarity index 97% rename from apps/sim/lib/workflows/socket-operations.ts rename to apps/sim/lib/workflows/operations/socket-operations.ts index 40ea1b42ee7..5679b20861d 100644 --- a/apps/sim/lib/workflows/socket-operations.ts +++ b/apps/sim/lib/workflows/operations/socket-operations.ts @@ -1,4 +1,4 @@ -import { client } from '@/lib/auth-client' +import { client } from '@/lib/auth/auth-client' import { createLogger } from '@/lib/logs/console/logger' import { useOperationQueueStore } from '@/stores/operation-queue/store' import type { WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/lib/workflows/custom-tools-persistence.ts b/apps/sim/lib/workflows/persistence/custom-tools-persistence.ts similarity index 98% rename from apps/sim/lib/workflows/custom-tools-persistence.ts rename to apps/sim/lib/workflows/persistence/custom-tools-persistence.ts index facb1246376..a8936c8b889 100644 --- a/apps/sim/lib/workflows/custom-tools-persistence.ts +++ b/apps/sim/lib/workflows/persistence/custom-tools-persistence.ts @@ -1,5 +1,5 @@ -import { upsertCustomTools } from '@/lib/custom-tools/operations' import { createLogger } from '@/lib/logs/console/logger' +import { upsertCustomTools } from '@/lib/workflows/custom-tools/operations' const logger = createLogger('CustomToolsPersistence') diff --git a/apps/sim/lib/workflows/duplicate.ts b/apps/sim/lib/workflows/persistence/duplicate.ts similarity index 99% rename from apps/sim/lib/workflows/duplicate.ts rename to apps/sim/lib/workflows/persistence/duplicate.ts index 7f6bb03e4f1..bf6fde02ceb 100644 --- a/apps/sim/lib/workflows/duplicate.ts +++ b/apps/sim/lib/workflows/persistence/duplicate.ts @@ -2,7 +2,7 @@ import { db } from '@sim/db' import { workflow, workflowBlocks, workflowEdges, workflowSubflows } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' import type { Variable } from '@/stores/panel/variables/types' import type { LoopConfig, ParallelConfig } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/lib/workflows/db-helpers.test.ts b/apps/sim/lib/workflows/persistence/utils.test.ts similarity index 99% rename from apps/sim/lib/workflows/db-helpers.test.ts rename to apps/sim/lib/workflows/persistence/utils.test.ts index c3f876a1ef5..0efb0fa2832 100644 --- a/apps/sim/lib/workflows/db-helpers.test.ts +++ b/apps/sim/lib/workflows/persistence/utils.test.ts @@ -93,7 +93,7 @@ vi.mock('@/lib/logs/console/logger', () => ({ })), })) -import * as dbHelpers from '@/lib/workflows/db-helpers' +import * as dbHelpers from '@/lib/workflows/persistence/utils' const mockWorkflowId = 'test-workflow-123' diff --git a/apps/sim/lib/workflows/db-helpers.ts b/apps/sim/lib/workflows/persistence/utils.ts similarity index 99% rename from apps/sim/lib/workflows/db-helpers.ts rename to apps/sim/lib/workflows/persistence/utils.ts index e58172e6c8e..aaa125680d7 100644 --- a/apps/sim/lib/workflows/db-helpers.ts +++ b/apps/sim/lib/workflows/persistence/utils.ts @@ -13,7 +13,7 @@ import { and, desc, eq, sql } from 'drizzle-orm' import type { Edge } from 'reactflow' import { v4 as uuidv4 } from 'uuid' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeAgentToolsInBlocks } from '@/lib/workflows/validation' +import { sanitizeAgentToolsInBlocks } from '@/lib/workflows/sanitization/validation' import type { BlockState, Loop, Parallel, WorkflowState } from '@/stores/workflows/workflow/types' import { SUBFLOW_TYPES } from '@/stores/workflows/workflow/types' import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils' @@ -560,7 +560,7 @@ export async function deployWorkflow(params: { // Track deployment telemetry if workflow name is provided if (workflowName) { try { - const { trackPlatformEvent } = await import('@/lib/telemetry/tracer') + const { trackPlatformEvent } = await import('@/lib/core/telemetry') const blockTypeCounts: Record = {} for (const block of Object.values(currentState.blocks)) { diff --git a/apps/sim/lib/workflows/json-sanitizer.ts b/apps/sim/lib/workflows/sanitization/json-sanitizer.ts similarity index 99% rename from apps/sim/lib/workflows/json-sanitizer.ts rename to apps/sim/lib/workflows/sanitization/json-sanitizer.ts index f5b2651ace9..d7dab0673ec 100644 --- a/apps/sim/lib/workflows/json-sanitizer.ts +++ b/apps/sim/lib/workflows/sanitization/json-sanitizer.ts @@ -1,5 +1,5 @@ import type { Edge } from 'reactflow' -import { sanitizeWorkflowForSharing } from '@/lib/workflows/credential-extractor' +import { sanitizeWorkflowForSharing } from '@/lib/workflows/credentials/credential-extractor' import type { BlockState, Loop, Parallel, WorkflowState } from '@/stores/workflows/workflow/types' import { generateLoopBlocks, generateParallelBlocks } from '@/stores/workflows/workflow/utils' import { TRIGGER_PERSISTED_SUBBLOCK_IDS } from '@/triggers/consts' diff --git a/apps/sim/lib/workflows/references.test.ts b/apps/sim/lib/workflows/sanitization/references.test.ts similarity index 92% rename from apps/sim/lib/workflows/references.test.ts rename to apps/sim/lib/workflows/sanitization/references.test.ts index 04b950635df..4aece4c7713 100644 --- a/apps/sim/lib/workflows/references.test.ts +++ b/apps/sim/lib/workflows/sanitization/references.test.ts @@ -1,5 +1,8 @@ import { describe, expect, it } from 'vitest' -import { isLikelyReferenceSegment, splitReferenceSegment } from '@/lib/workflows/references' +import { + isLikelyReferenceSegment, + splitReferenceSegment, +} from '@/lib/workflows/sanitization/references' describe('splitReferenceSegment', () => { it('should return leading and reference for simple segments', () => { diff --git a/apps/sim/lib/workflows/references.ts b/apps/sim/lib/workflows/sanitization/references.ts similarity index 100% rename from apps/sim/lib/workflows/references.ts rename to apps/sim/lib/workflows/sanitization/references.ts diff --git a/apps/sim/lib/workflows/validation.ts b/apps/sim/lib/workflows/sanitization/validation.ts similarity index 100% rename from apps/sim/lib/workflows/validation.ts rename to apps/sim/lib/workflows/sanitization/validation.ts diff --git a/apps/sim/lib/schedules/utils.test.ts b/apps/sim/lib/workflows/schedules/utils.test.ts similarity index 99% rename from apps/sim/lib/schedules/utils.test.ts rename to apps/sim/lib/workflows/schedules/utils.test.ts index 1e9033de819..949cb323113 100644 --- a/apps/sim/lib/schedules/utils.test.ts +++ b/apps/sim/lib/workflows/schedules/utils.test.ts @@ -12,7 +12,7 @@ import { parseCronToHumanReadable, parseTimeString, validateCronExpression, -} from '@/lib/schedules/utils' +} from '@/lib/workflows/schedules/utils' describe('Schedule Utilities', () => { describe('parseTimeString', () => { diff --git a/apps/sim/lib/schedules/utils.ts b/apps/sim/lib/workflows/schedules/utils.ts similarity index 99% rename from apps/sim/lib/schedules/utils.ts rename to apps/sim/lib/workflows/schedules/utils.ts index 9d2904ce266..233715c7110 100644 --- a/apps/sim/lib/schedules/utils.ts +++ b/apps/sim/lib/workflows/schedules/utils.ts @@ -1,7 +1,7 @@ import { Cron } from 'croner' import cronstrue from 'cronstrue' +import { formatDateTime } from '@/lib/core/utils/formatting' import { createLogger } from '@/lib/logs/console/logger' -import { formatDateTime } from '@/lib/utils' const logger = createLogger('ScheduleUtils') diff --git a/apps/sim/lib/workflows/streaming.ts b/apps/sim/lib/workflows/streaming/streaming.ts similarity index 98% rename from apps/sim/lib/workflows/streaming.ts rename to apps/sim/lib/workflows/streaming/streaming.ts index 27f4342875e..46e1d924786 100644 --- a/apps/sim/lib/workflows/streaming.ts +++ b/apps/sim/lib/workflows/streaming/streaming.ts @@ -1,5 +1,5 @@ +import { encodeSSE } from '@/lib/core/utils/sse' import { createLogger } from '@/lib/logs/console/logger' -import { encodeSSE } from '@/lib/utils' import type { ExecutionResult } from '@/executor/types' const logger = createLogger('WorkflowStreaming') @@ -105,7 +105,7 @@ export async function createStreamingResponse( if (!streamConfig.selectedOutputs?.length) return const { extractBlockIdFromOutputId, extractPathFromOutputId, traverseObjectPath } = - await import('@/lib/response-format') + await import('@/lib/core/utils/response-format') const matchingOutputs = streamConfig.selectedOutputs.filter( (outputId) => extractBlockIdFromOutputId(outputId) === blockId @@ -195,7 +195,7 @@ export async function createStreamingResponse( if (streamConfig.selectedOutputs?.length && result.output) { const { extractBlockIdFromOutputId, extractPathFromOutputId, traverseObjectPath } = - await import('@/lib/response-format') + await import('@/lib/core/utils/response-format') for (const outputId of streamConfig.selectedOutputs) { const blockId = extractBlockIdFromOutputId(outputId) diff --git a/apps/sim/lib/workflows/training/compute-edit-sequence.ts b/apps/sim/lib/workflows/training/compute-edit-sequence.ts index bcc686dae2b..bf4204376ed 100644 --- a/apps/sim/lib/workflows/training/compute-edit-sequence.ts +++ b/apps/sim/lib/workflows/training/compute-edit-sequence.ts @@ -1,4 +1,4 @@ -import type { CopilotWorkflowState } from '@/lib/workflows/json-sanitizer' +import type { CopilotWorkflowState } from '@/lib/workflows/sanitization/json-sanitizer' import { TRIGGER_RUNTIME_SUBBLOCK_IDS } from '@/triggers/consts' export interface EditOperation { diff --git a/apps/sim/lib/workflows/execution-events.ts b/apps/sim/lib/workflows/triggers/execution-events.ts similarity index 100% rename from apps/sim/lib/workflows/execution-events.ts rename to apps/sim/lib/workflows/triggers/execution-events.ts diff --git a/apps/sim/lib/workflows/trigger-utils.ts b/apps/sim/lib/workflows/triggers/trigger-utils.ts similarity index 99% rename from apps/sim/lib/workflows/trigger-utils.ts rename to apps/sim/lib/workflows/triggers/trigger-utils.ts index 4c4d52b978d..aaf6dbb697f 100644 --- a/apps/sim/lib/workflows/trigger-utils.ts +++ b/apps/sim/lib/workflows/triggers/trigger-utils.ts @@ -1,5 +1,9 @@ import { createLogger } from '@/lib/logs/console/logger' -import { type StartBlockCandidate, StartBlockPath, TRIGGER_TYPES } from '@/lib/workflows/triggers' +import { + type StartBlockCandidate, + StartBlockPath, + TRIGGER_TYPES, +} from '@/lib/workflows/triggers/triggers' import { getAllBlocks, getBlock } from '@/blocks' import type { BlockConfig } from '@/blocks/types' import { getTrigger } from '@/triggers' diff --git a/apps/sim/lib/workflows/triggers.ts b/apps/sim/lib/workflows/triggers/triggers.ts similarity index 100% rename from apps/sim/lib/workflows/triggers.ts rename to apps/sim/lib/workflows/triggers/triggers.ts diff --git a/apps/sim/lib/workflows/utils.ts b/apps/sim/lib/workflows/utils.ts index a64e3355d33..b2573610a9b 100644 --- a/apps/sim/lib/workflows/utils.ts +++ b/apps/sim/lib/workflows/utils.ts @@ -4,9 +4,9 @@ import type { InferSelectModel } from 'drizzle-orm' import { and, eq } from 'drizzle-orm' import { NextResponse } from 'next/server' import { getSession } from '@/lib/auth' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import type { PermissionType } from '@/lib/permissions/utils' -import { getBaseUrl } from '@/lib/urls/utils' +import type { PermissionType } from '@/lib/workspaces/permissions/utils' import type { ExecutionResult } from '@/executor/types' import type { WorkflowState } from '@/stores/workflows/workflow/types' diff --git a/apps/sim/lib/variables/variable-manager.test.ts b/apps/sim/lib/workflows/variables/variable-manager.test.ts similarity index 99% rename from apps/sim/lib/variables/variable-manager.test.ts rename to apps/sim/lib/workflows/variables/variable-manager.test.ts index 850f2bfc1ac..4796ce19b9d 100644 --- a/apps/sim/lib/variables/variable-manager.test.ts +++ b/apps/sim/lib/workflows/variables/variable-manager.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { VariableManager } from '@/lib/variables/variable-manager' +import { VariableManager } from '@/lib/workflows/variables/variable-manager' describe('VariableManager', () => { describe('parseInputForStorage', () => { diff --git a/apps/sim/lib/variables/variable-manager.ts b/apps/sim/lib/workflows/variables/variable-manager.ts similarity index 100% rename from apps/sim/lib/variables/variable-manager.ts rename to apps/sim/lib/workflows/variables/variable-manager.ts diff --git a/apps/sim/lib/workspaces/duplicate.ts b/apps/sim/lib/workspaces/duplicate.ts index 4678911aa51..9bda00d5f4a 100644 --- a/apps/sim/lib/workspaces/duplicate.ts +++ b/apps/sim/lib/workspaces/duplicate.ts @@ -2,8 +2,8 @@ import { db } from '@sim/db' import { permissions, workflow, workflowFolder, workspace as workspaceTable } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' -import { duplicateWorkflow } from '@/lib/workflows/duplicate' +import { duplicateWorkflow } from '@/lib/workflows/persistence/duplicate' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('WorkspaceDuplicate') diff --git a/apps/sim/lib/workspaces/naming.ts b/apps/sim/lib/workspaces/naming.ts index 49701acbfb4..4c08f5eda2a 100644 --- a/apps/sim/lib/workspaces/naming.ts +++ b/apps/sim/lib/workspaces/naming.ts @@ -2,7 +2,7 @@ * Utility functions for generating names for workspaces and folders */ -import type { Workspace } from '@/lib/organization/types' +import type { Workspace } from '@/lib/workspaces/organization/types' import type { WorkflowFolder } from '@/stores/folders/store' export interface NameableEntity { diff --git a/apps/sim/lib/organization/index.ts b/apps/sim/lib/workspaces/organization/index.ts similarity index 65% rename from apps/sim/lib/organization/index.ts rename to apps/sim/lib/workspaces/organization/index.ts index d128aecbf5c..1d864411750 100644 --- a/apps/sim/lib/organization/index.ts +++ b/apps/sim/lib/workspaces/organization/index.ts @@ -1,10 +1,3 @@ -// Export helper functions -export { - calculateSeatUsage as calculateSeatUsageHelper, - getUsedSeats, - getUserRole, - isAdminOrOwner, -} from '@/lib/organization/helpers' // Export types export type { Invitation, @@ -17,11 +10,14 @@ export type { User, Workspace, WorkspaceInvitation, -} from '@/lib/organization/types' +} from '@/lib/workspaces/organization/types' // Export utility functions export { calculateSeatUsage, generateSlug, + getUsedSeats, + getUserRole, + isAdminOrOwner, validateEmail, validateSlug, -} from '@/lib/organization/utils' +} from '@/lib/workspaces/organization/utils' diff --git a/apps/sim/lib/organization/types.ts b/apps/sim/lib/workspaces/organization/types.ts similarity index 100% rename from apps/sim/lib/organization/types.ts rename to apps/sim/lib/workspaces/organization/types.ts diff --git a/apps/sim/lib/organization/helpers.ts b/apps/sim/lib/workspaces/organization/utils.ts similarity index 61% rename from apps/sim/lib/organization/helpers.ts rename to apps/sim/lib/workspaces/organization/utils.ts index 3edc4d67cd8..b619677d1eb 100644 --- a/apps/sim/lib/organization/helpers.ts +++ b/apps/sim/lib/workspaces/organization/utils.ts @@ -1,9 +1,10 @@ /** - * Helper functions for organization-related computations + * Utility functions for organization-related operations * These are pure functions that compute values from organization data */ -import type { Organization } from '@/lib/organization/types' +import { quickValidateEmail } from '@/lib/messaging/email/validation' +import type { Organization } from '@/lib/workspaces/organization/types' /** * Get the role of a user in an organization @@ -55,8 +56,34 @@ export function calculateSeatUsage(organization: Organization | null | undefined /** * Get used seats from an organization - * Alias for calculateSeatUsage for backward compatibility + * Alias for calculateSeatUsage */ export function getUsedSeats(organization: Organization | null | undefined) { return calculateSeatUsage(organization) } + +/** + * Generate a URL-friendly slug from a name + */ +export function generateSlug(name: string): string { + return name + .toLowerCase() + .replace(/[^a-z0-9]/g, '-') // Replace non-alphanumeric with hyphens + .replace(/-+/g, '-') // Replace consecutive hyphens with single hyphen + .replace(/^-|-$/g, '') // Remove leading and trailing hyphens +} + +/** + * Validate organization slug format + */ +export function validateSlug(slug: string): boolean { + const slugRegex = /^[a-z0-9-_]+$/ + return slugRegex.test(slug) +} + +/** + * Validate email format + */ +export function validateEmail(email: string): boolean { + return quickValidateEmail(email.trim().toLowerCase()).isValid +} diff --git a/apps/sim/lib/permissions/utils.test.ts b/apps/sim/lib/workspaces/permissions/utils.test.ts similarity index 99% rename from apps/sim/lib/permissions/utils.test.ts rename to apps/sim/lib/workspaces/permissions/utils.test.ts index f4c4852399c..f997e142651 100644 --- a/apps/sim/lib/permissions/utils.test.ts +++ b/apps/sim/lib/workspaces/permissions/utils.test.ts @@ -48,7 +48,7 @@ import { getUsersWithPermissions, hasAdminPermission, hasWorkspaceAdminAccess, -} from '@/lib/permissions/utils' +} from '@/lib/workspaces/permissions/utils' const mockDb = db as any type PermissionType = 'admin' | 'write' | 'read' diff --git a/apps/sim/lib/permissions/utils.ts b/apps/sim/lib/workspaces/permissions/utils.ts similarity index 100% rename from apps/sim/lib/permissions/utils.ts rename to apps/sim/lib/workspaces/permissions/utils.ts diff --git a/apps/sim/lib/collaboration/presence-colors.ts b/apps/sim/lib/workspaces/presence-colors.ts similarity index 100% rename from apps/sim/lib/collaboration/presence-colors.ts rename to apps/sim/lib/workspaces/presence-colors.ts diff --git a/apps/sim/middleware.ts b/apps/sim/middleware.ts index a922ab9feb0..e9ffd2da678 100644 --- a/apps/sim/middleware.ts +++ b/apps/sim/middleware.ts @@ -1,8 +1,8 @@ import { getSessionCookie } from 'better-auth/cookies' import { type NextRequest, NextResponse } from 'next/server' -import { isHosted } from './lib/environment' +import { isHosted } from './lib/core/config/environment' +import { generateRuntimeCSP } from './lib/core/security/csp' import { createLogger } from './lib/logs/console/logger' -import { generateRuntimeCSP } from './lib/security/csp' const logger = createLogger('Middleware') diff --git a/apps/sim/next.config.ts b/apps/sim/next.config.ts index 628ee264fd5..43074480174 100644 --- a/apps/sim/next.config.ts +++ b/apps/sim/next.config.ts @@ -1,7 +1,7 @@ import type { NextConfig } from 'next' -import { env, getEnv, isTruthy } from './lib/env' -import { isDev, isHosted } from './lib/environment' -import { getMainCSPPolicy, getWorkflowExecutionCSPPolicy } from './lib/security/csp' +import { env, getEnv, isTruthy } from './lib/core/config/env' +import { isDev, isHosted } from './lib/core/config/environment' +import { getMainCSPPolicy, getWorkflowExecutionCSPPolicy } from './lib/core/security/csp' const nextConfig: NextConfig = { devIndicators: false, diff --git a/apps/sim/providers/azure-openai/index.ts b/apps/sim/providers/azure-openai/index.ts index b4af62f63ac..fd4f71a563f 100644 --- a/apps/sim/providers/azure-openai/index.ts +++ b/apps/sim/providers/azure-openai/index.ts @@ -1,5 +1,5 @@ import { AzureOpenAI } from 'openai' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import type { StreamingExecution } from '@/executor/types' import { getProviderDefaultModel, getProviderModels } from '@/providers/models' diff --git a/apps/sim/providers/index.ts b/apps/sim/providers/index.ts index d4af6e5c18d..0b6d7b1ac7e 100644 --- a/apps/sim/providers/index.ts +++ b/apps/sim/providers/index.ts @@ -1,4 +1,4 @@ -import { getCostMultiplier } from '@/lib/environment' +import { getCostMultiplier } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import type { StreamingExecution } from '@/executor/types' import type { ProviderRequest, ProviderResponse } from '@/providers/types' diff --git a/apps/sim/providers/ollama/index.ts b/apps/sim/providers/ollama/index.ts index c1f28204622..0118e53ffc6 100644 --- a/apps/sim/providers/ollama/index.ts +++ b/apps/sim/providers/ollama/index.ts @@ -1,5 +1,5 @@ import OpenAI from 'openai' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import type { StreamingExecution } from '@/executor/types' import type { ModelsObject } from '@/providers/ollama/types' diff --git a/apps/sim/providers/utils.test.ts b/apps/sim/providers/utils.test.ts index 21ea4711643..7c30ac3c3a4 100644 --- a/apps/sim/providers/utils.test.ts +++ b/apps/sim/providers/utils.test.ts @@ -1,5 +1,5 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' -import * as environmentModule from '@/lib/environment' +import * as environmentModule from '@/lib/core/config/environment' import { calculateCost, extractAndParseJSON, diff --git a/apps/sim/providers/utils.ts b/apps/sim/providers/utils.ts index b554efd03d1..85718667a5b 100644 --- a/apps/sim/providers/utils.ts +++ b/apps/sim/providers/utils.ts @@ -1,5 +1,5 @@ -import { getEnv, isTruthy } from '@/lib/env' -import { isHosted } from '@/lib/environment' +import { getEnv, isTruthy } from '@/lib/core/config/env' +import { isHosted } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' import { anthropicProvider } from '@/providers/anthropic' import { azureOpenAIProvider } from '@/providers/azure-openai' @@ -645,7 +645,7 @@ export function getApiKey(provider: string, model: string, userProvidedKey?: str if (isHosted && (isOpenAIModel || isClaudeModel || isGeminiModel)) { try { // Import the key rotation function - const { getRotatingApiKey } = require('@/lib/utils') + const { getRotatingApiKey } = require('@/lib/core/config/api-keys') const serverKey = getRotatingApiKey(isGeminiModel ? 'gemini' : provider) return serverKey } catch (_error) { diff --git a/apps/sim/providers/vllm/index.ts b/apps/sim/providers/vllm/index.ts index 7a9ee6afe9d..be59f5480e9 100644 --- a/apps/sim/providers/vllm/index.ts +++ b/apps/sim/providers/vllm/index.ts @@ -1,5 +1,5 @@ import OpenAI from 'openai' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import type { StreamingExecution } from '@/executor/types' import { getProviderDefaultModel, getProviderModels } from '@/providers/models' diff --git a/apps/sim/scripts/export-workflow.ts b/apps/sim/scripts/export-workflow.ts index c64e018dca2..f842922377d 100755 --- a/apps/sim/scripts/export-workflow.ts +++ b/apps/sim/scripts/export-workflow.ts @@ -26,8 +26,8 @@ console.error = () => {} import { writeFileSync } from 'fs' import { eq } from 'drizzle-orm' import { db, workflow } from '../../../packages/db/index.js' -import { loadWorkflowFromNormalizedTables } from '../lib/workflows/db-helpers.js' -import { sanitizeForExport } from '../lib/workflows/json-sanitizer.js' +import { loadWorkflowFromNormalizedTables } from '../lib/workflows/persistence/utils.js' +import { sanitizeForExport } from '../lib/workflows/sanitization/json-sanitizer.js' // ---------- CLI argument parsing ---------- const args = process.argv.slice(2) diff --git a/apps/sim/scripts/process-docs.ts b/apps/sim/scripts/process-docs.ts index 029594df967..2a53e78fc56 100644 --- a/apps/sim/scripts/process-docs.ts +++ b/apps/sim/scripts/process-docs.ts @@ -5,7 +5,7 @@ import { db } from '@sim/db' import { docsEmbeddings } from '@sim/db/schema' import { sql } from 'drizzle-orm' import { type DocChunk, DocsChunker } from '@/lib/chunkers' -import { isDev } from '@/lib/environment' +import { isDev } from '@/lib/core/config/environment' import { createLogger } from '@/lib/logs/console/logger' const logger = createLogger('ProcessDocs') diff --git a/apps/sim/serializer/index.ts b/apps/sim/serializer/index.ts index 3fb005c6956..0b03bd2af7f 100644 --- a/apps/sim/serializer/index.ts +++ b/apps/sim/serializer/index.ts @@ -1,6 +1,6 @@ import type { Edge } from 'reactflow' -import { BlockPathCalculator } from '@/lib/block-path-calculator' import { createLogger } from '@/lib/logs/console/logger' +import { BlockPathCalculator } from '@/lib/workflows/blocks/block-path-calculator' import { getBlock } from '@/blocks' import type { SubBlockConfig } from '@/blocks/types' import type { SerializedBlock, SerializedWorkflow } from '@/serializer/types' diff --git a/apps/sim/services/queue/types.ts b/apps/sim/services/queue/types.ts index ac620b86437..607c977061f 100644 --- a/apps/sim/services/queue/types.ts +++ b/apps/sim/services/queue/types.ts @@ -1,6 +1,6 @@ import type { userRateLimits } from '@sim/db/schema' import type { InferSelectModel } from 'drizzle-orm' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' // Database types export type UserRateLimit = InferSelectModel diff --git a/apps/sim/socket-server/config/socket.ts b/apps/sim/socket-server/config/socket.ts index 9bbe853d82c..2eab72f588c 100644 --- a/apps/sim/socket-server/config/socket.ts +++ b/apps/sim/socket-server/config/socket.ts @@ -1,9 +1,9 @@ import type { Server as HttpServer } from 'http' import { Server } from 'socket.io' -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 { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' const logger = createLogger('SocketIOConfig') diff --git a/apps/sim/socket-server/database/operations.ts b/apps/sim/socket-server/database/operations.ts index e985d169f89..09a4f48d12b 100644 --- a/apps/sim/socket-server/database/operations.ts +++ b/apps/sim/socket-server/database/operations.ts @@ -3,10 +3,10 @@ import { webhook, workflow, workflowBlocks, workflowEdges, workflowSubflows } fr import { and, eq, inArray, or, sql } from 'drizzle-orm' import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' -import { cleanupExternalWebhook } from '@/lib/webhooks/webhook-helpers' -import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers' +import { cleanupExternalWebhook } from '@/lib/webhooks/provider-subscriptions' +import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/persistence/utils' const logger = createLogger('SocketDatabase') diff --git a/apps/sim/socket-server/index.ts b/apps/sim/socket-server/index.ts index 1a475ef1e1d..1a88dfaebf2 100644 --- a/apps/sim/socket-server/index.ts +++ b/apps/sim/socket-server/index.ts @@ -1,5 +1,5 @@ import { createServer } from 'http' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' import { createSocketIOServer } from '@/socket-server/config/socket' import { setupAllHandlers } from '@/socket-server/handlers' diff --git a/apps/sim/socket-server/middleware/permissions.ts b/apps/sim/socket-server/middleware/permissions.ts index 71ed1f3cb1d..7ce8db17e1b 100644 --- a/apps/sim/socket-server/middleware/permissions.ts +++ b/apps/sim/socket-server/middleware/permissions.ts @@ -2,7 +2,7 @@ import { db } from '@sim/db' import { workflow } from '@sim/db/schema' import { eq } from 'drizzle-orm' import { createLogger } from '@/lib/logs/console/logger' -import { getUserEntityPermissions } from '@/lib/permissions/utils' +import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils' const logger = createLogger('SocketPermissions') diff --git a/apps/sim/socket-server/rooms/manager.ts b/apps/sim/socket-server/rooms/manager.ts index 5b6a429f276..b8f4948798a 100644 --- a/apps/sim/socket-server/rooms/manager.ts +++ b/apps/sim/socket-server/rooms/manager.ts @@ -4,7 +4,7 @@ import { and, eq, isNull } from 'drizzle-orm' import { drizzle } from 'drizzle-orm/postgres-js' import postgres from 'postgres' import type { Server } from 'socket.io' -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import { createLogger } from '@/lib/logs/console/logger' const connectionString = env.DATABASE_URL diff --git a/apps/sim/stores/copilot-training/store.ts b/apps/sim/stores/copilot-training/store.ts index 481b4914e90..f9841849d63 100644 --- a/apps/sim/stores/copilot-training/store.ts +++ b/apps/sim/stores/copilot-training/store.ts @@ -1,7 +1,7 @@ import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { createLogger } from '@/lib/logs/console/logger' -import { sanitizeForCopilot } from '@/lib/workflows/json-sanitizer' +import { sanitizeForCopilot } from '@/lib/workflows/sanitization/json-sanitizer' import { computeEditSequence, type EditOperation, diff --git a/apps/sim/stores/terminal/console/store.ts b/apps/sim/stores/terminal/console/store.ts index a8b1eab0bb5..a02d5bb19e9 100644 --- a/apps/sim/stores/terminal/console/store.ts +++ b/apps/sim/stores/terminal/console/store.ts @@ -1,7 +1,7 @@ import { create } from 'zustand' import { devtools, persist } from 'zustand/middleware' +import { redactApiKeys } from '@/lib/core/security/redaction' import { createLogger } from '@/lib/logs/console/logger' -import { redactApiKeys } from '@/lib/utils' import type { NormalizedBlockOutput } from '@/executor/types' import { useExecutionStore } from '@/stores/execution/store' import { useNotificationStore } from '@/stores/notifications' diff --git a/apps/sim/stores/workflow-diff/store.ts b/apps/sim/stores/workflow-diff/store.ts index 1676ccfba88..bef5512ff2f 100644 --- a/apps/sim/stores/workflow-diff/store.ts +++ b/apps/sim/stores/workflow-diff/store.ts @@ -8,8 +8,8 @@ import { type WorkflowDiff, WorkflowDiffEngine, } from '@/lib/workflows/diff' -import { enqueueReplaceWorkflowState } from '@/lib/workflows/socket-operations' -import { validateWorkflowState } from '@/lib/workflows/validation' +import { enqueueReplaceWorkflowState } from '@/lib/workflows/operations/socket-operations' +import { validateWorkflowState } from '@/lib/workflows/sanitization/validation' import { Serializer } from '@/serializer' import { useWorkflowRegistry } from '../workflows/registry/store' import { useSubBlockStore } from '../workflows/subblock/store' diff --git a/apps/sim/stores/workflows/json/store.ts b/apps/sim/stores/workflows/json/store.ts index 82d663b8ec1..0b1550091d3 100644 --- a/apps/sim/stores/workflows/json/store.ts +++ b/apps/sim/stores/workflows/json/store.ts @@ -1,7 +1,10 @@ import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { createLogger } from '@/lib/logs/console/logger' -import { type ExportWorkflowState, sanitizeForExport } from '@/lib/workflows/json-sanitizer' +import { + type ExportWorkflowState, + sanitizeForExport, +} from '@/lib/workflows/sanitization/json-sanitizer' import { getWorkflowWithValues } from '@/stores/workflows' import { useWorkflowRegistry } from '../registry/store' diff --git a/apps/sim/stores/workflows/registry/store.ts b/apps/sim/stores/workflows/registry/store.ts index de69fa84482..ab871a22d8c 100644 --- a/apps/sim/stores/workflows/registry/store.ts +++ b/apps/sim/stores/workflows/registry/store.ts @@ -1,7 +1,7 @@ import { create } from 'zustand' import { devtools } from 'zustand/middleware' +import { withOptimisticUpdate } from '@/lib/core/utils/optimistic-update' import { createLogger } from '@/lib/logs/console/logger' -import { withOptimisticUpdate } from '@/lib/utils' import { buildDefaultWorkflowArtifacts } from '@/lib/workflows/defaults' import { API_ENDPOINTS } from '@/stores/constants' import { useVariablesStore } from '@/stores/panel/variables/store' diff --git a/apps/sim/stores/workflows/workflow/store.ts b/apps/sim/stores/workflows/workflow/store.ts index dfb22918a03..842a1ff40f5 100644 --- a/apps/sim/stores/workflows/workflow/store.ts +++ b/apps/sim/stores/workflows/workflow/store.ts @@ -2,8 +2,8 @@ import type { Edge } from 'reactflow' import { create } from 'zustand' import { devtools } from 'zustand/middleware' import { createLogger } from '@/lib/logs/console/logger' -import { getBlockOutputs } from '@/lib/workflows/block-outputs' -import { TriggerUtils } from '@/lib/workflows/triggers' +import { getBlockOutputs } from '@/lib/workflows/blocks/block-outputs' +import { TriggerUtils } from '@/lib/workflows/triggers/triggers' import { getBlock } from '@/blocks' import type { SubBlockConfig } from '@/blocks/types' import { isAnnotationOnlyBlock } from '@/executor/consts' diff --git a/apps/sim/telemetry.config.ts b/apps/sim/telemetry.config.ts index 621560b297d..0256b3f32db 100644 --- a/apps/sim/telemetry.config.ts +++ b/apps/sim/telemetry.config.ts @@ -23,7 +23,7 @@ * - API keys or tokens * - IP addresses or geolocation data */ -import { env } from './lib/env' +import { env } from './lib/core/config/env' const config = { /** diff --git a/apps/sim/tools/http/utils.ts b/apps/sim/tools/http/utils.ts index d2520101252..1c99a162dbb 100644 --- a/apps/sim/tools/http/utils.ts +++ b/apps/sim/tools/http/utils.ts @@ -1,6 +1,6 @@ -import { isTest } from '@/lib/environment' +import { isTest } from '@/lib/core/config/environment' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import type { TableRow } from '@/tools/types' const logger = createLogger('HTTPRequestUtils') diff --git a/apps/sim/tools/index.ts b/apps/sim/tools/index.ts index 597fdb8099c..7624c338543 100644 --- a/apps/sim/tools/index.ts +++ b/apps/sim/tools/index.ts @@ -1,8 +1,8 @@ import { generateInternalToken } from '@/lib/auth/internal' +import { generateRequestId } from '@/lib/core/utils/request' +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' import { parseMcpToolId } from '@/lib/mcp/utils' -import { getBaseUrl } from '@/lib/urls/utils' -import { generateRequestId } from '@/lib/utils' import type { ExecutionContext } from '@/executor/types' import type { ErrorInfo } from '@/tools/error-extractors' import { extractErrorMessage } from '@/tools/error-extractors' diff --git a/apps/sim/tools/mistral/parser.ts b/apps/sim/tools/mistral/parser.ts index 825469ba4fd..33a70e85bec 100644 --- a/apps/sim/tools/mistral/parser.ts +++ b/apps/sim/tools/mistral/parser.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import type { MistralParserInput, MistralParserOutput } from '@/tools/mistral/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/openai/image.ts b/apps/sim/tools/openai/image.ts index 141c9a3aeac..b65a59923fe 100644 --- a/apps/sim/tools/openai/image.ts +++ b/apps/sim/tools/openai/image.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import type { BaseImageRequestBody } from '@/tools/openai/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/add_comment.ts b/apps/sim/tools/trello/add_comment.ts index 6462127b59f..e84e65ffe82 100644 --- a/apps/sim/tools/trello/add_comment.ts +++ b/apps/sim/tools/trello/add_comment.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloAddCommentParams, TrelloAddCommentResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/create_card.ts b/apps/sim/tools/trello/create_card.ts index e1bdb791a31..0cee7d752f3 100644 --- a/apps/sim/tools/trello/create_card.ts +++ b/apps/sim/tools/trello/create_card.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloCreateCardParams, TrelloCreateCardResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/get_actions.ts b/apps/sim/tools/trello/get_actions.ts index 7f70259444a..9ab5ff41617 100644 --- a/apps/sim/tools/trello/get_actions.ts +++ b/apps/sim/tools/trello/get_actions.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloGetActionsParams, TrelloGetActionsResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/list_cards.ts b/apps/sim/tools/trello/list_cards.ts index f116479df18..ddbbe1b5954 100644 --- a/apps/sim/tools/trello/list_cards.ts +++ b/apps/sim/tools/trello/list_cards.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloListCardsParams, TrelloListCardsResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/list_lists.ts b/apps/sim/tools/trello/list_lists.ts index cf0ce873369..f0579755d93 100644 --- a/apps/sim/tools/trello/list_lists.ts +++ b/apps/sim/tools/trello/list_lists.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloListListsParams, TrelloListListsResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/trello/update_card.ts b/apps/sim/tools/trello/update_card.ts index 39dae6f80c0..3a6c7f9c2e3 100644 --- a/apps/sim/tools/trello/update_card.ts +++ b/apps/sim/tools/trello/update_card.ts @@ -1,4 +1,4 @@ -import { env } from '@/lib/env' +import { env } from '@/lib/core/config/env' import type { TrelloUpdateCardParams, TrelloUpdateCardResponse } from '@/tools/trello/types' import type { ToolConfig } from '@/tools/types' diff --git a/apps/sim/tools/utils.ts b/apps/sim/tools/utils.ts index 5c052b31517..8cf07a5301b 100644 --- a/apps/sim/tools/utils.ts +++ b/apps/sim/tools/utils.ts @@ -1,5 +1,5 @@ +import { getBaseUrl } from '@/lib/core/utils/urls' import { createLogger } from '@/lib/logs/console/logger' -import { getBaseUrl } from '@/lib/urls/utils' import { useCustomToolsStore } from '@/stores/custom-tools/store' import { useEnvironmentStore } from '@/stores/settings/environment/store' import { tools } from '@/tools/registry' diff --git a/apps/sim/trigger.config.ts b/apps/sim/trigger.config.ts index 4d82d04e2c7..543d112f070 100644 --- a/apps/sim/trigger.config.ts +++ b/apps/sim/trigger.config.ts @@ -1,6 +1,6 @@ import { additionalPackages } from '@trigger.dev/build/extensions/core' import { defineConfig } from '@trigger.dev/sdk' -import { env } from './lib/env' +import { env } from './lib/core/config/env' export default defineConfig({ project: env.TRIGGER_PROJECT_ID!, diff --git a/apps/sim/triggers/index.ts b/apps/sim/triggers/index.ts index 88e7653fdce..3bc5fe793e2 100644 --- a/apps/sim/triggers/index.ts +++ b/apps/sim/triggers/index.ts @@ -1,4 +1,4 @@ -import { generateMockPayloadFromOutputsDefinition } from '@/lib/workflows/trigger-utils' +import { generateMockPayloadFromOutputsDefinition } from '@/lib/workflows/triggers/trigger-utils' import type { SubBlockConfig } from '@/blocks/types' import { TRIGGER_REGISTRY } from '@/triggers/registry' import type { TriggerConfig } from '@/triggers/types' From bf54c88ae4a1eb8ab0325683e9c8c4345d444726 Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 14:31:23 -0800 Subject: [PATCH 07/15] feat(models): added xai models and updated gemini pricing (#2161) --- apps/sim/providers/models.ts | 72 +++++++++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 10 deletions(-) diff --git a/apps/sim/providers/models.ts b/apps/sim/providers/models.ts index 6111db81896..04ecdb71825 100644 --- a/apps/sim/providers/models.ts +++ b/apps/sim/providers/models.ts @@ -684,10 +684,10 @@ export const PROVIDER_DEFINITIONS: Record = { { id: 'gemini-2.5-pro', pricing: { - input: 0.15, - cachedInput: 0.075, - output: 0.6, - updatedAt: '2025-06-17', + input: 1.25, + cachedInput: 0.125, + output: 10.0, + updatedAt: '2025-12-02', }, capabilities: { temperature: { min: 0, max: 2 }, @@ -697,10 +697,23 @@ export const PROVIDER_DEFINITIONS: Record = { { id: 'gemini-2.5-flash', pricing: { - input: 0.15, - cachedInput: 0.075, - output: 0.6, - updatedAt: '2025-06-17', + input: 0.3, + cachedInput: 0.03, + output: 2.5, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 2 }, + }, + contextWindow: 1048576, + }, + { + id: 'gemini-2.5-flash-lite', + pricing: { + input: 0.1, + cachedInput: 0.01, + output: 0.4, + updatedAt: '2025-12-02', }, capabilities: { temperature: { min: 0, max: 2 }, @@ -772,15 +785,54 @@ export const PROVIDER_DEFINITIONS: Record = { id: 'grok-4-latest', pricing: { input: 3.0, - cachedInput: 1.5, + cachedInput: 0.75, output: 15.0, - updatedAt: '2025-10-11', + updatedAt: '2025-12-02', }, capabilities: { temperature: { min: 0, max: 1 }, }, contextWindow: 256000, }, + { + id: 'grok-4-0709', + pricing: { + input: 3.0, + cachedInput: 0.75, + output: 15.0, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 256000, + }, + { + id: 'grok-4-1-fast-reasoning', + pricing: { + input: 0.2, + cachedInput: 0.05, + output: 0.5, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 2000000, + }, + { + id: 'grok-4-1-fast-non-reasoning', + pricing: { + input: 0.2, + cachedInput: 0.05, + output: 0.5, + updatedAt: '2025-12-02', + }, + capabilities: { + temperature: { min: 0, max: 1 }, + }, + contextWindow: 2000000, + }, { id: 'grok-4-fast-reasoning', pricing: { From 2ab8cec8c36244521530a0f3f7331eb4d2789bab Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 16:21:43 -0800 Subject: [PATCH 08/15] fix(icons): fix mailgun, restore tts and smtp blocks (#2162) * fix(icons): fix mailgun * register smtp block that was missing --- apps/docs/components/icons.tsx | 10 +++++++--- apps/docs/content/docs/en/tools/mailgun.mdx | 2 +- apps/sim/blocks/blocks/mailgun.ts | 2 +- apps/sim/blocks/registry.ts | 4 ++++ apps/sim/components/icons.tsx | 10 +++++++--- 5 files changed, 20 insertions(+), 8 deletions(-) diff --git a/apps/docs/components/icons.tsx b/apps/docs/components/icons.tsx index 27a3c5119d8..b85680a25bc 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/content/docs/en/tools/mailgun.mdx b/apps/docs/content/docs/en/tools/mailgun.mdx index 450576219ae..9fb05cfab7b 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/sim/blocks/blocks/mailgun.ts b/apps/sim/blocks/blocks/mailgun.ts index 1fdeb3b6290..e78aa6690f9 100644 --- a/apps/sim/blocks/blocks/mailgun.ts +++ b/apps/sim/blocks/blocks/mailgun.ts @@ -10,7 +10,7 @@ export const MailgunBlock: BlockConfig = { 'Integrate Mailgun into your workflow. Send transactional emails, manage mailing lists and members, view domain information, and track email events. Supports text and HTML emails, tags for tracking, and comprehensive list management.', docsLink: 'https://docs.sim.ai/tools/mailgun', category: 'tools', - bgColor: '#F06248', + bgColor: '#E0E0E0', icon: MailgunIcon, subBlocks: [ diff --git a/apps/sim/blocks/registry.ts b/apps/sim/blocks/registry.ts index 57d9c9d0c58..d0353d797a9 100644 --- a/apps/sim/blocks/registry.ts +++ b/apps/sim/blocks/registry.ts @@ -85,6 +85,7 @@ import { SentryBlock } from '@/blocks/blocks/sentry' import { SerperBlock } from '@/blocks/blocks/serper' import { SharepointBlock } from '@/blocks/blocks/sharepoint' import { SlackBlock } from '@/blocks/blocks/slack' +import { SmtpBlock } from '@/blocks/blocks/smtp' import { StagehandBlock } from '@/blocks/blocks/stagehand' import { StagehandAgentBlock } from '@/blocks/blocks/stagehand_agent' import { StartTriggerBlock } from '@/blocks/blocks/start_trigger' @@ -97,6 +98,7 @@ import { TelegramBlock } from '@/blocks/blocks/telegram' import { ThinkingBlock } from '@/blocks/blocks/thinking' import { TranslateBlock } from '@/blocks/blocks/translate' import { TrelloBlock } from '@/blocks/blocks/trello' +import { TtsBlock } from '@/blocks/blocks/tts' import { TwilioSMSBlock } from '@/blocks/blocks/twilio' import { TwilioVoiceBlock } from '@/blocks/blocks/twilio_voice' import { TypeformBlock } from '@/blocks/blocks/typeform' @@ -206,11 +208,13 @@ export const registry: Record = { serper: SerperBlock, sharepoint: SharepointBlock, slack: SlackBlock, + smtp: SmtpBlock, stagehand: StagehandBlock, stagehand_agent: StagehandAgentBlock, starter: StarterBlock, start_trigger: StartTriggerBlock, stt: SttBlock, + tts: TtsBlock, stripe: StripeBlock, supabase: SupabaseBlock, tavily: TavilyBlock, diff --git a/apps/sim/components/icons.tsx b/apps/sim/components/icons.tsx index 27a3c5119d8..b85680a25bc 100644 --- a/apps/sim/components/icons.tsx +++ b/apps/sim/components/icons.tsx @@ -3765,12 +3765,16 @@ export function MailgunIcon(props: SVGProps) { return ( - + ) } From 84c2335a37ae7a0b807873266439a203e668bb0b Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 16:37:30 -0800 Subject: [PATCH 09/15] feat(i18n): update translations (#2163) Co-authored-by: waleedlatif1 --- apps/docs/content/docs/de/tools/mailgun.mdx | 2 +- apps/docs/content/docs/es/tools/mailgun.mdx | 2 +- apps/docs/content/docs/fr/tools/mailgun.mdx | 2 +- apps/docs/content/docs/ja/tools/mailgun.mdx | 2 +- apps/docs/content/docs/zh/tools/mailgun.mdx | 2 +- apps/docs/i18n.lock | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/docs/content/docs/de/tools/mailgun.mdx b/apps/docs/content/docs/de/tools/mailgun.mdx index a1981beed4e..901c76277f0 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/es/tools/mailgun.mdx b/apps/docs/content/docs/es/tools/mailgun.mdx index f1e5e5704a2..75defc2a459 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/fr/tools/mailgun.mdx b/apps/docs/content/docs/fr/tools/mailgun.mdx index 39d0bc982b4..10f8d9bd4c5 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/ja/tools/mailgun.mdx b/apps/docs/content/docs/ja/tools/mailgun.mdx index 82083e2e47d..46c7d50a208 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/zh/tools/mailgun.mdx b/apps/docs/content/docs/zh/tools/mailgun.mdx index 8d2e2c4ae6e..82a369d3636 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/i18n.lock b/apps/docs/i18n.lock index 89f5a7d7180..423253da9fe 100644 --- a/apps/docs/i18n.lock +++ b/apps/docs/i18n.lock @@ -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 From ffd12e1da4b7dc5b9d3d0c9ed6c4d3c6d8ba16a8 Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 18:36:34 -0800 Subject: [PATCH 10/15] fix(subblocks): update guardrails pii selector component to use emcn (#2164) --- .../grouped-checkbox-list.tsx | 40 +++++++++++-------- .../components/tool-input/tool-input.tsx | 6 ++- 2 files changed, 29 insertions(+), 17 deletions(-) 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 0b0d382e089..b627ba13154 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
-
-
-
+
+
@@ -269,17 +269,17 @@ function TemplateCardInner({
-
+
{authorImageUrl ? ( -
+
{author}
) : ( -
- +
+
)} -
+
{author} {isVerified && }
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 d0f0bead47a..caf0360572a 100644 --- a/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx @@ -43,8 +43,8 @@ export function TemplateCardSkeleton({ className }: { className?: string }) {
-
-
+
+
@@ -270,17 +270,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 3605f98cd0d..0e49d77b5e4 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/components/ui/verified-badge.tsx b/apps/sim/components/ui/verified-badge.tsx index 347f524609f..b0e05ac094b 100644 --- a/apps/sim/components/ui/verified-badge.tsx +++ b/apps/sim/components/ui/verified-badge.tsx @@ -1,3 +1,4 @@ +import { Tooltip } from '@/components/emcn' import { cn } from '@/lib/core/utils/cn' interface VerifiedBadgeProps { @@ -15,19 +16,24 @@ export function VerifiedBadge({ className, size = 'md' }: VerifiedBadgeProps) { const dimension = sizeMap[size] return ( -
- - - -
+ + +
+ + + +
+
+ Verified Creator +
) } From 9670d96eca3d6f502cb0182000a5e24c55ddc696 Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Tue, 2 Dec 2025 19:47:48 -0800 Subject: [PATCH 12/15] fix(templates-page): loading issue due to loading extensive workflow block in preview for all listings (#2166) * fix(templates-page): loading issue due to loading extensive workflow block in preview for all listings * add more properties --- .../templates/components/template-card.tsx | 1 + .../templates/components/template-card.tsx | 1 + .../workflow-preview-block.tsx | 133 ++++++++++++++++++ .../workflow-preview-subflow.tsx | 90 ++++++++++++ .../workflow-preview/workflow-preview.tsx | 66 ++++++++- 5 files changed, 285 insertions(+), 6 deletions(-) create mode 100644 apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-block.tsx create mode 100644 apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-subflow.tsx diff --git a/apps/sim/app/templates/components/template-card.tsx b/apps/sim/app/templates/components/template-card.tsx index 51b58f74854..3bb7c5c49a6 100644 --- a/apps/sim/app/templates/components/template-card.tsx +++ b/apps/sim/app/templates/components/template-card.tsx @@ -210,6 +210,7 @@ function TemplateCardInner({ isPannable={false} defaultZoom={0.8} fitPadding={0.2} + lightweight /> ) : (
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 caf0360572a..1e15ddcfa88 100644 --- a/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx +++ b/apps/sim/app/workspace/[workspaceId]/templates/components/template-card.tsx @@ -211,6 +211,7 @@ function TemplateCardInner({ isPannable={false} defaultZoom={0.8} fitPadding={0.2} + lightweight /> ) : (
diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-block.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-block.tsx new file mode 100644 index 00000000000..5a8cfec4c53 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-block.tsx @@ -0,0 +1,133 @@ +'use client' + +import { memo, useMemo } from 'react' +import { Handle, type NodeProps, Position } from 'reactflow' +import { getBlock } from '@/blocks/registry' + +interface WorkflowPreviewBlockData { + type: string + name: string + isTrigger?: boolean + horizontalHandles?: boolean + enabled?: boolean +} + +/** + * Lightweight block component for workflow previews. + * Renders block header, dummy subblocks skeleton, and handles. + * Respects horizontalHandles and enabled state from workflow. + * No heavy hooks, store subscriptions, or interactive features. + * Used in template cards and other preview contexts for performance. + */ +function WorkflowPreviewBlockInner({ data }: NodeProps) { + const { type, name, isTrigger = false, horizontalHandles = false, enabled = true } = data + + const blockConfig = getBlock(type) + if (!blockConfig) { + return null + } + + const IconComponent = blockConfig.icon + // Hide input handle for triggers, starters, or blocks in trigger mode + const isStarterOrTrigger = blockConfig.category === 'triggers' || type === 'starter' || isTrigger + + // Get visible subblocks from config (no fetching, just config structure) + const visibleSubBlocks = useMemo(() => { + if (!blockConfig.subBlocks) return [] + + return blockConfig.subBlocks.filter((subBlock) => { + if (subBlock.hidden) return false + if (subBlock.hideFromPreview) return false + if (subBlock.mode === 'trigger') return false + if (subBlock.mode === 'advanced') return false + return true + }) + }, [blockConfig.subBlocks]) + + const hasSubBlocks = visibleSubBlocks.length > 0 + const showErrorRow = !isStarterOrTrigger + + // Handle styles based on orientation + const horizontalHandleClass = '!border-none !bg-[var(--surface-12)] !h-5 !w-[7px] !rounded-[2px]' + const verticalHandleClass = '!border-none !bg-[var(--surface-12)] !h-[7px] !w-5 !rounded-[2px]' + + return ( +
+ {/* Target handle - not shown for triggers/starters */} + {!isStarterOrTrigger && ( + + )} + + {/* Header */} +
+
+ +
+ + {name} + +
+ + {/* Subblocks skeleton */} + {(hasSubBlocks || showErrorRow) && ( +
+ {visibleSubBlocks.slice(0, 4).map((subBlock) => ( +
+ + {subBlock.title ?? subBlock.id} + + - +
+ ))} + {visibleSubBlocks.length > 4 && ( +
+ + +{visibleSubBlocks.length - 4} more + +
+ )} + {showErrorRow && ( +
+ + error + +
+ )} +
+ )} + + {/* Source handle */} + +
+ ) +} + +export const WorkflowPreviewBlock = memo(WorkflowPreviewBlockInner) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-subflow.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-subflow.tsx new file mode 100644 index 00000000000..d58d04b5df4 --- /dev/null +++ b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-subflow.tsx @@ -0,0 +1,90 @@ +'use client' + +import { memo } from 'react' +import { RepeatIcon, SplitIcon } from 'lucide-react' +import { Handle, type NodeProps, Position } from 'reactflow' + +interface WorkflowPreviewSubflowData { + name: string + width?: number + height?: number + kind: 'loop' | 'parallel' +} + +/** + * Lightweight subflow component for workflow previews. + * Matches the styling of the actual SubflowNodeComponent but without + * hooks, store subscriptions, or interactive features. + * Used in template cards and other preview contexts for performance. + */ +function WorkflowPreviewSubflowInner({ data }: NodeProps) { + const { name, width = 500, height = 300, kind } = data + + const isLoop = kind === 'loop' + const BlockIcon = isLoop ? RepeatIcon : SplitIcon + const blockIconBg = isLoop ? '#2FB3FF' : '#FEE12B' + const blockName = name || (isLoop ? 'Loop' : 'Parallel') + + // Handle IDs matching the actual subflow component + const startHandleId = isLoop ? 'loop-start-source' : 'parallel-start-source' + const endHandleId = isLoop ? 'loop-end-source' : 'parallel-end-source' + + // Handle styles matching the actual subflow component + const handleClass = + '!border-none !bg-[var(--surface-12)] !h-5 !w-[7px] !rounded-l-[2px] !rounded-r-[2px]' + + return ( +
+ {/* Target handle on left (input to the subflow) */} + + + {/* Header - matches actual subflow header */} +
+
+ +
+ + {blockName} + +
+ + {/* Start handle inside - connects to first block in subflow */} +
+ Start + +
+ + {/* End source handle on right (output from the subflow) */} + +
+ ) +} + +export const WorkflowPreviewSubflow = memo(WorkflowPreviewSubflowInner) diff --git a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx index ca4674596f6..32b605f440f 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview.tsx @@ -1,7 +1,6 @@ 'use client' import { useMemo } from 'react' -import { cloneDeep } from 'lodash' import ReactFlow, { ConnectionLineType, type Edge, @@ -18,6 +17,8 @@ import { NoteBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/componen import { SubflowNodeComponent } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/subflows/subflow-node' import { WorkflowBlock } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-block/workflow-block' import { WorkflowEdge } from '@/app/workspace/[workspaceId]/w/[workflowId]/components/workflow-edge/workflow-edge' +import { WorkflowPreviewBlock } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-block' +import { WorkflowPreviewSubflow } from '@/app/workspace/[workspaceId]/w/components/workflow-preview/workflow-preview-subflow' import { getBlock } from '@/blocks' import type { WorkflowState } from '@/stores/workflows/workflow/types' @@ -34,15 +35,29 @@ interface WorkflowPreviewProps { defaultZoom?: number fitPadding?: number onNodeClick?: (blockId: string, mousePosition: { x: number; y: number }) => void + /** Use lightweight blocks for better performance in template cards */ + lightweight?: boolean } -// Define node types - the components now handle preview mode internally -const nodeTypes: NodeTypes = { +/** + * Full node types with interactive WorkflowBlock for detailed previews + */ +const fullNodeTypes: NodeTypes = { workflowBlock: WorkflowBlock, noteBlock: NoteBlock, subflowNode: SubflowNodeComponent, } +/** + * Lightweight node types for template cards and other high-volume previews. + * Uses minimal components without hooks or store subscriptions. + */ +const lightweightNodeTypes: NodeTypes = { + workflowBlock: WorkflowPreviewBlock, + noteBlock: WorkflowPreviewBlock, + subflowNode: WorkflowPreviewSubflow, +} + // Define edge types const edgeTypes: EdgeTypes = { default: WorkflowEdge, @@ -59,7 +74,10 @@ export function WorkflowPreview({ defaultZoom = 0.8, fitPadding = 0.25, onNodeClick, + lightweight = false, }: WorkflowPreviewProps) { + // Use lightweight node types for better performance in template cards + const nodeTypes = lightweight ? lightweightNodeTypes : fullNodeTypes // Check if the workflow state is valid const isValidWorkflowState = workflowState?.blocks && workflowState.edges @@ -130,6 +148,43 @@ export function WorkflowPreview({ const absolutePosition = calculateAbsolutePosition(block, workflowState.blocks) + // Lightweight mode: create minimal node data for performance + if (lightweight) { + // Handle loops and parallels as subflow nodes + if (block.type === 'loop' || block.type === 'parallel') { + nodeArray.push({ + id: blockId, + type: 'subflowNode', + position: absolutePosition, + draggable: false, + data: { + name: block.name, + width: block.data?.width || 500, + height: block.data?.height || 300, + kind: block.type as 'loop' | 'parallel', + }, + }) + return + } + + // Regular blocks + nodeArray.push({ + id: blockId, + type: 'workflowBlock', + position: absolutePosition, + draggable: false, + data: { + type: block.type, + name: block.name, + isTrigger: block.triggerMode === true, + horizontalHandles: block.horizontalHandles ?? false, + enabled: block.enabled ?? true, + }, + }) + return + } + + // Full mode: create detailed node data for interactive previews if (block.type === 'loop') { nodeArray.push({ id: block.id, @@ -178,8 +233,6 @@ export function WorkflowPreview({ return } - const subBlocksClone = block.subBlocks ? cloneDeep(block.subBlocks) : {} - const nodeType = block.type === 'note' ? 'noteBlock' : 'workflowBlock' nodeArray.push({ @@ -194,7 +247,7 @@ export function WorkflowPreview({ blockState: block, canEdit: false, isPreview: true, - subBlockValues: subBlocksClone, + subBlockValues: block.subBlocks ?? {}, }, }) @@ -242,6 +295,7 @@ export function WorkflowPreview({ showSubBlocks, workflowState.blocks, isValidWorkflowState, + lightweight, ]) const edges: Edge[] = useMemo(() => { From a6e3c92c10def6c388a3fe6572fe1efbc07b020a Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 20:18:01 -0800 Subject: [PATCH 13/15] fix(jira): fixed incorrect dependsOn for jira project/issue subblcks (#2167) --- apps/sim/blocks/blocks/jira.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/sim/blocks/blocks/jira.ts b/apps/sim/blocks/blocks/jira.ts index 532a3c1d792..54885e7111e 100644 --- a/apps/sim/blocks/blocks/jira.ts +++ b/apps/sim/blocks/blocks/jira.ts @@ -183,7 +183,7 @@ export const JiraBlock: BlockConfig = { type: 'short-input', required: true, placeholder: 'Enter new summary for the issue', - dependsOn: ['issueKey'], + dependsOn: ['projectId'], condition: { field: 'operation', value: ['update', 'write'] }, }, { @@ -191,7 +191,7 @@ export const JiraBlock: BlockConfig = { title: 'New Description', type: 'long-input', placeholder: 'Enter new description for the issue', - dependsOn: ['issueKey'], + dependsOn: ['projectId'], condition: { field: 'operation', value: ['update', 'write'] }, }, // Delete Issue fields From 3e83fb398cead855dcb950fad2b042edf9acb7d5 Mon Sep 17 00:00:00 2001 From: Waleed Date: Tue, 2 Dec 2025 20:36:16 -0800 Subject: [PATCH 14/15] fix(trace-spans): fix input/output token count in trace spans (#2168) --- apps/sim/lib/logs/execution/logging-factory.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/apps/sim/lib/logs/execution/logging-factory.ts b/apps/sim/lib/logs/execution/logging-factory.ts index 0cc5a243dd0..d70b750ffee 100644 --- a/apps/sim/lib/logs/execution/logging-factory.ts +++ b/apps/sim/lib/logs/execution/logging-factory.ts @@ -80,7 +80,6 @@ export function calculateCostSummary(traceSpans: any[]): { } } - // Recursively collect all spans with cost information from the trace span tree const collectCostSpans = (spans: any[]): any[] => { const costSpans: any[] = [] @@ -119,12 +118,12 @@ export function calculateCostSummary(traceSpans: any[]): { totalCost += span.cost.total || 0 totalInputCost += span.cost.input || 0 totalOutputCost += span.cost.output || 0 - // Tokens are at span.tokens, not span.cost.tokens + const promptTokens = span.tokens?.prompt ?? span.tokens?.input ?? 0 + const completionTokens = span.tokens?.completion ?? span.tokens?.output ?? 0 totalTokens += span.tokens?.total || 0 - totalPromptTokens += span.tokens?.prompt || 0 - totalCompletionTokens += span.tokens?.completion || 0 + totalPromptTokens += promptTokens + totalCompletionTokens += completionTokens - // Aggregate model-specific costs - model is at span.model, not span.cost.model if (span.model) { const model = span.model if (!models[model]) { @@ -138,8 +137,8 @@ export function calculateCostSummary(traceSpans: any[]): { models[model].input += span.cost.input || 0 models[model].output += span.cost.output || 0 models[model].total += span.cost.total || 0 - models[model].tokens.prompt += span.tokens?.prompt || 0 - models[model].tokens.completion += span.tokens?.completion || 0 + models[model].tokens.prompt += promptTokens + models[model].tokens.completion += completionTokens models[model].tokens.total += span.tokens?.total || 0 } } From 7de721e09045533f94df54068680b5aaf737693c Mon Sep 17 00:00:00 2001 From: Vikhyath Mondreti Date: Tue, 2 Dec 2025 20:54:17 -0800 Subject: [PATCH 15/15] fix(logs): logging with error issues for model costs (#2169) * fix(async-execution): restore async executions * fix schedules trace span collection' * fix execution trace spans for schedules + cost tracking when workflow errors --- .../app/api/workflows/[id]/execute/route.ts | 75 +++++++++++++++++++ apps/sim/background/schedule-execution.ts | 7 +- .../sim/lib/logs/execution/logging-factory.ts | 10 +-- .../sim/lib/logs/execution/logging-session.ts | 28 +++---- 4 files changed, 100 insertions(+), 20 deletions(-) diff --git a/apps/sim/app/api/workflows/[id]/execute/route.ts b/apps/sim/app/api/workflows/[id]/execute/route.ts index ada7b7c5be7..1b9fa2f7ff3 100644 --- a/apps/sim/app/api/workflows/[id]/execute/route.ts +++ b/apps/sim/app/api/workflows/[id]/execute/route.ts @@ -1,9 +1,12 @@ +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' @@ -17,6 +20,7 @@ import { } 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' @@ -217,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 * @@ -291,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, @@ -301,6 +365,7 @@ export async function POST(req: NextRequest, { params }: { params: Promise<{ id: streamParam, streamHeader, enableSSE, + isAsyncMode, }) const executionId = uuidv4() @@ -349,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/background/schedule-execution.ts b/apps/sim/background/schedule-execution.ts index 34a352e8e71..d51e2f290ac 100644 --- a/apps/sim/background/schedule-execution.ts +++ b/apps/sim/background/schedule-execution.ts @@ -9,6 +9,7 @@ import { getPersonalAndWorkspaceEnv } from '@/lib/environment/utils' import { preprocessExecution } from '@/lib/execution/preprocessing' 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 { executeWorkflowCore } from '@/lib/workflows/executor/execution-core' import { PauseResumeManager } from '@/lib/workflows/executor/human-in-the-loop-manager' import { @@ -22,6 +23,7 @@ import { getSubBlockValue, } from '@/lib/workflows/schedules/utils' import { type ExecutionMetadata, ExecutionSnapshot } from '@/executor/execution/snapshot' +import type { ExecutionResult } from '@/executor/types' import { mergeSubblockState } from '@/stores/workflows/server-utils' const logger = createLogger('TriggerScheduleExecution') @@ -293,6 +295,9 @@ async function runWorkflowExecution({ ) try { + const executionResult = (earlyError as any)?.executionResult as ExecutionResult | undefined + const { traceSpans } = executionResult ? buildTraceSpans(executionResult) : { traceSpans: [] } + await loggingSession.safeCompleteWithError({ error: { message: `Schedule execution failed: ${ @@ -300,7 +305,7 @@ async function runWorkflowExecution({ }`, stackTrace: earlyError instanceof Error ? earlyError.stack : undefined, }, - traceSpans: [], + traceSpans, }) } catch (loggingError) { logger.error(`[${requestId}] Failed to complete log entry for schedule failure`, loggingError) diff --git a/apps/sim/lib/logs/execution/logging-factory.ts b/apps/sim/lib/logs/execution/logging-factory.ts index d70b750ffee..c09f4b2ec47 100644 --- a/apps/sim/lib/logs/execution/logging-factory.ts +++ b/apps/sim/lib/logs/execution/logging-factory.ts @@ -118,11 +118,9 @@ export function calculateCostSummary(traceSpans: any[]): { totalCost += span.cost.total || 0 totalInputCost += span.cost.input || 0 totalOutputCost += span.cost.output || 0 - const promptTokens = span.tokens?.prompt ?? span.tokens?.input ?? 0 - const completionTokens = span.tokens?.completion ?? span.tokens?.output ?? 0 totalTokens += span.tokens?.total || 0 - totalPromptTokens += promptTokens - totalCompletionTokens += completionTokens + totalPromptTokens += span.tokens?.input ?? span.tokens?.prompt ?? 0 + totalCompletionTokens += span.tokens?.output ?? span.tokens?.completion ?? 0 if (span.model) { const model = span.model @@ -137,8 +135,8 @@ export function calculateCostSummary(traceSpans: any[]): { models[model].input += span.cost.input || 0 models[model].output += span.cost.output || 0 models[model].total += span.cost.total || 0 - models[model].tokens.prompt += promptTokens - models[model].tokens.completion += completionTokens + models[model].tokens.prompt += span.tokens?.input ?? span.tokens?.prompt ?? 0 + models[model].tokens.completion += span.tokens?.output ?? span.tokens?.completion ?? 0 models[model].tokens.total += span.tokens?.total || 0 } } diff --git a/apps/sim/lib/logs/execution/logging-session.ts b/apps/sim/lib/logs/execution/logging-session.ts index d19904e5da8..a14dedfca7d 100644 --- a/apps/sim/lib/logs/execution/logging-session.ts +++ b/apps/sim/lib/logs/execution/logging-session.ts @@ -186,21 +186,23 @@ export class LoggingSession { const durationMs = typeof totalDurationMs === 'number' ? totalDurationMs : 0 const startTime = new Date(endTime.getTime() - Math.max(1, durationMs)) - const costSummary = { - totalCost: BASE_EXECUTION_CHARGE, - totalInputCost: 0, - totalOutputCost: 0, - totalTokens: 0, - totalPromptTokens: 0, - totalCompletionTokens: 0, - baseExecutionCharge: BASE_EXECUTION_CHARGE, - modelCost: 0, - models: {}, - } + const hasProvidedSpans = Array.isArray(traceSpans) && traceSpans.length > 0 - const message = error?.message || 'Execution failed before starting blocks' + const costSummary = hasProvidedSpans + ? calculateCostSummary(traceSpans) + : { + totalCost: BASE_EXECUTION_CHARGE, + totalInputCost: 0, + totalOutputCost: 0, + totalTokens: 0, + totalPromptTokens: 0, + totalCompletionTokens: 0, + baseExecutionCharge: BASE_EXECUTION_CHARGE, + modelCost: 0, + models: {}, + } - const hasProvidedSpans = Array.isArray(traceSpans) && traceSpans.length > 0 + const message = error?.message || 'Execution failed before starting blocks' const errorSpan: TraceSpan = { id: 'workflow-error-root',