{ "name": "server", "version": "1.2.1", "private": true, "type": "module", "engines": { "node": ">=20.0.0", "npm": ">=10.0.0" }, "scripts": { "dev": "cd .. && npx nx build-deps server && NX_LOAD_DOT_ENV_FILES=false NODE_ENV=development NX_DAEMON=false npx nx next:dev server", "dev:turbo": "cd .. && npx nx build-deps server && NX_LOAD_DOT_ENV_FILES=false NODE_ENV=development npx nx next:dev server -- --turbo", "dev:express": "NODE_OPTIONS='--max-old-space-size=8192' NODE_ENV=development nodemon --watch index.ts --watch src/middleware --ext ts --exec tsx index.ts", "dev:ngrok": "node scripts/dev-with-ngrok-instructions.js", "ngrok:start": "ngrok http 3000 --subdomain=alga-psa-dev", "ngrok:tunnel": "ngrok http 3000", "test:webhook": "node scripts/test-webhook.js", "dev:with-ngrok": "echo 'Set NGROK_URL and run: NGROK_URL=https://your-url.ngrok.io npm run dev'", "build": "NODE_OPTIONS=\"${NODE_OPTIONS:---max-old-space-size=8192}\" NODE_ENV=production next build --webpack", "build:turbo": "NODE_OPTIONS=\"${NODE_OPTIONS:---max-old-space-size=8192}\" NODE_ENV=production next build --turbo", "build:enterprise": "NODE_OPTIONS=\"${NODE_OPTIONS:---max-old-space-size=8192}\" NODE_ENV=production next build --webpack", "build:enterprise:turbo": "NODE_OPTIONS=\"${NODE_OPTIONS:---max-old-space-size=8192}\" NODE_ENV=production NEXT_PUBLIC_EDITION=enterprise next build --turbo", "build:enterprise-script": "../scripts/build-enterprise.sh", "analyze": "NODE_OPTIONS=\"${NODE_OPTIONS:---max-old-space-size=8192}\" NODE_ENV=production ANALYZE=true next build --webpack", "start": "next start -p 3000", "start:next": "next start -p 3000", "start:express": "tsx index.ts", "lint": "next lint", "typecheck": "tsc --noEmit -p tsconfig.json", "test": "vitest run src/test/unit --coverage.enabled=false", "test:watch": "vitest --watch", "test:unit": "vitest src/test/unit", "test:integration": "vitest src/test/integration", "test:integration:ci": "vitest run src/test/integration --coverage.enabled=false", "test:integration:tier1": "vitest run src/test/integration/billing src/test/integration/accounting src/test/integration/authorization src/test/integration/billingInvoiceTiming.integration.test.ts --coverage.enabled=false", "test:infrastructure": "vitest src/test/infrastructure", "test:e2e": "vitest src/test/e2e", "test:e2e:email": "vitest src/test/e2e/email-processing.test.ts", "test:e2e:workflow": "vitest src/test/e2e/workflow-integration.test.ts", "test:e2e:pipeline": "vitest src/test/e2e/full-pipeline.test.ts", "test:e2e:email-settings": "vitest src/test/e2e/email-settings", "test:local": "vitest --config vitest.config.ts", "test:harness:start": "node scripts/test-harness.js start", "test:harness:stop": "node scripts/test-harness.js stop", "test:harness:restart": "node scripts/test-harness.js restart", "test:harness:status": "node scripts/test-harness.js status", "test:harness:logs": "node scripts/test-harness.js logs", "test:harness:reset": "node scripts/test-harness.js reset-data", "workflow-worker": "ts-node --esm src/bin/workflow-worker.ts", "workflow-worker:dev": "nodemon --watch src --ext ts --exec \"ts-node --esm src/bin/workflow-worker.ts\"", "workflow-worker:build": "tsc --project tsconfig.json --outDir dist src/bin/workflow-worker.ts", "workflow-worker:start": "node dist/bin/workflow-worker.js", "unified-inbound-email-consumer": "ts-node --esm src/bin/unifiedInboundEmailQueueConsumer.ts", "create-tenant": "tsx scripts/create-tenant.ts", "rollback-tenant": "tsx scripts/rollback-tenant.ts", "migrate:ee": "node scripts/run-ee-migrations.js", "migrate:ee:down": "node scripts/run-ee-migrations.js down", "migrate:ee:status": "node scripts/run-ee-migrations.js status" }, "nx": { "targets": { "build": { "dependsOn": [] } } }, "dependencies": { "@alga-psa/authorization": "*", "@alga-psa/workflow-streams": "*", "@alga-psa/workflows": "*", "@anthropic-ai/sdk": "^0.36.3", "@assemblyscript/loader": "^0.27.36", "@asteasolutions/zod-to-openapi": "^6.3.1", "@aws-sdk/client-s3": "^3.984.0", "@aws-sdk/s3-request-presigner": "^3.984.0", "@blocknote/core": "^0.47.3", "@blocknote/mantine": "^0.47.3", "@blocknote/react": "^0.47.3", "@blocknote/server-util": "^0.47.3", "@eslint/plugin-kit": "^0.3.5", "@hocuspocus/provider": "^2.15.2", "@hookform/resolvers": "^5.0.1", "@huggingface/inference": "^3.3.3", "@js-temporal/polyfill": "^0.4.4", "@mantine/form": "^8.0.0", "@monaco-editor/react": "^4.7.0", "@nestjs/common": "^11.0.4", "@nestjs/core": "^11.1.18", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.75.0", "@opentelemetry/auto-instrumentations-web": "^0.48.0", "@opentelemetry/exporter-jaeger": "^2.0.1", "@opentelemetry/exporter-trace-otlp-http": "^0.217.0", "@opentelemetry/instrumentation-document-load": "^0.47.0", "@opentelemetry/instrumentation-http": "^0.217.0", "@opentelemetry/instrumentation-pg": "^0.54.0", "@opentelemetry/instrumentation-redis": "^0.49.1", "@opentelemetry/instrumentation-user-interaction": "^0.47.0", "@opentelemetry/resources": "^2.0.1", "@opentelemetry/sdk-node": "^0.217.0", "@opentelemetry/sdk-trace-base": "^2.0.1", "@opentelemetry/sdk-trace-web": "^2.0.1", "@opentelemetry/semantic-conventions": "^1.34.0", "@opentelemetry/winston-transport": "^0.13.0", "@radix-ui/react-dialog": "^1.0.5", "@radix-ui/react-form": "^0.1.2", "@radix-ui/react-label": "^2.1.2", "@radix-ui/react-progress": "^1.1.1", "@radix-ui/react-select": "^2.0.0", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.0.3", "@radix-ui/react-tabs": "^1.1.3", "@radix-ui/themes": "^3.2.0", "@rjsf/core": "^6.0.0-beta.11", "@rjsf/validator-ajv8": "^6.0.0-beta.11", "@stripe/react-stripe-js": "^5.2.0", "@stripe/stripe-js": "^8.0.0", "@tailwindcss/postcss": "^4.0.6", "@tanstack/react-table": "^8.20.6", "@tiptap/extension-collaboration": "^3.12.0", "@tiptap/extension-collaboration-caret": "^3.0.0", "@tiptap/extension-table": "^3.22.5", "@tiptap/extension-table-cell": "^3.22.5", "@tiptap/extension-table-header": "^3.22.5", "@tiptap/extension-table-row": "^3.22.5", "@tiptap/react": "^3.0.7", "@tiptap/starter-kit": "^3.0.7", "@tiptap/y-tiptap": "^3.0.2", "@types/cookie-parser": "^1.4.9", "@types/express": "^5.0.3", "@types/nodemailer": "^7.0.9", "@types/papaparse": "^5.3.16", "@types/redis": "^4.0.10", "@types/uuid": "^10.0.0", "@types/ws": "^8.5.13", "@wasmer/sdk": "^0.9.0", "archiver": "^7.0.1", "autoprefixer": "^10.4.21", "axios": "^1.16.0", "class-variance-authority": "^0.7.0", "clean": "^4.0.2", "clsx": "^2.1.1", "cmdk": "^1.0.4", "cookie-parser": "^1.4.7", "cookies-next": "^6.1.0", "date-fns": "^4.1.0", "date-fns-tz": "^3.2.0", "dotenv": "^16.4.7", "elkjs": "^0.10.0", "expo-server-sdk": "^6.1.0", "express": "^5.1.0", "file-type": "^21.3.2", "fluent-ffmpeg": "^2.1.3", "formdata-node": "^6.0.3", "fractional-indexing": "^3.2.0", "fzstd": "^0.1.1", "google-auth-library": "^10.1.0", "googleapis": "^152.0.0", "handlebars": "^4.7.9", "i18next": "^25.5.2", "i18next-browser-languagedetector": "^8.2.0", "i18next-http-backend": "^3.0.6", "imapflow": "^1.3.1", "jsondiffpatch": "^0.7.3", "jsonwebtoken": "^9.0.2", "lodash": "^4.18.1", "lucide-react": "^0.475.0", "marked": "^15.0.7", "mkdirp": "^3.0.1", "monaco-editor": "^0.52.2", "nestjs-knex": "^2.0.0", "next": "^16.2.6", "next-auth": "^5.0.0-beta.30", "next-i18next": "^15.4.2", "next-themes": "^0.4.6", "node-vault": "^0.10.2", "nodemailer": "^8.0.4", "papaparse": "^5.5.3", "parsimmon": "^1.18.1", "pdf-lib": "^1.17.1", "pdf2pic": "^3.1.3", "pg-boss": "^10.1.6", "pg-query-stream": "^4.10.3", "pg-types": "^4.0.2", "postcss": "^8.5.10", "postcss-import": "^16.1.0", "posthog-js": "^1.255.1", "posthog-node": "^4.18.0", "prosemirror-view": "^1.30.2", "puppeteer": "^24.2.0", "qrcode": "^1.5.4", "querystring-es3": "^0.2.1", "rate-limiter-flexible": "^5.0.5", "react": "^19.2.3", "react-big-calendar": "^1.17.1", "react-day-picker": "^9.5.0", "react-dom": "^19.2.3", "react-error-boundary": "^5.0.0", "react-hook-form": "^7.54.2", "react-hot-toast": "^2.5.1", "react-i18next": "^15.7.3", "react-markdown": "^9.0.3", "react-resizable-panels": "^3.0.6", "reactflow": "^11.11.4", "recharts": "^2.15.1", "redis": "^4.7.0", "rrule": "^2.8.1", "sharp": "^0.33.5", "simple-swizzle": "^0.2.4", "socket.io-client": "^4.8.1", "speakeasy": "^2.0.0", "stripe": "^19.1.0", "swr": "^2.2.5", "tailwind-merge": "^2.6.0", "tailwindcss": "^3.3.0", "tar": "^7.5.12", "tinycolor2": "^1.6.0", "ts-command-line-args": "^2.5.1", "ts-morph": "^26.0.0", "ua-parser-js": "^2.0.6", "uuid": "^11.1.1", "web-vitals": "^5.0.3", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0", "ws": "^8.20.1", "xlsx": "^0.18.5", "zod": "^3.25.67", "zod-to-json-schema": "^3.24.6" }, "devDependencies": { "@eslint/js": "^9.18.0", "@faker-js/faker": "^9.9.0", "@tailwindcss/container-queries": "^0.1.1", "@tailwindcss/typography": "^0.5.19", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.2.0", "@types/archiver": "^6.0.3", "@types/fluent-ffmpeg": "^2.1.27", "@types/jsonwebtoken": "^9.0.8", "@types/lodash": "^4.17.20", "@types/node": "^20.11.0", "@types/parsimmon": "^1.10.9", "@types/qrcode": "^1.5.5", "@types/react-big-calendar": "^1.16.2", "@types/speakeasy": "^2.0.10", "@types/tinycolor2": "^1.4.6", "@types/ua-parser-js": "^0.7.39", "@typescript-eslint/eslint-plugin": "^8.19.1", "@typescript-eslint/parser": "^8.19.1", "@vitest/coverage-v8": "3.2.4", "as-json": "^1.0.2", "assemblyscript": "^0.27.36", "copy-webpack-plugin": "^13.0.0", "empty-module": "^0.0.2", "eslint": "^9.18.0", "eslint-plugin-react": "^7.37.3", "globals": "^15.14.0", "nodemon": "^3.1.10", "null-loader": "^4.0.1", "tsx": "^4.20.3", "typescript-eslint": "^8.19.1", "vitest": "^3.2.4" }, "optionalDependencies": { "ngrok": "^4.3.3" }, "main": "eslint.config.js", "keywords": [], "author": "", "license": "ISC", "description": "", "overrides": { "protobufjs": "^7.5.8", "@protobufjs/utf8": ">=1.1.1", "fast-uri": ">=3.1.2", "fast-xml-parser": ">=5.7.0", "fast-xml-builder": ">=1.1.7", "basic-ftp": ">=5.3.1", "picomatch": ">=2.3.2", "dompurify": ">=3.4.0", "follow-redirects": ">=1.16.0", "ip-address": ">=10.1.1", "vite": ">=6.4.2", "path-to-regexp@0.1": "0.1.12", "brace-expansion": ">=1.1.13" } }