diff --git a/.env.example b/.env.example index a261302..aa138d0 100644 --- a/.env.example +++ b/.env.example @@ -6,7 +6,7 @@ FRONTEND_PORT=3000 BACKEND_PORT=8000 # --- database --- -POSTGRES_DB=mission_control +POSTGRES_DB=pipeline POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_PORT=5432 @@ -26,6 +26,6 @@ LOCAL_AUTH_TOKEN= # --- frontend settings --- # REQUIRED: Public URL used by the browser to reach the API. -# Use `auto` to target the same host currently serving Mission Control on port 8000. +# Use `auto` to target the same host currently serving Pipeline on port 8000. # Example (explicit override): NEXT_PUBLIC_API_URL=https://mc.example.com NEXT_PUBLIC_API_URL=auto diff --git a/backend/.env.example b/backend/.env.example index aad2135..422ad9c 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -4,7 +4,7 @@ LOG_FORMAT=text LOG_USE_UTC=false REQUEST_LOG_SLOW_MS=1000 REQUEST_LOG_INCLUDE_HEALTH=false -DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:5432/mission_control +DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:5432/pipeline # For remote access, set this to your UI origin (e.g. http://:3000 or https://mc.example.com). CORS_ORIGINS=http://localhost:3000 # REQUIRED for gateway provisioning/agent heartbeats. Must be reachable by gateway runtime. diff --git a/backend/.env.test b/backend/.env.test index 8a55a25..b1d4ee5 100644 --- a/backend/.env.test +++ b/backend/.env.test @@ -12,7 +12,7 @@ REQUEST_LOG_SLOW_MS=1000 REQUEST_LOG_INCLUDE_HEALTH=false # Local backend -> local Postgres (adjust host/port if needed) -DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:5432/mission_control_test +DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:5432/pipeline_test CORS_ORIGINS=http://localhost:3000 BASE_URL=http://localhost:8000 diff --git a/backend/app/core/version.py b/backend/app/core/version.py index accae99..d27da9c 100644 --- a/backend/app/core/version.py +++ b/backend/app/core/version.py @@ -1,4 +1,4 @@ """Application name and version constants.""" -APP_NAME = "mission-control" +APP_NAME = "pipeline" APP_VERSION = "0.1.0" diff --git a/backend/pyproject.toml b/backend/pyproject.toml index 46261a6..66deefd 100644 --- a/backend/pyproject.toml +++ b/backend/pyproject.toml @@ -8,7 +8,7 @@ profile = "black" line_length = 100 skip = [".venv", "migrations/versions"] [project] -name = "openclaw-agency-backend" +name = "pipeline-backend" version = "0.1.0" requires-python = ">=3.12" dependencies = [ diff --git a/backend/uv.lock b/backend/uv.lock index 8136c6a..32f1114 100644 --- a/backend/uv.lock +++ b/backend/uv.lock @@ -698,7 +698,25 @@ wheels = [ ] [[package]] -name = "openclaw-agency-backend" +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, +] + +[[package]] +name = "pathspec" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, +] + +[[package]] +name = "pipeline-backend" version = "0.1.0" source = { virtual = "." } dependencies = [ @@ -767,24 +785,6 @@ requires-dist = [ ] provides-extras = ["dev"] -[[package]] -name = "packaging" -version = "26.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, -] - -[[package]] -name = "pathspec" -version = "1.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, -] - [[package]] name = "platformdirs" version = "4.5.1" diff --git a/compose.yml b/compose.yml index 7a389ea..42a6336 100644 --- a/compose.yml +++ b/compose.yml @@ -1,10 +1,10 @@ -name: openclaw-mission-control +name: pipeline services: db: image: postgres:16-alpine environment: - POSTGRES_DB: ${POSTGRES_DB:-mission_control} + POSTGRES_DB: ${POSTGRES_DB:-pipeline} POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres} volumes: @@ -37,7 +37,7 @@ services: - ./backend/.env environment: # Override localhost defaults for container networking - DATABASE_URL: postgresql+psycopg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-mission_control} + DATABASE_URL: postgresql+psycopg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-pipeline} CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:3030} DB_AUTO_MIGRATE: ${DB_AUTO_MIGRATE:-true} AUTH_MODE: ${AUTH_MODE} @@ -84,7 +84,7 @@ services: db: condition: service_healthy environment: - DATABASE_URL: postgresql+psycopg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-mission_control} + DATABASE_URL: postgresql+psycopg://${POSTGRES_USER:-postgres}:${POSTGRES_PASSWORD:-postgres}@db:5432/${POSTGRES_DB:-pipeline} AUTH_MODE: ${AUTH_MODE} LOCAL_AUTH_TOKEN: ${LOCAL_AUTH_TOKEN} BASE_URL: ${BASE_URL:-http://localhost:8000} diff --git a/frontend/package.json b/frontend/package.json index 3143b81..754b882 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,5 +1,5 @@ { - "name": "frontend", + "name": "pipeline-frontend", "version": "0.1.0", "private": true, "scripts": { diff --git a/frontend/src/app/boards/[boardId]/page.tsx b/frontend/src/app/boards/[boardId]/page.tsx index a30c407..8ec639c 100644 --- a/frontend/src/app/boards/[boardId]/page.tsx +++ b/frontend/src/app/boards/[boardId]/page.tsx @@ -861,7 +861,9 @@ export default function BoardDetailPage() { const openedTaskIdFromUrlRef = useRef(null); const openedPanelFromUrlRef = useRef(null); const [comments, setComments] = useState([]); - const [highlightedCommentId, setHighlightedCommentId] = useState(null); + const [highlightedCommentId, setHighlightedCommentId] = useState< + string | null + >(null); const [liveFeed, setLiveFeed] = useState([]); const liveFeedRef = useRef([]); const liveFeedFlashTimersRef = useRef>({}); @@ -2407,9 +2409,12 @@ export default function BoardDetailPage() { currentTaskIdFromUrl !== fullTask.id || currentCommentIdFromUrl !== targetCommentId ) { - router.replace(buildUrlWithTaskAndComment(fullTask.id, targetCommentId), { - scroll: false, - }); + router.replace( + buildUrlWithTaskAndComment(fullTask.id, targetCommentId), + { + scroll: false, + }, + ); } selectedTaskIdRef.current = fullTask.id; setSelectedTask(fullTask); @@ -4659,9 +4664,7 @@ export default function BoardDetailPage() { {" "} to board chat. -
  • - Mission Control forwards it to all agents on this board. -
  • +
  • Pipeline forwards it to all agents on this board.
  • diff --git a/frontend/src/app/gateways/[gatewayId]/edit/page.tsx b/frontend/src/app/gateways/[gatewayId]/edit/page.tsx index 7b4b124..4b03fea 100644 --- a/frontend/src/app/gateways/[gatewayId]/edit/page.tsx +++ b/frontend/src/app/gateways/[gatewayId]/edit/page.tsx @@ -165,7 +165,7 @@ export default function EditGatewayPage() { ? `Edit gateway — ${resolvedName.trim()}` : "Edit gateway" } - description="Update connection settings for this OpenClaw gateway." + description="Update connection settings for this Pipeline gateway." isAdmin={isAdmin} adminOnlyMessage="Only organization owners and admins can edit gateways." > diff --git a/frontend/src/app/gateways/new/page.tsx b/frontend/src/app/gateways/new/page.tsx index 7e752c6..0ed4e1a 100644 --- a/frontend/src/app/gateways/new/page.tsx +++ b/frontend/src/app/gateways/new/page.tsx @@ -116,7 +116,7 @@ export default function NewGatewayPage() { forceRedirectUrl: "/gateways/new", }} title="Create gateway" - description="Configure an OpenClaw gateway for mission control." + description="Configure a Pipeline gateway." isAdmin={isAdmin} adminOnlyMessage="Only organization owners and admins can create gateways." > diff --git a/frontend/src/app/gateways/page.tsx b/frontend/src/app/gateways/page.tsx index c46789d..2965063 100644 --- a/frontend/src/app/gateways/page.tsx +++ b/frontend/src/app/gateways/page.tsx @@ -95,7 +95,7 @@ export default function GatewaysPage() { forceRedirectUrl: "/gateways", }} title="Gateways" - description="Manage OpenClaw gateway connections used by boards" + description="Manage Pipeline gateway connections used by boards" headerActions={ isAdmin && gateways.length > 0 ? ( - This removes the gateway connection from Mission Control. Boards - using it will need a new gateway assigned. + This removes the gateway connection from Pipeline. Boards using it + will need a new gateway assigned. } errorMessage={deleteMutation.error?.message} diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index c76e6f9..1bbfd89 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -3,6 +3,29 @@ @tailwind utilities; :root { + color-scheme: dark; + --bg: #070b12; + --surface: #0f1724; + --surface-muted: #162133; + --surface-strong: #223047; + --border: #263246; + --border-strong: #3a4860; + --text: #edf3fb; + --text-muted: #a7b4c7; + --text-quiet: #748195; + --accent: #60a5fa; + --accent-strong: #93c5fd; + --accent-soft: rgba(96, 165, 250, 0.18); + --success: #34d399; + --warning: #fbbf24; + --danger: #f87171; + --shadow-panel: + 0 18px 50px rgba(0, 0, 0, 0.35), 0 1px 0 rgba(255, 255, 255, 0.04) inset; + --shadow-card: + 0 12px 34px rgba(0, 0, 0, 0.28), 0 1px 0 rgba(255, 255, 255, 0.04) inset; +} + +[data-theme="light"] { color-scheme: light; --bg: #f8fafc; --surface: #ffffff; @@ -25,6 +48,10 @@ 0 1px 2px rgba(15, 23, 42, 0.08), 0 2px 6px rgba(15, 23, 42, 0.06); } +[data-theme="dark"] { + color-scheme: dark; +} + body { @apply font-body; background: var(--bg); @@ -121,8 +148,16 @@ body { } .bg-landing-grid { background-image: - linear-gradient(to right, rgba(12, 17, 29, 0.08) 1px, transparent 1px), - linear-gradient(to bottom, rgba(12, 17, 29, 0.08) 1px, transparent 1px); + linear-gradient( + to right, + color-mix(in srgb, var(--text) 8%, transparent) 1px, + transparent 1px + ), + linear-gradient( + to bottom, + color-mix(in srgb, var(--text) 8%, transparent) 1px, + transparent 1px + ); background-size: 120px 120px; } } diff --git a/frontend/src/app/icon.svg b/frontend/src/app/icon.svg new file mode 100644 index 0000000..38a3a06 --- /dev/null +++ b/frontend/src/app/icon.svg @@ -0,0 +1,20 @@ + + + + + diff --git a/frontend/src/app/invite/page.tsx b/frontend/src/app/invite/page.tsx index 28c31aa..5892cc0 100644 --- a/frontend/src/app/invite/page.tsx +++ b/frontend/src/app/invite/page.tsx @@ -69,7 +69,7 @@ function InviteContent() { return (
    -
    +
    @@ -82,7 +82,7 @@ function InviteContent() { Organization Invite

    - Join your team in OpenClaw + Join your team in Pipeline

    {helperText}

    diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index 483aef0..aa226b8 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -7,10 +7,11 @@ import { DM_Serif_Display, IBM_Plex_Sans, Sora } from "next/font/google"; import { AuthProvider } from "@/components/providers/AuthProvider"; import { QueryProvider } from "@/components/providers/QueryProvider"; +import { ThemeProvider } from "@/components/providers/ThemeProvider"; import { GlobalLoader } from "@/components/ui/global-loader"; export const metadata: Metadata = { - title: "OpenClaw Mission Control", + title: "Pipeline", description: "A calm command center for every task.", }; @@ -35,18 +36,38 @@ const displayFont = DM_Serif_Display({ weight: ["400"], }); +const themeScript = ` +(() => { + try { + const theme = localStorage.getItem("openclaw_theme") === "light" ? "light" : "dark"; + const root = document.documentElement; + root.dataset.theme = theme; + root.classList.toggle("dark", theme === "dark"); + root.style.colorScheme = theme; + } catch { + document.documentElement.dataset.theme = "dark"; + document.documentElement.classList.add("dark"); + } +})(); +`; + export default function RootLayout({ children }: { children: ReactNode }) { return ( - + + +