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 frozenequanaut-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.equa-web/specs/060-command-center-fleet-management-shell/spec.mddefines equa-web as the sole supported Command Center surface and deprecateslocalhost:3001/command-center.equa-web/src/logic/paths.tsdefines the mounted/prime,/equabotz,/admin, and/airoute constants.equa-web/src/app/routes/routes.tsmounts/prime,/admin,/ai/*, and/equabotzinside the authenticated equa-web app.equa-web/src/modules/equanaut/index.tsxopens full-page Equanaut via the same-origin/prime?openEquanaut=truehandoff.equa-web/src/modules/fleet-tracker/services/fleet-tracker-config.tsdefines the Fleet Trackercommand-centerpanel 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 usesagent:main:equa-{organizationId}. - Operational panels now live in equa-web surfaces:
/prime,/fleet,/admin,/ai, and/equabotz.
Architecture
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 unifiedTaskStackItem payload consumed by Command Center status and task surfaces.
The response includes a schemaVersion field for observability.
GitHub Project field inventory (24 fields)
GitHub Project field inventory (24 fields)
Last verified against source: 2026-02-28Visible fields (17 table columns)
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).Hidden fields (7 — configured but not displayed as columns)
View configuration (Stack Ranked Priority List)
- Group by:
Priority - Sort:
Stack Rankascending (primary),Priorityascending (secondary) - Filter:
-status:Done - Field sum:
Count - Default repository:
EQUAStart/equanaut-command-center-main
--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 theis: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:- GitHub Projects (live data via
ghCLI) - Local stack file (for local dev with recent syncs)
- Remote compute API (if configured)
- Bundled data (static fallback)
Task identity
Tasks use a composite identity with precedence:projectItemId(GitHub Project item ID — used for project mutations)githubIssueNumber(cross-repo references)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
TheBlocked 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:- Equabot session key (strongest match)
- GitHub issue number (extracted from session label)
- Slug (legacy fallback)
Runtime mapping
Each project field anchors a specific runtime entity:
The unified runtime chain is:
Task Thread → Agent Session → Subagent Context → Conversation Surfaces → Artifacts
Where:
- Agent Session is anchored by the
Equabot Sessionfield. - 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.
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 inequabot/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 thegh CLI with zero raw GraphQL.
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")
--project-owner— GitHub project owner (default:ShawnOwen)--project-number— GitHub project number (default:4)--dry-run— Resolve all IDs and print thegh project item-editcommand without executing
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:
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 tohttp://localhost:3001/command-center. Use the same-origin equa-web route instead:
- Start equa-web locally.
- Open
http://localhost:8080/prime?openEquanaut=true. - 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 parameteropenEquanaut=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.
Related
- System Overview for how Command Center fits in the architecture
- Repository Map for project structure
- Developer Setup for local development
- Control UI for the Gateway built-in Control UI (separate from Command Center)