bea7e2be90
## Summary Run-graph data (runs, batches, waitpoints, and their related tables) can now live in a database separate from the control plane, with every read and write routed to the correct database by each run's residency. This makes reading and writing run data more reliable once the two are split, and is a no-op for single-database installs. ## Design - Run-graph table access goes through the run-store router, which selects the legacy or the new run-ops store per run instead of assuming one shared client. - The legacy run-ops client is now independently pointable, so legacy run data can be served from its own database (and replica) rather than the control-plane connection. - Run-graph writes go straight to the run-graph database instead of being forwarded through the control plane, and replication targets are split so runs in the new database still replicate to analytics without under-counting. - Read-through slots refuse the control-plane client, so a missing residency fails loudly instead of silently reading the wrong database. - Migration `20260710120000_drop_remaining_run_graph_seam_foreign_keys` drops the foreign keys that still crossed the run-graph / control-plane seam, which is what lets the two live in separate databases. The split stays off unless explicitly enabled and the two databases are confirmed physically distinct; startup fails closed otherwise. Verified by running the full dashboard end-to-end suite against both a single-database configuration and a three-database configuration (control plane, the new database, and a physically separate legacy database), with runs on both residencies. No misrouted reads in either configuration.
266 lines
9.5 KiB
JSON
266 lines
9.5 KiB
JSON
{
|
|
"private": true,
|
|
"name": "webapp",
|
|
"version": "1.0.0",
|
|
"sideEffects": false,
|
|
"scripts": {
|
|
"build": "run-s build:** && pnpm run upload:sourcemaps",
|
|
"build:remix": "remix build --sourcemap",
|
|
"build:server": "esbuild --platform=node --format=cjs ./server.ts --outdir=build --sourcemap",
|
|
"build:otlpworker": "esbuild --platform=node --format=cjs --bundle ./app/v3/otlpTransformWorker.ts --outfile=build/otlpTransformWorker.cjs --sourcemap",
|
|
"build:sentry": "esbuild --platform=node --format=cjs --outbase=. ./sentry.server.ts ./app/utils/sentryTraceContext.server.ts --outdir=build --sourcemap",
|
|
"dev": "cross-env PORT=3030 remix dev -c \"node ./build/server.js\"",
|
|
"dev:worker": "cross-env NODE_PATH=../../node_modules/.pnpm/node_modules node ./build/server.js",
|
|
"format": "oxfmt .",
|
|
"lint": "oxlint -c ../../.oxlintrc.json",
|
|
"start": "cross-env NODE_ENV=production node --max-old-space-size=8192 ./build/server.js",
|
|
"start:local": "cross-env node --max-old-space-size=8192 ./build/server.js",
|
|
"typecheck": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" tsc --noEmit -p ./tsconfig.check.json",
|
|
"guard:runops-legacy": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" tsx ./scripts/runOpsLegacyGuard.ts",
|
|
"db:seed": "tsx seed.ts",
|
|
"db:seed:ai-spans": "tsx seed-ai-spans.mts",
|
|
"upload:sourcemaps": "bash ./upload-sourcemaps.sh",
|
|
"test": "vitest --no-file-parallelism",
|
|
"eval:dev": "evalite watch"
|
|
},
|
|
"dependencies": {
|
|
"@ai-sdk/anthropic": "^3.0.0",
|
|
"@ai-sdk/openai": "^3.0.0",
|
|
"@ai-sdk/react": "^3.0.0",
|
|
"@ariakit/react": "^0.4.6",
|
|
"@ariakit/react-core": "^0.4.6",
|
|
"@aws-sdk/client-ecr": "^3.931.0",
|
|
"@aws-sdk/client-s3": "^3.936.0",
|
|
"@aws-sdk/client-sts": "^3.840.0",
|
|
"@aws-sdk/s3-presigned-post": "^3.936.0",
|
|
"@aws-sdk/s3-request-presigner": "^3.936.0",
|
|
"@better-auth/utils": "^0.2.6",
|
|
"@codemirror/autocomplete": "6.4.0",
|
|
"@codemirror/commands": "6.1.3",
|
|
"@codemirror/lang-json": "6.0.1",
|
|
"@codemirror/lang-sql": "6.5.5",
|
|
"@codemirror/language": "6.3.2",
|
|
"@codemirror/lint": "6.4.2",
|
|
"@codemirror/search": "6.2.3",
|
|
"@codemirror/state": "6.2.0",
|
|
"@codemirror/view": "6.7.2",
|
|
"@conform-to/react": "^1.2.2",
|
|
"@conform-to/zod": "^1.2.2",
|
|
"@depot/cli": "0.0.1-cli.2.80.0",
|
|
"@depot/sdk-node": "^1.0.0",
|
|
"@headlessui/react": "^1.7.8",
|
|
"@heroicons/react": "^2.0.12",
|
|
"@internal/cache": "workspace:*",
|
|
"@internal/compute": "workspace:*",
|
|
"@internal/dashboard-agent": "workspace:*",
|
|
"@internal/dashboard-agent-db": "workspace:*",
|
|
"@internal/llm-model-catalog": "workspace:*",
|
|
"@internal/redis": "workspace:*",
|
|
"@internal/run-engine": "workspace:*",
|
|
"@internal/run-ops-database": "workspace:*",
|
|
"@internal/run-store": "workspace:*",
|
|
"@internal/schedule-engine": "workspace:*",
|
|
"@internal/tracing": "workspace:*",
|
|
"@internal/tsql": "workspace:*",
|
|
"@internationalized/date": "^3.5.1",
|
|
"@jsonhero/schema-infer": "^0.1.5",
|
|
"@kapaai/react-sdk": "^0.1.3",
|
|
"@lezer/highlight": "^1.1.6",
|
|
"@opentelemetry/api": "1.9.1",
|
|
"@opentelemetry/api-logs": "0.218.0",
|
|
"@opentelemetry/core": "2.7.1",
|
|
"@opentelemetry/exporter-logs-otlp-http": "0.218.0",
|
|
"@opentelemetry/exporter-metrics-otlp-proto": "0.218.0",
|
|
"@opentelemetry/exporter-trace-otlp-http": "0.218.0",
|
|
"@opentelemetry/host-metrics": "^0.38.3",
|
|
"@opentelemetry/instrumentation": "0.218.0",
|
|
"@opentelemetry/instrumentation-aws-sdk": "^0.69.0",
|
|
"@opentelemetry/instrumentation-express": "^0.62.0",
|
|
"@opentelemetry/instrumentation-http": "0.218.0",
|
|
"@opentelemetry/resource-detector-aws": "^2.14.0",
|
|
"@opentelemetry/resources": "2.7.1",
|
|
"@opentelemetry/sdk-logs": "0.218.0",
|
|
"@opentelemetry/sdk-metrics": "2.7.1",
|
|
"@opentelemetry/sdk-trace-base": "2.7.1",
|
|
"@opentelemetry/sdk-trace-node": "2.7.1",
|
|
"@opentelemetry/semantic-conventions": "1.41.1",
|
|
"@popperjs/core": "^2.11.8",
|
|
"@prisma/instrumentation": "^6.14.0",
|
|
"@radix-ui/react-accordion": "^1.2.11",
|
|
"@radix-ui/react-alert-dialog": "^1.0.4",
|
|
"@radix-ui/react-dialog": "^1.0.3",
|
|
"@radix-ui/react-popover": "^1.0.5",
|
|
"@radix-ui/react-radio-group": "^1.1.3",
|
|
"@radix-ui/react-slider": "^1.1.2",
|
|
"@radix-ui/react-switch": "^1.0.3",
|
|
"@radix-ui/react-tabs": "^1.0.3",
|
|
"@radix-ui/react-tooltip": "^1.0.5",
|
|
"@react-aria/datepicker": "^3.9.1",
|
|
"@react-stately/datepicker": "^3.9.1",
|
|
"@react-types/datepicker": "^3.7.1",
|
|
"@remix-run/express": "2.17.5",
|
|
"@remix-run/node": "2.17.5",
|
|
"@remix-run/react": "2.17.5",
|
|
"@remix-run/router": "^1.23.3",
|
|
"@remix-run/server-runtime": "2.17.5",
|
|
"@s2-dev/streamstore": "^0.22.10",
|
|
"@sentry/remix": "9.46.0",
|
|
"@slack/web-api": "7.16.0",
|
|
"@socket.io/redis-adapter": "^8.3.0",
|
|
"@streamdown/code": "^1.1.1",
|
|
"@tabler/icons-react": "^3.36.1",
|
|
"@tanstack/match-sorter-utils": "^8.19.4",
|
|
"@tanstack/react-table": "^8.21.3",
|
|
"@tanstack/react-virtual": "^3.0.4",
|
|
"@team-plain/typescript-sdk": "^3.5.0",
|
|
"@trigger.dev/companyicons": "^1.5.35",
|
|
"@trigger.dev/core": "workspace:*",
|
|
"@trigger.dev/database": "workspace:*",
|
|
"@trigger.dev/otlp-importer": "workspace:*",
|
|
"@trigger.dev/platform": "1.2.0",
|
|
"@trigger.dev/plugins": "workspace:*",
|
|
"@trigger.dev/rbac": "workspace:*",
|
|
"@trigger.dev/redis-worker": "workspace:*",
|
|
"@trigger.dev/sdk": "workspace:*",
|
|
"@trigger.dev/sso": "workspace:*",
|
|
"@uiw/react-codemirror": "^4.19.5",
|
|
"@unkey/cache": "^1.5.0",
|
|
"@unkey/error": "^0.2.0",
|
|
"@upstash/ratelimit": "^1.1.3",
|
|
"@vercel/sdk": "^1.19.1",
|
|
"@window-splitter/react": "1.1.3",
|
|
"ai": "^6.0.116",
|
|
"assert-never": "^1.2.1",
|
|
"aws4fetch": "^1.0.18",
|
|
"class-variance-authority": "^0.5.2",
|
|
"clsx": "^1.2.1",
|
|
"compression": "^1.7.4",
|
|
"cookie": "^0.6.0",
|
|
"cron-parser": "^4.9.0",
|
|
"cronstrue": "^2.21.0",
|
|
"cross-env": "^7.0.3",
|
|
"cuid": "^2.1.8",
|
|
"date-fns": "^4.1.0",
|
|
"dompurify": "^3.4.1",
|
|
"dotenv": "^16.4.5",
|
|
"effect": "^3.21.2",
|
|
"emails": "workspace:*",
|
|
"evt": "^2.4.13",
|
|
"express": "4.20.0",
|
|
"framer-motion": "^10.12.11",
|
|
"input-otp": "^1.4.2",
|
|
"intl-parse-accept-language": "^1.0.0",
|
|
"ioredis": "~5.6.0",
|
|
"isbot": "^3.6.5",
|
|
"jose": "^5.4.0",
|
|
"json-stable-stringify": "^1.3.0",
|
|
"lucide-react": "^0.229.0",
|
|
"marked": "^4.0.18",
|
|
"match-sorter": "^6.3.4",
|
|
"morgan": "^1.10.0",
|
|
"nanoid": "3.3.8",
|
|
"neverthrow": "^8.2.0",
|
|
"non.geist": "^1.0.2",
|
|
"octokit": "^3.2.1",
|
|
"openai": "^4.33.1",
|
|
"p-limit": "^6.2.0",
|
|
"p-map": "^6.0.0",
|
|
"p-retry": "^4.6.1",
|
|
"parse-duration": "^2.1.0",
|
|
"posthog-js": "^1.93.3",
|
|
"posthog-node": "5.35.6",
|
|
"prism-react-renderer": "^2.3.1",
|
|
"prismjs": "^1.30.0",
|
|
"prom-client": "^15.1.0",
|
|
"qrcode.react": "^4.2.0",
|
|
"random-words": "^2.0.0",
|
|
"react": "^18.2.0",
|
|
"react-day-picker": "^9.13.0",
|
|
"react-dom": "^18.2.0",
|
|
"react-grid-layout": "^2.2.2",
|
|
"react-hotkeys-hook": "^4.4.1",
|
|
"react-markdown": "^10.1.0",
|
|
"react-popper": "^2.3.0",
|
|
"react-resizable": "^3.1.3",
|
|
"react-use": "17.5.1",
|
|
"recharts": "^2.15.2",
|
|
"regression": "^2.0.1",
|
|
"remix-auth": "^3.6.0",
|
|
"remix-auth-email-link": "2.0.2",
|
|
"remix-auth-github": "^1.6.0",
|
|
"remix-auth-google": "^2.0.0",
|
|
"remix-typedjson": "0.3.1",
|
|
"remix-utils": "^7.7.0",
|
|
"simplur": "^3.0.1",
|
|
"slug": "^6.0.0",
|
|
"socket.io": "4.7.4",
|
|
"socket.io-adapter": "^2.5.4",
|
|
"sonner": "^1.0.3",
|
|
"sql-formatter": "^15.4.10",
|
|
"streamdown": "^2.5.0",
|
|
"superjson": "^2.2.1",
|
|
"tailwind-merge": "^3.6.0",
|
|
"tailwind-scrollbar-hide": "^4.0.0",
|
|
"tw-animate-css": "^1.4.0",
|
|
"tiny-invariant": "^1.2.0",
|
|
"uuid": "^14.0.0",
|
|
"ws": "^8.11.0",
|
|
"zod": "3.25.76",
|
|
"zod-error": "1.5.0",
|
|
"zod-validation-error": "^1.5.0"
|
|
},
|
|
"devDependencies": {
|
|
"@internal/clickhouse": "workspace:*",
|
|
"@internal/replication": "workspace:*",
|
|
"@internal/testcontainers": "workspace:*",
|
|
"@remix-run/dev": "2.17.5",
|
|
"@remix-run/testing": "^2.17.5",
|
|
"@sentry/cli": "2.50.2",
|
|
"@swc/core": "^1.3.4",
|
|
"@swc/helpers": "^0.4.11",
|
|
"@tailwindcss/forms": "^0.5.11",
|
|
"@tailwindcss/postcss": "^4.3.1",
|
|
"@tailwindcss/typography": "^0.5.20",
|
|
"@testcontainers/postgresql": "^11.14.0",
|
|
"@total-typescript/ts-reset": "^0.4.2",
|
|
"@types/bcryptjs": "^2.4.2",
|
|
"@types/compression": "^1.7.2",
|
|
"@types/cookie": "^0.6.0",
|
|
"@types/express": "^4.17.13",
|
|
"@types/json-query": "^2.2.3",
|
|
"@types/marked": "^4.0.3",
|
|
"@types/morgan": "^1.9.3",
|
|
"@types/node-fetch": "^2.6.2",
|
|
"@types/prismjs": "^1.26.0",
|
|
"@types/qs": "^6.9.7",
|
|
"@types/react": "18.2.69",
|
|
"@types/react-dom": "18.2.7",
|
|
"@types/regression": "^2.0.6",
|
|
"@types/slug": "^5.0.3",
|
|
"@types/supertest": "^6.0.2",
|
|
"@types/tar": "^6.1.4",
|
|
"@types/ws": "^8.5.3",
|
|
"autoevals": "^0.0.130",
|
|
"css-loader": "^6.10.0",
|
|
"datepicker": "link:@types/@react-aria/datepicker",
|
|
"engine.io": "^6.5.4",
|
|
"esbuild": "^0.15.10",
|
|
"evalite": "1.0.0-beta.16",
|
|
"npm-run-all": "^4.1.5",
|
|
"postcss-import": "^16.0.1",
|
|
"postcss-loader": "^8.1.1",
|
|
"prop-types": "^15.8.1",
|
|
"rimraf": "^6.0.1",
|
|
"style-loader": "^3.3.4",
|
|
"supertest": "^7.0.0",
|
|
"tailwind-scrollbar": "^4.0.2",
|
|
"tailwindcss": "^4.3.1",
|
|
"tsconfig-paths": "^3.14.1",
|
|
"tsx": "^4.20.6",
|
|
"vite-tsconfig-paths": "^4.0.5"
|
|
},
|
|
"engines": {
|
|
"node": ">=18.19.0 || >=20.6.0"
|
|
}
|
|
}
|