Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
ac43c73
fix pillow
LukeJiaoR Jan 11, 2026
5bdb362
请修改 OpenManus 中的 main.py / cli.py(以实际入口文件为准):
LukeJiaoR Jan 11, 2026
51c39c5
请新增一个文件 core/task.py,实现一个 Task 类:
LukeJiaoR Jan 11, 2026
6a21f50
请新增 core/task_registry.py:
LukeJiaoR Jan 11, 2026
4511988
请修改所有 Agent 的 run / execute 入口方法(如 orchestrator / planner / executor):
LukeJiaoR Jan 11, 2026
b1562fb
请修改 Planner Agent:
LukeJiaoR Jan 11, 2026
ce72a4e
请修改 Executor Agent:
LukeJiaoR Jan 11, 2026
b740135
请新增 tools/runner.py:
LukeJiaoR Jan 12, 2026
e08b122
请修改 tools/shell.py:
LukeJiaoR Jan 12, 2026
b6f0d26
请新增 context/engine.py:
LukeJiaoR Jan 12, 2026
d52acd2
请修改 Agent prompt 构建逻辑:
LukeJiaoR Jan 12, 2026
6445f43
请新增 server/api.py:
LukeJiaoR Jan 12, 2026
7e9f56e
请新增 server/ws.py:
LukeJiaoR Jan 12, 2026
f8604d4
请新增统一异常处理:
LukeJiaoR Jan 12, 2026
1ccc414
add dockerfile and ci
LukeJiaoR Jan 12, 2026
d256128
任务目标:
LukeJiaoR Jan 12, 2026
558917b
任务目标:
LukeJiaoR Jan 12, 2026
c79a178
任务目标:
LukeJiaoR Jan 12, 2026
a4b444b
任务目标:
LukeJiaoR Jan 12, 2026
2044612
任务目标:
LukeJiaoR Jan 12, 2026
29d352a
fix pre-commit check
LukeJiaoR Jan 12, 2026
c3ebfff
OpenManus v2: conversation-first runtime, persistent sandbox, live ob…
May 14, 2026
57c52f9
OpenManus v2: conversation-first runtime, persistent sandbox, live ob…
May 14, 2026
66575a5
implement final response detection and add step-tracking for repeated…
May 14, 2026
b98eec1
apply consistent code formatting and black linting across codebase
May 14, 2026
dac8cbe
refactor: reformat codebase with consistent black-style line breaks a…
May 14, 2026
d9c7bb3
Merge branch 'openmanus-v2'
May 14, 2026
4b32c52
chore: update path alias in vite.config.ts to use node:path for absol…
May 14, 2026
66acb10
feat: implement detection and warning system for excessive consecutiv…
May 14, 2026
1476b6d
feat: implement persistent Obsidian vault integration with auto-sync …
May 14, 2026
4667c82
feat: scaffold comprehensive agent skill sets, architecture patterns,…
May 14, 2026
c817d98
feat: add context-window controls, auto context compression, Obsidian…
May 14, 2026
ad9abc2
feat: implement automated web smoke tests with Makefile, shell script…
May 15, 2026
03b7d93
fix: update health check endpoints to /api/health in CI smoke tests
May 15, 2026
55d0ca0
fix: update task API endpoints to include /api prefix in smoke test w…
May 15, 2026
32c33b0
ci: replace fixed sleep intervals with health check retries in smoke …
May 15, 2026
d9c4d0c
feat: replace static sleep with robust health check polling in local …
May 15, 2026
124dbb9
refactor: update Docker entrypoint to target server.api:app and clean…
May 15, 2026
34a46d4
chore: update docker-compose healthchecks and improve smoke test reli…
May 15, 2026
80cbc0c
ci: add postgresql-client dependency for web smoke tests and clean up…
May 16, 2026
60221f6
fix: update postgres image to version 15 and specify user in health c…
May 16, 2026
f7ad9e3
fix: update smoke test workflows to include user registration and coo…
May 16, 2026
72b0721
fix: update smoke test workflows to include redis service and correct…
May 16, 2026
e2f0b2a
chore: increase smoke test polling limit from 10 to 30 iterations
May 16, 2026
bb527da
feat: implement long-term memory system with agent-accessible tools a…
May 16, 2026
acda9c6
refactor: improve import organization, formatting, and tool registrat…
May 16, 2026
6d41419
refactor: improve smoke test reliability by replacing external CLI de…
May 16, 2026
1a1c330
test: update celery smoke test to verify task interruption and increa…
May 16, 2026
2bec2f0
refactor: improve LLM retry logic and enhance chat message aggregatio…
May 18, 2026
b662004
feat: implement template error fallback mechanism to force final resp…
May 18, 2026
ec87310
feat: introduce ApplyPatchEditor tool, improve StrReplaceEditor idemp…
May 18, 2026
bf6f250
refactor: reformat codebase to comply with standard linting and style…
May 18, 2026
098585e
feat: add MCP server implementation and introduce LineEdit tool for p…
May 19, 2026
a3c9498
style: reformat Python codebase for PEP 8 compliance and consistency
May 19, 2026
5cc68f5
updated README
May 19, 2026
4057a4f
feat: agent modernization — Tier 1/2/3 complete
May 21, 2026
35c15fa
feat: complete remaining 5 deferred modernization items
May 21, 2026
05723c9
chore: freeze requirements.txt to speed up docker builds and prevent …
May 21, 2026
814f1f5
refactor: apply consistent code formatting and style improvements acr…
May 21, 2026
b95e6a4
fix: correct indentation in LLM._init_from_config
May 21, 2026
7bde87e
fix: improve search reliability and remove duplicate Manus Computer b…
May 21, 2026
37ec1c6
style: refactor whitespace and formatting in web search and browser t…
May 21, 2026
533c2dc
feat: implement v1-grounded-heuristic policy for agent execution and …
May 22, 2026
e096ae5
feat: extend CloakBrowser stealth to main agent browser (BrowserUseTool)
May 22, 2026
43aa5cf
fix: search locale, extract_content empty page, fallback engine order
May 22, 2026
b329ff3
fix: eliminate 3-minute search blocking by reducing retry defaults
May 22, 2026
adad432
fix: change engine-level stop_after_attempt to 1 to prevent multiple …
May 22, 2026
95f83c3
fix(mcp): sync LM Studio context window to 128k before every run_task…
May 22, 2026
89a9914
refactor: standardize code formatting and improve readability across …
May 23, 2026
3310c14
feat: integrate FAISS vector search for hybrid memory recall and add …
Jul 1, 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
  •  
  •  
  •  
