diff --git a/.docker/Dockerfile.roomote-api b/.docker/Dockerfile.roomote-api index 6566096a71..935b7675de 100644 --- a/.docker/Dockerfile.roomote-api +++ b/.docker/Dockerfile.roomote-api @@ -1,27 +1,27 @@ -# docker compose build base api +# docker compose build roomote-api -FROM roomote-base AS base +FROM roo-code-cloud-base AS base WORKDIR /roo -COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json ./ COPY packages/config-eslint/package.json ./packages/config-eslint/ COPY packages/config-typescript/package.json ./packages/config-typescript/ -COPY packages/types/package.json ./packages/types/ +COPY packages/db/package.json ./packages/db/ COPY packages/ipc/package.json ./packages/ipc/ COPY apps/roomote/package.json ./apps/roomote/ -COPY scripts/bootstrap.mjs ./scripts/ RUN pnpm install -COPY apps/roomote ./apps/roomote/ COPY packages/config-eslint ./packages/config-eslint/ COPY packages/config-typescript ./packages/config-typescript/ -COPY packages/types ./packages/types/ +COPY packages/db ./packages/db/ COPY packages/ipc ./packages/ipc/ +COPY apps/roomote ./apps/roomote/ WORKDIR /roo/apps/roomote -RUN pnpm build +RUN node_modules/.bin/next build + ENV NODE_ENV=production EXPOSE 3001 -CMD ["pnpm", "start"] +CMD ["node_modules/.bin/next", "start", "--port", "3001"] diff --git a/.docker/Dockerfile.roomote-controller b/.docker/Dockerfile.roomote-controller index a2a2e00203..1ab88e9598 100644 --- a/.docker/Dockerfile.roomote-controller +++ b/.docker/Dockerfile.roomote-controller @@ -1,24 +1,23 @@ -# docker compose build base controller +# docker compose build roomote-controller -FROM roomote-base AS base +FROM roo-code-cloud-base AS base WORKDIR /roo COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY packages/config-eslint/package.json ./packages/config-eslint/ COPY packages/config-typescript/package.json ./packages/config-typescript/ -COPY packages/types/package.json ./packages/types/ +COPY packages/db/package.json ./packages/db/ COPY packages/ipc/package.json ./packages/ipc/ COPY apps/roomote/package.json ./apps/roomote/ -COPY scripts/bootstrap.mjs ./scripts/ RUN pnpm install -COPY apps/roomote ./apps/roomote/ COPY packages/config-eslint ./packages/config-eslint/ COPY packages/config-typescript ./packages/config-typescript/ -COPY packages/types ./packages/types/ +COPY packages/db ./packages/db/ COPY packages/ipc ./packages/ipc/ +COPY apps/roomote ./apps/roomote/ WORKDIR /roo/apps/roomote ENV NODE_ENV=production diff --git a/.docker/Dockerfile.roomote-dashboard b/.docker/Dockerfile.roomote-dashboard index df1b9af90a..3e5a95fa0c 100644 --- a/.docker/Dockerfile.roomote-dashboard +++ b/.docker/Dockerfile.roomote-dashboard @@ -1,23 +1,21 @@ -# docker compose build base roomote-dashboard +# docker compose build roomote-dashboard -FROM roomote-base AS base +FROM roo-code-cloud-base AS base WORKDIR /roo COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY packages/config-eslint/package.json ./packages/config-eslint/ COPY packages/config-typescript/package.json ./packages/config-typescript/ -COPY packages/types/package.json ./packages/types/ -COPY packages/ipc/package.json ./packages/ipc/ -COPY apps/roomote/package.json ./apps/roomote/ +COPY apps/roomote-dashboard/package.json ./apps/roomote-dashboard/ -COPY scripts/bootstrap.mjs ./scripts/ RUN pnpm install -COPY apps/roomote-dashboard ./apps/roomote-dashboard/ COPY packages/config-eslint ./packages/config-eslint/ COPY packages/config-typescript ./packages/config-typescript/ +COPY apps/roomote-dashboard ./apps/roomote-dashboard/ WORKDIR /roo/apps/roomote-dashboard + EXPOSE 3002 CMD ["pnpm", "dev"] diff --git a/.docker/Dockerfile.roomote-worker b/.docker/Dockerfile.roomote-worker index b1a21c8a62..92bc21c523 100644 --- a/.docker/Dockerfile.roomote-worker +++ b/.docker/Dockerfile.roomote-worker @@ -1,7 +1,7 @@ -# docker compose build worker +# docker compose build roomote-worker # Note: Requires $GH_TOKEN to be set as build argument. -FROM roomote-base AS base +FROM roo-code-cloud-base AS base # Install additional worker-specific packages RUN apt update && \ @@ -44,18 +44,17 @@ WORKDIR /roo COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ COPY packages/config-eslint/package.json ./packages/config-eslint/ COPY packages/config-typescript/package.json ./packages/config-typescript/ -COPY packages/types/package.json ./packages/types/ +COPY packages/db/package.json ./packages/db/ COPY packages/ipc/package.json ./packages/ipc/ COPY apps/roomote/package.json ./apps/roomote/ -COPY scripts/bootstrap.mjs ./scripts/ RUN pnpm install -COPY apps/roomote ./apps/roomote/ COPY packages/config-eslint ./packages/config-eslint/ COPY packages/config-typescript ./packages/config-typescript/ -COPY packages/types ./packages/types/ +COPY packages/db ./packages/db/ COPY packages/ipc ./packages/ipc/ +COPY apps/roomote ./apps/roomote/ WORKDIR /roo/apps/roomote ENV NODE_ENV=production diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..a88b19ea61 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,30 @@ +# git +.git + +# build artifacts +bin/ +dist/ +**/dist/ +out/ +**/out/ + +# dependencies +node_modules/ +**/node_modules/ + +# testing +coverage/ +**/.vscode-test/ +**/mock/ + +# devtools +knip.json +.husky/ + +# monorepo +.turbo/ +**/.turbo/ + +# next.js +**/.next/ +.vercel diff --git a/apps/roomote/.env.example b/apps/roomote/.env.example index 0e1eb3ae79..8f086cc85d 100644 --- a/apps/roomote/.env.example +++ b/apps/roomote/.env.example @@ -1,5 +1,5 @@ -DATABASE_URL=postgresql://postgres:password@localhost:5433/cloud_agents -REDIS_URL=redis://localhost:6380 +DATABASE_URL=postgres://postgres:password@postgres:5432/development +REDIS_URL=redis://localhost:6379 GH_WEBHOOK_SECRET=your-webhook-secret-here GH_TOKEN=your-token-here diff --git a/apps/roomote/package.json b/apps/roomote/package.json index 0fff5ac1c1..78e917c145 100644 --- a/apps/roomote/package.json +++ b/apps/roomote/package.json @@ -7,7 +7,6 @@ "check-types": "tsc --noEmit", "test": "vitest", "dev": "next dev --port 3001", - "tunnel": "ngrok http 3001 --domain cte.ngrok.dev", "build": "next build", "start": "next start --port 3001", "clean": "rimraf .next .turbo", diff --git a/apps/roomote/scripts/build.sh b/apps/roomote/scripts/build.sh deleted file mode 100755 index 1bc54d1e26..0000000000 --- a/apps/roomote/scripts/build.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# Build script for roomote services. -# This ensures the base image is built before dependent services. - -set -e - -build_service() { - local service=$1 - - case $service in - "dashboard"|"api"|"worker"|"controller") - echo "Building base image first..." - docker compose build base - echo "Building $service..." - docker compose build $service - ;; - "base") - echo "Building base image..." - docker compose build base - ;; - *) - echo "Building $service..." - docker compose build $service - ;; - esac -} - -if [ $# -eq 0 ]; then - echo "Usage: $0 " - echo "Available services: base, dashboard, api, worker, controller, db, redis" - echo "Example: $0 dashboard" - exit 1 -fi - -build_service $1 - -echo "Build completed successfully!" diff --git a/apps/roomote/src/app/api/jobs/[id]/route.ts b/apps/roomote/src/app/api/jobs/[id]/route.ts index 153c0cfa1e..88bd686829 100644 --- a/apps/roomote/src/app/api/jobs/[id]/route.ts +++ b/apps/roomote/src/app/api/jobs/[id]/route.ts @@ -6,7 +6,7 @@ import { db, cloudJobs } from '@roo-code-cloud/db/server'; type Params = Promise<{ id: string }>; export async function GET( - request856rf8pu9: NextRequest, + _request: NextRequest, { params }: { params: Params }, ) { try { diff --git a/apps/roomote/src/lib/worker.ts b/apps/roomote/src/lib/worker.ts index b61573a960..2cd2019a4b 100644 --- a/apps/roomote/src/lib/worker.ts +++ b/apps/roomote/src/lib/worker.ts @@ -12,7 +12,7 @@ import { processJob } from './job'; // --network roo-code-cloud_default \ // -e HOST_EXECUTION_METHOD=docker \ // -e GH_TOKEN=$GH_TOKEN \ -// -e DATABASE_URL=postgresql://postgres:password@db:5432/cloud_agents \ +// -e DATABASE_URL=postgres://postgres:password@postgres:5432/development \ // -e REDIS_URL=redis://redis:6379 \ // -e NODE_ENV=production \ // -v /var/run/docker.sock:/var/run/docker.sock \ diff --git a/docker-compose.yml b/docker-compose.yml index 6c6d719f65..78643c30ed 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,7 +3,7 @@ name: roo-code-cloud services: base: build: - context: ../../ + context: . dockerfile: .docker/Dockerfile.base image: roo-code-cloud-base @@ -55,7 +55,7 @@ services: container_name: roo-code-cloud-redis image: redis:7-alpine ports: - - "6380:6379" + - "6379:6379" volumes: - ./.docker/data/redis:/data command: redis-server --appendonly yes @@ -63,8 +63,8 @@ services: roomote-dashboard: container_name: roo-code-cloud-roomote-dashboard build: - context: ../../ - dockerfile: .docker/Dockerfile.dashboard + context: . + dockerfile: .docker/Dockerfile.roomote-dashboard image: roo-code-cloud-roomote-dashboard ports: - "3002:3002" @@ -78,13 +78,13 @@ services: roomote-api: container_name: roo-code-cloud-roomote-api build: - context: ../../ - dockerfile: .docker/Dockerfile.api + context: . + dockerfile: .docker/Dockerfile.roomote-api image: roo-code-cloud-roomote-api ports: - "3001:3001" environment: - - DATABASE_URL=postgresql://postgres:password@db:5432/cloud_agents + - DATABASE_URL=postgres://postgres:password@postgres:5432/development - REDIS_URL=redis://redis:6379 - NODE_ENV=production volumes: @@ -98,8 +98,8 @@ services: roomote-controller: container_name: roo-code-cloud-roomote-controller build: - context: ../../ - dockerfile: .docker/Dockerfile.controller + context: . + dockerfile: .docker/Dockerfile.roomote-controller args: - GH_TOKEN=${GH_TOKEN} image: roo-code-cloud-roomote-controller @@ -107,7 +107,7 @@ services: - .env environment: - HOST_EXECUTION_METHOD=docker - - DATABASE_URL=postgresql://postgres:password@db:5432/cloud_agents + - DATABASE_URL=postgres://postgres:password@postgres:5432/development - REDIS_URL=redis://redis:6379 - NODE_ENV=production volumes: @@ -122,8 +122,8 @@ services: roomote-worker: build: - context: ../../ - dockerfile: .docker/Dockerfile.worker + context: . + dockerfile: .docker/Dockerfile.roomote-worker args: - GH_TOKEN=${GH_TOKEN} image: roomote-worker diff --git a/package.json b/package.json index d94dd0e206..c7caa2191a 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,6 @@ { "name": "roo-code-cloud", "packageManager": "pnpm@10.12.1", - "engines": { - "node": "20.19.2" - }, "scripts": { "prepare": "husky", "lint": "turbo lint --log-order grouped --output-logs new-only", @@ -11,13 +8,15 @@ "test": "turbo test --log-order grouped --output-logs new-only", "build": "turbo build --log-order grouped --output-logs new-only", "clean": "turbo clean --log-order grouped --output-logs new-only && rimraf .turbo", - "services:up": "docker compose up postgres clickhouse redis roomote-dashboard -d --wait && pnpm db:push", - "services:down": "docker compose down postgres clickhouse redis roomote-dashboard", "db:up": "docker compose up postgres clickhouse -d --wait && pnpm --filter @roo-code-cloud/db db:migrate && pnpm --filter @roo-code-cloud/db db:test:push --force", "db:down": "docker compose down postgres clickhouse", "db:generate": "pnpm --filter @roo-code-cloud/db db:generate", "db:migrate": "pnpm --filter @roo-code-cloud/db db:migrate", - "db:reset": "pnpm db:down && rimraf .docker/data .docker/logs && pnpm db:up" + "db:reset": "pnpm db:down && rimraf .docker/data .docker/logs && pnpm db:up", + "services:build": "docker compose build base && docker compose build roomote-api roomote-dashboard roomote-controller roomote-worker", + "services:up": "docker compose up redis roomote-dashboard roomote-api -d --wait", + "services:down": "docker compose down redis roomote-dashboard roomote-api", + "tunnel": "ngrok http 3001 --domain cte.ngrok.dev" }, "devDependencies": { "@dotenvx/dotenvx": "^1.44.2", diff --git a/packages/db/src/schema.ts b/packages/db/src/schema.ts index 1ed2ab47e4..aa53e000c8 100644 --- a/packages/db/src/schema.ts +++ b/packages/db/src/schema.ts @@ -294,12 +294,12 @@ export const agentRequestLogsRelations = relations( */ export const cloudJobs = pgTable('cloud_jobs', { - id: integer().primaryKey().generatedAlwaysAsIdentity(), - type: text().notNull().$type(), - status: text().notNull().default('pending').$type(), - payload: jsonb().notNull().$type(), - result: jsonb(), - error: text(), + id: integer('id').primaryKey().generatedAlwaysAsIdentity(), + type: text('type').notNull().$type(), + status: text('status').notNull().default('pending').$type(), + payload: jsonb('payload').notNull().$type(), + result: jsonb('result'), + error: text('error'), slackThreadTs: text('slack_thread_ts'), startedAt: timestamp('started_at'), completedAt: timestamp('completed_at'), diff --git a/packages/db/src/server.ts b/packages/db/src/server.ts index a7ce9554ed..b08bfea94f 100644 --- a/packages/db/src/server.ts +++ b/packages/db/src/server.ts @@ -2,6 +2,27 @@ export * from './index'; -export * from './db'; -export * from './schema'; +export { db, disconnect, type DatabaseOrTransaction } from './db'; + +export { + users, + userRelations, + orgs, + orgsRelations, + orgSettings, + orgSettingsRelations, + auditLogs, + auditLogsRelations, + taskShares, + taskSharesRelations, + agents, + agentsRelations, + agentRequestLogs, + agentRequestLogsRelations, + cloudJobs, + type CloudJob, + type InsertCloudJob, + type UpdateCloudJob, +} from './schema'; + export * from './queries'; diff --git a/apps/roomote/scripts/enqueue-github-issue-job.sh b/scripts/enqueue-github-issue-job.sh similarity index 100% rename from apps/roomote/scripts/enqueue-github-issue-job.sh rename to scripts/enqueue-github-issue-job.sh