{
  "name": "arb-pulse",
  "version": "1.0.0",
  "description": "Real-time BTC cross-exchange arbitrage detection & simulation bot (Kraken, Bybit, OKX, Binance)",
  "type": "module",
  "engines": {
    "node": ">=20"
  },
  "scripts": {
    "dev": "tsx watch src/index.ts",
    "dev:web": "npm --prefix web run dev",
    "start": "tsx src/index.ts",
    "build": "npm --prefix web install && npm --prefix web run build",
    "typecheck": "tsc --noEmit && npm --prefix web run typecheck",
    "test": "node scripts/run-tests.mjs",
    "test:rate-limit": "node --import tsx --test src/interfaces/http/rate-limit.test.ts",
    "test:e2e": "playwright test",
    "test:observability": "playwright test observability.spec.ts",
    "lint": "eslint .",
    "prepare": "husky"
  },
  "lint-staged": {
    "src/**/*.ts": [
      "eslint --fix",
      "prettier --write"
    ],
    "web/src/**/*.{ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ]
  },
  "dependencies": {
    "@asteasolutions/zod-to-openapi": "^8.5.0",
    "@opentelemetry/api": "^1.9.1",
    "@opentelemetry/sdk-trace-node": "^2.7.1",
    "@scalar/express-api-reference": "^0.8.48",
    "@sentry/node": "^10.57.0",
    "@sentry/opentelemetry": "^10.57.0",
    "@upstash/ratelimit": "^2.0.6",
    "@upstash/redis": "^1.35.3",
    "express": "^4.21.2",
    "pino": "^10.3.1",
    "pino-pretty": "^13.1.3",
    "tsx": "^4.19.2",
    "ws": "^8.18.0",
    "zod": "^4.4.3"
  },
  "devDependencies": {
    "@eslint/js": "^9.18.0",
    "@playwright/test": "^1.51.1",
    "@types/express": "^4.17.21",
    "@types/node": "^22.10.5",
    "@types/ws": "^8.5.13",
    "eslint": "^9.18.0",
    "eslint-plugin-react-hooks": "^5.1.0",
    "globals": "^15.14.0",
    "husky": "^9.1.7",
    "lint-staged": "^16.4.0",
    "prettier": "^3.8.3",
    "typescript": "^5.7.3",
    "typescript-eslint": "^8.26.0"
  }
}
