From a305bb50065a34aa0e70c44b7fcd82ec4482ebbf Mon Sep 17 00:00:00 2001 From: Wayne <5291640+ringoinca@users.noreply.github.com> Date: Mon, 14 Jul 2025 00:11:01 +0300 Subject: [PATCH] Archived email API, dark mode --- package.json | 3 +- packages/backend/package.json | 4 + .../controllers/archived-email.controller.ts | 36 + .../src/api/controllers/storage.controller.ts | 31 + .../src/api/routes/archived-email.routes.ts | 20 + .../backend/src/api/routes/storage.routes.ts | 18 + .../backend/src/api/routes/test.routes.ts | 18 + packages/backend/src/config/logger.ts | 11 + packages/backend/src/config/redis.ts | 4 +- .../migrations/0001_odd_night_thrasher.sql | 1 + .../migrations/0002_lethal_quentin_quire.sql | 5 + .../migrations/0003_petite_wrecker.sql | 1 + .../migrations/meta/0001_snapshot.json | 819 ++++++++++++++++++ .../migrations/meta/0002_snapshot.json | 819 ++++++++++++++++++ .../migrations/meta/0003_snapshot.json | 819 ++++++++++++++++++ .../database/migrations/meta/_journal.json | 21 + .../src/database/schema/archived-emails.ts | 16 +- packages/backend/src/index.ts | 14 + .../processors/initial-import.processor.ts | 8 +- .../src/services/ArchivedEmailService.ts | 117 +++ .../src/services/EmailProviderFactory.ts | 10 +- .../backend/src/services/IngestionService.ts | 109 ++- .../ingestion-connectors/GoogleConnector.ts | 41 +- .../ingestion-connectors/ImapConnector.ts | 34 +- .../MicrosoftConnector.ts | 39 +- packages/frontend/package.json | 4 +- packages/frontend/src/app.html | 2 +- .../lib/components/custom/EmailPreview.svelte | 55 ++ .../src/lib/components/custom/Footer.svelte | 11 + .../custom/IngestionSourceForm.svelte | 2 +- .../components/custom/ThemeSwitcher.svelte | 34 + .../frontend/src/lib/stores/theme.store.ts | 5 + packages/frontend/src/routes/+layout.svelte | 19 +- .../src/routes/dashboard/+layout.svelte | 14 +- .../dashboard/archived-emails/+page.server.ts | 56 ++ .../dashboard/archived-emails/+page.svelte | 170 ++++ .../archived-emails/[id]/+page.server.ts | 23 + .../archived-emails/[id]/+page.svelte | 98 +++ packages/frontend/static/favicon.png | Bin 0 -> 4948 bytes packages/frontend/static/favicon.svg | 1 - packages/frontend/static/logos/logo-sq.svg | 19 + packages/types/src/archived-emails.types.ts | 51 ++ packages/types/src/email.types.ts | 48 + packages/types/src/index.ts | 2 + packages/types/src/ingestion.types.ts | 1 - packages/types/tsconfig.tsbuildinfo | 2 +- 46 files changed, 3581 insertions(+), 54 deletions(-) create mode 100644 packages/backend/src/api/controllers/archived-email.controller.ts create mode 100644 packages/backend/src/api/controllers/storage.controller.ts create mode 100644 packages/backend/src/api/routes/archived-email.routes.ts create mode 100644 packages/backend/src/api/routes/storage.routes.ts create mode 100644 packages/backend/src/api/routes/test.routes.ts create mode 100644 packages/backend/src/config/logger.ts create mode 100644 packages/backend/src/database/migrations/0001_odd_night_thrasher.sql create mode 100644 packages/backend/src/database/migrations/0002_lethal_quentin_quire.sql create mode 100644 packages/backend/src/database/migrations/0003_petite_wrecker.sql create mode 100644 packages/backend/src/database/migrations/meta/0001_snapshot.json create mode 100644 packages/backend/src/database/migrations/meta/0002_snapshot.json create mode 100644 packages/backend/src/database/migrations/meta/0003_snapshot.json create mode 100644 packages/backend/src/services/ArchivedEmailService.ts create mode 100644 packages/frontend/src/lib/components/custom/EmailPreview.svelte create mode 100644 packages/frontend/src/lib/components/custom/Footer.svelte create mode 100644 packages/frontend/src/lib/components/custom/ThemeSwitcher.svelte create mode 100644 packages/frontend/src/lib/stores/theme.store.ts create mode 100644 packages/frontend/src/routes/dashboard/archived-emails/+page.server.ts create mode 100644 packages/frontend/src/routes/dashboard/archived-emails/+page.svelte create mode 100644 packages/frontend/src/routes/dashboard/archived-emails/[id]/+page.server.ts create mode 100644 packages/frontend/src/routes/dashboard/archived-emails/[id]/+page.svelte create mode 100644 packages/frontend/static/favicon.png delete mode 100644 packages/frontend/static/favicon.svg create mode 100644 packages/frontend/static/logos/logo-sq.svg create mode 100644 packages/types/src/archived-emails.types.ts create mode 100644 packages/types/src/email.types.ts diff --git a/package.json b/package.json index 3a83cc9..89271ef 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "private": true, "scripts": { "dev": "dotenv -- pnpm --filter \"./packages/*\" --parallel dev", - "build": "pnpm --filter \"./packages/*\" --parallel build" + "build": "pnpm --filter \"./packages/*\" --parallel build", + "start:workers": "dotenv -- pnpm --filter \"./packages/backend\" start:ingestion-worker && -- pnpm --filter \"./packages/backend\" start:indexing-worker" }, "devDependencies": { "dotenv-cli": "8.0.0", diff --git a/packages/backend/package.json b/packages/backend/package.json index 6859d89..5c9aabc 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -30,7 +30,10 @@ "googleapis": "^152.0.0", "imapflow": "^1.0.191", "jose": "^6.0.11", + "mailparser": "^3.7.4", "pg": "^8.16.3", + "pino": "^9.7.0", + "pino-pretty": "^13.0.0", "postgres": "^3.4.7", "reflect-metadata": "^0.2.2", "sqlite3": "^5.1.7", @@ -40,6 +43,7 @@ "@bull-board/api": "^6.11.0", "@bull-board/express": "^6.11.0", "@types/express": "^5.0.3", + "@types/mailparser": "^3.4.6", "@types/node": "^24.0.12", "bull-board": "^2.1.3", "drizzle-kit": "^0.31.4", diff --git a/packages/backend/src/api/controllers/archived-email.controller.ts b/packages/backend/src/api/controllers/archived-email.controller.ts new file mode 100644 index 0000000..a074756 --- /dev/null +++ b/packages/backend/src/api/controllers/archived-email.controller.ts @@ -0,0 +1,36 @@ +import { Request, Response } from 'express'; +import { ArchivedEmailService } from '../../services/ArchivedEmailService'; + +export class ArchivedEmailController { + public getArchivedEmails = async (req: Request, res: Response): Promise => { + try { + const { ingestionSourceId } = req.params; + const page = parseInt(req.query.page as string, 10) || 1; + const limit = parseInt(req.query.limit as string, 10) || 10; + + const result = await ArchivedEmailService.getArchivedEmails( + ingestionSourceId, + page, + limit + ); + return res.status(200).json(result); + } catch (error) { + console.error('Get archived emails error:', error); + return res.status(500).json({ message: 'An internal server error occurred' }); + } + }; + + public getArchivedEmailById = async (req: Request, res: Response): Promise => { + try { + const { id } = req.params; + const email = await ArchivedEmailService.getArchivedEmailById(id); + if (!email) { + return res.status(404).json({ message: 'Archived email not found' }); + } + return res.status(200).json(email); + } catch (error) { + console.error(`Get archived email by id ${req.params.id} error:`, error); + return res.status(500).json({ message: 'An internal server error occurred' }); + } + }; +} diff --git a/packages/backend/src/api/controllers/storage.controller.ts b/packages/backend/src/api/controllers/storage.controller.ts new file mode 100644 index 0000000..9094866 --- /dev/null +++ b/packages/backend/src/api/controllers/storage.controller.ts @@ -0,0 +1,31 @@ +import { Request, Response } from 'express'; +import { StorageService } from '../../services/StorageService'; + +export class StorageController { + constructor(private storageService: StorageService) { } + + public downloadFile = async (req: Request, res: Response): Promise => { + const filePath = req.query.path as string; + + if (!filePath) { + res.status(400).send('File path is required'); + return; + } + + try { + const fileExists = await this.storageService.exists(filePath); + if (!fileExists) { + res.status(404).send('File not found'); + return; + } + + const fileStream = await this.storageService.get(filePath); + const fileName = filePath.split('/').pop(); + res.setHeader('Content-Disposition', `attachment; filename=${fileName}`); + fileStream.pipe(res); + } catch (error) { + console.error('Error downloading file:', error); + res.status(500).send('Error downloading file'); + } + }; +} diff --git a/packages/backend/src/api/routes/archived-email.routes.ts b/packages/backend/src/api/routes/archived-email.routes.ts new file mode 100644 index 0000000..aecfe4b --- /dev/null +++ b/packages/backend/src/api/routes/archived-email.routes.ts @@ -0,0 +1,20 @@ +import { Router } from 'express'; +import { ArchivedEmailController } from '../controllers/archived-email.controller'; +import { requireAuth } from '../middleware/requireAuth'; +import { IAuthService } from '../../services/AuthService'; + +export const createArchivedEmailRouter = ( + archivedEmailController: ArchivedEmailController, + authService: IAuthService +): Router => { + const router = Router(); + + // Secure all routes in this module + router.use(requireAuth(authService)); + + router.get('/ingestion-source/:ingestionSourceId', archivedEmailController.getArchivedEmails); + + router.get('/:id', archivedEmailController.getArchivedEmailById); + + return router; +}; diff --git a/packages/backend/src/api/routes/storage.routes.ts b/packages/backend/src/api/routes/storage.routes.ts new file mode 100644 index 0000000..b1fc4f8 --- /dev/null +++ b/packages/backend/src/api/routes/storage.routes.ts @@ -0,0 +1,18 @@ +import { Router } from 'express'; +import { StorageController } from '../controllers/storage.controller'; +import { requireAuth } from '../middleware/requireAuth'; +import { IAuthService } from '../../services/AuthService'; + +export const createStorageRouter = ( + storageController: StorageController, + authService: IAuthService +): Router => { + const router = Router(); + + // Secure all routes in this module + router.use(requireAuth(authService)); + + router.get('/download', storageController.downloadFile); + + return router; +}; diff --git a/packages/backend/src/api/routes/test.routes.ts b/packages/backend/src/api/routes/test.routes.ts new file mode 100644 index 0000000..2f341ba --- /dev/null +++ b/packages/backend/src/api/routes/test.routes.ts @@ -0,0 +1,18 @@ +import { Router } from 'express'; +import { ingestionQueue } from '../../jobs/queues'; + +const router: Router = Router(); + +router.post('/trigger-job', async (req, res) => { + try { + const job = await ingestionQueue.add('initial-import', { + ingestionSourceId: 'test-source-id-test-2345' + }); + res.status(202).json({ message: 'Test job triggered successfully', jobId: job.id }); + } catch (error) { + console.error('Failed to trigger test job', error); + res.status(500).json({ message: 'Failed to trigger test job' }); + } +}); + +export default router; diff --git a/packages/backend/src/config/logger.ts b/packages/backend/src/config/logger.ts new file mode 100644 index 0000000..9b6a76d --- /dev/null +++ b/packages/backend/src/config/logger.ts @@ -0,0 +1,11 @@ +import pino from 'pino'; + +export const logger = pino({ + level: process.env.LOG_LEVEL || 'info', + transport: { + target: 'pino-pretty', + options: { + colorize: true + } + } +}); diff --git a/packages/backend/src/config/redis.ts b/packages/backend/src/config/redis.ts index 85a3e68..f655866 100644 --- a/packages/backend/src/config/redis.ts +++ b/packages/backend/src/config/redis.ts @@ -6,5 +6,7 @@ import 'dotenv/config'; export const connection = { host: process.env.REDIS_HOST || 'localhost', port: (process.env.REDIS_PORT && parseInt(process.env.REDIS_PORT, 10)) || 6379, - maxRetriesPerRequest: null + password: process.env.REDIS_PASSWORD, + maxRetriesPerRequest: null, + tls: {} // Enable TLS for Upstash }; diff --git a/packages/backend/src/database/migrations/0001_odd_night_thrasher.sql b/packages/backend/src/database/migrations/0001_odd_night_thrasher.sql new file mode 100644 index 0000000..1212ece --- /dev/null +++ b/packages/backend/src/database/migrations/0001_odd_night_thrasher.sql @@ -0,0 +1 @@ +ALTER TYPE "public"."ingestion_status" ADD VALUE 'auth_success'; \ No newline at end of file diff --git a/packages/backend/src/database/migrations/0002_lethal_quentin_quire.sql b/packages/backend/src/database/migrations/0002_lethal_quentin_quire.sql new file mode 100644 index 0000000..e8dd63c --- /dev/null +++ b/packages/backend/src/database/migrations/0002_lethal_quentin_quire.sql @@ -0,0 +1,5 @@ +ALTER TABLE "archived_emails" DROP CONSTRAINT "archived_emails_custodian_id_custodians_id_fk"; +--> statement-breakpoint +ALTER TABLE "archived_emails" ADD COLUMN "ingestion_source_id" uuid NOT NULL;--> statement-breakpoint +ALTER TABLE "archived_emails" ADD CONSTRAINT "archived_emails_ingestion_source_id_ingestion_sources_id_fk" FOREIGN KEY ("ingestion_source_id") REFERENCES "public"."ingestion_sources"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "archived_emails" DROP COLUMN "custodian_id"; \ No newline at end of file diff --git a/packages/backend/src/database/migrations/0003_petite_wrecker.sql b/packages/backend/src/database/migrations/0003_petite_wrecker.sql new file mode 100644 index 0000000..f9f6cb8 --- /dev/null +++ b/packages/backend/src/database/migrations/0003_petite_wrecker.sql @@ -0,0 +1 @@ +ALTER TABLE "archived_emails" ALTER COLUMN "message_id_header" DROP NOT NULL; \ No newline at end of file diff --git a/packages/backend/src/database/migrations/meta/0001_snapshot.json b/packages/backend/src/database/migrations/meta/0001_snapshot.json new file mode 100644 index 0000000..3c015c3 --- /dev/null +++ b/packages/backend/src/database/migrations/meta/0001_snapshot.json @@ -0,0 +1,819 @@ +{ + "id": "9f4ccc8d-aafa-43de-abf6-f85034dba904", + "prevId": "3fe238cc-60db-4ddb-8945-11db89bdee2b", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.archived_emails": { + "name": "archived_emails", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "custodian_id": { + "name": "custodian_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "message_id_header": { + "name": "message_id_header", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "sent_at": { + "name": "sent_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "subject": { + "name": "subject", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sender_name": { + "name": "sender_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sender_email": { + "name": "sender_email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "recipients": { + "name": "recipients", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "storage_path": { + "name": "storage_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "storage_hash_sha256": { + "name": "storage_hash_sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "size_bytes": { + "name": "size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "is_indexed": { + "name": "is_indexed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "has_attachments": { + "name": "has_attachments", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_on_legal_hold": { + "name": "is_on_legal_hold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "archived_emails_custodian_id_custodians_id_fk": { + "name": "archived_emails_custodian_id_custodians_id_fk", + "tableFrom": "archived_emails", + "tableTo": "custodians", + "columnsFrom": [ + "custodian_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.attachments": { + "name": "attachments", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "filename": { + "name": "filename", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "mime_type": { + "name": "mime_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "size_bytes": { + "name": "size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "content_hash_sha256": { + "name": "content_hash_sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "storage_path": { + "name": "storage_path", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "attachments_content_hash_sha256_unique": { + "name": "attachments_content_hash_sha256_unique", + "nullsNotDistinct": false, + "columns": [ + "content_hash_sha256" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email_attachments": { + "name": "email_attachments", + "schema": "", + "columns": { + "email_id": { + "name": "email_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "attachment_id": { + "name": "attachment_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "email_attachments_email_id_archived_emails_id_fk": { + "name": "email_attachments_email_id_archived_emails_id_fk", + "tableFrom": "email_attachments", + "tableTo": "archived_emails", + "columnsFrom": [ + "email_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "email_attachments_attachment_id_attachments_id_fk": { + "name": "email_attachments_attachment_id_attachments_id_fk", + "tableFrom": "email_attachments", + "tableTo": "attachments", + "columnsFrom": [ + "attachment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "email_attachments_email_id_attachment_id_pk": { + "name": "email_attachments_email_id_attachment_id_pk", + "columns": [ + "email_id", + "attachment_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.audit_logs": { + "name": "audit_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "bigserial", + "primaryKey": true, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "actor_identifier": { + "name": "actor_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_type": { + "name": "target_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "details": { + "name": "details", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "is_tamper_evident": { + "name": "is_tamper_evident", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ediscovery_cases": { + "name": "ediscovery_cases", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'open'" + }, + "created_by_identifier": { + "name": "created_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "ediscovery_cases_name_unique": { + "name": "ediscovery_cases_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.export_jobs": { + "name": "export_jobs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "case_id": { + "name": "case_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "format": { + "name": "format", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "query": { + "name": "query", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "file_path": { + "name": "file_path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by_identifier": { + "name": "created_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "export_jobs_case_id_ediscovery_cases_id_fk": { + "name": "export_jobs_case_id_ediscovery_cases_id_fk", + "tableFrom": "export_jobs", + "tableTo": "ediscovery_cases", + "columnsFrom": [ + "case_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.legal_holds": { + "name": "legal_holds", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "case_id": { + "name": "case_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "custodian_id": { + "name": "custodian_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "hold_criteria": { + "name": "hold_criteria", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "reason": { + "name": "reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applied_by_identifier": { + "name": "applied_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applied_at": { + "name": "applied_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "removed_at": { + "name": "removed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "legal_holds_case_id_ediscovery_cases_id_fk": { + "name": "legal_holds_case_id_ediscovery_cases_id_fk", + "tableFrom": "legal_holds", + "tableTo": "ediscovery_cases", + "columnsFrom": [ + "case_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "legal_holds_custodian_id_custodians_id_fk": { + "name": "legal_holds_custodian_id_custodians_id_fk", + "tableFrom": "legal_holds", + "tableTo": "custodians", + "columnsFrom": [ + "custodian_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.retention_policies": { + "name": "retention_policies", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "retention_period_days": { + "name": "retention_period_days", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "action_on_expiry": { + "name": "action_on_expiry", + "type": "retention_action", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "is_enabled": { + "name": "is_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "conditions": { + "name": "conditions", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "retention_policies_name_unique": { + "name": "retention_policies_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.custodians": { + "name": "custodians", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source_type": { + "name": "source_type", + "type": "ingestion_provider", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "custodians_email_unique": { + "name": "custodians_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ingestion_sources": { + "name": "ingestion_sources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "ingestion_provider", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "credentials": { + "name": "credentials", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "ingestion_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending_auth'" + }, + "last_sync_started_at": { + "name": "last_sync_started_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_sync_finished_at": { + "name": "last_sync_finished_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_sync_status_message": { + "name": "last_sync_status_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.retention_action": { + "name": "retention_action", + "schema": "public", + "values": [ + "delete_permanently", + "notify_admin" + ] + }, + "public.ingestion_provider": { + "name": "ingestion_provider", + "schema": "public", + "values": [ + "google_workspace", + "microsoft_365", + "generic_imap" + ] + }, + "public.ingestion_status": { + "name": "ingestion_status", + "schema": "public", + "values": [ + "active", + "paused", + "error", + "pending_auth", + "syncing", + "auth_success" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/packages/backend/src/database/migrations/meta/0002_snapshot.json b/packages/backend/src/database/migrations/meta/0002_snapshot.json new file mode 100644 index 0000000..7c5c93b --- /dev/null +++ b/packages/backend/src/database/migrations/meta/0002_snapshot.json @@ -0,0 +1,819 @@ +{ + "id": "bb68c4a0-16d6-40c6-891d-200348601f91", + "prevId": "9f4ccc8d-aafa-43de-abf6-f85034dba904", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.archived_emails": { + "name": "archived_emails", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "ingestion_source_id": { + "name": "ingestion_source_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "message_id_header": { + "name": "message_id_header", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "sent_at": { + "name": "sent_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "subject": { + "name": "subject", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sender_name": { + "name": "sender_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sender_email": { + "name": "sender_email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "recipients": { + "name": "recipients", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "storage_path": { + "name": "storage_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "storage_hash_sha256": { + "name": "storage_hash_sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "size_bytes": { + "name": "size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "is_indexed": { + "name": "is_indexed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "has_attachments": { + "name": "has_attachments", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_on_legal_hold": { + "name": "is_on_legal_hold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "archived_emails_ingestion_source_id_ingestion_sources_id_fk": { + "name": "archived_emails_ingestion_source_id_ingestion_sources_id_fk", + "tableFrom": "archived_emails", + "tableTo": "ingestion_sources", + "columnsFrom": [ + "ingestion_source_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.attachments": { + "name": "attachments", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "filename": { + "name": "filename", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "mime_type": { + "name": "mime_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "size_bytes": { + "name": "size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "content_hash_sha256": { + "name": "content_hash_sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "storage_path": { + "name": "storage_path", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "attachments_content_hash_sha256_unique": { + "name": "attachments_content_hash_sha256_unique", + "nullsNotDistinct": false, + "columns": [ + "content_hash_sha256" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email_attachments": { + "name": "email_attachments", + "schema": "", + "columns": { + "email_id": { + "name": "email_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "attachment_id": { + "name": "attachment_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "email_attachments_email_id_archived_emails_id_fk": { + "name": "email_attachments_email_id_archived_emails_id_fk", + "tableFrom": "email_attachments", + "tableTo": "archived_emails", + "columnsFrom": [ + "email_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "email_attachments_attachment_id_attachments_id_fk": { + "name": "email_attachments_attachment_id_attachments_id_fk", + "tableFrom": "email_attachments", + "tableTo": "attachments", + "columnsFrom": [ + "attachment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "email_attachments_email_id_attachment_id_pk": { + "name": "email_attachments_email_id_attachment_id_pk", + "columns": [ + "email_id", + "attachment_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.audit_logs": { + "name": "audit_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "bigserial", + "primaryKey": true, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "actor_identifier": { + "name": "actor_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_type": { + "name": "target_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "details": { + "name": "details", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "is_tamper_evident": { + "name": "is_tamper_evident", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ediscovery_cases": { + "name": "ediscovery_cases", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'open'" + }, + "created_by_identifier": { + "name": "created_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "ediscovery_cases_name_unique": { + "name": "ediscovery_cases_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.export_jobs": { + "name": "export_jobs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "case_id": { + "name": "case_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "format": { + "name": "format", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "query": { + "name": "query", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "file_path": { + "name": "file_path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by_identifier": { + "name": "created_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "export_jobs_case_id_ediscovery_cases_id_fk": { + "name": "export_jobs_case_id_ediscovery_cases_id_fk", + "tableFrom": "export_jobs", + "tableTo": "ediscovery_cases", + "columnsFrom": [ + "case_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.legal_holds": { + "name": "legal_holds", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "case_id": { + "name": "case_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "custodian_id": { + "name": "custodian_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "hold_criteria": { + "name": "hold_criteria", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "reason": { + "name": "reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applied_by_identifier": { + "name": "applied_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applied_at": { + "name": "applied_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "removed_at": { + "name": "removed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "legal_holds_case_id_ediscovery_cases_id_fk": { + "name": "legal_holds_case_id_ediscovery_cases_id_fk", + "tableFrom": "legal_holds", + "tableTo": "ediscovery_cases", + "columnsFrom": [ + "case_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "legal_holds_custodian_id_custodians_id_fk": { + "name": "legal_holds_custodian_id_custodians_id_fk", + "tableFrom": "legal_holds", + "tableTo": "custodians", + "columnsFrom": [ + "custodian_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.retention_policies": { + "name": "retention_policies", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "retention_period_days": { + "name": "retention_period_days", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "action_on_expiry": { + "name": "action_on_expiry", + "type": "retention_action", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "is_enabled": { + "name": "is_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "conditions": { + "name": "conditions", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "retention_policies_name_unique": { + "name": "retention_policies_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.custodians": { + "name": "custodians", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source_type": { + "name": "source_type", + "type": "ingestion_provider", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "custodians_email_unique": { + "name": "custodians_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ingestion_sources": { + "name": "ingestion_sources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "ingestion_provider", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "credentials": { + "name": "credentials", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "ingestion_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending_auth'" + }, + "last_sync_started_at": { + "name": "last_sync_started_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_sync_finished_at": { + "name": "last_sync_finished_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_sync_status_message": { + "name": "last_sync_status_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.retention_action": { + "name": "retention_action", + "schema": "public", + "values": [ + "delete_permanently", + "notify_admin" + ] + }, + "public.ingestion_provider": { + "name": "ingestion_provider", + "schema": "public", + "values": [ + "google_workspace", + "microsoft_365", + "generic_imap" + ] + }, + "public.ingestion_status": { + "name": "ingestion_status", + "schema": "public", + "values": [ + "active", + "paused", + "error", + "pending_auth", + "syncing", + "auth_success" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/packages/backend/src/database/migrations/meta/0003_snapshot.json b/packages/backend/src/database/migrations/meta/0003_snapshot.json new file mode 100644 index 0000000..e9346ba --- /dev/null +++ b/packages/backend/src/database/migrations/meta/0003_snapshot.json @@ -0,0 +1,819 @@ +{ + "id": "0a5303e6-3d82-4687-bb45-0267a6c72130", + "prevId": "bb68c4a0-16d6-40c6-891d-200348601f91", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.archived_emails": { + "name": "archived_emails", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "ingestion_source_id": { + "name": "ingestion_source_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "message_id_header": { + "name": "message_id_header", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sent_at": { + "name": "sent_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "subject": { + "name": "subject", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sender_name": { + "name": "sender_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "sender_email": { + "name": "sender_email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "recipients": { + "name": "recipients", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "storage_path": { + "name": "storage_path", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "storage_hash_sha256": { + "name": "storage_hash_sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "size_bytes": { + "name": "size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "is_indexed": { + "name": "is_indexed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "has_attachments": { + "name": "has_attachments", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "is_on_legal_hold": { + "name": "is_on_legal_hold", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "archived_emails_ingestion_source_id_ingestion_sources_id_fk": { + "name": "archived_emails_ingestion_source_id_ingestion_sources_id_fk", + "tableFrom": "archived_emails", + "tableTo": "ingestion_sources", + "columnsFrom": [ + "ingestion_source_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.attachments": { + "name": "attachments", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "filename": { + "name": "filename", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "mime_type": { + "name": "mime_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "size_bytes": { + "name": "size_bytes", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "content_hash_sha256": { + "name": "content_hash_sha256", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "storage_path": { + "name": "storage_path", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "attachments_content_hash_sha256_unique": { + "name": "attachments_content_hash_sha256_unique", + "nullsNotDistinct": false, + "columns": [ + "content_hash_sha256" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.email_attachments": { + "name": "email_attachments", + "schema": "", + "columns": { + "email_id": { + "name": "email_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "attachment_id": { + "name": "attachment_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "email_attachments_email_id_archived_emails_id_fk": { + "name": "email_attachments_email_id_archived_emails_id_fk", + "tableFrom": "email_attachments", + "tableTo": "archived_emails", + "columnsFrom": [ + "email_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "email_attachments_attachment_id_attachments_id_fk": { + "name": "email_attachments_attachment_id_attachments_id_fk", + "tableFrom": "email_attachments", + "tableTo": "attachments", + "columnsFrom": [ + "attachment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "email_attachments_email_id_attachment_id_pk": { + "name": "email_attachments_email_id_attachment_id_pk", + "columns": [ + "email_id", + "attachment_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.audit_logs": { + "name": "audit_logs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "bigserial", + "primaryKey": true, + "notNull": true + }, + "timestamp": { + "name": "timestamp", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "actor_identifier": { + "name": "actor_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "action": { + "name": "action", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_type": { + "name": "target_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "details": { + "name": "details", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "is_tamper_evident": { + "name": "is_tamper_evident", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ediscovery_cases": { + "name": "ediscovery_cases", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'open'" + }, + "created_by_identifier": { + "name": "created_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "ediscovery_cases_name_unique": { + "name": "ediscovery_cases_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.export_jobs": { + "name": "export_jobs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "case_id": { + "name": "case_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "format": { + "name": "format", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "query": { + "name": "query", + "type": "jsonb", + "primaryKey": false, + "notNull": true + }, + "file_path": { + "name": "file_path", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_by_identifier": { + "name": "created_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "export_jobs_case_id_ediscovery_cases_id_fk": { + "name": "export_jobs_case_id_ediscovery_cases_id_fk", + "tableFrom": "export_jobs", + "tableTo": "ediscovery_cases", + "columnsFrom": [ + "case_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.legal_holds": { + "name": "legal_holds", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "case_id": { + "name": "case_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "custodian_id": { + "name": "custodian_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "hold_criteria": { + "name": "hold_criteria", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "reason": { + "name": "reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "applied_by_identifier": { + "name": "applied_by_identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "applied_at": { + "name": "applied_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "removed_at": { + "name": "removed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "legal_holds_case_id_ediscovery_cases_id_fk": { + "name": "legal_holds_case_id_ediscovery_cases_id_fk", + "tableFrom": "legal_holds", + "tableTo": "ediscovery_cases", + "columnsFrom": [ + "case_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "legal_holds_custodian_id_custodians_id_fk": { + "name": "legal_holds_custodian_id_custodians_id_fk", + "tableFrom": "legal_holds", + "tableTo": "custodians", + "columnsFrom": [ + "custodian_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.retention_policies": { + "name": "retention_policies", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "retention_period_days": { + "name": "retention_period_days", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "action_on_expiry": { + "name": "action_on_expiry", + "type": "retention_action", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "is_enabled": { + "name": "is_enabled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "conditions": { + "name": "conditions", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "retention_policies_name_unique": { + "name": "retention_policies_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.custodians": { + "name": "custodians", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source_type": { + "name": "source_type", + "type": "ingestion_provider", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "custodians_email_unique": { + "name": "custodians_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.ingestion_sources": { + "name": "ingestion_sources", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "provider": { + "name": "provider", + "type": "ingestion_provider", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "credentials": { + "name": "credentials", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "ingestion_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'pending_auth'" + }, + "last_sync_started_at": { + "name": "last_sync_started_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_sync_finished_at": { + "name": "last_sync_finished_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_sync_status_message": { + "name": "last_sync_status_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.retention_action": { + "name": "retention_action", + "schema": "public", + "values": [ + "delete_permanently", + "notify_admin" + ] + }, + "public.ingestion_provider": { + "name": "ingestion_provider", + "schema": "public", + "values": [ + "google_workspace", + "microsoft_365", + "generic_imap" + ] + }, + "public.ingestion_status": { + "name": "ingestion_status", + "schema": "public", + "values": [ + "active", + "paused", + "error", + "pending_auth", + "syncing", + "auth_success" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/packages/backend/src/database/migrations/meta/_journal.json b/packages/backend/src/database/migrations/meta/_journal.json index 5e317c9..918ae4a 100644 --- a/packages/backend/src/database/migrations/meta/_journal.json +++ b/packages/backend/src/database/migrations/meta/_journal.json @@ -8,6 +8,27 @@ "when": 1752225352591, "tag": "0000_amusing_namora", "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1752326803882, + "tag": "0001_odd_night_thrasher", + "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1752332648392, + "tag": "0002_lethal_quentin_quire", + "breakpoints": true + }, + { + "idx": 3, + "version": "7", + "when": 1752332967084, + "tag": "0003_petite_wrecker", + "breakpoints": true } ] } \ No newline at end of file diff --git a/packages/backend/src/database/schema/archived-emails.ts b/packages/backend/src/database/schema/archived-emails.ts index 410bca8..53164da 100644 --- a/packages/backend/src/database/schema/archived-emails.ts +++ b/packages/backend/src/database/schema/archived-emails.ts @@ -1,11 +1,13 @@ import { relations } from 'drizzle-orm'; import { boolean, jsonb, pgTable, text, timestamp, uuid, bigint } from 'drizzle-orm/pg-core'; -import { custodians } from './custodians'; +import { ingestionSources } from './ingestion-sources'; export const archivedEmails = pgTable('archived_emails', { id: uuid('id').primaryKey().defaultRandom(), - custodianId: uuid('custodian_id').notNull().references(() => custodians.id, { onDelete: 'cascade' }), - messageIdHeader: text('message_id_header').notNull(), + ingestionSourceId: uuid('ingestion_source_id') + .notNull() + .references(() => ingestionSources.id, { onDelete: 'cascade' }), + messageIdHeader: text('message_id_header'), sentAt: timestamp('sent_at', { withTimezone: true }).notNull(), subject: text('subject'), senderName: text('sender_name'), @@ -21,8 +23,8 @@ export const archivedEmails = pgTable('archived_emails', { }); export const archivedEmailsRelations = relations(archivedEmails, ({ one }) => ({ - custodian: one(custodians, { - fields: [archivedEmails.custodianId], - references: [custodians.id], - }), + ingestionSource: one(ingestionSources, { + fields: [archivedEmails.ingestionSourceId], + references: [ingestionSources.id] + }) })); diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 97895cf..df2f493 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -2,11 +2,17 @@ import express from 'express'; import dotenv from 'dotenv'; import { AuthController } from './api/controllers/auth.controller'; import { IngestionController } from './api/controllers/ingestion.controller'; +import { ArchivedEmailController } from './api/controllers/archived-email.controller'; +import { StorageController } from './api/controllers/storage.controller'; import { requireAuth } from './api/middleware/requireAuth'; import { createAuthRouter } from './api/routes/auth.routes'; import { createIngestionRouter } from './api/routes/ingestion.routes'; +import { createArchivedEmailRouter } from './api/routes/archived-email.routes'; +import { createStorageRouter } from './api/routes/storage.routes'; +import testRouter from './api/routes/test.routes'; import { AuthService } from './services/AuthService'; import { AdminUserService } from './services/UserService'; +import { StorageService } from './services/StorageService'; @@ -31,6 +37,9 @@ const userService = new AdminUserService(); const authService = new AuthService(userService, JWT_SECRET, JWT_EXPIRES_IN); const authController = new AuthController(authService); const ingestionController = new IngestionController(); +const archivedEmailController = new ArchivedEmailController(); +const storageService = new StorageService(); +const storageController = new StorageController(storageService); // --- Express App Initialization --- const app = express(); @@ -41,8 +50,13 @@ app.use(express.json()); // For parsing application/json // --- Routes --- const authRouter = createAuthRouter(authController); const ingestionRouter = createIngestionRouter(ingestionController, authService); +const archivedEmailRouter = createArchivedEmailRouter(archivedEmailController, authService); +const storageRouter = createStorageRouter(storageController, authService); app.use('/v1/auth', authRouter); app.use('/v1/ingestion-sources', ingestionRouter); +app.use('/v1/archived-emails', archivedEmailRouter); +app.use('/v1/storage', storageRouter); +app.use('/v1/test', testRouter); // Example of a protected route app.get('/v1/protected', requireAuth(authService), (req, res) => { diff --git a/packages/backend/src/jobs/processors/initial-import.processor.ts b/packages/backend/src/jobs/processors/initial-import.processor.ts index 76d6db7..4a8b2c0 100644 --- a/packages/backend/src/jobs/processors/initial-import.processor.ts +++ b/packages/backend/src/jobs/processors/initial-import.processor.ts @@ -5,6 +5,10 @@ import { IInitialImportJob } from '@open-archive/types'; const ingestionService = new IngestionService(); export default async (job: Job) => { - console.log(`Processing initial import for ingestion source: ${job.data.ingestionSourceId}`); - await ingestionService.performBulkImport(job.data); + try { + console.log(`Processing initial import for ingestion source: ${job.data.ingestionSourceId}`); + await ingestionService.performBulkImport(job.data); + } catch (error) { + console.error(error); + } }; diff --git a/packages/backend/src/services/ArchivedEmailService.ts b/packages/backend/src/services/ArchivedEmailService.ts new file mode 100644 index 0000000..a7602d4 --- /dev/null +++ b/packages/backend/src/services/ArchivedEmailService.ts @@ -0,0 +1,117 @@ +import { count, desc, eq } from 'drizzle-orm'; +import { db } from '../database'; +import { archivedEmails, attachments, emailAttachments } from '../database/schema'; +import type { PaginatedArchivedEmails, ArchivedEmail, Recipient } from '@open-archive/types'; +import { StorageService } from './StorageService'; +import type { Readable } from 'stream'; + +interface DbRecipients { + to: { name: string; address: string; }[]; + cc: { name: string; address: string; }[]; + bcc: { name: string; address: string; }[]; +} + +async function streamToBuffer(stream: Readable): Promise { + return new Promise((resolve, reject) => { + const chunks: Buffer[] = []; + stream.on('data', (chunk) => chunks.push(chunk)); + stream.on('error', reject); + stream.on('end', () => resolve(Buffer.concat(chunks))); + }); +} + +export class ArchivedEmailService { + private static mapRecipients(dbRecipients: unknown): Recipient[] { + const { to = [], cc = [], bcc = [] } = dbRecipients as DbRecipients; + + const allRecipients = [...to, ...cc, ...bcc]; + + return allRecipients.map((r) => ({ + name: r.name, + email: r.address + })); + } + + public static async getArchivedEmails( + ingestionSourceId: string, + page: number, + limit: number + ): Promise { + const offset = (page - 1) * limit; + + const [total] = await db + .select({ + count: count(archivedEmails.id) + }) + .from(archivedEmails) + .where(eq(archivedEmails.ingestionSourceId, ingestionSourceId)); + + const items = await db + .select() + .from(archivedEmails) + .where(eq(archivedEmails.ingestionSourceId, ingestionSourceId)) + .orderBy(desc(archivedEmails.sentAt)) + .limit(limit) + .offset(offset); + + return { + items: items.map((item) => ({ + ...item, + recipients: this.mapRecipients(item.recipients) + })), + total: total.count, + page, + limit + }; + } + + public static async getArchivedEmailById(emailId: string): Promise { + const [email] = await db + .select() + .from(archivedEmails) + .where(eq(archivedEmails.id, emailId)); + + if (!email) { + return null; + } + + const storage = new StorageService(); + const rawStream = await storage.get(email.storagePath); + const raw = await streamToBuffer(rawStream as Readable); + + const mappedEmail = { + ...email, + recipients: this.mapRecipients(email.recipients), + raw + }; + + if (email.hasAttachments) { + const emailAttachmentsResult = await db + .select({ + id: attachments.id, + filename: attachments.filename, + mimeType: attachments.mimeType, + sizeBytes: attachments.sizeBytes, + storagePath: attachments.storagePath + }) + .from(emailAttachments) + .innerJoin(attachments, eq(emailAttachments.attachmentId, attachments.id)) + .where(eq(emailAttachments.emailId, emailId)); + + // const attachmentsWithRaw = await Promise.all( + // emailAttachmentsResult.map(async (attachment) => { + // const rawStream = await storage.get(attachment.storagePath); + // const raw = await streamToBuffer(rawStream as Readable); + // return { ...attachment, raw }; + // }) + // ); + + return { + ...mappedEmail, + attachments: emailAttachmentsResult + }; + } + + return mappedEmail; + } +} diff --git a/packages/backend/src/services/EmailProviderFactory.ts b/packages/backend/src/services/EmailProviderFactory.ts index 13624d7..bec5195 100644 --- a/packages/backend/src/services/EmailProviderFactory.ts +++ b/packages/backend/src/services/EmailProviderFactory.ts @@ -2,19 +2,13 @@ import type { IngestionSource, GoogleWorkspaceCredentials, Microsoft365Credentials, - GenericImapCredentials + GenericImapCredentials, + EmailObject } from '@open-archive/types'; import { GoogleConnector } from './ingestion-connectors/GoogleConnector'; import { MicrosoftConnector } from './ingestion-connectors/MicrosoftConnector'; import { ImapConnector } from './ingestion-connectors/ImapConnector'; -// This is a placeholder for a real email object structure -export interface EmailObject { - id: string; - headers: Record | any[]; - body: string; -} - // Define a common interface for all connectors export interface IEmailConnector { testConnection(): Promise; diff --git a/packages/backend/src/services/IngestionService.ts b/packages/backend/src/services/IngestionService.ts index 5b30f58..92f6e91 100644 --- a/packages/backend/src/services/IngestionService.ts +++ b/packages/backend/src/services/IngestionService.ts @@ -11,7 +11,10 @@ import { CryptoService } from './CryptoService'; import { EmailProviderFactory } from './EmailProviderFactory'; import { ingestionQueue, indexingQueue } from '../jobs/queues'; import { StorageService } from './StorageService'; -import type { IInitialImportJob } from '@open-archive/types'; +import type { IInitialImportJob, EmailObject } from '@open-archive/types'; +import { archivedEmails, attachments as attachmentsSchema, emailAttachments } from '../database/schema'; +import { createHash } from 'crypto'; +import { logger } from '../config/logger'; export class IngestionService { @@ -68,6 +71,9 @@ export class IngestionService { const { providerConfig, ...rest } = dto; const valuesToUpdate: Partial = { ...rest }; + // Get the original source to compare the status later + const originalSource = await this.findById(id); + if (providerConfig) { // Encrypt the new credentials before updating valuesToUpdate.credentials = CryptoService.encryptObject(providerConfig); @@ -82,7 +88,18 @@ export class IngestionService { if (!updatedSource) { throw new Error('Ingestion source not found'); } - return this.decryptSource(updatedSource); + + const decryptedSource = this.decryptSource(updatedSource); + + // If the status has changed to auth_success, trigger the initial import + if ( + originalSource.status !== 'auth_success' && + decryptedSource.status === 'auth_success' + ) { + await this.triggerInitialImport(decryptedSource.id); + } + + return decryptedSource; } public static async delete(id: string): Promise { @@ -105,9 +122,9 @@ export class IngestionService { } public async performBulkImport(job: IInitialImportJob): Promise { + console.log('performing bulk import'); const { ingestionSourceId } = job; const source = await IngestionService.findById(ingestionSourceId); - if (!source) { throw new Error(`Ingestion source ${ingestionSourceId} not found.`); } @@ -123,12 +140,7 @@ export class IngestionService { try { for await (const email of connector.fetchEmails()) { - const filePath = `${source.id}/${email.id}.eml`; - await storage.put(filePath, Buffer.from(email.body, 'utf-8')); - await indexingQueue.add('index-email', { - filePath, - ingestionSourceId: source.id - }); + await this.processEmail(email, source, storage); } await IngestionService.update(ingestionSourceId, { @@ -147,4 +159,83 @@ export class IngestionService { throw error; // Re-throw to allow BullMQ to handle the job failure } } + + private async processEmail( + email: EmailObject, + source: IngestionSource, + storage: StorageService + ): Promise { + try { + console.log('processing email, ', email.id); + const emlBuffer = email.eml ?? Buffer.from(email.body, 'utf-8'); + const emailHash = createHash('sha256').update(emlBuffer).digest('hex'); + const emailPath = `email-archive/${source.name.replaceAll(' ', '-')}-${source.id}/emails/${email.id}.eml`; + await storage.put(emailPath, emlBuffer); + + const [archivedEmail] = await db + .insert(archivedEmails) + .values({ + ingestionSourceId: source.id, + messageIdHeader: + (email.headers['message-id'] as string) ?? + `generated-${emailHash}-${source.id}-${email.id}`, + sentAt: email.receivedAt, + subject: email.subject, + senderName: email.from[0]?.name, + senderEmail: email.from[0]?.address, + recipients: { + to: email.to, + cc: email.cc, + bcc: email.bcc + }, + storagePath: emailPath, + storageHashSha256: emailHash, + sizeBytes: emlBuffer.length, + hasAttachments: email.attachments.length > 0 + }) + .returning(); + + if (email.attachments.length > 0) { + for (const attachment of email.attachments) { + const attachmentBuffer = attachment.content; + const attachmentHash = createHash('sha256').update(attachmentBuffer).digest('hex'); + const attachmentPath = `email-archive/${source.name.replaceAll(' ', '-')}-${source.id}/attachments/${attachment.filename}`; + await storage.put(attachmentPath, attachmentBuffer); + + const [newAttachment] = await db + .insert(attachmentsSchema) + .values({ + filename: attachment.filename, + mimeType: attachment.contentType, + sizeBytes: attachment.size, + contentHashSha256: attachmentHash, + storagePath: attachmentPath + }) + .onConflictDoUpdate({ + target: attachmentsSchema.contentHashSha256, + set: { filename: attachment.filename } + }) + .returning(); + + await db.insert(emailAttachments).values({ + emailId: archivedEmail.id, + attachmentId: newAttachment.id + }); + } + } + + // Uncomment when indexing feature is done + // await indexingQueue.add('index-email', { + // filePath: emailPath, + // ingestionSourceId: source.id + // }); + } catch (error) { + logger.error({ + message: `Failed to process email ${email.id} for source ${source.id}`, + error, + emailId: email.id, + ingestionSourceId: source.id + }); + } + } } diff --git a/packages/backend/src/services/ingestion-connectors/GoogleConnector.ts b/packages/backend/src/services/ingestion-connectors/GoogleConnector.ts index bea673c..e90dfd5 100644 --- a/packages/backend/src/services/ingestion-connectors/GoogleConnector.ts +++ b/packages/backend/src/services/ingestion-connectors/GoogleConnector.ts @@ -1,6 +1,7 @@ -import type { GoogleWorkspaceCredentials } from '@open-archive/types'; -import type { IEmailConnector, EmailObject } from '../EmailProviderFactory'; +import type { GoogleWorkspaceCredentials, EmailObject, EmailAddress } from '@open-archive/types'; +import type { IEmailConnector } from '../EmailProviderFactory'; import { google } from 'googleapis'; +import { simpleParser, ParsedMail, Attachment, AddressObject } from 'mailparser'; import { OAuth2Client } from 'google-auth-library'; import type { gmail_v1 } from 'googleapis'; @@ -44,13 +45,43 @@ export class GoogleConnector implements IEmailConnector { const msg = await gmail.users.messages.get({ userId: 'me', id: message.id, - format: 'raw', + format: 'raw' }); if (msg.data.raw) { + const emlBuffer = Buffer.from(msg.data.raw, 'base64'); + const parsedEmail: ParsedMail = await simpleParser(emlBuffer); + const attachments = parsedEmail.attachments.map((attachment: Attachment) => ({ + filename: attachment.filename || 'untitled', + contentType: attachment.contentType, + size: attachment.size, + content: attachment.content as Buffer + })); + + const mapAddresses = ( + addresses: AddressObject | AddressObject[] | undefined + ): EmailAddress[] => { + if (!addresses) return []; + const addressArray = Array.isArray(addresses) + ? addresses + : [addresses]; + return addressArray.flatMap(a => + a.value.map(v => ({ name: v.name, address: v.address || '' })) + ); + }; + yield { id: msg.data.id!, - headers: msg.data.payload?.headers || [], - body: Buffer.from(msg.data.raw, 'base64').toString('utf-8'), + from: mapAddresses(parsedEmail.from), + to: mapAddresses(parsedEmail.to), + cc: mapAddresses(parsedEmail.cc), + bcc: mapAddresses(parsedEmail.bcc), + subject: parsedEmail.subject || '', + body: parsedEmail.text || '', + html: parsedEmail.html || '', + headers: parsedEmail.headers as any, + attachments, + receivedAt: parsedEmail.date || new Date(), + eml: emlBuffer }; } } diff --git a/packages/backend/src/services/ingestion-connectors/ImapConnector.ts b/packages/backend/src/services/ingestion-connectors/ImapConnector.ts index 71be0a2..c4b105e 100644 --- a/packages/backend/src/services/ingestion-connectors/ImapConnector.ts +++ b/packages/backend/src/services/ingestion-connectors/ImapConnector.ts @@ -1,6 +1,7 @@ -import type { GenericImapCredentials } from '@open-archive/types'; -import type { IEmailConnector, EmailObject } from '../EmailProviderFactory'; +import type { GenericImapCredentials, EmailObject, EmailAddress } from '@open-archive/types'; +import type { IEmailConnector } from '../EmailProviderFactory'; import { ImapFlow } from 'imapflow'; +import { simpleParser, ParsedMail, Attachment, AddressObject } from 'mailparser'; export class ImapConnector implements IEmailConnector { private client: ImapFlow; @@ -36,12 +37,35 @@ export class ImapConnector implements IEmailConnector { const searchCriteria = since ? { since } : { all: true }; - for await (const msg of this.client.fetch(searchCriteria, { envelope: true, source: true })) { + for await (const msg of this.client.fetch(searchCriteria, { envelope: true, source: true, bodyStructure: true })) { if (msg.envelope && msg.source) { + const parsedEmail: ParsedMail = await simpleParser(msg.source); + const attachments = parsedEmail.attachments.map((attachment: Attachment) => ({ + filename: attachment.filename || 'untitled', + contentType: attachment.contentType, + size: attachment.size, + content: attachment.content as Buffer + })); + + const mapAddresses = (addresses: AddressObject | AddressObject[] | undefined): EmailAddress[] => { + if (!addresses) return []; + const addressArray = Array.isArray(addresses) ? addresses : [addresses]; + return addressArray.flatMap(a => a.value.map(v => ({ name: v.name, address: v.address || '' }))); + }; + yield { id: msg.uid.toString(), - headers: msg.envelope, - body: msg.source.toString(), + from: mapAddresses(parsedEmail.from), + to: mapAddresses(parsedEmail.to), + cc: mapAddresses(parsedEmail.cc), + bcc: mapAddresses(parsedEmail.bcc), + subject: parsedEmail.subject || '', + body: parsedEmail.text || '', + html: parsedEmail.html || '', + headers: parsedEmail.headers as any, + attachments, + receivedAt: parsedEmail.date || new Date(), + eml: msg.source }; } } diff --git a/packages/backend/src/services/ingestion-connectors/MicrosoftConnector.ts b/packages/backend/src/services/ingestion-connectors/MicrosoftConnector.ts index 8b210db..b71c10e 100644 --- a/packages/backend/src/services/ingestion-connectors/MicrosoftConnector.ts +++ b/packages/backend/src/services/ingestion-connectors/MicrosoftConnector.ts @@ -1,6 +1,7 @@ -import type { Microsoft365Credentials } from '@open-archive/types'; -import type { IEmailConnector, EmailObject } from '../EmailProviderFactory'; +import type { Microsoft365Credentials, EmailObject, EmailAddress } from '@open-archive/types'; +import type { IEmailConnector } from '../EmailProviderFactory'; import { ConfidentialClientApplication } from '@azure/msal-node'; +import { simpleParser, ParsedMail, Attachment, AddressObject } from 'mailparser'; import axios from 'axios'; const GRAPH_API_ENDPOINT = 'https://graph.microsoft.com/v1.0'; @@ -54,16 +55,42 @@ export class MicrosoftConnector implements IEmailConnector { const messages = res.data.value; for (const message of messages) { - // The raw MIME content is not directly available in the list view. - // A second request is needed to get the full content. const rawContentRes = await axios.get( `${GRAPH_API_ENDPOINT}/users/me/messages/${message.id}/$value`, { headers } ); + const emlBuffer = Buffer.from(rawContentRes.data, 'utf-8'); + const parsedEmail: ParsedMail = await simpleParser(emlBuffer); + const attachments = parsedEmail.attachments.map((attachment: Attachment) => ({ + filename: attachment.filename || 'untitled', + contentType: attachment.contentType, + size: attachment.size, + content: attachment.content as Buffer + })); + + const mapAddresses = ( + addresses: AddressObject | AddressObject[] | undefined + ): EmailAddress[] => { + if (!addresses) return []; + const addressArray = Array.isArray(addresses) ? addresses : [addresses]; + return addressArray.flatMap(a => + a.value.map(v => ({ name: v.name, address: v.address || '' })) + ); + }; + yield { id: message.id, - headers: message, // The list response contains most headers - body: rawContentRes.data, + from: mapAddresses(parsedEmail.from), + to: mapAddresses(parsedEmail.to), + cc: mapAddresses(parsedEmail.cc), + bcc: mapAddresses(parsedEmail.bcc), + subject: parsedEmail.subject || '', + body: parsedEmail.text || '', + html: parsedEmail.html || '', + headers: parsedEmail.headers as any, + attachments, + receivedAt: parsedEmail.date || new Date(), + eml: emlBuffer }; } nextLink = res.data['@odata.nextLink']; diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 94e7cb2..b1f8ac1 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -16,7 +16,9 @@ "dependencies": { "@open-archive/types": "workspace:*", "jose": "^6.0.1", - "lucide-svelte": "^0.525.0" + "lucide-svelte": "^0.525.0", + "postal-mime": "^2.4.4", + "svelte-persisted-store": "^0.12.0" }, "devDependencies": { "@internationalized/date": "^3.8.2", diff --git a/packages/frontend/src/app.html b/packages/frontend/src/app.html index 1391f88..77a5ff5 100644 --- a/packages/frontend/src/app.html +++ b/packages/frontend/src/app.html @@ -2,7 +2,7 @@ - + %sveltekit.head% diff --git a/packages/frontend/src/lib/components/custom/EmailPreview.svelte b/packages/frontend/src/lib/components/custom/EmailPreview.svelte new file mode 100644 index 0000000..06b0567 --- /dev/null +++ b/packages/frontend/src/lib/components/custom/EmailPreview.svelte @@ -0,0 +1,55 @@ + + +
+ {#if isLoading} +

Loading email preview...

+ {:else if emailHtml} + + {:else if raw} +

Could not render email preview.

+ {:else} +

Raw .eml file not available for this email.

+ {/if} +
diff --git a/packages/frontend/src/lib/components/custom/Footer.svelte b/packages/frontend/src/lib/components/custom/Footer.svelte new file mode 100644 index 0000000..ce0d58a --- /dev/null +++ b/packages/frontend/src/lib/components/custom/Footer.svelte @@ -0,0 +1,11 @@ +
+
+
+

+ © {new Date().getFullYear()} OpenArchive. All rights reserved. +

+
+
+
diff --git a/packages/frontend/src/lib/components/custom/IngestionSourceForm.svelte b/packages/frontend/src/lib/components/custom/IngestionSourceForm.svelte index 27afe6d..337a5f3 100644 --- a/packages/frontend/src/lib/components/custom/IngestionSourceForm.svelte +++ b/packages/frontend/src/lib/components/custom/IngestionSourceForm.svelte @@ -23,7 +23,7 @@ let formData = $state({ name: source?.name ?? '', provider: source?.provider ?? 'google_workspace', - providerConfig: source?.providerConfig ?? {} + providerConfig: source?.credentials ?? {} }); const triggerContent = $derived( diff --git a/packages/frontend/src/lib/components/custom/ThemeSwitcher.svelte b/packages/frontend/src/lib/components/custom/ThemeSwitcher.svelte new file mode 100644 index 0000000..f01ce68 --- /dev/null +++ b/packages/frontend/src/lib/components/custom/ThemeSwitcher.svelte @@ -0,0 +1,34 @@ + + + + + + + + ($theme = 'light')}> + + Light + + ($theme = 'dark')}> + + Dark + + ($theme = 'system')}> + + System + + + diff --git a/packages/frontend/src/lib/stores/theme.store.ts b/packages/frontend/src/lib/stores/theme.store.ts new file mode 100644 index 0000000..1c39ab7 --- /dev/null +++ b/packages/frontend/src/lib/stores/theme.store.ts @@ -0,0 +1,5 @@ +import { persisted } from 'svelte-persisted-store'; + +type Theme = 'light' | 'dark' | 'system'; + +export const theme = persisted('theme', 'system'); diff --git a/packages/frontend/src/routes/+layout.svelte b/packages/frontend/src/routes/+layout.svelte index a4b6ed6..b926d6c 100644 --- a/packages/frontend/src/routes/+layout.svelte +++ b/packages/frontend/src/routes/+layout.svelte @@ -1,12 +1,29 @@ -{@render children()} +
+
+ {@render children()} +
+
+
diff --git a/packages/frontend/src/routes/dashboard/+layout.svelte b/packages/frontend/src/routes/dashboard/+layout.svelte index 0f2c558..a242443 100644 --- a/packages/frontend/src/routes/dashboard/+layout.svelte +++ b/packages/frontend/src/routes/dashboard/+layout.svelte @@ -4,9 +4,11 @@ import { authStore } from '$lib/stores/auth.store'; import { goto } from '$app/navigation'; import { page } from '$app/state'; + import ThemeSwitcher from '$lib/components/custom/ThemeSwitcher.svelte'; const navItems = [ { href: '/dashboard', label: 'Dashboard' }, - { href: '/dashboard/ingestions', label: 'Ingestions' } + { href: '/dashboard/ingestions', label: 'Ingestions' }, + { href: '/dashboard/archived-emails', label: 'Archived emails' } ]; let { children } = $props(); function handleLogout() { @@ -17,7 +19,10 @@
- OpenArchive + + OpenArchive Logo + OpenArchive + {#each navItems as item} @@ -31,7 +36,10 @@ {/each} - +
+ + +
diff --git a/packages/frontend/src/routes/dashboard/archived-emails/+page.server.ts b/packages/frontend/src/routes/dashboard/archived-emails/+page.server.ts new file mode 100644 index 0000000..e0fa7be --- /dev/null +++ b/packages/frontend/src/routes/dashboard/archived-emails/+page.server.ts @@ -0,0 +1,56 @@ +import { api } from '$lib/server/api'; +import type { PageServerLoad } from './$types'; +import type { IngestionSource, PaginatedArchivedEmails } from '@open-archive/types'; + +export const load: PageServerLoad = async (event) => { + try { + const { url } = event; + const ingestionSourceId = url.searchParams.get('ingestionSourceId'); + const page = url.searchParams.get('page') || '1'; + const limit = url.searchParams.get('limit') || '10'; + + const sourcesResponse = await api('/ingestion-sources', event); + if (!sourcesResponse.ok) { + throw new Error(`Failed to fetch ingestion sources: ${sourcesResponse.statusText}`); + } + const ingestionSources: IngestionSource[] = await sourcesResponse.json(); + + let archivedEmails: PaginatedArchivedEmails = { + items: [], + total: 0, + page: 1, + limit: 10 + }; + + const selectedIngestionSourceId = ingestionSourceId || ingestionSources[0]?.id; + + if (selectedIngestionSourceId) { + const emailsResponse = await api( + `/archived-emails/ingestion-source/${selectedIngestionSourceId}?page=${page}&limit=${limit}`, + event + ); + if (!emailsResponse.ok) { + throw new Error(`Failed to fetch archived emails: ${emailsResponse.statusText}`); + } + archivedEmails = await emailsResponse.json(); + } + + return { + ingestionSources, + archivedEmails, + selectedIngestionSourceId + }; + } catch (error) { + console.error('Failed to load archived emails page:', error); + return { + ingestionSources: [], + archivedEmails: { + items: [], + total: 0, + page: 1, + limit: 10 + }, + error: 'Failed to load data' + }; + } +}; diff --git a/packages/frontend/src/routes/dashboard/archived-emails/+page.svelte b/packages/frontend/src/routes/dashboard/archived-emails/+page.svelte new file mode 100644 index 0000000..df22e43 --- /dev/null +++ b/packages/frontend/src/routes/dashboard/archived-emails/+page.svelte @@ -0,0 +1,170 @@ + + +
+

Archived Emails

+ {#if ingestionSources.length > 0} +
+ + + {selectedIngestionSourceId + ? ingestionSources.find((s) => s.id === selectedIngestionSourceId)?.name + : 'Select an ingestion source'} + + + {#each ingestionSources as source} + {source.name} + {/each} + + +
+ {/if} +
+ +
+ + + + Date + Subject + Sender + Attachments + Actions + + + + {#if archivedEmails.items.length > 0} + {#each archivedEmails.items as email (email.id)} + + {new Date(email.sentAt).toLocaleString()} + + + {email.subject} + + + {email.senderEmail} + {email.hasAttachments ? 'Yes' : 'No'} + + + + + + + {/each} + {:else} + + No archived emails found. + + {/if} + + +
+ +{#if archivedEmails.total > archivedEmails.limit} +
+ + + + + {#each paginationItems as item} + {#if typeof item === 'number'} + + + + {:else} + ... + {/if} + {/each} + + + + +
+{/if} diff --git a/packages/frontend/src/routes/dashboard/archived-emails/[id]/+page.server.ts b/packages/frontend/src/routes/dashboard/archived-emails/[id]/+page.server.ts new file mode 100644 index 0000000..589ebe8 --- /dev/null +++ b/packages/frontend/src/routes/dashboard/archived-emails/[id]/+page.server.ts @@ -0,0 +1,23 @@ +import { api } from '$lib/server/api'; +import type { PageServerLoad } from './$types'; +import type { ArchivedEmail } from '@open-archive/types'; + +export const load: PageServerLoad = async (event) => { + try { + const { id } = event.params; + const response = await api(`/archived-emails/${id}`, event); + if (!response.ok) { + throw new Error(`Failed to fetch archived email: ${response.statusText}`); + } + const email: ArchivedEmail = await response.json(); + return { + email + }; + } catch (error) { + console.error('Failed to load archived email:', error); + return { + email: null, + error: 'Failed to load email' + }; + } +}; diff --git a/packages/frontend/src/routes/dashboard/archived-emails/[id]/+page.svelte b/packages/frontend/src/routes/dashboard/archived-emails/[id]/+page.svelte new file mode 100644 index 0000000..bcc803b --- /dev/null +++ b/packages/frontend/src/routes/dashboard/archived-emails/[id]/+page.svelte @@ -0,0 +1,98 @@ + + +{#if email} +
+
+ + + {email.subject || 'No Subject'} + + From: {email.senderName || email.senderEmail} | Sent: {new Date( + email.sentAt + ).toLocaleString()} + + + +
+
+

Recipients

+

To: {email.recipients.map((r) => r.email).join(', ')}

+
+
+

Email Preview

+ +
+ {#if email.attachments && email.attachments.length > 0} +
+

Attachments

+
    + {#each email.attachments as attachment} +
  • + {attachment.filename} ({attachment.sizeBytes} bytes) + +
  • + {/each} +
+
+ {/if} +
+
+
+
+
+ + + Actions + + + + + +
+
+{:else} +

Email not found.

+{/if} diff --git a/packages/frontend/static/favicon.png b/packages/frontend/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..9506d026637a2468dd807b7e2cf33c1bc491b474 GIT binary patch literal 4948 zcmV-a6RYfrP)7|!+8#jKKIpp>gCh85A!u&$>tT}U19S%oga&nSECX?9* z`ups?-Mt2{&tp+5l^TcLHsTxUe}DhMBjLkM?OO{A3!P49pJLOdtvhji;s#K0hIBXjo9o5JbkSk?zct(aX8t_9F zAA?*bLx`Wl;jnZ)txgC224iCpzN=w2rC@X{67%?j!ME1_wIx5l;E&b&_qz=S%khee z&uh3*aa>M^H5yI!qmMrNvoac;nB^I9Tat`=Wr`^gTCEy>uNNNo2%4LlapJ@YC=_v| zI~=gttVm8YAVIB0FcL#oR}Th%6VAaQq*%>J zPD+M0Apr@R1XS15HsW)Y*R6XOm%t_*E-5G|dFhoG5BK#uVYk~+`T3`~{`w{8K7Jfygr!!Sz-Sn` zz%h)D`uU0wo?!$-V~l1LiADp|N;%|m75|Q5jE>0_bd3K-gCWFaDsF@VNy$ktn=J^8 zjzX!Bb7LY1^7t69D~=oWypCE4pU;Pql4(FRg7q7>wXXYc^D~LMgkxG`a^<`4z8l0v z+JwXR-FIKk_pZCPeg1+4INsSI2nlsHdtgq~qmzG|xKN^ij_K*V4x!N?VW^R!DIE0s zn6G0|Mo12sLJ4DHB6Q4KIUUvzvax84IUB|>)50_CW>n3vT208#bRbG+`w8=*p&>Yj zM&KqYtX3NxmrK{RTJ6Zo%SC%fH~#VGzxd^qvq~FNGqbz?@Z5`4_=Yx7mR7D@Y0zr4 z4`pX(VaALZ%+(g8n62pQ?uI@=MM&!44~{YKY)H`Rk!-f3v!jdTq#*1GNs|Rh68yC! zBqJl_m!ecQqZo_~^cop+-3WtDi@x3-=K68MUjc7ml=(a?McTyQ7Zn#EBi#kJX&<3yDiCb>?&UcqAzG9Wv=PwuxM)&u2bvf}3Y$C!>Jn=+E`MmP3{DOSu zsvG1kY~Q{ONl7Mr{NZ0Pqc8_1I;mhZO?1#|O@SdvkJLa)^@(rV^B^O@22c}FDj8f8j&{XRsaQE=T(Q1T|5^R6&2gPBLgpZ{E^VQb?Y`>u)|M3{dD?u-(B3DVzCm! z$C00(kJQvuP!teWUi5S{!kTQ9@>Ipw2)~oj8DDS|YC1APr&VO?{JebViH2d9lg#dc z*B9X8H5em_g@OT=t`Rz}K}L2OQj!xTh$-aEeJ(}Rp_aA|Zh#*t7BkXGigH#br*nvT zK8ny-j2vL%HG_x|Syonv>BYs+Y1CNr-ye4O4U9a(3bN_-*I#!P6%|>Ei;Hz1ee}`s zvpT$d`Hd@n{G(MHmaVu2!_2X)tSqn=O2_IO8n{poI-44xRzz4vl$cgrh*wv?1r=*+ zQDH8$ys4U>{eCYreAm%w!Mr}NpNsYLdKuiv9tf{&M2B9lmNH5>845?>VkztH?S)LG zfz@J{QbVRtNrae0L^x~~n3Ge8iUITw4?)LTUQkfT`Vhwu+5Wj#-bU%{*&>x%9S-|2 zFPj&Q#uJ0V;D(o9e)%^HTPoV|Dw|!*`Z0!_Gb1k!4H50LzF*7r}~K zR`M)HFA(Ae0GU)_GAS=l{Udhg&7A`VTdJ+%gUCY-ojlsujDC_`enAn!(Ky#)Mb5N2 zxN@;wBG81MF4Wi8K}S*yhsUI}kdwWaExU=xiZfL@Np=PbrDUlTig!^V)T&bi>GMo9 zCld}A5Dq3vKnq_rhZ@M5F_gINV+g@;dRU{KavQw?@*K+XQ?}QuvX#%_psmsJ8rsZ zxzs_O#LuNOfdr$`NckILS&QI6P0jH5u?dGG>PWn)sTr$Q-GR5>d=m}zN2DDRIVN%> zJ3D)l)8e8wyG>$m52au;3C7__!?DIDGX5;)Tm$pHN!pm)++5sv1yIC5OG=xTgM@?ryz5cBC*kN!Iz z`_JDXCpYg@Bu?H)yzjVz6MQXXo(`vxVVY}L9J4L76>Oq@43=)~c}hgl|!thqT-`4Da5HzA^v7N?p! zNxEmI#F^$|_vLX9i)QEX?c29YQI?;6!s~Cmc}L~$J)NOZaY32H#DD*H_o9T#tCk8Y zg$ioT>er~Rt55wRMj7g2GarSLtSA9qFgo9*Gof(%8Ff-sRov)e7FX>F)cp}#kpD7$5IDr z>~(I0_}GNdLM(Bt+-v)S+bOR5p9gDTgL6rkBlufU`@#e z^kwld6tXCC*q^64Z0yIim@~T!#f1gfyk#3vAjkKvUn&vbxvc5fF>xV=EHQYwX={4S1TM;gR%(D}xiH=jMP!@{;~`)t?h*Ip~OSW@X4>Pd&tmOE1aLh3yh+Xq1c^-* z*Nt#WqEjgZuk@{6^XC`G&r_buVKEmjEiL_NFc>Jh_aF3gvvTvLs0kr)=UsQ>op=5s zHTY)k_7^*LBEnAPP+c91y$yrTK}J%={7=ExnTWVrt-y3TSyR_Q1Ravl!+AK|9=e0o&r~({b~yEAjq&??~g=CJyMYV@~NflowAOMBDat z&WgpE&1T$v&ppz2Vv&#k?g=R}ViU)mlNuGt*~z~b=3!n7wN_odR~juD44i*+03Hd2 zaNyuUvGKldW4( zKf-5=l!#D9M&?=0o$Tm%q=o2VDV2u(3l?0%4dX;5=mRSZ$w?-aIE6|z3DW20^fTEj-32== zj84bu8xG(8?DNmJ_H&qi^yp!hkrQ-K#b<++ zcAh{M=U2J}O{B7_x}mzZ_N6DEd3MF{5_ z{r21b3%&LQvGm!juCA`V;c)#5ht0Op>+_k!r15x9HyoK6(hQ2vm@n)?lKziNZ0qDK zEJ_6@@-HhR9ci4Xu!oL!v~~BkHn&uKvTEfs3?@c39Zz)qmdW@dWOh zJG*QxA9E_j6GQPxMAXv}K2kZ;PKUN|u%)$;xnD*J>EZ*nZt3ZT7(O%}b$PnGdv^ly*+>&wo80h#?&pUZ)QG=Y?w2>utfQcO8Q zp@7sci^nI$91pcMH^w{?x2MKNzcaZ$1K04~j8MMq~xp#MaF)BdV``!{^@@t$~GzU|Bh zUUU|h%P!?~6nEc!*JHD1&H9xoDG`enErMt*H-7R7A9l(bSw^-{kyX^zAF0~4Yge}@ zari&5OX{#NP8S|~=)r$pN%{UcpB`*$Zf@H{k~x7Xo3bgJvMHOgDVwtYZ}z`CY+_wN Sl1*&@0000svelte-logo \ No newline at end of file diff --git a/packages/frontend/static/logos/logo-sq.svg b/packages/frontend/static/logos/logo-sq.svg new file mode 100644 index 0000000..94c43f5 --- /dev/null +++ b/packages/frontend/static/logos/logo-sq.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/packages/types/src/archived-emails.types.ts b/packages/types/src/archived-emails.types.ts new file mode 100644 index 0000000..a9c02bb --- /dev/null +++ b/packages/types/src/archived-emails.types.ts @@ -0,0 +1,51 @@ +/** + * Represents a single recipient of an email. + */ +export interface Recipient { + name?: string; + email: string; +} + +/** + * Represents a single attachment of an email. + */ +export interface Attachment { + id: string; + filename: string; + mimeType: string | null; + sizeBytes: number; + storagePath: string; +} + +/** + * Represents a single archived email. + */ +export interface ArchivedEmail { + id: string; + ingestionSourceId: string; + messageIdHeader: string | null; + sentAt: Date; + subject: string | null; + senderName: string | null; + senderEmail: string; + recipients: Recipient[]; + storagePath: string; + storageHashSha256: string; + sizeBytes: number; + isIndexed: boolean; + hasAttachments: boolean; + isOnLegalHold: boolean; + archivedAt: Date; + attachments?: Attachment[]; + raw?: Buffer; +} + +/** + * Represents a paginated list of archived emails. + */ +export interface PaginatedArchivedEmails { + items: ArchivedEmail[]; + total: number; + page: number; + limit: number; +} diff --git a/packages/types/src/email.types.ts b/packages/types/src/email.types.ts new file mode 100644 index 0000000..39caffb --- /dev/null +++ b/packages/types/src/email.types.ts @@ -0,0 +1,48 @@ +/** + * Represents a single email address, including an optional name and the email address itself. + */ +export interface EmailAddress { + name: string; + address: string; +} + +/** + * Defines the structure for an email attachment, including its filename, content type, size, and the raw content as a buffer. + */ +export interface EmailAttachment { + filename: string; + contentType: string; + size: number; + content: Buffer; +} + +/** + * Describes the universal structure for a raw email object, designed to be compatible with various ingestion sources like IMAP and Google Workspace. + * This type serves as a standardized representation of an email before it is processed and stored in the database. + */ +export interface EmailObject { + /** A unique identifier for the email, typically assigned by the source provider. */ + id: string; + /** An array of `EmailAddress` objects representing the sender(s). */ + from: EmailAddress[]; + /** An array of `EmailAddress` objects representing the primary recipient(s). */ + to: EmailAddress[]; + /** An optional array of `EmailAddress` objects for carbon copy (CC) recipients. */ + cc?: EmailAddress[]; + /** An optional array of `EmailAddress` objects for blind carbon copy (BCC) recipients. */ + bcc?: EmailAddress[]; + /** The subject line of the email. */ + subject: string; + /** The plain text body of the email. */ + body: string; + /** The HTML version of the email body, if available. */ + html: string; + /** A record of all email headers, where keys are header names and values can be a string or an array of strings. */ + headers: Record; + /** An array of `EmailAttachment` objects found in the email. */ + attachments: EmailAttachment[]; + /** The date and time when the email was received. */ + receivedAt: Date; + /** An optional buffer containing the full raw EML content of the email, which is useful for archival and compliance purposes. */ + eml?: Buffer; +} diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 36b9ffd..2a3992b 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -2,3 +2,5 @@ export * from './auth.types'; export * from './user.types'; export * from './ingestion.types'; export * from './storage.types'; +export * from './email.types'; +export * from './archived-emails.types'; diff --git a/packages/types/src/ingestion.types.ts b/packages/types/src/ingestion.types.ts index 9f989a4..d57c35d 100644 --- a/packages/types/src/ingestion.types.ts +++ b/packages/types/src/ingestion.types.ts @@ -14,7 +14,6 @@ export interface GenericImapCredentials { port: number; secure: boolean; username: string; - // Password will be encrypted and stored securely password?: string; } diff --git a/packages/types/tsconfig.tsbuildinfo b/packages/types/tsconfig.tsbuildinfo index 5cec9ec..656ec10 100644 --- a/packages/types/tsconfig.tsbuildinfo +++ b/packages/types/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"fileNames":["../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.full.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/types.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/general/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/general/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/compact/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/flattened/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/general/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/compact/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/flattened/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/general/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwk/thumbprint.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwk/embedded.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwks/local.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwks/remote.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/unsecured.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/export.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/import.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/decode_protected_header.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/decode_jwt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/errors.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/generate_key_pair.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/generate_secret.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/base64url.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/index.d.ts","./src/user.types.ts","./src/auth.types.ts","./src/ingestion.types.ts","./src/storage.types.ts","./src/index.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/buffer@5.6.0/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/utility.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/h2c-client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-call-history.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/index.d.ts"],"fileIdsList":[[123,165,168],[123,167,168],[168],[123,168,173,203],[123,168,169,174,180,181,188,200,211],[123,168,169,170,180,188],[123,168],[123,168,171,212],[123,168,172,173,181,189],[123,168,173,200,208],[123,168,174,176,180,188],[123,167,168,175],[123,168,176,177],[123,168,178,180],[123,167,168,180],[123,168,180,181,182,200,211],[123,168,180,181,182,195,200,203],[123,163,168],[123,163,168,176,180,183,188,200,211],[123,168,180,181,183,184,188,200,208,211],[123,168,183,185,200,208,211],[121,122,123,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217],[123,168,180,186],[123,168,187,211],[123,168,176,180,188,200],[123,168,189],[123,168,190],[123,167,168,191],[123,165,166,167,168,169,170,171,172,173,174,175,176,177,178,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217],[123,168,193],[123,168,194],[123,168,180,195,196],[123,168,195,197,212,214],[123,168,180,200,201,203],[123,168,202,203],[123,168,200,201],[123,168,203],[123,168,204],[123,165,168,200,205],[123,168,180,206,207],[123,168,206,207],[123,168,173,188,200,208],[123,168,209],[123,168,188,210],[123,168,183,194,211],[123,168,173,212],[123,168,200,213],[123,168,187,214],[123,168,215],[123,168,180,182,191,200,203,211,213,214,216],[123,168,200,217],[85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,123,168],[85,123,168],[123,133,137,168,211],[123,133,168,200,211],[123,168,200],[123,128,168],[123,130,133,168,211],[123,168,188,208],[123,168,218],[123,128,168,218],[123,130,133,168,188,211],[123,125,126,127,129,132,168,180,200,211],[123,133,141,168],[123,126,131,168],[123,133,157,158,168],[123,126,129,133,168,203,211,218],[123,133,168],[123,125,168],[123,128,129,130,131,132,133,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,158,159,160,161,162,168],[123,133,150,153,168,176],[123,133,141,142,143,168],[123,131,133,142,144,168],[123,132,168],[123,126,128,133,168],[123,133,137,142,144,168],[123,137,168],[123,131,133,136,168,211],[123,126,130,133,141,168],[123,133,150,168],[123,128,133,157,168,203,216,218],[115,116,123,168],[116,117,118,119,123,168]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"8bf8b5e44e3c9c36f98e1007e8b7018c0f38d8adc07aecef42f5200114547c70","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"dc9e7909f3edca55a7da578ab1f2b473490cf1cea844fd05af2daee94e17e518","impliedFormat":99},{"version":"a380cd0a371b5b344c2f679a932593f02445571f9de0014bdf013dddf2a77376","impliedFormat":99},{"version":"dbbcd13911daafc1554acc17dad18ab92f91b5b8f084c6c4370cb8c60520c3b6","impliedFormat":99},{"version":"ab17464cd8391785c29509c629aa8477c8e86d4d3013f4c200b71ac574774ec2","impliedFormat":99},{"version":"d7f1043cbc447d09c8962c973d9f60e466c18e6bbaa470777901d9c2d357cfbe","impliedFormat":99},{"version":"e130a73d7e1e34953b1964c17c218fd14fccd1df6f15f111352b0d53291311bb","impliedFormat":99},{"version":"4ddecad872558e2b3df434ef0b01114d245e7a18a86afa6e7b5c68e75f9b8f76","impliedFormat":99},{"version":"a0ab7a82c3f844d4d4798f68f7bd6dc304e9ad6130631c90a09fb2636cb62756","impliedFormat":99},{"version":"270ceb915b1304c042b6799de28ff212cfa4baf06900d3a8bc4b79f62f00c8a7","impliedFormat":99},{"version":"1b3174ea6e3b4ae157c88eb28bf8e6d67f044edc9c552daf5488628fd8e5be97","impliedFormat":99},{"version":"1d1c0e6bda55b6fdcc247c4abd1ba2a36b50aac71bbf78770cbd172713c4e05f","impliedFormat":99},{"version":"d7d8a5f6a306b755dfa5a9b101cb800fd912b256222fb7d4629b5de416b4b8d5","impliedFormat":99},{"version":"5585ed538922e2e58655218652dcb262f08afa902f26f490cdec4967887ac31a","impliedFormat":99},{"version":"b46de7238d9d2243b27a21797e4772ba91465caae9c31f21dc43748dc9de9cd0","impliedFormat":99},{"version":"625fdbce788630c62f793cb6c80e0072ce0b8bf1d4d0a9922430671164371e0b","impliedFormat":99},{"version":"b6790300d245377671c085e76e9ef359b3cbba6821b913d6ce6b2739d00b9fb1","impliedFormat":99},{"version":"6beaff23ae0b12aa3b7672c7fd4e924f5088efa899b58fe83c7cc5675234ff14","impliedFormat":99},{"version":"a36c717362d06d76e7332d9c1d2744c2c5e4b4a5da6218ef7b4a299a62d23a6d","impliedFormat":99},{"version":"a61f8455fd21cec75a8288cd761f5bcc72441848841eb64aa09569e9d8929ff0","impliedFormat":99},{"version":"7539c82be2eb9b83ec335b11bb06dc35497f0b7dab8830b2c08b650d62707160","impliedFormat":99},{"version":"0eaa77f9ed4c3eb8fac011066c987b6faa7c70db95cfe9e3fb434573e095c4c8","impliedFormat":99},{"version":"466e7296272b827c55b53a7858502de733733558966e2e3a7cc78274e930210a","impliedFormat":99},{"version":"364a5c527037fdd7d494ab0a97f510d3ceda30b8a4bc598b490c135f959ff3c6","impliedFormat":99},{"version":"d26c255888cc20d5ab7397cc267ad81c8d7e97624c442a218afec00949e7316e","impliedFormat":99},{"version":"83d2dab980f2d1a2fe333f0001de8f42c831a438159d47b77c686ae405891b7f","impliedFormat":99},{"version":"ca369bcbdafc423d1a9dccd69de98044534900ff8236d2dd970b52438afb5355","impliedFormat":99},{"version":"5b90280e84e8eba347caaefc18210de3ce6ac176f5e82705a28e7f497dcc8689","impliedFormat":99},{"version":"6fc2d85e6d20a566b97001ee9a74dacc18d801bc9e9b735988119036db992932","impliedFormat":99},{"version":"d57bf30bf951ca5ce0119fcce3810bd03205377d78f08dfe6fca9d350ce73edc","impliedFormat":99},{"version":"e7878d8cd1fd0d0f1c55dcd8f5539f4c22e44993852f588dd194bd666b230727","impliedFormat":99},{"version":"638575c7a309a595c5ac3a65f03a643438fd81bf378aac93eadb84461cdd247c","impliedFormat":99},{"version":"70eebdf8cb991b4b5a1bfd9540698012cf9b2f11d265f7349e2fb7b7cb82d07b","signature":"4c60eadea5f3da0a00a59d1d46e3c9e106da50e89df04f75bd88e81c2d3cb42d"},{"version":"7f729540963914f308742abcebd1c93cf6634ca85e4024177705d811301a09ab","signature":"9033c48366f3826f3e362190c39da048e43e4fe22b27eb7b3f5550d47c41dfec"},{"version":"1af038103a221e3f64c9db3e2c74182945b8e153d412d58945f92dc431b0c324","signature":"0dc16ea1a7a453526db6d0d4a5a100130fb845043278de5d790b399f05e7c13f"},{"version":"c06978661e13b2f691344a26d9769d89738f0901095f1e40b9d836328c39137b","signature":"f4dab491108e5772996f2e4fb909f964a3745bfb77fca4759cf2dfd5c7edac52"},"8dd8b9c9d122b7a7dc90584530653c5339b83ce1838a146ad767034b8dbba0bb",{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"ef18cbf1d8374576e3db03ff33c2c7499845972eb0c4adf87392949709c5e160","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"e525f9e67f5ddba7b5548430211cae2479070b70ef1fd93550c96c10529457bd","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"17fe9131bec653b07b0a1a8b99a830216e3e43fe0ea2605be318dc31777c8bbf","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"2c9875466123715464539bfd69bcaccb8ff6f3e217809428e0d7bd6323416d01","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"2472ef4c28971272a897fdb85d4155df022e1f5d9a474a526b8fc2ef598af94e","impliedFormat":1},{"version":"6c8e442ba33b07892169a14f7757321e49ab0f1032d676d321a1fdab8a67d40c","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"1cd673d367293fc5cb31cd7bf03d598eb368e4f31f39cf2b908abbaf120ab85a","impliedFormat":1},{"version":"19851a6596401ca52d42117108d35e87230fc21593df5c4d3da7108526b6111c","impliedFormat":1},{"version":"3825bf209f1662dfd039010a27747b73d0ef379f79970b1d05601ec8e8a4249f","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"40bfc70953be2617dc71979c14e9e99c5e65c940a4f1c9759ddb90b0f8ff6b1a","impliedFormat":1},{"version":"da52342062e70c77213e45107921100ba9f9b3a30dd019444cf349e5fb3470c4","impliedFormat":1},{"version":"e9ace91946385d29192766bf783b8460c7dbcbfc63284aa3c9cae6de5155c8bc","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"561c60d8bfe0fec2c08827d09ff039eca0c1f9b50ef231025e5a549655ed0298","impliedFormat":1},{"version":"1e30c045732e7db8f7a82cf90b516ebe693d2f499ce2250a977ec0d12e44a529","impliedFormat":1},{"version":"84b736594d8760f43400202859cda55607663090a43445a078963031d47e25e7","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"e38d4fdf79e1eadd92ed7844c331dbaa40f29f21541cfee4e1acff4db09cda33","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"7c10a32ae6f3962672e6869ee2c794e8055d8225ef35c91c0228e354b4e5d2d3","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"99f569b42ea7e7c5fe404b2848c0893f3e1a56e0547c1cd0f74d5dbb9a9de27e","impliedFormat":1},{"version":"f4b4faedc57701ae727d78ba4a83e466a6e3bdcbe40efbf913b17e860642897c","affectsGlobalScope":true,"impliedFormat":1},{"version":"bbcfd9cd76d92c3ee70475270156755346c9086391e1b9cb643d072e0cf576b8","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"003ec918ec442c3a4db2c36dc0c9c766977ea1c8bcc1ca7c2085868727c3d3f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"938f94db8400d0b479626b9006245a833d50ce8337f391085fad4af540279567","impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"12fb9c13f24845000d7bd9660d11587e27ef967cbd64bd9df19ae3e6aa9b52d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","impliedFormat":1},{"version":"5078cd62dbdf91ae8b1dc90b1384dec71a9c0932d62bdafb1a811d2a8e26bef2","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"62f572306e0b173cc5dfc4c583471151f16ef3779cf27ab96922c92ec82a3bc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f32444438ecb1fa4519f6ec3977d69ce0e3acfa18b803e5cd725c204501f350","impliedFormat":1},{"version":"0ab3c844f1eb5a1d94c90edc346a25eb9d3943af7a7812f061bf2d627d8afac0","impliedFormat":1},{"version":"b0a84d9348601dbc217017c0721d6064c3b1af9b392663348ba146fdae0c7afd","impliedFormat":1},{"version":"161f09445a8b4ba07f62ae54b27054e4234e7957062e34c6362300726dabd315","impliedFormat":1},{"version":"77fced47f495f4ff29bb49c52c605c5e73cd9b47d50080133783032769a9d8a6","impliedFormat":1},{"version":"e6057f9e7b0c64d4527afeeada89f313f96a53291705f069a9193c18880578cb","impliedFormat":1},{"version":"34ecb9596317c44dab586118fb62c1565d3dad98d201cd77f3e6b0dde453339c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0f5cda0282e1d18198e2887387eb2f026372ebc4e11c4e4516fef8a19ee4d514","impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"237581f5ec4620a17e791d3bb79bad3af01e27a274dbee875ac9b0721a4fe97d","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"e6d81b1f7ab11dc1b1ad7ad29fcfad6904419b36baf55ed5e80df48d56ac3aff","impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","impliedFormat":1},{"version":"b6b8e3736383a1d27e2592c484a940eeb37ec4808ba9e74dd57679b2453b5865","impliedFormat":1},{"version":"d6f36b683c59ac0d68a1d5ee906e578e2f5e9a285bca80ff95ce61cdc9ddcdeb","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"12aad38de6f0594dc21efa78a2c1f67bf6a7ef5a389e05417fe9945284450908","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"b338a6e6c1d456e65a6ea78da283e3077fe8edf7202ae10490abbba5b952b05e","impliedFormat":1},{"version":"2918b7c516051c30186a1055ebcdb3580522be7190f8a2fff4100ea714c7c366","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"982efeb2573605d4e6d5df4dc7e40846bda8b9e678e058fc99522ab6165c479e","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"d67fc92a91171632fc74f413ce42ff1aa7fbcc5a85b127101f7ec446d2039a1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d40e4631100dbc067268bce96b07d7aff7f28a541b1bfb7ef791c64a696b3d33","affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","impliedFormat":1},{"version":"42180b657831d1b8fead051698618b31da623fb71ff37f002cb9d932cfa775f1","impliedFormat":1},{"version":"4f98d6fb4fe7cbeaa04635c6eaa119d966285d4d39f0eb55b2654187b0b27446","impliedFormat":1},{"version":"e4c653466d0497d87fa9ffd00e59a95f33bc1c1722c3f5c84dab2e950c18da70","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6dcc3b933e864e91d4bea94274ad69854d5d2a1311a4b0e20408a57af19e95d","impliedFormat":1},{"version":"a51f786b9f3c297668f8f322a6c58f85d84948ef69ade32069d5d63ec917221c","impliedFormat":1}],"root":[[116,120]],"options":{"composite":true,"declaration":true,"esModuleInterop":true,"module":1,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":99},"referencedMap":[[165,1],[166,1],[167,2],[123,3],[168,4],[169,5],[170,6],[121,7],[171,8],[172,9],[173,10],[174,11],[175,12],[176,13],[177,13],[179,7],[178,14],[180,15],[181,16],[182,17],[164,18],[122,7],[183,19],[184,20],[185,21],[218,22],[186,23],[187,24],[188,25],[189,26],[190,27],[191,28],[192,29],[193,30],[194,31],[195,32],[196,32],[197,33],[198,7],[199,7],[200,34],[202,35],[201,36],[203,37],[204,38],[205,39],[206,40],[207,41],[208,42],[209,43],[210,44],[211,45],[212,46],[213,47],[214,48],[215,49],[216,50],[217,51],[124,7],[115,52],[86,53],[95,53],[87,53],[96,53],[88,53],[89,53],[103,53],[102,53],[104,53],[105,53],[97,53],[90,53],[98,53],[91,53],[99,53],[92,53],[94,53],[101,53],[100,53],[106,53],[93,53],[107,53],[112,53],[113,53],[108,53],[85,7],[114,7],[110,53],[109,53],[111,53],[82,7],[83,7],[15,7],[13,7],[14,7],[19,7],[18,7],[2,7],[20,7],[21,7],[22,7],[23,7],[24,7],[25,7],[26,7],[27,7],[3,7],[28,7],[29,7],[4,7],[30,7],[34,7],[31,7],[32,7],[33,7],[35,7],[36,7],[37,7],[5,7],[38,7],[39,7],[40,7],[41,7],[6,7],[45,7],[42,7],[43,7],[44,7],[46,7],[7,7],[47,7],[52,7],[53,7],[48,7],[49,7],[50,7],[51,7],[8,7],[57,7],[54,7],[55,7],[56,7],[58,7],[9,7],[59,7],[60,7],[61,7],[63,7],[62,7],[64,7],[65,7],[10,7],[66,7],[67,7],[68,7],[11,7],[69,7],[70,7],[71,7],[72,7],[73,7],[1,7],[74,7],[75,7],[12,7],[79,7],[77,7],[81,7],[84,7],[76,7],[80,7],[78,7],[17,7],[16,7],[141,54],[152,55],[139,54],[153,56],[162,57],[131,58],[130,59],[161,60],[156,61],[160,62],[133,63],[149,64],[132,65],[159,66],[128,67],[129,61],[134,68],[135,7],[140,58],[138,68],[126,69],[163,70],[154,71],[144,72],[143,68],[145,73],[147,74],[142,75],[146,76],[157,60],[136,77],[137,78],[148,79],[127,56],[151,80],[150,68],[155,7],[125,7],[158,81],[117,82],[120,83],[118,7],[119,7],[116,7]],"latestChangedDtsFile":"./dist/ingestion.types.d.ts","version":"5.8.3"} \ No newline at end of file +{"fileNames":["../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.promise.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.float16.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../node_modules/.pnpm/typescript@5.8.3/node_modules/typescript/lib/lib.esnext.full.d.ts","./src/archived-emails.types.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/types.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/general/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/general/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/compact/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/flattened/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/general/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/verify.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/decrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/compact/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/flattened/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jws/general/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/sign.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/encrypt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwk/thumbprint.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwk/embedded.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwks/local.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwks/remote.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/jwt/unsecured.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/export.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/import.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/decode_protected_header.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/decode_jwt.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/errors.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/generate_key_pair.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/key/generate_secret.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/util/base64url.d.ts","../../node_modules/.pnpm/jose@6.0.11/node_modules/jose/dist/types/index.d.ts","./src/user.types.ts","./src/auth.types.ts","./src/email.types.ts","./src/ingestion.types.ts","./src/storage.types.ts","./src/index.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/compatibility/iterators.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/globals.typedarray.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/buffer.buffer.d.ts","../../node_modules/.pnpm/buffer@5.6.0/node_modules/buffer/index.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/utility.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/header.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/readable.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/fetch.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/formdata.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/connector.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/errors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/global-dispatcher.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/global-origin.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/pool-stats.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/handlers.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/balanced-pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/h2c-client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-call-history.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-client.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-pool.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/mock-errors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/retry-handler.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/retry-agent.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/api.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cache-interceptor.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/interceptors.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/util.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cookies.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/patch.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/websocket.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/eventsource.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/diagnostics-channel.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/content-type.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/cache.d.ts","../../node_modules/.pnpm/undici-types@7.8.0/node_modules/undici-types/index.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/globals.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/assert.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/assert/strict.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/async_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/buffer.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/child_process.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/cluster.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/console.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/constants.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/crypto.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dgram.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dns.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dns/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/domain.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/dom-events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/fs.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/fs/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/http.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/http2.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/https.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/inspector.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/module.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/net.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/os.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/path.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/perf_hooks.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/process.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/punycode.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/querystring.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/readline.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/readline/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/repl.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/sea.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/sqlite.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/consumers.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/stream/web.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/string_decoder.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/test.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/timers.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/timers/promises.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/tls.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/trace_events.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/tty.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/url.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/util.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/v8.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/vm.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/wasi.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/worker_threads.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/zlib.d.ts","../../node_modules/.pnpm/@types+node@24.0.13/node_modules/@types/node/index.d.ts"],"fileIdsList":[[125,167,170],[125,169,170],[170],[125,170,175,205],[125,170,171,176,182,183,190,202,213],[125,170,171,172,182,190],[125,170],[125,170,173,214],[125,170,174,175,183,191],[125,170,175,202,210],[125,170,176,178,182,190],[125,169,170,177],[125,170,178,179],[125,170,180,182],[125,169,170,182],[125,170,182,183,184,202,213],[125,170,182,183,184,197,202,205],[125,165,170],[125,165,170,178,182,185,190,202,213],[125,170,182,183,185,186,190,202,210,213],[125,170,185,187,202,210,213],[123,124,125,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219],[125,170,182,188],[125,170,189,213],[125,170,178,182,190,202],[125,170,191],[125,170,192],[125,169,170,193],[125,167,168,169,170,171,172,173,174,175,176,177,178,179,180,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219],[125,170,195],[125,170,196],[125,170,182,197,198],[125,170,197,199,214,216],[125,170,182,202,203,205],[125,170,204,205],[125,170,202,203],[125,170,205],[125,170,206],[125,167,170,202,207],[125,170,182,208,209],[125,170,208,209],[125,170,175,190,202,210],[125,170,211],[125,170,190,212],[125,170,185,196,213],[125,170,175,214],[125,170,202,215],[125,170,189,216],[125,170,217],[125,170,182,184,193,202,205,213,215,216,218],[125,170,202,219],[86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,125,170],[86,125,170],[125,135,139,170,213],[125,135,170,202,213],[125,170,202],[125,130,170],[125,132,135,170,213],[125,170,190,210],[125,170,220],[125,130,170,220],[125,132,135,170,190,213],[125,127,128,129,131,134,170,182,202,213],[125,135,143,170],[125,128,133,170],[125,135,159,160,170],[125,128,131,135,170,205,213,220],[125,135,170],[125,127,170],[125,130,131,132,133,134,135,136,137,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,160,161,162,163,164,170],[125,135,152,155,170,178],[125,135,143,144,145,170],[125,133,135,144,146,170],[125,134,170],[125,128,130,135,170],[125,135,139,144,146,170],[125,139,170],[125,133,135,138,170,213],[125,128,132,135,143,170],[125,135,152,170],[125,130,135,159,170,205,218,220],[116,117,125,170],[85,117,118,119,120,121,125,170]],"fileInfos":[{"version":"69684132aeb9b5642cbcd9e22dff7818ff0ee1aa831728af0ecf97d3364d5546","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"8bf8b5e44e3c9c36f98e1007e8b7018c0f38d8adc07aecef42f5200114547c70","impliedFormat":1},{"version":"092c2bfe125ce69dbb1223c85d68d4d2397d7d8411867b5cc03cec902c233763","affectsGlobalScope":true,"impliedFormat":1},{"version":"07f073f19d67f74d732b1adea08e1dc66b1b58d77cb5b43931dee3d798a2fd53","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"df83c2a6c73228b625b0beb6669c7ee2a09c914637e2d35170723ad49c0f5cd4","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"60037901da1a425516449b9a20073aa03386cce92f7a1fd902d7602be3a7c2e9","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"22adec94ef7047a6c9d1af3cb96be87a335908bf9ef386ae9fd50eeb37f44c47","affectsGlobalScope":true,"impliedFormat":1},{"version":"4245fee526a7d1754529d19227ecbf3be066ff79ebb6a380d78e41648f2f224d","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"471b5fe8145b49509351e2b3952137f66208e6a8e79349612e753962179d6204","signature":"0e7c3b4afa499c999571f1a67a99d62a189d06e8678da5025255ab4d1242cb3a"},{"version":"dc9e7909f3edca55a7da578ab1f2b473490cf1cea844fd05af2daee94e17e518","impliedFormat":99},{"version":"a380cd0a371b5b344c2f679a932593f02445571f9de0014bdf013dddf2a77376","impliedFormat":99},{"version":"dbbcd13911daafc1554acc17dad18ab92f91b5b8f084c6c4370cb8c60520c3b6","impliedFormat":99},{"version":"ab17464cd8391785c29509c629aa8477c8e86d4d3013f4c200b71ac574774ec2","impliedFormat":99},{"version":"d7f1043cbc447d09c8962c973d9f60e466c18e6bbaa470777901d9c2d357cfbe","impliedFormat":99},{"version":"e130a73d7e1e34953b1964c17c218fd14fccd1df6f15f111352b0d53291311bb","impliedFormat":99},{"version":"4ddecad872558e2b3df434ef0b01114d245e7a18a86afa6e7b5c68e75f9b8f76","impliedFormat":99},{"version":"a0ab7a82c3f844d4d4798f68f7bd6dc304e9ad6130631c90a09fb2636cb62756","impliedFormat":99},{"version":"270ceb915b1304c042b6799de28ff212cfa4baf06900d3a8bc4b79f62f00c8a7","impliedFormat":99},{"version":"1b3174ea6e3b4ae157c88eb28bf8e6d67f044edc9c552daf5488628fd8e5be97","impliedFormat":99},{"version":"1d1c0e6bda55b6fdcc247c4abd1ba2a36b50aac71bbf78770cbd172713c4e05f","impliedFormat":99},{"version":"d7d8a5f6a306b755dfa5a9b101cb800fd912b256222fb7d4629b5de416b4b8d5","impliedFormat":99},{"version":"5585ed538922e2e58655218652dcb262f08afa902f26f490cdec4967887ac31a","impliedFormat":99},{"version":"b46de7238d9d2243b27a21797e4772ba91465caae9c31f21dc43748dc9de9cd0","impliedFormat":99},{"version":"625fdbce788630c62f793cb6c80e0072ce0b8bf1d4d0a9922430671164371e0b","impliedFormat":99},{"version":"b6790300d245377671c085e76e9ef359b3cbba6821b913d6ce6b2739d00b9fb1","impliedFormat":99},{"version":"6beaff23ae0b12aa3b7672c7fd4e924f5088efa899b58fe83c7cc5675234ff14","impliedFormat":99},{"version":"a36c717362d06d76e7332d9c1d2744c2c5e4b4a5da6218ef7b4a299a62d23a6d","impliedFormat":99},{"version":"a61f8455fd21cec75a8288cd761f5bcc72441848841eb64aa09569e9d8929ff0","impliedFormat":99},{"version":"7539c82be2eb9b83ec335b11bb06dc35497f0b7dab8830b2c08b650d62707160","impliedFormat":99},{"version":"0eaa77f9ed4c3eb8fac011066c987b6faa7c70db95cfe9e3fb434573e095c4c8","impliedFormat":99},{"version":"466e7296272b827c55b53a7858502de733733558966e2e3a7cc78274e930210a","impliedFormat":99},{"version":"364a5c527037fdd7d494ab0a97f510d3ceda30b8a4bc598b490c135f959ff3c6","impliedFormat":99},{"version":"d26c255888cc20d5ab7397cc267ad81c8d7e97624c442a218afec00949e7316e","impliedFormat":99},{"version":"83d2dab980f2d1a2fe333f0001de8f42c831a438159d47b77c686ae405891b7f","impliedFormat":99},{"version":"ca369bcbdafc423d1a9dccd69de98044534900ff8236d2dd970b52438afb5355","impliedFormat":99},{"version":"5b90280e84e8eba347caaefc18210de3ce6ac176f5e82705a28e7f497dcc8689","impliedFormat":99},{"version":"6fc2d85e6d20a566b97001ee9a74dacc18d801bc9e9b735988119036db992932","impliedFormat":99},{"version":"d57bf30bf951ca5ce0119fcce3810bd03205377d78f08dfe6fca9d350ce73edc","impliedFormat":99},{"version":"e7878d8cd1fd0d0f1c55dcd8f5539f4c22e44993852f588dd194bd666b230727","impliedFormat":99},{"version":"638575c7a309a595c5ac3a65f03a643438fd81bf378aac93eadb84461cdd247c","impliedFormat":99},{"version":"70eebdf8cb991b4b5a1bfd9540698012cf9b2f11d265f7349e2fb7b7cb82d07b","signature":"4c60eadea5f3da0a00a59d1d46e3c9e106da50e89df04f75bd88e81c2d3cb42d"},{"version":"7f729540963914f308742abcebd1c93cf6634ca85e4024177705d811301a09ab","signature":"9033c48366f3826f3e362190c39da048e43e4fe22b27eb7b3f5550d47c41dfec"},{"version":"c07fd22aca1eb250fda78434778e26d7b7bd140a449701f2c446554e82741710","signature":"f1b01ba7e1f955d2d14875db3f5e4913b0a9f95321b74b410cf9e0cc07699440"},{"version":"446e2f162a5cf4eaf8db79e0507166c0053e608388d87c1128c112d24e29d6c8","signature":"0dc16ea1a7a453526db6d0d4a5a100130fb845043278de5d790b399f05e7c13f"},{"version":"c06978661e13b2f691344a26d9769d89738f0901095f1e40b9d836328c39137b","signature":"f4dab491108e5772996f2e4fb909f964a3745bfb77fca4759cf2dfd5c7edac52"},"5f80c946b77b8c111af13d6dc724d1b284c2754ec89544d11d47983b8daf491e",{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"ef18cbf1d8374576e3db03ff33c2c7499845972eb0c4adf87392949709c5e160","impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"e525f9e67f5ddba7b5548430211cae2479070b70ef1fd93550c96c10529457bd","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"17fe9131bec653b07b0a1a8b99a830216e3e43fe0ea2605be318dc31777c8bbf","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"2c9875466123715464539bfd69bcaccb8ff6f3e217809428e0d7bd6323416d01","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"2472ef4c28971272a897fdb85d4155df022e1f5d9a474a526b8fc2ef598af94e","impliedFormat":1},{"version":"6c8e442ba33b07892169a14f7757321e49ab0f1032d676d321a1fdab8a67d40c","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"1cd673d367293fc5cb31cd7bf03d598eb368e4f31f39cf2b908abbaf120ab85a","impliedFormat":1},{"version":"19851a6596401ca52d42117108d35e87230fc21593df5c4d3da7108526b6111c","impliedFormat":1},{"version":"3825bf209f1662dfd039010a27747b73d0ef379f79970b1d05601ec8e8a4249f","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"40bfc70953be2617dc71979c14e9e99c5e65c940a4f1c9759ddb90b0f8ff6b1a","impliedFormat":1},{"version":"da52342062e70c77213e45107921100ba9f9b3a30dd019444cf349e5fb3470c4","impliedFormat":1},{"version":"e9ace91946385d29192766bf783b8460c7dbcbfc63284aa3c9cae6de5155c8bc","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"561c60d8bfe0fec2c08827d09ff039eca0c1f9b50ef231025e5a549655ed0298","impliedFormat":1},{"version":"1e30c045732e7db8f7a82cf90b516ebe693d2f499ce2250a977ec0d12e44a529","impliedFormat":1},{"version":"84b736594d8760f43400202859cda55607663090a43445a078963031d47e25e7","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"e38d4fdf79e1eadd92ed7844c331dbaa40f29f21541cfee4e1acff4db09cda33","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"7c10a32ae6f3962672e6869ee2c794e8055d8225ef35c91c0228e354b4e5d2d3","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"99f569b42ea7e7c5fe404b2848c0893f3e1a56e0547c1cd0f74d5dbb9a9de27e","impliedFormat":1},{"version":"f4b4faedc57701ae727d78ba4a83e466a6e3bdcbe40efbf913b17e860642897c","affectsGlobalScope":true,"impliedFormat":1},{"version":"bbcfd9cd76d92c3ee70475270156755346c9086391e1b9cb643d072e0cf576b8","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"003ec918ec442c3a4db2c36dc0c9c766977ea1c8bcc1ca7c2085868727c3d3f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"938f94db8400d0b479626b9006245a833d50ce8337f391085fad4af540279567","impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"12fb9c13f24845000d7bd9660d11587e27ef967cbd64bd9df19ae3e6aa9b52d4","affectsGlobalScope":true,"impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","impliedFormat":1},{"version":"5078cd62dbdf91ae8b1dc90b1384dec71a9c0932d62bdafb1a811d2a8e26bef2","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"71450bbc2d82821d24ca05699a533e72758964e9852062c53b30f31c36978ab8","affectsGlobalScope":true,"impliedFormat":1},{"version":"62f572306e0b173cc5dfc4c583471151f16ef3779cf27ab96922c92ec82a3bc8","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f32444438ecb1fa4519f6ec3977d69ce0e3acfa18b803e5cd725c204501f350","impliedFormat":1},{"version":"0ab3c844f1eb5a1d94c90edc346a25eb9d3943af7a7812f061bf2d627d8afac0","impliedFormat":1},{"version":"b0a84d9348601dbc217017c0721d6064c3b1af9b392663348ba146fdae0c7afd","impliedFormat":1},{"version":"161f09445a8b4ba07f62ae54b27054e4234e7957062e34c6362300726dabd315","impliedFormat":1},{"version":"77fced47f495f4ff29bb49c52c605c5e73cd9b47d50080133783032769a9d8a6","impliedFormat":1},{"version":"e6057f9e7b0c64d4527afeeada89f313f96a53291705f069a9193c18880578cb","impliedFormat":1},{"version":"34ecb9596317c44dab586118fb62c1565d3dad98d201cd77f3e6b0dde453339c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0f5cda0282e1d18198e2887387eb2f026372ebc4e11c4e4516fef8a19ee4d514","impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"237581f5ec4620a17e791d3bb79bad3af01e27a274dbee875ac9b0721a4fe97d","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"e6d81b1f7ab11dc1b1ad7ad29fcfad6904419b36baf55ed5e80df48d56ac3aff","impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","impliedFormat":1},{"version":"b6b8e3736383a1d27e2592c484a940eeb37ec4808ba9e74dd57679b2453b5865","impliedFormat":1},{"version":"d6f36b683c59ac0d68a1d5ee906e578e2f5e9a285bca80ff95ce61cdc9ddcdeb","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"12aad38de6f0594dc21efa78a2c1f67bf6a7ef5a389e05417fe9945284450908","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"b338a6e6c1d456e65a6ea78da283e3077fe8edf7202ae10490abbba5b952b05e","impliedFormat":1},{"version":"2918b7c516051c30186a1055ebcdb3580522be7190f8a2fff4100ea714c7c366","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"982efeb2573605d4e6d5df4dc7e40846bda8b9e678e058fc99522ab6165c479e","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"d67fc92a91171632fc74f413ce42ff1aa7fbcc5a85b127101f7ec446d2039a1f","affectsGlobalScope":true,"impliedFormat":1},{"version":"d40e4631100dbc067268bce96b07d7aff7f28a541b1bfb7ef791c64a696b3d33","affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","impliedFormat":1},{"version":"42180b657831d1b8fead051698618b31da623fb71ff37f002cb9d932cfa775f1","impliedFormat":1},{"version":"4f98d6fb4fe7cbeaa04635c6eaa119d966285d4d39f0eb55b2654187b0b27446","impliedFormat":1},{"version":"e4c653466d0497d87fa9ffd00e59a95f33bc1c1722c3f5c84dab2e950c18da70","affectsGlobalScope":true,"impliedFormat":1},{"version":"e6dcc3b933e864e91d4bea94274ad69854d5d2a1311a4b0e20408a57af19e95d","impliedFormat":1},{"version":"a51f786b9f3c297668f8f322a6c58f85d84948ef69ade32069d5d63ec917221c","impliedFormat":1}],"root":[85,[117,122]],"options":{"composite":true,"declaration":true,"esModuleInterop":true,"module":1,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"strict":true,"target":99},"referencedMap":[[167,1],[168,1],[169,2],[125,3],[170,4],[171,5],[172,6],[123,7],[173,8],[174,9],[175,10],[176,11],[177,12],[178,13],[179,13],[181,7],[180,14],[182,15],[183,16],[184,17],[166,18],[124,7],[185,19],[186,20],[187,21],[220,22],[188,23],[189,24],[190,25],[191,26],[192,27],[193,28],[194,29],[195,30],[196,31],[197,32],[198,32],[199,33],[200,7],[201,7],[202,34],[204,35],[203,36],[205,37],[206,38],[207,39],[208,40],[209,41],[210,42],[211,43],[212,44],[213,45],[214,46],[215,47],[216,48],[217,49],[218,50],[219,51],[126,7],[116,52],[87,53],[96,53],[88,53],[97,53],[89,53],[90,53],[104,53],[103,53],[105,53],[106,53],[98,53],[91,53],[99,53],[92,53],[100,53],[93,53],[95,53],[102,53],[101,53],[107,53],[94,53],[108,53],[113,53],[114,53],[109,53],[86,7],[115,7],[111,53],[110,53],[112,53],[82,7],[83,7],[15,7],[13,7],[14,7],[19,7],[18,7],[2,7],[20,7],[21,7],[22,7],[23,7],[24,7],[25,7],[26,7],[27,7],[3,7],[28,7],[29,7],[4,7],[30,7],[34,7],[31,7],[32,7],[33,7],[35,7],[36,7],[37,7],[5,7],[38,7],[39,7],[40,7],[41,7],[6,7],[45,7],[42,7],[43,7],[44,7],[46,7],[7,7],[47,7],[52,7],[53,7],[48,7],[49,7],[50,7],[51,7],[8,7],[57,7],[54,7],[55,7],[56,7],[58,7],[9,7],[59,7],[60,7],[61,7],[63,7],[62,7],[64,7],[65,7],[10,7],[66,7],[67,7],[68,7],[11,7],[69,7],[70,7],[71,7],[72,7],[73,7],[1,7],[74,7],[75,7],[12,7],[79,7],[77,7],[81,7],[84,7],[76,7],[80,7],[78,7],[17,7],[16,7],[143,54],[154,55],[141,54],[155,56],[164,57],[133,58],[132,59],[163,60],[158,61],[162,62],[135,63],[151,64],[134,65],[161,66],[130,67],[131,61],[136,68],[137,7],[142,58],[140,68],[128,69],[165,70],[156,71],[146,72],[145,68],[147,73],[149,74],[144,75],[148,76],[159,60],[138,77],[139,78],[150,79],[129,56],[153,80],[152,68],[157,7],[127,7],[160,81],[85,7],[118,82],[119,7],[122,83],[120,7],[121,7],[117,7]],"latestChangedDtsFile":"./dist/archived-emails.types.d.ts","version":"5.8.3"} \ No newline at end of file