Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
f768d54
project side bar and new layout design
Douglasymlai Mar 24, 2026
fdb1fbb
Merge branch 'main' into project-side-bar
4pmtong Mar 25, 2026
3f3447a
udpate side bar design
Douglasymlai Mar 26, 2026
d21f062
update content
Douglasymlai Mar 26, 2026
9fb75a1
move single agent chatbox ui update to sidebar version (#1522)
Douglasymlai Mar 27, 2026
cb87108
feature all updated
Douglasymlai Mar 27, 2026
dfa4c5d
update language
Douglasymlai Mar 27, 2026
12cf809
review and fix bug for hardcoded state
Douglasymlai Mar 27, 2026
c0bad6a
iteration change for the workforce window interaction
Douglasymlai Mar 27, 2026
ae2c08e
restrucutre components
Douglasymlai Mar 27, 2026
88b68d7
Merge branch 'main' into feat-new-project-workspace-with-sidebar
Douglasymlai Mar 27, 2026
8451cc5
fix model missing notification layout
Douglasymlai Mar 27, 2026
e3ee804
revert background color for visibility
Douglasymlai Mar 27, 2026
72ddd22
update bug fix for texting, and missing margins
Douglasymlai Mar 29, 2026
87693f6
check language translation
Douglasymlai Mar 30, 2026
d1c86d5
bug fix
Douglasymlai Mar 30, 2026
47dfd4d
ux improvement for starting new project
Douglasymlai Mar 31, 2026
bfd6baf
initial push
Douglasymlai Mar 31, 2026
2faf2ce
Merge branch 'main' into feat-new-project-workspace-with-sidebar
4pmtong Apr 1, 2026
cfe92bb
WIP: refactor
4pmtong Apr 2, 2026
68e171b
fix: improve web browser/login flow and handle duplicate agent files
4pmtong Apr 5, 2026
e1f747e
add docs
4pmtong Apr 5, 2026
9210436
Merge remote-tracking branch 'origin/main' into refactor_eigent
4pmtong Apr 5, 2026
94a07d5
Merge remote-tracking branch 'origin/main' into refactor_eigent
4pmtong Apr 5, 2026
addb6fa
fix(ci): unblock workflows and address CodeQL findings
4pmtong Apr 5, 2026
61a122f
bug fix to remove confusing feature
Douglasymlai Apr 7, 2026
7e9fa85
Merge branch 'feat-new-project-workspace-with-sidebar' into feat-new-…
Douglasymlai Apr 8, 2026
72e93bc
Merge origin/main into feat-new-workspace-ai-worker
Douglasymlai Apr 9, 2026
19e6ee1
resolve conflicts
Douglasymlai Apr 9, 2026
086df14
redesign for chathistory and workspace panel
Douglasymlai Apr 9, 2026
04bc9e3
add test env
4pmtong Apr 16, 2026
c852c3e
add all new features
Douglasymlai Apr 17, 2026
ec0a9b3
Merge branch 'main' into test
4pmtong Apr 17, 2026
8468684
update design
Douglasymlai Apr 17, 2026
b8204f2
fix import bug
Douglasymlai Apr 17, 2026
bb5daa2
bug fix
Douglasymlai Apr 18, 2026
d3810f9
chore(ui): reorganize component paths and shared layout
Douglasymlai Apr 18, 2026
4227e06
fix(review): address PR #1536 feedback (file path normalization, Path…
4pmtong Apr 20, 2026
3990362
Merge remote-tracking branch 'origin/test' into refactor_eigent
4pmtong Apr 21, 2026
d604be3
Design Roken refactor (#1569)
Douglasymlai Apr 21, 2026
c734699
Refactor chat rendering (#1570)
Douglasymlai Apr 21, 2026
cd8fcce
Feat/home workspace UI polish 20260422 (#1572)
Douglasymlai Apr 22, 2026
65486c6
style fix for folder content
Douglasymlai Apr 22, 2026
273ce4f
update design change
Douglasymlai Apr 22, 2026
46f9355
Refactor agent log (#1574)
Douglasymlai Apr 22, 2026
0988edd
Merge branch 'refactor_eigent' into feat/eigent-new-design
Douglasymlai Apr 22, 2026
7402171
Merge origin/refactor_eigent: resolve TopBar, Models, Setting, WorkFl…
Douglasymlai Apr 22, 2026
c35396f
edit default app size
Douglasymlai Apr 22, 2026
024133a
feat(ui): add formFieldSurface and share form control chrome
Douglasymlai Apr 23, 2026
047a028
feat(ui): add Alert tone API and deprecate destructive variant
Douglasymlai Apr 23, 2026
fe6b397
refactor(ui): rename TabsList/TabsTrigger variant to appearance
Douglasymlai Apr 23, 2026
9c4766c
refactor(ui): add tone to menu-button and resolve look from variant
Douglasymlai Apr 23, 2026
e20284b
fix(ui): merge Toggle className with cn() outside toggleVariants
Douglasymlai Apr 23, 2026
bda0e29
style(ui): use design token for Skeleton background
Douglasymlai Apr 23, 2026
13ea060
chore(storybook): centralize UI stories under src/stories/ui
Douglasymlai Apr 23, 2026
a96f100
refactor(ui): use Tailwind ds-* tokens in sheet, tabs, and sidebar
Douglasymlai Apr 23, 2026
8106c9a
refactor(background): use Tailwind ds-* on SVG patterns and lottie ba…
Douglasymlai Apr 23, 2026
31bcf19
refactor(chat): use ds-* Tailwind utilities in message components
Douglasymlai Apr 23, 2026
ca086ab
refactor(chat): use ds-* utilities in input area and user query group
Douglasymlai Apr 23, 2026
172936c
refactor(chat): use ds-* utilities in task list and session timeline
Douglasymlai Apr 23, 2026
48e94c1
refactor(layout): use ds-* utilities in top bar, history search, proj…
Douglasymlai Apr 23, 2026
070339b
refactor(workflow): use border-ds-* for markdown tables
Douglasymlai Apr 23, 2026
10f14ea
refactor(settings): use accent-ds-* for appearance range input
Douglasymlai Apr 23, 2026
17f8f61
feat(theme): dialog overlay scrim token and mode-split aliases
Douglasymlai Apr 23, 2026
33f76c7
feat(ui): dialog overlay variants and scrim on alert
Douglasymlai Apr 23, 2026
69af431
feat(ui): use dialog overlay scrim on sheets and full-screen backdrops
Douglasymlai Apr 23, 2026
b589f3c
refactor(ui): prefer design tokens over raw colors
Douglasymlai Apr 23, 2026
aa888e5
chore: add design-token usage guardrail and allowlist
Douglasymlai Apr 23, 2026
0070655
Tighten auth and install step padding, soften card background
Douglasymlai Apr 23, 2026
421f01c
feat(sidebar): rich session list lead icons from task lifecycle
Douglasymlai Apr 23, 2026
d38baee
chore(deps): alphabetize @emotion/is-prop-valid in dependencies
Douglasymlai Apr 23, 2026
debd59b
feat(history): Blocks icon for projects tab; align padding; task titl…
Douglasymlai Apr 23, 2026
bc9416c
refactor(topbar): useHost for Electron APIs; simplify history header
Douglasymlai Apr 23, 2026
a85e3c4
feat(settings): version and update actions in sidebar
Douglasymlai Apr 23, 2026
c08386f
style(models): design tokens and controls on Models settings
Douglasymlai Apr 23, 2026
5d2cbd6
chore(assets): add integration icons and update Slack icon
Douglasymlai Apr 23, 2026
f285deb
feat(i18n): add MCP and connectors strings for settings
Douglasymlai Apr 23, 2026
1d28863
feat(connectors): expand MCP UI and connectors entry
Douglasymlai Apr 23, 2026
c5ad335
style change for skills and dashboard panel
Douglasymlai Apr 23, 2026
ae753dc
refactor(Workspace): use Host abstraction for Electron APIs
Douglasymlai Apr 23, 2026
43ee2b7
refactor(ChatBox): use Host abstraction for Electron APIs
Douglasymlai Apr 23, 2026
4582fcb
refactor(Workforce): use Host abstraction for webview and overlay
Douglasymlai Apr 23, 2026
92dbb06
refactor(settings): use Host abstraction for proxy and restart
Douglasymlai Apr 23, 2026
175e62a
feat(report-bug): add diagnostics export and email report flow
Douglasymlai Apr 23, 2026
9cb2b12
refactor(session-nav): unify session rows across workspace views
Douglasymlai Apr 23, 2026
4a7e9c2
feat(history-ui): refresh token badges and history header labels
Douglasymlai Apr 23, 2026
7d7fccf
fix(theme-tokens): pin dark subtle status backgrounds where required
Douglasymlai Apr 23, 2026
b3c00ca
style(ui): update shared form and surface primitives
Douglasymlai Apr 23, 2026
49f3b16
feat(add-worker): refresh tool selection UI and agent tool copy
Douglasymlai Apr 23, 2026
3f840ff
feat(app): update workspace shell, nav, and integrations
Douglasymlai Apr 23, 2026
fd129b3
fix: correct BrowserAgentWorkspace import path casing for CI and TS1261
Douglasymlai Apr 23, 2026
255b94f
chore(theme): update preset ids and add whale and custom in base colo…
Douglasymlai Apr 23, 2026
877b1ae
feat(ui): add ruled, dotted, and dashed line background overlays
Douglasymlai Apr 23, 2026
3aea8c7
feat(settings): add workspace line backgrounds and persist choice
Douglasymlai Apr 23, 2026
f4f5729
git commit -m "style: fix ruff import order in browser factory"
4pmtong Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
10 changes: 10 additions & 0 deletions .env.development
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
VITE_BASE_URL=/api

# =======Production environment variables=======
SERVER_URL=https://dev.eigent.ai
VITE_PROXY_URL=https://dev.eigent.ai
VITE_SITE_URL=https://www.eigent.ai
VITE_USE_LOCAL_PROXY=false

# =======Test environment variables=======
# SERVER_URL=https://test-dev.eigent.ai
# VITE_PROXY_URL=https://test-dev.eigent.ai
# VITE_SITE_URL=https://test.eigent.ai
# VITE_USE_LOCAL_PROXY=false

# =======Local environment variables=======
# VITE_PROXY_URL=http://localhost:3001
# VITE_USE_LOCAL_PROXY=true

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -347,7 +347,7 @@ jobs:
files: |
gh-release-assets/*
# Extract version from tag (e.g., v0.0.85 -> 0.0.90)
# Extract version from tag (e.g., v0.0.89 -> 0.0.89)
- name: Extract version
if: startsWith(github.ref, 'refs/tags/')
id: version
Expand Down
58 changes: 58 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,64 @@ permissions:
contents: read

jobs:
web-local-smoke:
name: Run Web + Local Brain Smoke
runs-on: ubuntu-latest
timeout-minutes: 25

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20

- name: Install frontend dependencies
run: npm install --ignore-scripts

- name: Install uv
uses: astral-sh/setup-uv@v5
with:
enable-cache: true

- name: Set up Python
run: uv python install 3.11

- name: Install backend dependencies
run: |
cd backend
uv sync

- name: Run web + local brain smoke
run: bash scripts/smoke-web-local-brain.sh

frontend-quality:
name: Run Frontend Guardrails
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20

- name: Install frontend dependencies
run: npm install --ignore-scripts

- name: Run type check
run: npm run type-check

- name: Check Electron Access Guard
run: bash scripts/check-electron-access.sh

- name: Design tokens (engine + no hard-coded colors in UI)
run: npm run check:design-tokens

pytest:
name: Run Python Tests
runs-on: ubuntu-latest
Expand Down
1 change: 1 addition & 0 deletions .lintstagedrc.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"*.{ts,tsx}": [
"eslint --fix --no-warn-ignored",
"node scripts/check-design-token-usage.mjs",
"prettier --write",
"node licenses/update_license.js"
],
Expand Down
35 changes: 35 additions & 0 deletions backend/README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,40 @@
```bash
# Option 1: Start with uvicorn directly
uv run uvicorn main:api --port 5001

# Option 2: Standalone mode (no Electron dependency)
uv run python main.py

# Option 3: If uv run hangs, delete lock files and retry, or use venv directly:
.venv/bin/python main.py
# or
.venv/bin/uvicorn main:api --port 5001 --host 0.0.0.0

# If uv hangs, delete lock files first: rm -f uv_installing.lock uv_installed.lock
```

### Environment Variables (Standalone)

| Variable | Default | Description |
| ---------------------------------- | ------------------- | ----------------------------------------------------------------------------------------- |
| `EIGENT_BRAIN_PORT` | 5001 | Listening port |
| `EIGENT_BRAIN_HOST` | 0.0.0.0 | Listening address |
| `EIGENT_DEBUG` | - | Set to 1/true to enable reload |
| `EIGENT_WORKSPACE` | ~/.eigent/workspace | Working directory |
| `EIGENT_DEPLOYMENT_TYPE` | (auto) | `local` / `cloud_vm` / `sandbox` / `docker`; determines Hands capabilities (see ADR-0006) |
| `EIGENT_HANDS_MODE` | - | Set to `remote` to enable `RemoteHands` (remote cluster resource mode) |
| `EIGENT_HANDS_CLUSTER_CONFIG_FILE` | - | Path to `RemoteHands` config file (TOML); **recommended** |
| `EIGENT_HANDS_TERMINAL` | - | Override terminal hand: `1`/`true`/`yes` or `0`/`false`/`no` |
| `EIGENT_HANDS_BROWSER` | - | Override browser hand |
| `EIGENT_HANDS_FILESYSTEM` | - | Override filesystem scope: `full` / `workspace_only` |
| `EIGENT_HANDS_MCP` | - | Override MCP mode: `all` / `allowlist` |

RemoteHands config file example:

```bash
cp backend/config/hands_clusters.example.toml ~/.eigent/hands_clusters.toml
export EIGENT_HANDS_MODE=remote
export EIGENT_HANDS_CLUSTER_CONFIG_FILE=~/.eigent/hands_clusters.toml
```

i18n operation process: https://github.com/Anbarryprojects/fastapi-babel
Expand Down
57 changes: 54 additions & 3 deletions backend/app/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,68 @@
# limitations under the License.
# ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========

import os

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from starlette.middleware.base import BaseHTTPMiddleware

# Initialize FastAPI with title
api = FastAPI(title="Eigent Multi-Agent System API")

# Add CORS middleware

@api.get("/")
def root():
"""Root endpoint - confirms this is the Brain backend."""
return {"service": "eigent-brain", "docs": "/docs", "health": "/health"}


_cors_raw = os.environ.get("EIGENT_CORS_ORIGINS", "")
_allowed_origins = [o.strip() for o in _cors_raw.split(",") if o.strip()]
_default_frame_ancestors = [
"'self'",
"http://localhost:*",
"http://127.0.0.1:*",
"https://localhost:*",
"https://127.0.0.1:*",
]
_frame_ancestors = " ".join(
dict.fromkeys(
[
*_default_frame_ancestors,
*[origin for origin in _allowed_origins if origin != "*"],
]
)
)


class SecurityHeadersMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request, call_next):
response = await call_next(request)
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["Referrer-Policy"] = "strict-origin-when-cross-origin"
if request.url.path.startswith("/files/preview/"):
if "X-Frame-Options" in response.headers:
del response.headers["X-Frame-Options"]
response.headers["Content-Security-Policy"] = (
f"frame-ancestors {_frame_ancestors};"
)
else:
response.headers["X-Frame-Options"] = "DENY"
return response


api.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_origins=_allowed_origins or ["*"],
allow_credentials=bool(_allowed_origins),
allow_methods=["*"],
allow_headers=["*"],
expose_headers=["X-Session-ID"],
)
api.add_middleware(SecurityHeadersMiddleware)

# Phase 2: Channel/Session header parsing (X-Channel, X-Session-ID, X-User-ID)
from app.router_layer import ChannelSessionMiddleware

api.add_middleware(ChannelSessionMiddleware)
Loading
Loading