Skip to content

Commit 2378b2e

Browse files
committed
Feature the RMP architecture diagram and refresh the README.
Add the Hyper-AI-Lab architecture hero image, document the galaxy web stack and canary soft-fail behavior, and replace the old flow chart with an up-to-date mermaid control-plane diagram.
1 parent 14e8f05 commit 2378b2e

3 files changed

Lines changed: 80 additions & 28 deletions

File tree

README.md

Lines changed: 80 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
# Aura
22

3+
![Aura: The Reliability & Memory Plane for Production Slack Agents](docs/assets/AI_Agent_Reliability_Architecture.jpg)
4+
35
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
46
[![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg)](requirements.txt)
57
[![OpenClaw](https://img.shields.io/badge/runtime-OpenClaw-0ea5e9.svg)](https://github.com/openclaw/openclaw)
68
[![Org](https://img.shields.io/badge/org-Hyper--AI--Lab-111827.svg)](https://github.com/Hyper-AI-Lab)
79

810
**Aura is a reliability & memory control plane for a production Slack agent.**
9-
It sits beside [OpenClaw](https://github.com/openclaw/openclaw) and turns every user turn into a durable Temporal workflow: intake routing, process memory, evidence gates, idempotent Slack delivery, and multi-key LLM orchestration.
11+
It sits beside [OpenClaw](https://github.com/openclaw/openclaw) and turns every user turn into a durable Temporal workflow: intake routing, process memory, evidence gates, idempotent Slack delivery, multi-key LLM orchestration, and a routed galaxy web-research stack.
1012

1113
Built by [Hyper-AI-Lab](https://github.com/Hyper-AI-Lab) · Homepage: [hyperailab.com](https://hyperailab.com/)
1214

@@ -20,6 +22,7 @@ Chat-agent stacks are great at tools and models — and terrible at **ops truth*
2022
- Sessions forget process context across turns
2123
- Rate limits stall the whole agent with no fair key rotation
2224
- “Done” is whatever the model claimed, not what evidence allows
25+
- Canary restarts can kill mid-flight user work if remediation is too aggressive
2326

2427
Aura (the **Reliability & Memory Plane**, RMP) is the sidecar that owns those guarantees while OpenClaw stays the execution engine.
2528

@@ -30,56 +33,98 @@ Aura (the **Reliability & Memory Plane**, RMP) is the sidecar that owns those gu
3033
| Durable task intake | 3-layer funnel (fast path → vector gate → LLM classify) with `off` / `shadow` / `enforce` modes |
3134
| Workflow control plane | Temporal `GenericTask` / `CatalogTask` workflows, child steps, reconciler + janitor |
3235
| Process memory | Process-scoped recall + promotion; Qdrant vectors (`nv-embed-v1`) |
33-
| Slack ownership | OpenClaw plugin routes DMs to RMP; RMP posts the final reply (no double-send) |
34-
| LLM orchestration | Balanced NVIDIA key rotation, concurrency caps, cooldowns, usage ledger |
35-
| Production gates | Readiness API, hourly canaries, patch verify, backup/restore runbooks |
36+
| Slack ownership | OpenClaw plugin routes DMs to RMP; RMP posts the final reply (no double-send / no native fallback) |
37+
| LLM orchestration | Balanced NVIDIA key rotation, concurrency caps, fast idle rotate (~5s), usage ledger |
38+
| Galaxy web stack | Brave + LangSearch search; Jina Reader; Crawl4AI / Scrapling / Crawlee / ScrapeGraphAI; OpenClaw `browser` + browser-use + Obscura CDP |
39+
| Web capability routing | Intake analyzer picks `search` / `fetch` / `crawl` / `extract` / `interact` and injects a tool brief |
40+
| Production gates | Readiness API, hourly canaries with **soft-fail deferral** (no worker restart while user tasks run), orphan-reply Slack recovery |
3641

3742
## Architecture
3843

44+
Hero diagram (full system narrative):
45+
46+
<p align="center">
47+
<img src="docs/assets/AI_Agent_Reliability_Architecture.jpg" alt="Aura RMP architecture" width="100%" />
48+
</p>
49+
50+
Full-resolution PNG: [`docs/assets/AI_Agent_Reliability_Architecture.png`](docs/assets/AI_Agent_Reliability_Architecture.png)
51+
### Control-plane flow (current)
52+
3953
```mermaid
40-
flowchart LR
41-
User["Slack user"] --> OC["OpenClaw gateway"]
42-
OC --> Plugin["rmp_adapter plugin"]
43-
Plugin -->|"POST /tasks"| API["RMP FastAPI"]
44-
API --> Temporal["Temporal workflows"]
45-
Temporal --> Worker["rmp-worker"]
46-
Worker -->|"hooks/agent"| OC
54+
flowchart TD
55+
User["Slack_user_DM"] --> OC["OpenClaw_gateway"]
56+
OC --> Plugin["rmp_adapter_claim"]
57+
Plugin -->|"POST_/tasks"| API["RMP_FastAPI"]
58+
API --> Intake["3_layer_intake"]
59+
Intake --> WebCap["WebCapabilityAnalyzer"]
60+
Intake --> Mode{"execution_mode"}
61+
Mode -->|conversational_or_structured| Generic["GenericTaskWorkflow"]
62+
Mode -->|interact_gated| Catalog["CatalogTask_browser_automation"]
63+
WebCap -.->|preferred_tools_brief| Generic
64+
WebCap -.->|preferred_tools_brief| Catalog
65+
Generic --> Worker["rmp_worker"]
66+
Catalog --> Worker
67+
Worker -->|"hooks/agent_rmp_task"| OC2["OpenClaw_execution"]
68+
OC2 --> Tools["Tools"]
69+
Tools --> Native["web_search_web_fetch_browser"]
70+
Tools --> AuraWeb["aura_web_plugin"]
71+
AuraWeb --> LangSearch["LangSearch"]
72+
AuraWeb --> Jina["Jina_Reader"]
73+
AuraWeb --> Stack["web_stack_:8791"]
74+
Stack --> Crawl4AI
75+
Stack --> Scrapling
76+
Stack --> Crawlee
77+
Stack --> ScrapeGraph
78+
Stack --> BrowserUse["browser_use"]
79+
Stack --> Obscura["Obscura_CDP_:9222"]
4780
Worker --> PG["PostgreSQL"]
4881
Worker --> Qdrant["Qdrant"]
49-
Worker -->|"notify_slack_user"| Slack["Slack DM"]
82+
Worker -->|"notify_slack_user"| Slack["Slack_DM_idempotent"]
83+
Canary["hourly_health_canary"] --> Sentinel["canary_sentinel"]
84+
Sentinel -->|"soft_timeout_+_active_users"| Defer["defer_worker_restart"]
85+
Sentinel -->|"hard_stale_or_code_sync"| Restart["restart_rmp_api_worker"]
86+
Reconciler["reconciler"] -->|"orphan_OpenClaw_reply"| Slack
5087
```
5188

5289
| Layer | Role |
5390
| --- | --- |
54-
| **OpenClaw** | Slack socket, LLM/tools, isolated `rmp_task_*` sessions |
55-
| **RMP (`app/`)** | API, workflows, intake, memory, quota broker, evidence |
56-
| **Plugin (`plugins/rmp_adapter`)** | Intercepts Slack → creates RMP tasks; suppresses native double-posts |
91+
| **OpenClaw** | Slack socket, LLM/tools, isolated `rmp_task_*` sessions (execution only — not Slack delivery owner) |
92+
| **RMP (`app/`)** | API, workflows, intake, memory, quota broker, evidence, canary sentinel, reconciler |
93+
| **Plugin (`plugins/rmp_adapter`)** | Intercepts Slack → creates RMP tasks; suppresses native double-posts (fail closed) |
94+
| **Web (`plugins/aura_web`, `plugins/langsearch`, `web-stack/`)** | Multi-backend search/fetch/crawl/extract/browser tools + localhost FastAPI backends |
95+
96+
**Binding rules:** every Slack DM goes through RMP; MiniMax M3 is the primary chat model; LLM idle silence fails fast (~5s) and rotates NVIDIA keys.
5797

5898
Deep dive: [`ARCHITECTURE.md`](ARCHITECTURE.md) · Runbooks: [`docs/runbooks/`](docs/runbooks/)
5999

60100
## Repository layout
61101

62102
```text
63103
aura/
64-
├── app/ # FastAPI + Temporal + memory + intake
65-
├── plugins/rmp_adapter/ # OpenClaw plugin
66-
├── ops/ # Canaries, backup, janitor, patch verify
67-
├── tests/ # Pytest suite
68-
├── docs/ # Runbooks + planning history
69-
├── patch_openclaw.sh # Re-apply dist patches after OpenClaw upgrades
70-
├── settings.example.json # Config template (no secrets)
71-
├── worker.py # Temporal worker entrypoint
72-
└── ARCHITECTURE.md # Full system design
104+
├── app/ # FastAPI + Temporal + memory + intake + web routing
105+
├── plugins/
106+
│ ├── rmp_adapter/ # Slack claim → RMP tasks
107+
│ ├── aura_web/ # Galaxy web tools (Jina, Crawl4AI, …)
108+
│ └── langsearch/ # LangSearch web_search provider + API key holder
109+
├── web-stack/ # Local FastAPI backends + Obscura compose/systemd
110+
├── ops/ # Canaries, backup, janitor, patch verify
111+
├── tests/ # Pytest suite
112+
├── docs/ # Runbooks, history, architecture assets
113+
├── patch_openclaw.sh # Re-apply dist patches after OpenClaw upgrades
114+
├── settings.example.json # Config template (no secrets)
115+
├── worker.py # Temporal worker entrypoint
116+
└── ARCHITECTURE.md # Full system design
73117
```
74118

75119
## Quick start
76120

77121
### Prerequisites
78122

79-
- Linux host (or VM) with Docker optional for Qdrant/observability
123+
- Linux host (or VM) with Docker optional for Qdrant / Obscura / observability
80124
- Python 3.12+, Node.js ≥ 22.23 (OpenClaw engines)
81125
- PostgreSQL, Temporal, [OpenClaw](https://github.com/openclaw/openclaw) gateway
82126
- NVIDIA NIM (or compatible) API keys for chat + embeddings
127+
- Optional: Brave + [LangSearch](https://langsearch.com/) API keys; Obscura image `h4ckf0r0day/obscura`
83128

84129
### Setup
85130

@@ -92,10 +137,13 @@ pip install -r requirements.txt
92137
cp settings.example.json settings.json
93138
# set api_key, production.slack_owner_user_id, vector/qdrant, task_registry.intake_mode
94139

95-
# Link plugin into your OpenClaw plugins dir, then:
140+
# Link plugins into your OpenClaw plugins dir (rmp_adapter, aura_web, langsearch), then:
96141
bash patch_openclaw.sh
97142
bash ops/verify_openclaw_patch.sh
98143

144+
# Optional galaxy web backends + Obscura CDP
145+
# systemctl enable --now aura-web-backends aura-obscura
146+
99147
# Start API + worker (systemd units or process manager of your choice)
100148
# then:
101149
make production-check
@@ -107,14 +155,18 @@ make production-check
107155
make production-check # health + OpenClaw patch verify + intake canaries
108156
make canary # manual E2E canary task
109157
pytest -q # unit/integration tests
158+
curl -s http://127.0.0.1:8791/health # web-stack backends (if enabled)
110159
```
111160

112161
## Configuration notes
113162

114163
- **Never commit** `settings.json`, `.env`, auth profiles, or `data/`.
115164
- Example config: [`settings.example.json`](settings.example.json).
116-
- After every `npm install -g openclaw`, re-run `patch_openclaw.sh` (hook persistence, Slack suppress, allowUnsafe passthrough for RMP sessions).
117-
- Model stack (typical): MiniMax M3 primary → DeepSeek V4 Flash → GLM-5.2; intake/subagents on DeepSeek Flash.
165+
- LangSearch / Jina keys live in OpenClaw `plugins.entries.*` (not this repo).
166+
- Obscura remote mode: `OBSCURA_CDP_URL=http://127.0.0.1:9222` (Hermes-compatible).
167+
- After every `npm install -g openclaw`, re-run `patch_openclaw.sh` (hook persistence, Slack suppress, allowUnsafe passthrough, ~5s LLM idle).
168+
- Model stack (typical): MiniMax M3 primary → DeepSeek V4 Flash → GLM-5.2; intake/subagents on DeepSeek Flash.
169+
- Health canary **soft** failures (`timeout`/`failed`) defer worker restart while user tasks are active; reconciler can recover finished OpenClaw replies to Slack if delivery was interrupted.
118170

119171
## Status
120172

473 KB
Loading
2.96 MB
Loading

0 commit comments

Comments
 (0)