You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
v5.1.1 — Enterprise-Grade Autonomous AI Agent Framework (Bug-Fix Patch)
A production-ready, self-reasoning AI agent framework with PAORR loop, DAG-based multi-agent orchestration, defense-in-depth security, 100+ LLM providers (cloud + offline/GGUF/HuggingFace), 13+ messaging channels, voice interaction, live canvas, SSH server, cron scheduler, and enterprise observability.
v5.1.1 is a maintenance release that resolves 32 bugs discovered in v5.1.0 across the agent core, security layer, FastAPI server, cron scheduler, secrets redaction, and multi-agent role pipeline. See CHANGELOG.md for the full audit trail.
ManusClaw v5.1 introduces enterprise-grade capabilities that transform it from a powerful agent framework into a production-ready AI operations platform.
Category
Highlights
Event System
17 discriminated union event types, LLMConvertibleEvent, file-backed EventLog with O(1) length, crash-proof atomic writes
v5.1.1 is a maintenance release that closes 32 bugs across the agent core, security layer, FastAPI server, cron scheduler, secrets redaction, multi-agent role pipeline, and observability subsystem. All fixes are covered by the existing test suite plus two new regression tests; the full suite runs 212 passed, 2 skipped, 0 failed.
Critical Runtime Fixes
#
Component
Bug
Fix
1
app/agent/router.py
AgentRegistry._evict_idle was declared async but called from sync get()/put() without await — eviction never ran, so idle-TTL test expected None but got the cached agent.
Converted _evict_idle to a sync method; agent cleanup() coroutines are scheduled fire-and-forget via _safe_create_task. Also fixed LRU put() path that moved-to-end but did not overwrite the stored agent when re-inserting an existing key.
2
app/cli.py
logger was referenced in two functions without being imported → NameError on the Spinner long-operation exit path and the background-task checkpoint-restore path.
Local from app.logger import logger as _logger imports at the use-site.
3
app/conversation/stuck_detector.py
_action_fingerprint referenced undefined tool_call instead of the local tool_name → NameError on every action without a .function attribute, breaking stuck detection.
Use tool_name consistently.
4
app/integrations/slack.py
re was used in @self._bolt_app.action(re.compile(...)) but never imported → NameError on Slack Bolt action-handler registration.
Added import re.
5
app/server/webhook_router.py
Route ordering bug: @router.post("/{hook_id}") was declared before @router.post("/create"), so FastAPI matched the parameterised path first and POST /webhooks/create returned 404 ("Webhook 'create' not found"). Create / list / delete all broken via HTTP.
Reordered the router so literal sub-paths (/create, /sign/{hook_id}) come before the parameterised catch-all. Added regression tests using the real FastAPI TestClient.
6
app/observability/health.py
LLMHealthChecker._test_api_call was def (sync) but called llm.ask(...) which is async → returned a coroutine object that was silently discarded (F841 result). The health check would always report success regardless of the LLM's actual state.
Bridge the sync/async boundary via a worker thread running asyncio.run. Also fixed the call signature: LLM.ask takes a list of Message objects, not a string.
7
app/llm/profile_rotation.py
ModelProfile.default() exception fallback called cls(name="default") but __init__ does not accept name → TypeError masked the original error.
Construct the profile first, then set .name.
8
app/llm/credential_pool.py
Forward-reference "ModelProfile" triggered F821 (undefined name) under strict type checking.
Use TYPE_CHECKING import so the symbol is resolvable for type checkers without creating a runtime circular import.
9
app/observability/metrics.py
Union was used in three module-level type hints but never imported → F821 on module import under strict checkers.
Added Union to the existing typing import.
10
app/voice/talk.py
Any was used in two instance-variable annotations but never imported → F821.
Added Any to the existing typing import.
Logic & Correctness Fixes
#
Component
Bug
Fix
11
app/cron.py
_JOBS_FILE = Path(os.getenv(...)) was evaluated ONCE at module import. Runtime changes to MANUSCLAW_CRON_FILE (tests, profile switching, CLI overrides) were silently ignored.
Replaced with _get_jobs_file() lazy resolver called inside _load_jobs / _save_jobs.
12
app/cron.py
manusclaw-cron --trigger JOB did not return after triggering → fell through to asyncio.run(scheduler.run_forever()) and blocked the terminal forever.
Added return.
13
app/cron.py
--list output overwrote output on every loop iteration (output = f"{t}") instead of appending, so only the LAST output_target was ever shown.
Use output += f" {t}" and strip.
14
app/skills/skill_engine.py
Same module-level-eval bug as cron.py: _SKILLS_DIR was set at import time and ignored subsequent MANUSCLAW_SKILLS_DIR changes.
Replaced with _get_skills_dir() lazy resolver; updated _load_user() and create() to call it.
15
app/tool/memory_tool.py
Same bug: _WORKSPACE / MEMORY_FILE / USER_FILE frozen at import. The tmp_workspace pytest fixture set MANUSCLAW_WORKSPACE at runtime, but MemoryTool.execute() still wrote to the import-time path — tests passed only because they manually monkey-patched mt.MEMORY_FILE.
Added _get_workspace() / _memory_file() / _user_file() lazy resolvers; rewrote execute() to use them.
16
app/task_queue.py
Same bug: _WORKSPACE / _DB_PATH evaluated at import.
Added _get_db_path() lazy resolver; TaskQueue.__init__ calls it when no explicit path is provided.
17
app/llm/secret_redaction.py
AWS-secret pattern used a non-capturing prefix group `(?:secret_key...
aws_secret...)soredact()replaced the entire match including the prefix —secret_key=ABC...becameREDACTED` (prefix lost).
18
app/integrations/resolver.py
clear_results(older_than_hours=24) computed cutoff but never used it — every terminal-status result was removed regardless of age, breaking the documented "older than N hours" contract.
Now uses started_at to filter by age, with a safe default (keep results we can't prove are old enough).
Resource Leak Fixes
#
Component
Bug
Fix
19
app/agent/roles/engineer.py
Manus() instances were created for the main pass and the retry pass but cleanup() was never called → leaked Bash subprocesses (and any other tool resources) for the lifetime of the process.
Wrapped each Manus run in try/finally with a _cleanup_agent helper.
20
app/agent/roles/qa.py
Same leak as engineer.py: the QA Manus agent was never cleaned up.
Added try/finally with cleanup call.
Test Pollution Fix
#
Component
Bug
Fix
21
tests/test_voice.py
test_get_tts_provider_returns_nulltts_stub did tts_mod._create_provider = lambda name: ... — a permanent module-level monkeypatch that leaked into every subsequent test in the file, causing test_get_tts_provider_preferred_openai to receive NullTTS instead of OpenAITTS.
Use the monkeypatch fixture so the override is automatically restored at test teardown.
Dead-Code / F841 Cleanup
#
Component
Issue
Resolution
22
app/canvas/tool.py
_add_chart captured state = await self._server.update(...) but never used it.
Now reports the resulting component count for consistency with the other canvas method.
23
app/file_store/s3.py
write_stream computed key = self._make_key(path) but never used it.
Removed the assignment but kept the call for its path-traversal-validation side-effect.
24
app/conversation/local_conversation.py
_do_fork computed fork_log_path but never used it.
Now logged at DEBUG level so the path is visible in diagnostics.
HTTP smoke test: FastAPI TestClient hits against /healthz, /, /tools, /sessions, /webhooks (create / list / trigger-with-HMAC / delete) all pass.
Path-traversal audit:LocalFileStore._resolve() rejects ../../../etc/passwd, /etc/passwd, a/../../b, ../outside, subdir/../../../etc/passwd — all blocked with FileStorePermissionError.
Module import audit: all 133 main modules import cleanly under Python 3.12.
🌟 Overview
ManusClaw is an enterprise-grade autonomous AI agent framework that empowers Large Language Models to plan, execute code, browse the web, manage files, resolve issues, and complete complex multi-step tasks — all autonomously.
At its core is the PAORR reasoning loop (Plan → Act → Observe → Reflect → Retry), a self-correcting execution model. Combined with DAG-based multi-agent orchestration, defense-in-depth security, offline LLM support (GGUF/HuggingFace/Ollama), and enterprise observability, ManusClaw runs anywhere — cloud, local, or fully air-gapped.
Why ManusClaw?
Challenge
ManusClaw Solution
Vendor lock-in
100+ cloud providers + offline GGUF/HuggingFace/Ollama with credential rotation and model failover
No internet access
Fully offline: GGUF via llama-cpp-python, HuggingFace local, Ollama local — zero cloud dependency
No persistence
SQLite-backed sessions, event logs, task queues — all survive restarts
The PAORR loop is the heart of ManusClaw — a self-correcting reasoning cycle that plans, acts, observes, reflects, and retries until the task is complete.
Feature
Description
PAORR Loop
Plan → Act → Observe → Reflect → Retry — autonomous self-correction at every step
Self-Check
Manus agent performs self-check every 3 steps to verify progress
Multi-Agent Orchestrator
DAG-based pipeline with topological sorting (Kahn's algorithm), event hooks, global timeout
Role Pipeline
ProductManager → Architect → Engineer → QA with typed RoleResult and RoleMessageBus
Agent Router
Per-channel and per-account routing with LRU cache (64 entries, 300s idle TTL)
Agent Registry
Dynamic agent class import (sandboxed to app. namespace) with idle eviction + cleanup
Identity Guard
30+ anti-jailbreak patterns in 9 languages (English, Chinese, Spanish, French, German, Portuguese, Japanese, Korean, Russian)
FastAPI /secrets endpoints — never exposes raw values (masked with ***)
Key Rotation
Cipher supports key rotation with add_key() for seamless rotation
📦 File Storage Backends
Backend
Use Case
Key Feature
Local
Filesystem storage (default)
Atomic writes, sidecar .meta.json, streaming
S3
AWS S3 / MinIO
Presigned URLs, retry with backoff, async executor
GCS
Google Cloud Storage
Signed URLs (v4), retry with backoff, async executor
In-Memory
Testing and ephemeral
Full metadata tracking, size limits
Factory auto-detection from MANUSCLAW_FILE_STORE_BACKEND env var, config, or explicit parameter.
🔀 Git Provider Integrations
Provider
OAuth
PRs/MRs
Issues
Branches
Files
Suggested Tasks
Webhooks
GitHub
✅
✅
✅
✅
✅
✅
✅
GitLab
✅
✅
✅
✅
✅
✅
✅
Azure DevOps
✅
✅
✅ (Work Items)
✅
✅
✅
✅
Bitbucket
✅
✅
✅
✅
✅
✅
✅
Forgejo
✅
✅
✅
✅
✅
✅
✅
All providers implement a unified GitProviderService interface with both sync and async methods, thread-safety, rate limiting, and exponential backoff.
At least one LLM API key (or use free Pollinations/OpenCode providers — no key needed!)
Or run fully offline with GGUF/Ollama/HuggingFace — no internet needed!
Installation
# Clone the repository
git clone https://github.com/manusagents/manusclaw.git
cd manusclaw
# Install dependencies
pip install -e .# Or install with all enterprise features
pip install -e ".[all-plus]"# Configure your API key
cp config.toml config.toml.local
# Edit config.toml with your API keys, or set env vars:export OPENAI_API_KEY=sk-...
# Run your first task
python main.py "Create a Python script that generates Fibonacci numbers"
Free / No API Key Required
# Use Pollinations (free, no key)# Set in config.toml: provider = "pollinations"# Or use OpenCode (free deepseek-v4-flash)# Set in config.toml: provider = "opencode"
Fully Offline (Air-Gapped)
# GGUF — download any .gguf model and run with zero internet# Set in config.toml:# provider = "gguf"# model_path = "/path/to/model.gguf"# n_gpu_layers = 0 # set >0 for GPU acceleration# Ollama — run ollama serve, then:# provider = "ollama"# model = "llama3"# HuggingFace — use Inference API, Spaces, or local models# provider = "huggingface"# model = "meta-llama/Llama-3-8B"
Manusclaw: Unleash self-reasoning CLI beasts to execute code, browse the web, and dominate tasks — across 12+ messaging channels, with voice wake, live canvas, SSH control, and multi-agent routing. No limits. Pure power.