90 changes: 90 additions & 0 deletions .github/workflows/docker-celery-smoke-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Docker Celery Smoke Test

on:
push:
branches: ["main"]
pull_request:
branches: ["main"]

jobs:
smoke:
runs-on: ubuntu-latest

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

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build and start stack
run: |
docker compose build
docker compose up -d

# Wait for server to be ready with retries
for i in {1..30}; do
if curl -sf http://127.0.0.1:8000/api/health >/dev/null 2>&1; then
echo "Server is ready"
break
fi
echo "Waiting for server... attempt $i/30"
sleep 1
done
if ! curl -sf http://127.0.0.1:8000/api/health >/dev/null 2>&1; then
echo "Server did not become ready in time"
docker compose logs web worker postgres redis || true
exit 1
fi

- name: Verify service health
run: |
docker compose ps
# Ensure key services are up before API checks
docker compose ps postgres | grep -E "Up|running"
docker compose ps redis | grep -E "Up|running"
docker compose ps web | grep -E "Up|running"
docker compose ps worker | grep -E "Up|running"

- name: Check /api/health
run: curl --fail http://127.0.0.1:8000/api/health

- name: Check /docs
run: curl --fail http://127.0.0.1:8000/docs

- name: Task create, interrupt, and poll terminal state
run: |
set -e
curl -s -o /dev/null -c cookies.txt -X POST http://127.0.0.1:8000/api/auth/signup -H "Content-Type: application/json" -d "{\"email\":\"user$RANDOM@test.com\", \"password\":\"password\", \"name\":\"test\"}"
TASK_JSON=$(curl -b cookies.txt -s -X POST http://127.0.0.1:8000/api/tasks -H "Content-Type: application/json" -d '{"prompt":"ping"}')
echo "Created: $TASK_JSON"
TASK_ID=$(echo "$TASK_JSON" | python -c "import sys, json; print(json.load(sys.stdin)['task_id'])")
if [ -z "$TASK_ID" ]; then echo "No task id"; exit 1; fi

# Interrupt quickly so this smoke test does not depend on LLM latency.
curl -b cookies.txt -s -X POST "http://127.0.0.1:8000/api/tasks/$TASK_ID/interrupt" || true

for i in {1..60}; do
STATUS_JSON=$(curl -b cookies.txt -s http://127.0.0.1:8000/api/tasks/$TASK_ID)
echo "Status: $STATUS_JSON"
STATUS=$(echo "$STATUS_JSON" | python -c "import sys, json; print(json.load(sys.stdin).get('status'))")
if [ "$STATUS" = "COMPLETED" ] || [ "$STATUS" = "FAILED" ] || [ "$STATUS" = "INTERRUPTED" ]; then
if [ "$STATUS" = "INTERRUPTED" ]; then
echo "Task interrupted as expected"
fi
exit 0
fi
sleep 2
done
echo "Task did not complete in time"
exit 1

- name: Dump logs on failure
if: failure()
run: |
docker compose ps
docker compose logs web worker postgres redis

- name: Tear down
if: always()
run: docker compose down -v
141 changes: 141 additions & 0 deletions .github/workflows/docker-smoke-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
name: Docker Smoke Test

on:
push:
branches: ["main"]
pull_request:
branches: ["main"]

jobs:
smoke:
runs-on: ubuntu-latest

services:
postgres:
image: postgres:15
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: openmanus
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U postgres"
--health-interval 10s
--health-timeout 5s
--health-retries 5

redis:
image: redis:latest
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 5s
--health-timeout 5s
--health-retries 5

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

- name: Build image
run: docker build -t openmanus:latest .

- name: Run container
run: |
docker run -d --network host --name openmanus \
-e DATABASE_URL=postgresql+psycopg2://postgres:postgres@localhost:5432/openmanus \
-e CELERY_BROKER_URL=redis://localhost:6379/0 \
-e CELERY_RESULT_BACKEND=redis://localhost:6379/0 \
openmanus:latest
# start websocket server inside container on port 8001
docker exec openmanus sh -c "uvicorn server.ws:app --host 0.0.0.0 --port 8001 --workers 1 >/tmp/ws.log 2>&1 & echo \$! >/tmp/ws.pid"

# Wait for server to be ready with retries
for i in {1..30}; do
if curl -sf http://127.0.0.1:8000/api/health >/dev/null 2>&1; then
echo "Server is ready"
break
fi
echo "Waiting for server... attempt $i/30"
sleep 1
done
if ! curl -sf http://127.0.0.1:8000/api/health >/dev/null 2>&1; then
echo "Server did not become ready in time"
docker logs openmanus || true
exit 1
fi

# Wait for websocket server readiness
for i in {1..20}; do
if curl -sf http://127.0.0.1:8001/health >/dev/null 2>&1; then
echo "WebSocket server is ready"
break
fi
echo "Waiting for websocket server... attempt $i/20"
sleep 1
done

- name: Check /api/health
run: curl --fail http://127.0.0.1:8000/api/health

- name: Check /docs
run: curl --fail http://127.0.0.1:8000/docs

- name: Install tooling for task test
run: |
sudo apt-get update && sudo apt-get install -y jq
python -m pip install --upgrade pip
pip install websockets

- name: Simulate task lifecycle with interrupt and event stream
run: |
set -e
curl -s -o /dev/null -c cookies.txt -X POST http://127.0.0.1:8000/api/auth/signup -H "Content-Type: application/json" -d "{\"email\":\"user$RANDOM@test.com\", \"password\":\"password\", \"name\":\"test\"}"
TASK_JSON=$(curl -b cookies.txt -s -X POST http://127.0.0.1:8000/api/tasks)
echo "Task created: $TASK_JSON"
TASK_ID=$(echo "$TASK_JSON" | jq -r '.task_id')
if [ -z "$TASK_ID" ] || [ "$TASK_ID" = "null" ]; then
echo "Failed to parse task id"; exit 1; fi
export TASK_ID

python - <<'PY'
import asyncio, json, websockets, os, sys
task_id = os.environ["TASK_ID"]
uri = f"ws://127.0.0.1:8001/tasks/{task_id}/stream"
events = []
async def main():
try:
async with websockets.connect(uri) as ws:
# send interrupt quickly to avoid long-running agent
await ws.send(json.dumps({"command": "interrupt"}))
try:
for _ in range(10):
msg = await asyncio.wait_for(ws.recv(), timeout=10)
events.append(msg)
if len(events) >= 2:
break
except asyncio.TimeoutError:
pass
except Exception as e:
print("WebSocket error:", e, file=sys.stderr)
sys.exit(1)
asyncio.run(main())
if not events:
print("No events received"); sys.exit(1)
print("Received events:", events)
PY

- name: Dump container logs on failure
if: failure()
run: |
docker logs openmanus || true
docker exec openmanus cat /tmp/ws.log || true
docker exec openmanus cat /tmp/server.log || true

- name: Stop container
if: always()
run: |
docker stop openmanus || true
docker rm openmanus || true
107 changes: 107 additions & 0 deletions .github/workflows/web-smoke-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
name: Web Smoke Test

on:
push:
pull_request:

jobs:
smoke:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:15
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: openmanus
options: >-
--health-cmd "pg_isready -U postgres"
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432

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

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt

- name: Wait for PostgreSQL
run: |
python - <<'PY'
import time
import psycopg2

for i in range(30):
try:
conn = psycopg2.connect(
host="localhost",
port=5432,
user="postgres",
password="postgres",
dbname="openmanus",
)
conn.close()
print("PostgreSQL is ready")
raise SystemExit(0)
except Exception as exc:
print(f"Waiting for PostgreSQL... {i+1}/30 ({exc})")
time.sleep(1)
print("PostgreSQL not ready in time")
raise SystemExit(1)
PY

- name: Start FastAPI server
env:
DATABASE_URL: postgresql+psycopg2://postgres:postgres@localhost:5432/openmanus
run: |
uvicorn server.api:app --host 0.0.0.0 --port 8000 --workers 1 > /tmp/server.log 2>&1 &
echo $! > server.pid

# Wait for server to be ready with retries
for i in {1..30}; do
if curl -sf http://127.0.0.1:8000/api/health >/dev/null 2>&1; then
echo "Server is ready"
break
fi
echo "Waiting for server... attempt $i/30"
sleep 1
done

- name: Check /api/health
run: |
for i in {1..10}; do
if curl -sf http://127.0.0.1:8000/api/health > /tmp/health.json; then
cat /tmp/health.json
exit 0
fi
sleep 2
done
echo "Health endpoint not responding"
cat /tmp/server.log || true
exit 1

- name: Check /docs
run: |
curl -sf http://127.0.0.1:8000/docs > /tmp/docs.html
grep -i "swagger" /tmp/docs.html

- name: Stop server
if: always()
run: |
if [ -f server.pid ]; then kill $(cat server.pid) || true; fi

- name: Dump server logs on failure
if: failure()
run: |
cat /tmp/server.log || true
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ __pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid

OpenManus.code-workspace
# SageMath parsed files
*.sage.py

Expand Down
18 changes: 18 additions & 0 deletions .openhands/skills/code-review.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
name: code-review
type: knowledge
version: 1.0
agent: Manus
triggers:
- review
- bug
- regression
- security
- test
---
Code review workflow:
1. Prioritize correctness, regressions, missing tests, and security issues.
2. Ground findings in exact files, functions, or observable behavior.
3. Verify suspicious behavior by reading the caller and callee, not just one file.
4. Keep style-only notes secondary unless they block maintainability.
5. When implementing fixes, run focused tests and inspect the resulting diff.
18 changes: 18 additions & 0 deletions .openhands/skills/docker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
name: docker
type: knowledge
version: 1.0
agent: Manus
triggers:
- docker
- container
- compose
- port
- server
---
Docker workflow:
1. Inspect `docker compose ps`, container logs, and exposed ports before guessing.
2. Keep long-running dev servers in the background and write logs to a file in the conversation workspace.
3. After starting a server, verify it is listening with `ss -tlnp` or `curl`.
4. Report the reachable URL and leave enough runtime evidence for the UI process panel.
5. Do not stop OpenManus system containers unless explicitly asked.
Loading