diff --git a/frontend/AGENTS.md b/frontend/AGENTS.md index 618d2158..0aad01bf 100644 --- a/frontend/AGENTS.md +++ b/frontend/AGENTS.md @@ -76,6 +76,12 @@ src/ - **MagicUI** - Magic UI components - **React Bits** - React bits components +### Interaction Ownership + +- `src/app/workspace/chats/[thread_id]/page.tsx` owns composer busy-state wiring. +- `src/core/threads/hooks.ts` owns pre-submit upload state and thread submission. +- `src/hooks/usePoseStream.ts` is a passive store selector; global WebSocket lifecycle stays in `App.tsx`. + ## Resources - [LangGraph Documentation](https://langchain-ai.github.io/langgraph/) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 941945fd..9f37b4ec 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,22 +1,49 @@ -# Frontend Development Dockerfile -FROM node:22-alpine +# Frontend Dockerfile +# Supports two targets: +# --target dev — install deps only, run `pnpm dev` at container start +# --target prod — full build baked in, run `pnpm start` at container start (default if no --target is specified) -# Accept build argument for pnpm store path ARG PNPM_STORE_PATH=/root/.local/share/pnpm/store -# Install pnpm at specific version (matching package.json) -RUN corepack enable && corepack install -g pnpm@10.26.2 - +# ── Base: shared setup ──────────────────────────────────────────────────────── +FROM node:22-alpine AS base +ARG PNPM_STORE_PATH +ARG NPM_REGISTRY +# Configure corepack registry before installing pnpm so the download itself +# succeeds in restricted networks (COREPACK_NPM_REGISTRY controls where +# corepack fetches package managers from). +RUN if [ -n "${NPM_REGISTRY}" ]; then \ + export COREPACK_NPM_REGISTRY="${NPM_REGISTRY}"; \ + fi && \ + corepack enable && corepack install -g pnpm@10.26.2 RUN pnpm config set store-dir ${PNPM_STORE_PATH} - -# Set working directory +# Optionally override npm registry for restricted networks (e.g. NPM_REGISTRY=https://registry.npmmirror.com) +RUN if [ -n "${NPM_REGISTRY}" ]; then pnpm config set registry "${NPM_REGISTRY}"; fi WORKDIR /app - -# Copy frontend source code COPY frontend ./frontend -# Install dependencies -RUN sh -c "cd /app/frontend && pnpm install --frozen-lockfile" - -# Expose Next.js dev server port +# ── Dev: install only, CMD is overridden by docker-compose ─────────────────── +FROM base AS dev +RUN cd /app/frontend && pnpm install --frozen-lockfile EXPOSE 3000 + +# ── Builder: install + compile Next.js ─────────────────────────────────────── +FROM base AS builder +RUN cd /app/frontend && pnpm install --frozen-lockfile +# Skip env validation — runtime vars are injected by nginx/container +RUN cd /app/frontend && SKIP_ENV_VALIDATION=1 pnpm build + +# ── Prod: minimal runtime with pre-built output ─────────────────────────────── +FROM node:22-alpine AS prod +ARG PNPM_STORE_PATH +ARG NPM_REGISTRY +RUN if [ -n "${NPM_REGISTRY}" ]; then \ + export COREPACK_NPM_REGISTRY="${NPM_REGISTRY}"; \ + fi && \ + corepack enable && corepack install -g pnpm@10.26.2 +RUN pnpm config set store-dir ${PNPM_STORE_PATH} +RUN if [ -n "${NPM_REGISTRY}" ]; then pnpm config set registry "${NPM_REGISTRY}"; fi +WORKDIR /app +COPY --from=builder /app/frontend ./frontend +EXPOSE 3000 +CMD ["sh", "-c", "cd /app/frontend && pnpm start"]