Skip to main content

Command Center

Command Center is the full-screen Equanaut operating mode inside equa-web. It is no longer a supported split-origin Next.js app on port 3001. The frozen equanaut-command-center-main / command-center-so codebase remains source material for migrated behavior, but current operator workflows must open from the authenticated equa-web shell.

URL contract

The supported local Command Center path is same-origin through equa-web. Do not start or navigate to localhost:3001 for current Command Center work unless you are explicitly comparing frozen source-material behavior.
This page is the current Command Center routing authority. Older docs that still describe command-center-so, localhost:3001, or /command-center as the current local app surface are legacy until they are reconciled with Spec 060.
Source evidence:
  • equa-web/specs/060-command-center-fleet-management-shell/spec.md defines equa-web as the sole supported Command Center surface and deprecates localhost:3001/command-center.
  • equa-web/src/logic/paths.ts defines the mounted /prime, /equabotz, /admin, and /ai route constants.
  • equa-web/src/app/routes/routes.ts mounts /prime, /admin, /ai/*, and /equabotz inside the authenticated equa-web app.
  • equa-web/src/modules/equanaut/index.tsx opens full-page Equanaut via the same-origin /prime?openEquanaut=true handoff.
  • equa-web/src/modules/fleet-tracker/services/fleet-tracker-config.ts defines the Fleet Tracker command-center panel used by /fleet.

equa-web integration

Command Center is not a separate user-facing product surface. It is the expanded, full-page mode of the same Equanaut assistant experience:
  • equa-web owns the main app shell, organization context, and the Equanaut sidebar.
  • The Equanaut rail maximize control opens the full Command Center in place: full-screen rail, Command Center mode, and the Threads/Fleet/Status tabs.
  • The Equanaut rail page action opens the same-origin Prime surface with openEquanaut=true, preserving the session key, organization id, and return URL.
  • Command Center mode defaults to agent:main:main; org-scoped Equanaut sidebar chat uses agent:main:equa-{organizationId}.
  • Operational panels now live in equa-web surfaces: /prime, /fleet, /admin, /ai, and /equabotz.

Architecture

Command Center reads orchestration state from local JSON files written by the orchestration system and routes chat messages based on routing mode and model selection.

Key components

Setup

Prerequisites

  • Node.js version supported by equa-web
  • equa-server available on port 3000
  • Equabot gateway running on port 18789

Environment

Use the equa-web development environment. Gateway-specific values are still read by the gateway and API layer:

Run

yarn start already sets the legacy OpenSSL provider in equa-web’s package.json. Open the app at http://localhost:8080/prime?openEquanaut=true or use the Equanaut rail from any supported equa-web route.

API routes

Core same-origin contracts used by the integrated Command Center surfaces: Namespace note: /api/equanaut/* and /api/fleet/* are top-level same-origin contracts introduced by Specs 041 and 031. The /api/v1/* paths are the existing equa-web API client namespace. The retired /command-center/api/* paths are not the supported local API surface. Keep any remaining references categorized as frozen-source or compatibility-only.

Task stack contract

The priority stack adapter ingests GitHub Project items (24-field inventory) and produces a unified TaskStackItem payload consumed by Command Center status and task surfaces. The response includes a schemaVersion field for observability.
Last verified against source: 2026-02-28
The gh project field-list --format json CLI does not distinguish text, number, and date fields — all report as ProjectV2Field. Only ProjectV2SingleSelectField is identified by type. The update-project-field.py helper infers field type from the value format (numeric values use --number, YYYY-MM-DD patterns use --date, otherwise --text).
Visible fields (17 table columns)Hidden fields (7 — configured but not displayed as columns)View configuration (Stack Ranked Priority List)
  • Group by: Priority
  • Sort: Stack Rank ascending (primary), Priority ascending (secondary)
  • Filter: -status:Done
  • Field sum: Count
  • Default repository: EQUAStart/equanaut-command-center-main
Project owner mapping: Two GitHub owners reference “Project #4” with different internal IDs. Orchestration scripts must specify --project-owner explicitly to target the correct project.

Issue ingestion

Issues from 9 connected repositories are automatically added to Project #4 through two mechanisms. The GitHub Team plan limits built-in auto-add workflows to 5 per project; additional repos use a GitHub Actions workflow. Method A — Built-in Project Workflows (5 repos) Configured directly on the project under Settings > Workflows. Each triggers when a new or updated item matches the is:issue filter. Method B — GitHub Actions (4 repos) Each repo contains .github/workflows/auto-add-to-project.yml using actions/add-to-project@v1.0.2, authenticated via the ADD_TO_PROJECT_PAT classic PAT (repo + project scopes). EQUAStart/equabot uses a repo-level secret because GitHub org secrets do not cross org boundaries. The PAT itself is scoped to the user account and covers both orgs. Canonical architecture reference: project-auto-add-flowchart.md

Source priority

The stack adapter tries these sources in order:
  1. GitHub Projects (live data via gh CLI)
  2. Local stack file (for local dev with recent syncs)
  3. Remote compute API (if configured)
  4. Bundled data (static fallback)

Task identity

Tasks use a composite identity with precedence:
  1. projectItemId (GitHub Project item ID — used for project mutations)
  2. githubIssueNumber (cross-repo references)
  3. slug (UI/session alias)

Priority and status authority

GitHub Project fields (Priority, Status, Stack Rank, Urgency) are authoritative. The UI may compute display-only decorations but does not override the normalized values from the API payload.

Blocker convention

The Blocked By text field supports parseable tokens: Tokens are comma- or semicolon-separated. Optional annotation text after -- is stripped before parsing.

Session linkage

Sessions are linked to task threads using cascade matching:
  1. Equabot session key (strongest match)
  2. GitHub issue number (extracted from session label)
  3. Slug (legacy fallback)

Runtime mapping

Each project field anchors a specific runtime entity: The unified runtime chain is: Task ThreadAgent SessionSubagent ContextConversation SurfacesArtifacts Where:
  • Agent Session is anchored by the Equabot Session field.
  • Subagent Context is anchored by the Comet Browser fields.
  • Conversation Surfaces are anchored by email and research fields (Gmail, Shortwave, NotebookLM).
  • Artifacts are anchored by Drive, Docs, and QBO fields.
This mapping allows different UI layouts (table, board, conversation panel, session monitor) to render the same underlying thread state from one project schema.

Polling and real-time behavior

The integrated Command Center uses same-origin API polling for rail tabs and admin panels. Fleet dispatch remains request-driven.

Orchestration integration

Command Center reads these files from the orchestration directory:

Orchestration scripts

These Python scripts in equabot/orchestration/ interact with GitHub Project V2 fields:

update-project-field.py

Unified helper for updating any GitHub Project V2 custom field by human-readable inputs. Resolves all identifiers at runtime via the gh CLI with zero raw GraphQL.
Arguments:
  • issue_ref — Issue URL (https://github.com/owner/repo/issues/N) or shortref (owner/repo#N)
  • field_name — Human-readable project field name (e.g., "Google Drive Folder", "Priority", "Stack Rank")
  • value — Value to set. For single-select fields, use the option name (e.g., "P1 - High")
Flags:
  • --project-owner — GitHub project owner (default: ShawnOwen)
  • --project-number — GitHub project number (default: 4)
  • --dry-run — Resolve all IDs and print the gh project item-edit command without executing
Field type auto-detection: The gh CLI does not expose granular field types for text, number, and date fields (all report as ProjectV2Field). The script infers the correct gh project item-edit flag from the value format: Examples:
Error handling: Exits non-zero with actionable messages for invalid issue references, issues not in the project, unknown field names (lists available fields), unknown option names (lists valid options), and gh CLI failures.

Tech stack

  • Host app: equa-web React application
  • Language: TypeScript
  • Styling: equa-web component styles and module-local React styles
  • Auth: equa-web authenticated routes and site-admin permission gates
  • State: React hooks, Redux-backed app context, and same-origin API calls

Troubleshooting

Browser still opens port 3001

The docs or app entry point is stale if it sends you to http://localhost:3001/command-center. Use the same-origin equa-web route instead:
  1. Start equa-web locally.
  2. Open http://localhost:8080/prime?openEquanaut=true.
  3. Use the Equanaut rail maximize button to enter the full Command Center.

Command Center does not open from the rail

Confirm the page is running inside equa-web and that the URL parameter openEquanaut=true is present when using the full-page action. The rail maximize control should switch the existing rail into Command Center mode without leaving the current page.