From 8aab9e346da0e55f088151204485b546235be8a7 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Fri, 30 Jan 2026 00:07:23 -0800 Subject: [PATCH] feat: include inspector UI in release binaries (#34) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - Add Node.js build stage to all release Dockerfiles to build the inspector frontend - Copy pre-built inspector assets into Rust build stages so they get embedded in binaries - Remove `SANDBOX_AGENT_SKIP_INSPECTOR=1` from all Dockerfiles and the release workflow ## Test plan - [ ] Build linux-x86_64 locally: `docker/release/build.sh x86_64-unknown-linux-musl` - [ ] Run the binary and verify inspector is embedded (should show "inspector ui available") - [ ] Access the inspector UI at http://localhost:2468/ui/ 🤖 Generated with [Claude Code](https://claude.ai/code) --- .github/workflows/release.yaml | 2 -- docker/release/linux-x86_64.Dockerfile | 31 +++++++++++++++++++-- docker/release/macos-aarch64.Dockerfile | 31 +++++++++++++++++++-- docker/release/macos-x86_64.Dockerfile | 31 +++++++++++++++++++-- docker/release/windows.Dockerfile | 31 +++++++++++++++++++-- docker/runtime/Dockerfile | 36 +++++++++++++++++++++++-- 6 files changed, 150 insertions(+), 12 deletions(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 497c667..0ab3ac5 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -25,8 +25,6 @@ defaults: env: # Disable incremental compilation for faster from-scratch builds CARGO_INCREMENTAL: 0 - # Skip inspector frontend for CI (not needed for type checking) - SANDBOX_AGENT_SKIP_INSPECTOR: 1 # Skip OpenAPI generation in CI (use pre-committed docs/openapi.json) SKIP_OPENAPI_GEN: 1 diff --git a/docker/release/linux-x86_64.Dockerfile b/docker/release/linux-x86_64.Dockerfile index 8fb9807..f838b93 100644 --- a/docker/release/linux-x86_64.Dockerfile +++ b/docker/release/linux-x86_64.Dockerfile @@ -1,4 +1,29 @@ # syntax=docker/dockerfile:1.10.0 + +# Build inspector frontend +FROM node:22-alpine AS inspector-build +WORKDIR /app +RUN npm install -g pnpm + +# Copy package files for workspaces +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY frontend/packages/inspector/package.json ./frontend/packages/inspector/ +COPY sdks/typescript/package.json ./sdks/typescript/ + +# Install dependencies +RUN pnpm install --filter @anthropic-ai/sdk-inspector... + +# Copy SDK source (with pre-generated types from docs/openapi.json) +COPY docs/openapi.json ./docs/ +COPY sdks/typescript ./sdks/typescript + +# Build SDK (just tsup, skip generate since types are pre-generated) +RUN cd sdks/typescript && SKIP_OPENAPI_GEN=1 pnpm exec tsup + +# Copy inspector source and build +COPY frontend/packages/inspector ./frontend/packages/inspector +RUN cd frontend/packages/inspector && pnpm exec vite build + FROM rust:1.88.0 AS base # Install dependencies @@ -61,12 +86,14 @@ ENV OPENSSL_DIR=/musl \ # Copy the source code COPY . . +# Copy pre-built inspector frontend +COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/packages/inspector/dist + # Build for Linux with musl (static binary) - x86_64 -# SANDBOX_AGENT_SKIP_INSPECTOR=1 skips embedding the inspector frontend RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo build -p sandbox-agent --release --target x86_64-unknown-linux-musl && \ + cargo build -p sandbox-agent --release --target x86_64-unknown-linux-musl && \ mkdir -p /artifacts && \ cp target/x86_64-unknown-linux-musl/release/sandbox-agent /artifacts/sandbox-agent-x86_64-unknown-linux-musl diff --git a/docker/release/macos-aarch64.Dockerfile b/docker/release/macos-aarch64.Dockerfile index fb2d75f..29e4b32 100644 --- a/docker/release/macos-aarch64.Dockerfile +++ b/docker/release/macos-aarch64.Dockerfile @@ -1,4 +1,29 @@ # syntax=docker/dockerfile:1.10.0 + +# Build inspector frontend +FROM node:22-alpine AS inspector-build +WORKDIR /app +RUN npm install -g pnpm + +# Copy package files for workspaces +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY frontend/packages/inspector/package.json ./frontend/packages/inspector/ +COPY sdks/typescript/package.json ./sdks/typescript/ + +# Install dependencies +RUN pnpm install --filter @anthropic-ai/sdk-inspector... + +# Copy SDK source (with pre-generated types from docs/openapi.json) +COPY docs/openapi.json ./docs/ +COPY sdks/typescript ./sdks/typescript + +# Build SDK (just tsup, skip generate since types are pre-generated) +RUN cd sdks/typescript && SKIP_OPENAPI_GEN=1 pnpm exec tsup + +# Copy inspector source and build +COPY frontend/packages/inspector ./frontend/packages/inspector +RUN cd frontend/packages/inspector && pnpm exec vite build + FROM rust:1.88.0 AS base # Install dependencies @@ -59,12 +84,14 @@ ar = "aarch64-apple-darwin20.4-ar"\n\ # Copy the source code COPY . . +# Copy pre-built inspector frontend +COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/packages/inspector/dist + # Build for ARM64 macOS -# SANDBOX_AGENT_SKIP_INSPECTOR=1 skips embedding the inspector frontend RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo build -p sandbox-agent --release --target aarch64-apple-darwin && \ + cargo build -p sandbox-agent --release --target aarch64-apple-darwin && \ mkdir -p /artifacts && \ cp target/aarch64-apple-darwin/release/sandbox-agent /artifacts/sandbox-agent-aarch64-apple-darwin diff --git a/docker/release/macos-x86_64.Dockerfile b/docker/release/macos-x86_64.Dockerfile index b16c6e6..5a33b15 100644 --- a/docker/release/macos-x86_64.Dockerfile +++ b/docker/release/macos-x86_64.Dockerfile @@ -1,4 +1,29 @@ # syntax=docker/dockerfile:1.10.0 + +# Build inspector frontend +FROM node:22-alpine AS inspector-build +WORKDIR /app +RUN npm install -g pnpm + +# Copy package files for workspaces +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY frontend/packages/inspector/package.json ./frontend/packages/inspector/ +COPY sdks/typescript/package.json ./sdks/typescript/ + +# Install dependencies +RUN pnpm install --filter @anthropic-ai/sdk-inspector... + +# Copy SDK source (with pre-generated types from docs/openapi.json) +COPY docs/openapi.json ./docs/ +COPY sdks/typescript ./sdks/typescript + +# Build SDK (just tsup, skip generate since types are pre-generated) +RUN cd sdks/typescript && SKIP_OPENAPI_GEN=1 pnpm exec tsup + +# Copy inspector source and build +COPY frontend/packages/inspector ./frontend/packages/inspector +RUN cd frontend/packages/inspector && pnpm exec vite build + FROM rust:1.88.0 AS base # Install dependencies @@ -59,12 +84,14 @@ ar = "x86_64-apple-darwin20.4-ar"\n\ # Copy the source code COPY . . +# Copy pre-built inspector frontend +COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/packages/inspector/dist + # Build for x86_64 macOS -# SANDBOX_AGENT_SKIP_INSPECTOR=1 skips embedding the inspector frontend RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo build -p sandbox-agent --release --target x86_64-apple-darwin && \ + cargo build -p sandbox-agent --release --target x86_64-apple-darwin && \ mkdir -p /artifacts && \ cp target/x86_64-apple-darwin/release/sandbox-agent /artifacts/sandbox-agent-x86_64-apple-darwin diff --git a/docker/release/windows.Dockerfile b/docker/release/windows.Dockerfile index 187cbed..2acabf2 100644 --- a/docker/release/windows.Dockerfile +++ b/docker/release/windows.Dockerfile @@ -1,4 +1,29 @@ # syntax=docker/dockerfile:1.10.0 + +# Build inspector frontend +FROM node:22-alpine AS inspector-build +WORKDIR /app +RUN npm install -g pnpm + +# Copy package files for workspaces +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY frontend/packages/inspector/package.json ./frontend/packages/inspector/ +COPY sdks/typescript/package.json ./sdks/typescript/ + +# Install dependencies +RUN pnpm install --filter @anthropic-ai/sdk-inspector... + +# Copy SDK source (with pre-generated types from docs/openapi.json) +COPY docs/openapi.json ./docs/ +COPY sdks/typescript ./sdks/typescript + +# Build SDK (just tsup, skip generate since types are pre-generated) +RUN cd sdks/typescript && SKIP_OPENAPI_GEN=1 pnpm exec tsup + +# Copy inspector source and build +COPY frontend/packages/inspector ./frontend/packages/inspector +RUN cd frontend/packages/inspector && pnpm exec vite build + FROM rust:1.88.0 # Install dependencies @@ -45,12 +70,14 @@ WORKDIR /build # Copy the source code COPY . . +# Copy pre-built inspector frontend +COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/packages/inspector/dist + # Build for Windows -# SANDBOX_AGENT_SKIP_INSPECTOR=1 skips embedding the inspector frontend RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo build -p sandbox-agent --release --target x86_64-pc-windows-gnu && \ + cargo build -p sandbox-agent --release --target x86_64-pc-windows-gnu && \ mkdir -p /artifacts && \ cp target/x86_64-pc-windows-gnu/release/sandbox-agent.exe /artifacts/sandbox-agent-x86_64-pc-windows-gnu.exe diff --git a/docker/runtime/Dockerfile b/docker/runtime/Dockerfile index 3557c02..fed9840 100644 --- a/docker/runtime/Dockerfile +++ b/docker/runtime/Dockerfile @@ -1,5 +1,31 @@ # syntax=docker/dockerfile:1.10.0 +# ============================================================================ +# Build inspector frontend +# ============================================================================ +FROM node:22-alpine AS inspector-build +WORKDIR /app +RUN npm install -g pnpm + +# Copy package files for workspaces +COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./ +COPY frontend/packages/inspector/package.json ./frontend/packages/inspector/ +COPY sdks/typescript/package.json ./sdks/typescript/ + +# Install dependencies +RUN pnpm install --filter @anthropic-ai/sdk-inspector... + +# Copy SDK source (with pre-generated types from docs/openapi.json) +COPY docs/openapi.json ./docs/ +COPY sdks/typescript ./sdks/typescript + +# Build SDK (just tsup, skip generate since types are pre-generated) +RUN cd sdks/typescript && SKIP_OPENAPI_GEN=1 pnpm exec tsup + +# Copy inspector source and build +COPY frontend/packages/inspector ./frontend/packages/inspector +RUN cd frontend/packages/inspector && pnpm exec vite build + # ============================================================================ # AMD64 Builder - Uses cross-tools musl toolchain # ============================================================================ @@ -59,10 +85,13 @@ ENV OPENSSL_DIR=/musl \ WORKDIR /build COPY . . +# Copy pre-built inspector frontend +COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/packages/inspector/dist + RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo build -p sandbox-agent --release --target x86_64-unknown-linux-musl && \ + cargo build -p sandbox-agent --release --target x86_64-unknown-linux-musl && \ cp target/x86_64-unknown-linux-musl/release/sandbox-agent /sandbox-agent # ============================================================================ @@ -90,10 +119,13 @@ ENV CARGO_INCREMENTAL=0 \ WORKDIR /build COPY . . +# Copy pre-built inspector frontend +COPY --from=inspector-build /app/frontend/packages/inspector/dist ./frontend/packages/inspector/dist + RUN --mount=type=cache,target=/usr/local/cargo/registry \ --mount=type=cache,target=/usr/local/cargo/git \ --mount=type=cache,target=/build/target \ - SANDBOX_AGENT_SKIP_INSPECTOR=1 cargo build -p sandbox-agent --release --target aarch64-unknown-linux-musl && \ + cargo build -p sandbox-agent --release --target aarch64-unknown-linux-musl && \ cp target/aarch64-unknown-linux-musl/release/sandbox-agent /sandbox-agent # ============================================================================