From f9852bae0e18113e7b966e8fa702eb41969da9f1 Mon Sep 17 00:00:00 2001
From: thisisvaishnav
Date: Fri, 20 Mar 2026 17:28:55 +0530
Subject: [PATCH 1/4] feature: added working email node
---
apps/executor/emails/alert-email.tsx | 97 ++++++++++++++++++++
apps/executor/execution-recorder.ts | 2 +
apps/executor/graph-runner.ts | 23 +++++
apps/executor/notification-handlers/email.ts | 36 ++++----
apps/executor/package.json | 6 +-
5 files changed, 143 insertions(+), 21 deletions(-)
create mode 100644 apps/executor/emails/alert-email.tsx
diff --git a/apps/executor/emails/alert-email.tsx b/apps/executor/emails/alert-email.tsx
new file mode 100644
index 0000000..9cf4e51
--- /dev/null
+++ b/apps/executor/emails/alert-email.tsx
@@ -0,0 +1,97 @@
+import {
+ Body,
+ Container,
+ Head,
+ Heading,
+ Hr,
+ Html,
+ Preview,
+ Section,
+ Text,
+} from "@react-email/components";
+import * as React from "react";
+
+type AlertEmailProps = {
+ subject: string;
+ body: string;
+};
+
+const BRAND_COLOR = "#2563eb";
+
+export const AlertEmail = ({ subject, body }: AlertEmailProps) => (
+
+
+ {subject}
+
+
+ TradingFlow
+
+
+
+ {subject}
+
+ {body}
+
+
+
+ You received this because you have an active workflow on TradingFlow.
+
+
+
+
+);
+
+const main: React.CSSProperties = {
+ backgroundColor: "#f6f9fc",
+ fontFamily:
+ '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Ubuntu, sans-serif',
+};
+
+const container: React.CSSProperties = {
+ backgroundColor: "#ffffff",
+ margin: "0 auto",
+ padding: "40px 20px",
+ maxWidth: "560px",
+ borderRadius: "8px",
+};
+
+const logo: React.CSSProperties = {
+ color: BRAND_COLOR,
+ fontSize: "24px",
+ fontWeight: 700,
+ textAlign: "center" as const,
+ margin: "0 0 16px",
+};
+
+const divider: React.CSSProperties = {
+ borderColor: "#e6ebf1",
+ margin: "20px 0",
+};
+
+const content: React.CSSProperties = {
+ padding: "0",
+};
+
+const heading: React.CSSProperties = {
+ color: "#1a1a1a",
+ fontSize: "20px",
+ fontWeight: 600,
+ margin: "0 0 12px",
+};
+
+const bodyText: React.CSSProperties = {
+ color: "#4a4a4a",
+ fontSize: "16px",
+ lineHeight: "26px",
+ margin: "0",
+ whiteSpace: "pre-wrap",
+};
+
+const footer: React.CSSProperties = {
+ color: "#8898aa",
+ fontSize: "12px",
+ lineHeight: "16px",
+ textAlign: "center" as const,
+};
+
+export default AlertEmail;
diff --git a/apps/executor/execution-recorder.ts b/apps/executor/execution-recorder.ts
index baea74a..fff7015 100644
--- a/apps/executor/execution-recorder.ts
+++ b/apps/executor/execution-recorder.ts
@@ -3,10 +3,12 @@ import { ExecutionModel } from "db/client";
const createExecution = async (params: {
workflowId: string;
nodeId: string;
+ nodeName: string;
}) => {
return ExecutionModel.create({
workflowId: params.workflowId,
nodeId: params.nodeId,
+ nodeName: params.nodeName,
status: "PENDING",
startTime: new Date(),
});
diff --git a/apps/executor/graph-runner.ts b/apps/executor/graph-runner.ts
index f22c1b9..3c7e81e 100644
--- a/apps/executor/graph-runner.ts
+++ b/apps/executor/graph-runner.ts
@@ -17,6 +17,28 @@ export type WorkflowNode = {
};
};
+const NODE_TYPE_LABELS: Record = {
+ "Price-trigger": "Price Trigger",
+ "timer": "Timer",
+ "Hyperliquid": "Hyperliquid",
+ "Backpack": "Backpack",
+ "Lighter": "Lighter",
+ "Email": "Email",
+ "Telegram": "Telegram",
+};
+
+const KIND_LABELS: Record = {
+ ACTION: "Action",
+ TRIGGER: "Trigger",
+ NOTIFICATION: "Notification",
+};
+
+const getNodeDisplayName = (node: WorkflowNode): string => {
+ const typeLabel = NODE_TYPE_LABELS[node.type ?? ""] ?? node.type ?? "Unknown";
+ const kindLabel = KIND_LABELS[node.data.kind] ?? node.data.kind;
+ return `${typeLabel} (${kindLabel})`;
+};
+
export type WorkflowEdge = {
id: string;
source: string;
@@ -104,6 +126,7 @@ export const executeWorkflowFromTrigger = async (
const execution = await createExecution({
workflowId: workflow._id,
nodeId,
+ nodeName: getNodeDisplayName(node),
});
try {
diff --git a/apps/executor/notification-handlers/email.ts b/apps/executor/notification-handlers/email.ts
index ab54db7..890bcc5 100644
--- a/apps/executor/notification-handlers/email.ts
+++ b/apps/executor/notification-handlers/email.ts
@@ -1,3 +1,5 @@
+import { Resend } from "resend";
+import { AlertEmail } from "../emails/alert-email.tsx";
import type { NotificationResult } from "./index.ts";
type EmailPayload = {
@@ -7,7 +9,10 @@ type EmailPayload = {
};
const RESEND_API_KEY = process.env.RESEND_API_KEY ?? "";
-const EMAIL_FROM = process.env.EMAIL_FROM ?? "TradingFlow ";
+const EMAIL_FROM =
+ process.env.EMAIL_FROM ?? "TradingFlow ";
+
+const resend = new Resend(RESEND_API_KEY);
export const executeEmail = async (
metadata: Record,
@@ -24,34 +29,25 @@ export const executeEmail = async (
console.log(`[email] Sending to ${to}: "${subject}"`);
- const response = await fetch("https://api.resend.com/emails", {
- method: "POST",
- headers: {
- Authorization: `Bearer ${RESEND_API_KEY}`,
- "Content-Type": "application/json",
- },
- body: JSON.stringify({
- from: EMAIL_FROM,
- to: [to],
- subject: subject || "TradingFlow Alert",
- text: body || "",
- }),
+ const { data, error } = await resend.emails.send({
+ from: EMAIL_FROM,
+ to: [to],
+ subject: subject || "TradingFlow Alert",
+ react: AlertEmail({ subject: subject || "TradingFlow Alert", body: body || "" }),
});
- if (!response.ok) {
- const errorBody = await response.text();
- console.error(`[email] Resend API error (${response.status}):`, errorBody);
+ if (error) {
+ console.error("[email] Resend SDK error:", error);
return {
success: false,
- message: `Email send failed (${response.status}): ${errorBody}`,
+ message: `Email send failed: ${error.message}`,
};
}
- const result = await response.json();
- console.log(`[email] Sent successfully, id: ${result.id}`);
+ console.log(`[email] Sent successfully, id: ${data?.id}`);
return {
success: true,
- message: `Email sent to ${to} (id: ${result.id})`,
+ message: `Email sent to ${to} (id: ${data?.id})`,
};
};
diff --git a/apps/executor/package.json b/apps/executor/package.json
index 03f5850..b532087 100644
--- a/apps/executor/package.json
+++ b/apps/executor/package.json
@@ -13,8 +13,12 @@
"typescript": "^5"
},
"dependencies": {
+ "@react-email/components": "^1.0.10",
"common": "*",
"db": "*",
- "mongoose": "^9.3.1"
+ "mongoose": "^9.3.1",
+ "react": "^19.2.4",
+ "react-dom": "^19.2.4",
+ "resend": "^6.9.4"
}
}
From bf0a58ba0c61f596b789ca507d14f511dec3483d Mon Sep 17 00:00:00 2001
From: thisisvaishnav
Date: Fri, 20 Mar 2026 18:56:06 +0530
Subject: [PATCH 2/4] feature: added working email node
---
apps/executor/emails/alert-email.tsx | 92 +++++++++++++-----
apps/executor/exchange-adapters/lighter.ts | 104 +++++++++++++++++++--
apps/executor/package.json | 1 +
3 files changed, 167 insertions(+), 30 deletions(-)
diff --git a/apps/executor/emails/alert-email.tsx b/apps/executor/emails/alert-email.tsx
index 9cf4e51..442e43a 100644
--- a/apps/executor/emails/alert-email.tsx
+++ b/apps/executor/emails/alert-email.tsx
@@ -16,7 +16,7 @@ type AlertEmailProps = {
body: string;
};
-const BRAND_COLOR = "#2563eb";
+const ACCENT = "#10b981";
export const AlertEmail = ({ subject, body }: AlertEmailProps) => (
@@ -24,47 +24,66 @@ export const AlertEmail = ({ subject, body }: AlertEmailProps) => (
{subject}
- TradingFlow
+
+ ALERT
{subject}
- {body}
+
You received this because you have an active workflow on TradingFlow.
+ v0.1.0 // OPERATIONAL
);
const main: React.CSSProperties = {
- backgroundColor: "#f6f9fc",
+ backgroundColor: "#09090b",
fontFamily:
- '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Ubuntu, sans-serif',
+ '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif',
};
const container: React.CSSProperties = {
- backgroundColor: "#ffffff",
+ backgroundColor: "#18181b",
margin: "0 auto",
- padding: "40px 20px",
+ padding: "32px 24px",
maxWidth: "560px",
- borderRadius: "8px",
+ borderRadius: "0",
+ border: "1px solid #3f3f46",
+};
+
+const header: React.CSSProperties = {
+ padding: "0",
};
const logo: React.CSSProperties = {
- color: BRAND_COLOR,
- fontSize: "24px",
- fontWeight: 700,
- textAlign: "center" as const,
- margin: "0 0 16px",
+ color: "#fafafa",
+ fontSize: "13px",
+ fontWeight: 800,
+ letterSpacing: "0.05em",
+ textTransform: "uppercase" as const,
+ margin: "0",
+};
+
+const logoChevron: React.CSSProperties = {
+ color: ACCENT,
+ marginRight: "4px",
};
const divider: React.CSSProperties = {
- borderColor: "#e6ebf1",
+ borderColor: "#3f3f46",
margin: "20px 0",
};
@@ -72,26 +91,55 @@ const content: React.CSSProperties = {
padding: "0",
};
+const label: React.CSSProperties = {
+ color: ACCENT,
+ fontSize: "11px",
+ fontWeight: 600,
+ letterSpacing: "0.1em",
+ textTransform: "uppercase" as const,
+ margin: "0 0 8px",
+ fontFamily: '"IBM Plex Mono", ui-monospace, monospace',
+};
+
const heading: React.CSSProperties = {
- color: "#1a1a1a",
+ color: "#fafafa",
fontSize: "20px",
fontWeight: 600,
- margin: "0 0 12px",
+ margin: "0 0 16px",
+ letterSpacing: "-0.025em",
+};
+
+const bodyCard: React.CSSProperties = {
+ backgroundColor: "#27272a",
+ border: "1px solid #3f3f46",
+ padding: "16px",
+ borderRadius: "0",
};
const bodyText: React.CSSProperties = {
- color: "#4a4a4a",
- fontSize: "16px",
- lineHeight: "26px",
+ color: "#a1a1aa",
+ fontSize: "14px",
+ lineHeight: "24px",
margin: "0",
- whiteSpace: "pre-wrap",
+ whiteSpace: "pre-wrap" as const,
+ fontFamily: '"IBM Plex Mono", ui-monospace, monospace',
};
const footer: React.CSSProperties = {
- color: "#8898aa",
- fontSize: "12px",
+ color: "#71717a",
+ fontSize: "11px",
lineHeight: "16px",
textAlign: "center" as const,
+ margin: "0 0 4px",
+};
+
+const version: React.CSSProperties = {
+ color: "#52525b",
+ fontSize: "9px",
+ fontFamily: '"IBM Plex Mono", ui-monospace, monospace',
+ textAlign: "center" as const,
+ margin: "0",
+ letterSpacing: "0.05em",
};
export default AlertEmail;
diff --git a/apps/executor/exchange-adapters/lighter.ts b/apps/executor/exchange-adapters/lighter.ts
index 897e9cf..261cfd1 100644
--- a/apps/executor/exchange-adapters/lighter.ts
+++ b/apps/executor/exchange-adapters/lighter.ts
@@ -1,17 +1,105 @@
-import type { TradingMetadata } from "common";
+import type { TradingMetadata, LighterTradingMetadata } from "common";
+import { SignerClient } from "lighter-sdk-ts/signer";
import type { ExchangeResult } from "./index.ts";
+const MARKET_INDEX: Record = {
+ BTC: 0,
+ ETH: 1,
+ SOL: 2,
+};
+
+const MAX_MARKET_PRICE = 999_999_999;
+
+const clientCache = new Map>();
+
+const getCacheKey = (meta: LighterTradingMetadata): string =>
+ `${meta.lighterUrl}:${meta.lighterAccountIndex}:${meta.lighterApiKeyIndex}`;
+
+const getClient = (meta: LighterTradingMetadata): Promise => {
+ const key = getCacheKey(meta);
+ const cached = clientCache.get(key);
+ if (cached) {
+ return cached;
+ }
+
+ const promise = SignerClient.create({
+ url: meta.lighterUrl,
+ privateKey: meta.lighterPrivateKey,
+ apiKeyIndex: meta.lighterApiKeyIndex,
+ accountIndex: meta.lighterAccountIndex,
+ });
+
+ promise.catch(() => {
+ clientCache.delete(key);
+ });
+
+ clientCache.set(key, promise);
+ return promise;
+};
+
export const executeLighter = async (
metadata: TradingMetadata,
): Promise => {
+ const meta = metadata as LighterTradingMetadata;
+ const { type, qty, symbol } = meta;
+
+ if (!meta.lighterPrivateKey || meta.lighterAccountIndex == null || meta.lighterApiKeyIndex == null) {
+ return {
+ success: false,
+ message: "Lighter: missing API credentials. Configure them on the Lighter node.",
+ };
+ }
+
+ if (!meta.lighterUrl) {
+ return {
+ success: false,
+ message: "Lighter: missing API URL. Configure it on the Lighter node.",
+ };
+ }
+
console.log(
- `[lighter] Placing ${metadata.type} order: ${metadata.qty} ${metadata.symbol}`,
+ `[lighter] Placing ${type} order: ${qty} ${symbol}`,
);
- // Replace body with real Lighter exchange API call when credentials are available.
- return {
- success: true,
- orderId: `lt-${Date.now()}`,
- message: `Lighter ${metadata.type} ${metadata.qty} ${metadata.symbol} placed (stub)`,
- };
+ const marketIndex = MARKET_INDEX[symbol];
+ if (marketIndex === undefined) {
+ return {
+ success: false,
+ message: `Lighter: unsupported symbol "${symbol}". Supported: ${Object.keys(MARKET_INDEX).join(", ")}`,
+ };
+ }
+
+ const isAsk = type === "SHORT";
+
+ try {
+ const client = await getClient(meta);
+
+ const result = await client.createOrder({
+ marketIndex,
+ clientOrderIndex: Date.now() % 2_147_483_647,
+ baseAmount: qty,
+ price: isAsk ? 1 : MAX_MARKET_PRICE,
+ isAsk,
+ orderType: SignerClient.ORDER_TYPE_MARKET,
+ timeInForce: SignerClient.ORDER_TIME_IN_FORCE_IMMEDIATE_OR_CANCEL,
+ reduceOnly: 0,
+ triggerPrice: SignerClient.NIL_TRIGGER_PRICE,
+ orderExpiry: SignerClient.DEFAULT_IOC_EXPIRY,
+ });
+
+ const txHash = result.apiResponse?.txHash ?? result.txInfo ?? "unknown";
+
+ return {
+ success: true,
+ orderId: String(txHash),
+ message: `Lighter ${type} ${qty} ${symbol} executed (tx: ${txHash})`,
+ };
+ } catch (error) {
+ const errorMessage =
+ error instanceof Error ? error.message : "Unknown Lighter SDK error";
+ return {
+ success: false,
+ message: `Lighter order failed: ${errorMessage}`,
+ };
+ }
};
diff --git a/apps/executor/package.json b/apps/executor/package.json
index b532087..0d1348d 100644
--- a/apps/executor/package.json
+++ b/apps/executor/package.json
@@ -16,6 +16,7 @@
"@react-email/components": "^1.0.10",
"common": "*",
"db": "*",
+ "lighter-sdk-ts": "*",
"mongoose": "^9.3.1",
"react": "^19.2.4",
"react-dom": "^19.2.4",
From 6a9f2e86035c50011938ec2f601d50308325b898 Mon Sep 17 00:00:00 2001
From: thisisvaishnav
Date: Fri, 20 Mar 2026 22:33:08 +0530
Subject: [PATCH 3/4] Actions
---
.github/workflows/deploy.yml | 137 +++++------------------------
bun.lock | 140 ++++++++++++++++++++++++++++++
ecosystem.config.cjs | 22 +++++
packages/common/metadata/index.ts | 6 ++
packages/common/types/index.ts | 1 +
packages/db/index.ts | 4 +
packages/lighter-sdk-ts | 1 +
7 files changed, 197 insertions(+), 114 deletions(-)
create mode 100644 ecosystem.config.cjs
create mode 160000 packages/lighter-sdk-ts
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 4b7457c..69991ff 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -1,4 +1,4 @@
-name: Deploy
+name: Deploy to Production
on:
push:
@@ -9,132 +9,41 @@ concurrency:
group: deploy-${{ github.ref }}
cancel-in-progress: false
-env:
- TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
- TURBO_TEAM: ${{ vars.TURBO_TEAM }}
-
jobs:
ci:
name: CI Checks
uses: ./.github/workflows/ci.yml
secrets: inherit
- deploy-client:
- name: Deploy Client
+ deploy:
+ name: Deploy to DigitalOcean
runs-on: ubuntu-latest
needs: ci
+ timeout-minutes: 10
environment: production
- steps:
- - uses: actions/checkout@v4
-
- - uses: oven-sh/setup-bun@v2
- with:
- bun-version: "1.3.10"
-
- - name: Cache Bun dependencies
- uses: actions/cache@v4
- with:
- path: ~/.bun/install/cache
- key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }}
- restore-keys: |
- ${{ runner.os }}-bun-
-
- - name: Install dependencies
- run: bun install --frozen-lockfile
- - name: Build client
- run: bun run build
- env:
- VITE_API_BASE_URL: ${{ vars.VITE_API_BASE_URL }}
-
- # Uncomment and configure for your deployment target:
-
- # --- Vercel ---
- # - uses: amondnet/vercel-action@v25
- # with:
- # vercel-token: ${{ secrets.VERCEL_TOKEN }}
- # vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
- # vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
- # vercel-args: --prod
- # working-directory: apps/client
-
- # --- Cloudflare Pages ---
- # - uses: cloudflare/wrangler-action@v3
- # with:
- # apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
- # accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
- # command: pages deploy apps/client/dist --project-name=tradingflow
-
- # --- Netlify ---
- # - uses: nwtgck/actions-netlify@v3
- # with:
- # publish-dir: apps/client/dist
- # production-deploy: true
- # env:
- # NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
- # NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
-
- deploy-backend:
- name: Deploy Backend
- runs-on: ubuntu-latest
- needs: ci
- environment: production
steps:
- - uses: actions/checkout@v4
-
- # Uncomment and configure for your deployment target:
-
- # --- Railway ---
- # - uses: bervProject/railway-deploy@main
- # with:
- # railway_token: ${{ secrets.RAILWAY_TOKEN }}
- # service: backend
-
- # --- Fly.io ---
- # - uses: superfly/flyctl-actions/setup-flyctl@master
- # - run: flyctl deploy --app tradingflow-backend
- # working-directory: apps/backend
- # env:
- # FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
-
- # --- Docker + any registry ---
- # - uses: docker/login-action@v3
- # with:
- # registry: ghcr.io
- # username: ${{ github.actor }}
- # password: ${{ secrets.GITHUB_TOKEN }}
- # - uses: docker/build-push-action@v6
- # with:
- # context: .
- # file: apps/backend/Dockerfile
- # push: true
- # tags: ghcr.io/${{ github.repository }}/backend:latest
-
- - name: Placeholder
- run: echo "Configure deployment target above"
+ - name: Deploy via SSH
+ uses: appleboy/ssh-action@v1
+ with:
+ host: ${{ secrets.SERVER_HOST }}
+ username: ${{ secrets.SERVER_USER }}
+ key: ${{ secrets.SERVER_SSH_KEY }}
+ script_stop: true
+ script: |
+ cd ~/tradingflow
- deploy-executor:
- name: Deploy Executor
- runs-on: ubuntu-latest
- needs: ci
- environment: production
- steps:
- - uses: actions/checkout@v4
+ echo "==> Pulling latest code..."
+ git pull origin main
- # Same deployment options as backend — uncomment and configure:
+ echo "==> Installing dependencies..."
+ bun install --frozen-lockfile
- # --- Railway ---
- # - uses: bervProject/railway-deploy@main
- # with:
- # railway_token: ${{ secrets.RAILWAY_TOKEN }}
- # service: executor
+ echo "==> Building all apps..."
+ bun run build
- # --- Fly.io ---
- # - uses: superfly/flyctl-actions/setup-flyctl@master
- # - run: flyctl deploy --app tradingflow-executor
- # working-directory: apps/executor
- # env:
- # FLY_API_TOKEN: ${{ secrets.FLY_API_TOKEN }}
+ echo "==> Restarting PM2 processes..."
+ pm2 restart ecosystem.config.cjs
- - name: Placeholder
- run: echo "Configure deployment target above"
+ echo "==> Deploy complete!"
+ pm2 status
diff --git a/bun.lock b/bun.lock
index 4d679fc..a15b9ac 100644
--- a/bun.lock
+++ b/bun.lock
@@ -74,9 +74,14 @@
"apps/executor": {
"name": "executor",
"dependencies": {
+ "@react-email/components": "^1.0.10",
"common": "*",
"db": "*",
+ "lighter-sdk-ts": "*",
"mongoose": "^9.3.1",
+ "react": "^19.2.4",
+ "react-dom": "^19.2.4",
+ "resend": "^6.9.4",
},
"devDependencies": {
"@types/bun": "latest",
@@ -127,6 +132,21 @@
"typescript-eslint": "^8.50.0",
},
},
+ "packages/lighter-sdk-ts": {
+ "name": "lighter-sdk-ts",
+ "version": "0.1.0",
+ "dependencies": {
+ "@types/node": "^24.9.1",
+ "@types/ws": "^8.18.1",
+ "axios": "^1.7.0",
+ "es6-promise": "^4.2.4",
+ "whatwg-fetch": "^3.0.0",
+ "ws": "^8.18.3",
+ },
+ "devDependencies": {
+ "typescript": "^5.0.0",
+ },
+ },
"packages/typescript-config": {
"name": "@repo/typescript-config",
"version": "0.0.0",
@@ -407,6 +427,48 @@
"@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="],
+ "@react-email/body": ["@react-email/body@0.3.0", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-uGo0BOOzjbMUo3lu+BIDWayvn5o6Xyfmnlla5VGf05n8gHMvO1ll7U4FtzWe3hxMLwt53pmc4iE0M+B5slG+Ug=="],
+
+ "@react-email/button": ["@react-email/button@0.2.1", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-qXyj7RZLE7POy9BMKSoqQ00tOXThjOZSUnI2Yu9i29IHngPlmrNayIWBoVKtElES7OWwypUcpiajwi1mUWx6/A=="],
+
+ "@react-email/code-block": ["@react-email/code-block@0.2.1", "", { "dependencies": { "prismjs": "^1.30.0" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-M3B7JpVH4ytgn83/ujRR1k1DQHvTeABiDM61OvAbjLRPhC/5KLHU5KkzIbbuGIrjWwxAbL1kSQzU8MhLEtSxyw=="],
+
+ "@react-email/code-inline": ["@react-email/code-inline@0.0.6", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-jfhebvv3dVsp3OdPgKXnk8+e2pBiDVZejDOBFzBa/IblrAJ9cQDkN6rBD5IyEg8hTOxwbw3iaI/yZFmDmIguIA=="],
+
+ "@react-email/column": ["@react-email/column@0.0.14", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-f+W+Bk2AjNO77zynE33rHuQhyqVICx4RYtGX9NKsGUg0wWjdGP0qAuIkhx9Rnmk4/hFMo1fUrtYNqca9fwJdHg=="],
+
+ "@react-email/components": ["@react-email/components@1.0.10", "", { "dependencies": { "@react-email/body": "0.3.0", "@react-email/button": "0.2.1", "@react-email/code-block": "0.2.1", "@react-email/code-inline": "0.0.6", "@react-email/column": "0.0.14", "@react-email/container": "0.0.16", "@react-email/font": "0.0.10", "@react-email/head": "0.0.13", "@react-email/heading": "0.0.16", "@react-email/hr": "0.0.12", "@react-email/html": "0.0.12", "@react-email/img": "0.0.12", "@react-email/link": "0.0.13", "@react-email/markdown": "0.0.18", "@react-email/preview": "0.0.14", "@react-email/render": "2.0.4", "@react-email/row": "0.0.13", "@react-email/section": "0.0.17", "@react-email/tailwind": "2.0.6", "@react-email/text": "0.1.6" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-r/BnqfAjr3apcvn/NDx2DqNRD5BP5wZLRdjn2IVHXjt4KmQ5RHWSCAvFiXAzRHys1BWQ2zgIc7cpWePUcAl+nw=="],
+
+ "@react-email/container": ["@react-email/container@0.0.16", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-QWBB56RkkU0AJ9h+qy33gfT5iuZknPC7Un/IjZv9B0QmMIK+WWacc0cH6y2SV5Cv/b99hU94fjEMOOO4enpkbQ=="],
+
+ "@react-email/font": ["@react-email/font@0.0.10", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-0urVSgCmQIfx5r7Xc586miBnQUVnGp3OTYUm8m5pwtQRdTRO5XrTtEfNJ3JhYhSOruV0nD8fd+dXtKXobum6tA=="],
+
+ "@react-email/head": ["@react-email/head@0.0.13", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-AJg6le/08Gz4tm+6MtKXqtNNyKHzmooOCdmtqmWxD7FxoAdU1eVcizhtQ0gcnVaY6ethEyE/hnEzQxt1zu5Kog=="],
+
+ "@react-email/heading": ["@react-email/heading@0.0.16", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-jmsKnQm1ykpBzw4hCYHwBkt5pW2jScXffPeEH5ZRF5tZeF5b1pvlFTO9han7C0pCkZYo1kEvWiRtx69yfCIwuw=="],
+
+ "@react-email/hr": ["@react-email/hr@0.0.12", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-TwmOmBDibavUQpXBxpmZYi2Iks/yeZOzFYh+di9EltMSnEabH8dMZXrl+pxNXzCgZ2XE8HY7VmUL65Lenfu5PA=="],
+
+ "@react-email/html": ["@react-email/html@0.0.12", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-KTShZesan+UsreU7PDUV90afrZwU5TLwYlALuCSU0OT+/U8lULNNbAUekg+tGwCnOfIKYtpDPKkAMRdYlqUznw=="],
+
+ "@react-email/img": ["@react-email/img@0.0.12", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-sRCpEARNVTf3FQhZOC+JTvu5r6ubiYWkT0ucYXg8ctkyi4G8QG+jgYPiNUqVeTLA2STOfmPM/nrk1nb84y6CPQ=="],
+
+ "@react-email/link": ["@react-email/link@0.0.13", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-lkWc/NjOcefRZMkQoSDDbuKBEBDES9aXnFEOuPH845wD3TxPwh+QTf0fStuzjoRLUZWpHnio4z7qGGRYusn/sw=="],
+
+ "@react-email/markdown": ["@react-email/markdown@0.0.18", "", { "dependencies": { "marked": "^15.0.12" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-gSuYK5fsMbGk87jDebqQ6fa2fKcWlkf2Dkva8kMONqLgGCq8/0d+ZQYMEJsdidIeBo3kmsnHZPrwdFB4HgjUXg=="],
+
+ "@react-email/preview": ["@react-email/preview@0.0.14", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-aYK8q0IPkBXyMsbpMXgxazwHxYJxTrXrV95GFuu2HbEiIToMwSyUgb8HDFYwPqqfV03/jbwqlsXmFxsOd+VNaw=="],
+
+ "@react-email/render": ["@react-email/render@2.0.4", "", { "dependencies": { "html-to-text": "^9.0.5", "prettier": "^3.5.3" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-kht2oTFQ1SwrLpd882ahTvUtNa9s53CERHstiTbzhm6aR2Hbykp/mQ4tpPvsBGkKAEvKRlDEoooh60Uk6nHK1g=="],
+
+ "@react-email/row": ["@react-email/row@0.0.13", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-bYnOac40vIKCId7IkwuLAAsa3fKfSfqCvv6epJKmPE0JBuu5qI4FHFCl9o9dVpIIS08s/ub+Y/txoMt0dYziGw=="],
+
+ "@react-email/section": ["@react-email/section@0.0.17", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-qNl65ye3W0Rd5udhdORzTV9ezjb+GFqQQSae03NDzXtmJq6sqVXNWNiVolAjvJNypim+zGXmv6J9TcV5aNtE/w=="],
+
+ "@react-email/tailwind": ["@react-email/tailwind@2.0.6", "", { "dependencies": { "tailwindcss": "4.1.18" }, "peerDependencies": { "@react-email/body": ">=0", "@react-email/button": ">=0", "@react-email/code-block": ">=0", "@react-email/code-inline": ">=0", "@react-email/container": ">=0", "@react-email/heading": ">=0", "@react-email/hr": ">=0", "@react-email/img": ">=0", "@react-email/link": ">=0", "@react-email/preview": ">=0", "@react-email/text": ">=0", "react": "^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@react-email/body", "@react-email/button", "@react-email/code-block", "@react-email/code-inline", "@react-email/container", "@react-email/heading", "@react-email/hr", "@react-email/img", "@react-email/link", "@react-email/preview"] }, "sha512-3PgL/GYWmgS+puLPQ2aLlsplHSOFztRl70fowBkbLIb8ZUIgvx5YId6zYCCHeM2+DQ/EG3iXXqLNTahVztuMqQ=="],
+
+ "@react-email/text": ["@react-email/text@0.1.6", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-TYqkioRS45wTR5il3dYk/SbUjjEdhSwh9BtRNB99qNH1pXAwA45H7rAuxehiu8iJQJH0IyIr+6n62gBz9ezmsw=="],
+
"@repo/eslint-config": ["@repo/eslint-config@workspace:packages/eslint-config"],
"@repo/typescript-config": ["@repo/typescript-config@workspace:packages/typescript-config"],
@@ -445,8 +507,12 @@
"@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="],
+ "@selderee/plugin-htmlparser2": ["@selderee/plugin-htmlparser2@0.11.0", "", { "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" } }, "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ=="],
+
"@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
+ "@stablelib/base64": ["@stablelib/base64@1.0.1", "", {}, "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ=="],
+
"@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="],
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.2.1", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.2.1", "@tailwindcss/oxide-darwin-arm64": "4.2.1", "@tailwindcss/oxide-darwin-x64": "4.2.1", "@tailwindcss/oxide-freebsd-x64": "4.2.1", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", "@tailwindcss/oxide-linux-x64-musl": "4.2.1", "@tailwindcss/oxide-wasm32-wasi": "4.2.1", "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" } }, "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw=="],
@@ -541,6 +607,8 @@
"@types/whatwg-url": ["@types/whatwg-url@13.0.0", "", { "dependencies": { "@types/webidl-conversions": "*" } }, "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q=="],
+ "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
+
"@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.57.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/type-utils": "8.57.0", "@typescript-eslint/utils": "8.57.0", "@typescript-eslint/visitor-keys": "8.57.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.57.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ=="],
"@typescript-eslint/parser": ["@typescript-eslint/parser@8.57.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/types": "8.57.0", "@typescript-eslint/typescript-estree": "8.57.0", "@typescript-eslint/visitor-keys": "8.57.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g=="],
@@ -605,8 +673,12 @@
"async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
+ "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
+
"available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
+ "axios": ["axios@1.13.6", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ=="],
+
"backend": ["backend@workspace:apps/backend"],
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
@@ -667,6 +739,8 @@
"color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+ "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
+
"commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
"common": ["common@workspace:packages/common"],
@@ -739,6 +813,8 @@
"define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
+ "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
+
"depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
@@ -749,6 +825,14 @@
"doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="],
+ "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
+
+ "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
+
+ "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
+
+ "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
+
"dotenv": ["dotenv@16.0.3", "", {}, "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="],
"dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
@@ -767,6 +851,8 @@
"enhanced-resolve": ["enhanced-resolve@5.20.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ=="],
+ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
"env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
"error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="],
@@ -787,6 +873,8 @@
"es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
+ "es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="],
+
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
"escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
@@ -845,6 +933,8 @@
"fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+ "fast-sha256": ["fast-sha256@1.3.0", "", {}, "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="],
+
"fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
"fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
@@ -867,8 +957,12 @@
"flatted": ["flatted@3.4.1", "", {}, "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ=="],
+ "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="],
+
"for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
+ "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="],
+
"formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
"forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
@@ -941,6 +1035,10 @@
"hono": ["hono@4.12.8", "", {}, "sha512-VJCEvtrezO1IAR+kqEYnxUOoStaQPGrCmX3j4wDTNOcD1uRPFpGlwQUIW8niPuvHXaTUxeOUl5MMDGrl+tmO9A=="],
+ "html-to-text": ["html-to-text@9.0.5", "", { "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", "dom-serializer": "^2.0.0", "htmlparser2": "^8.0.2", "selderee": "^0.11.0" } }, "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg=="],
+
+ "htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="],
+
"http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
"https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
@@ -1085,8 +1183,12 @@
"kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
+ "leac": ["leac@0.6.0", "", {}, "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg=="],
+
"levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
+ "lighter-sdk-ts": ["lighter-sdk-ts@workspace:packages/lighter-sdk-ts"],
+
"lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
"lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
@@ -1141,6 +1243,8 @@
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
+ "marked": ["marked@15.0.12", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA=="],
+
"math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
"media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
@@ -1245,6 +1349,8 @@
"parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="],
+ "parseley": ["parseley@0.12.1", "", { "dependencies": { "leac": "^0.6.0", "peberminta": "^0.9.0" } }, "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw=="],
+
"parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
"path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
@@ -1257,6 +1363,8 @@
"path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
+ "peberminta": ["peberminta@0.9.0", "", {}, "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ=="],
+
"picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
"picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
@@ -1265,6 +1373,8 @@
"possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
+ "postal-mime": ["postal-mime@2.7.3", "", {}, "sha512-MjhXadAJaWgYzevi46+3kLak8y6gbg0ku14O1gO/LNOuay8dO+1PtcSGvAdgDR0DoIsSaiIA8y/Ddw6MnrO0Tw=="],
+
"postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
"postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
@@ -1277,12 +1387,16 @@
"pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="],
+ "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="],
+
"prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
"prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
"proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
+ "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
+
"punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
"qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="],
@@ -1321,6 +1435,8 @@
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+ "resend": ["resend@6.9.4", "", { "dependencies": { "postal-mime": "2.7.3", "svix": "1.86.0" }, "peerDependencies": { "@react-email/render": "*" }, "optionalPeers": ["@react-email/render"] }, "sha512-/M3dsJzu5OgozqVsA4Psd/1L7EdePgOIIxClas453GOQYFG3VHc2ZyCHZFlvqsc9aZCCd2BJRRqZgWC8D9c7/g=="],
+
"resolve": ["resolve@2.0.0-next.6", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-3JmVl5hMGtJ3kMmB3zi3DL25KfkCEyy3Tw7Gmw7z5w8M9WlwoPFnIvwChzu1+cF3iaK3sp18hhPz8ANeimdJfA=="],
"resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
@@ -1351,6 +1467,8 @@
"scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
+ "selderee": ["selderee@0.11.0", "", { "dependencies": { "parseley": "^0.12.0" } }, "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA=="],
+
"semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
@@ -1393,6 +1511,8 @@
"sparse-bitfield": ["sparse-bitfield@3.0.3", "", { "dependencies": { "memory-pager": "^1.0.2" } }, "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ=="],
+ "standardwebhooks": ["standardwebhooks@1.0.0", "", { "dependencies": { "@stablelib/base64": "^1.0.0", "fast-sha256": "^1.3.0" } }, "sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg=="],
+
"statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
"stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="],
@@ -1427,6 +1547,8 @@
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
+ "svix": ["svix@1.86.0", "", { "dependencies": { "standardwebhooks": "1.0.0", "uuid": "^10.0.0" } }, "sha512-/HTvXwjLJe1l/MsLXAO1ddCYxElJk4eNR4DzOjDOEmGrPN/3BtBE8perGwMAaJ2sT5T172VkBYzmHcjUfM1JRQ=="],
+
"tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],
"tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="],
@@ -1517,6 +1639,8 @@
"util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+ "uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="],
+
"validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="],
"vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
@@ -1527,6 +1651,8 @@
"webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="],
+ "whatwg-fetch": ["whatwg-fetch@3.6.20", "", {}, "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg=="],
+
"whatwg-url": ["whatwg-url@14.2.0", "", { "dependencies": { "tr46": "^5.1.0", "webidl-conversions": "^7.0.0" } }, "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw=="],
"which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
@@ -1545,6 +1671,8 @@
"wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
+ "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="],
+
"wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],
"y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
@@ -1583,6 +1711,8 @@
"@modelcontextprotocol/sdk/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="],
+ "@react-email/tailwind/tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="],
+
"@tailwindcss/node/lightningcss": ["lightningcss@1.31.1", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.31.1", "lightningcss-darwin-arm64": "1.31.1", "lightningcss-darwin-x64": "1.31.1", "lightningcss-freebsd-x64": "1.31.1", "lightningcss-linux-arm-gnueabihf": "1.31.1", "lightningcss-linux-arm64-gnu": "1.31.1", "lightningcss-linux-arm64-musl": "1.31.1", "lightningcss-linux-x64-gnu": "1.31.1", "lightningcss-linux-x64-musl": "1.31.1", "lightningcss-win32-arm64-msvc": "1.31.1", "lightningcss-win32-x64-msvc": "1.31.1" } }, "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ=="],
"@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.9.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w=="],
@@ -1633,8 +1763,14 @@
"fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+ "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
+
"jsonwebtoken/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
+ "lighter-sdk-ts/@types/node": ["@types/node@24.12.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ=="],
+
+ "lighter-sdk-ts/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+
"log-symbols/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
"log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
@@ -1721,6 +1857,10 @@
"db/@types/bun/bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],
+ "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+
+ "lighter-sdk-ts/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
+
"shadcn/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
"wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs
new file mode 100644
index 0000000..dc95aa8
--- /dev/null
+++ b/ecosystem.config.cjs
@@ -0,0 +1,22 @@
+module.exports = {
+ apps: [
+ {
+ name: "tradingflow-backend",
+ cwd: "./apps/backend",
+ script: "index.ts",
+ interpreter: "bun",
+ env: {
+ NODE_ENV: "production",
+ },
+ },
+ {
+ name: "tradingflow-executor",
+ cwd: "./apps/executor",
+ script: "index.ts",
+ interpreter: "bun",
+ env: {
+ NODE_ENV: "production",
+ },
+ },
+ ],
+};
diff --git a/packages/common/metadata/index.ts b/packages/common/metadata/index.ts
index 11a8879..c430a8a 100644
--- a/packages/common/metadata/index.ts
+++ b/packages/common/metadata/index.ts
@@ -4,6 +4,12 @@ export type TradingMetadata = {
symbol: (typeof SUPPORTED_ASSETS)[number]
}
+export type LighterTradingMetadata = TradingMetadata & {
+ lighterPrivateKey: string;
+ lighterAccountIndex: number;
+ lighterApiKeyIndex: number;
+ lighterUrl: string;
+}
export const SUPPORTED_ASSETS = ["SOL", "BTC", "ETH"];
export type TimerNodeMetadata = {
diff --git a/packages/common/types/index.ts b/packages/common/types/index.ts
index 9428499..c4b0626 100644
--- a/packages/common/types/index.ts
+++ b/packages/common/types/index.ts
@@ -6,6 +6,7 @@ export type {
PriceTriggerMetadata,
TimerNodeMetadata,
TradingMetadata,
+ LighterTradingMetadata,
EmailMetadata,
TelegramMetadata,
} from "../metadata";
diff --git a/packages/db/index.ts b/packages/db/index.ts
index 2a12cf7..252af20 100644
--- a/packages/db/index.ts
+++ b/packages/db/index.ts
@@ -128,6 +128,10 @@ const ExecutionSchema = new Schema({
type: String,
required: true,
},
+ nodeName: {
+ type: String,
+ default: "Unknown Node",
+ },
status: {
type: String,
enum: ["PENDING", "COMPLETED", "FAILED"],
diff --git a/packages/lighter-sdk-ts b/packages/lighter-sdk-ts
new file mode 160000
index 0000000..08643b5
--- /dev/null
+++ b/packages/lighter-sdk-ts
@@ -0,0 +1 @@
+Subproject commit 08643b5094ce1a54f00f797f5efb48497591d049
From fed6b06588998f10e58c533369842f0e56d5248b Mon Sep 17 00:00:00 2001
From: thisisvaishnav
Date: Fri, 20 Mar 2026 22:48:27 +0530
Subject: [PATCH 4/4] update submodules
---
apps/client | 2 +-
packages/lighter-sdk-ts | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/apps/client b/apps/client
index 527f448..f3b3b64 160000
--- a/apps/client
+++ b/apps/client
@@ -1 +1 @@
-Subproject commit 527f44887f4d022f11c3bb7ea0c4a6ba43d63bf1
+Subproject commit f3b3b64a6e375085bbc7a1534bb78d9ba2396084
diff --git a/packages/lighter-sdk-ts b/packages/lighter-sdk-ts
index 08643b5..7f96922 160000
--- a/packages/lighter-sdk-ts
+++ b/packages/lighter-sdk-ts
@@ -1 +1 @@
-Subproject commit 08643b5094ce1a54f00f797f5efb48497591d049
+Subproject commit 7f969227ac9f8d58f83b87fa1fc7db3951dda95c