diff --git a/README.md b/README.md index b78fafa32..b7cb403fc 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # π¦ Moltbot β Personal AI Assistant
-
+
@@ -52,47 +52,7 @@ moltbot onboard --install-daemon
The wizard installs the Gateway daemon (launchd/systemd user service) so it stays running.
Legacy note: `clawdbot` remains available as a compatibility shim.
-
-
-Diagram source (Mermaid)
-
-```mermaid
-graph LR
- subgraph Channels [Messaging Channels]
- WA[WhatsApp]
- TG[Telegram]
- SL[Slack]
- DC[Discord]
- SIG[Signal]
- IM[iMessage]
- WC[WebChat]
- MORE[+ more]
- end
-
- GW[Gateway\nWebSocket + HTTP\nControl Plane]
-
- subgraph Agent [AI Agent]
- RT[Runtime\npi-agent-core]
- SK[Skills]
- MEM[Memory]
- end
-
- subgraph Tools [Agent Tools]
- EXEC[Shell / FS]
- BR[Browser]
- MSG[Messaging]
- CRON[Cron / Automation]
- end
-
- Channels -->|inbound| GW
- GW -->|route + queue| Agent
- Agent -->|tool calls| Tools
- Agent -->|reply| GW
- GW -->|outbound| Channels
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- subgraph MainSession [Main Session Job]
- MS1[Schedule Triggers] --> MS2[Enqueue System Event]
- MS2 --> MS3{Wake Mode?}
- MS3 -->|next-heartbeat| MS4[Wait for Next Heartbeat]
- MS3 -->|now| MS5[Immediate Heartbeat]
- MS4 --> MS6[Run in Main Session Context]
- MS5 --> MS6
- end
-
- subgraph IsolatedSession [Isolated Session Job]
- IS1[Schedule Triggers] --> IS2[Create Fresh Session\ncron:jobId]
- IS2 --> IS3[Run Dedicated Agent Turn]
- IS3 --> IS4[Post Summary to Main]
- IS4 --> IS5{Deliver?}
- IS5 -->|Yes| IS6[Send to Channel Target]
- IS5 -->|No| IS7[Internal Only]
- end
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-sequenceDiagram
- participant EXT as External System
- participant WH as Gateway /hooks
- participant AUTH as Auth Check
- participant GW as Gateway Core
-
- EXT->>WH: POST /hooks/wake or /hooks/agent
- WH->>AUTH: Verify token (Bearer / header / query)
- alt Token valid
- AUTH->>WH: OK
- alt /hooks/wake
- WH->>GW: Enqueue system event
- GW->>GW: Trigger heartbeat (if mode=now)
- WH-->>EXT: 200 OK
- else /hooks/agent
- WH->>GW: Start isolated agent run
- GW->>GW: Post summary to main session
- GW->>GW: Deliver to channel (if configured)
- WH-->>EXT: 202 Accepted
- else /hooks/Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- MSG[Incoming Message] --> ALLOW{Channel Allowlist\n+ Group Activation?}
- ALLOW -->|Blocked| DROP[Ignored]
- ALLOW -->|Allowed| BC{Peer in\nBroadcast Config?}
- BC -->|No| NORMAL[Normal Routing\nSingle agent via bindings]
- BC -->|Yes| AGENTS[Get Agent List\nfor this peer]
- AGENTS --> STRAT{Strategy?}
- STRAT -->|parallel| PAR[Run All Agents\nSimultaneously]
- STRAT -->|sequential| SEQ[Run Agents\nIn Order]
- PAR --> ISO1[Agent A\nIsolated Session]
- PAR --> ISO2[Agent B\nIsolated Session]
- PAR --> ISO3[Agent C\nIsolated Session]
- SEQ --> ISO1
- ISO1 --> |done| ISO2
- ISO2 --> |done| ISO3
- ISO1 & ISO2 & ISO3 --> DELIVER[Deliver Replies\nto Same Chat]
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-stateDiagram-v2
- [*] --> Intake: Inbound message / RPC
- Intake --> ContextAssembly: Resolve session + workspace
- ContextAssembly --> PromptBuild: Load skills, bootstrap files
- PromptBuild --> ModelInference: System prompt + history
- ModelInference --> ToolExecution: Tool calls returned
- ToolExecution --> ModelInference: Tool results fed back
- ModelInference --> Streaming: Assistant text deltas
- Streaming --> Persistence: Final reply assembled
- Persistence --> [*]: Session updated + reply delivered
-
- ModelInference --> Compaction: Context limit hit
- Compaction --> ModelInference: Retry with compacted context
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-sequenceDiagram
- participant GW as Gateway
- participant HOOK as Plugin Hooks
- participant AGENT as Agent Runtime
- participant MODEL as Model API
- participant TOOL as Tool Execution
-
- GW->>HOOK: gateway_start
- Note over GW: Gateway initializes
-
- GW->>HOOK: message_received
- GW->>HOOK: session_start
- GW->>HOOK: before_agent_start
- GW->>AGENT: Start agent run
- AGENT->>MODEL: Send prompt + context
-
- loop Tool Loop
- MODEL->>AGENT: Tool call request
- AGENT->>HOOK: before_tool_call
- AGENT->>TOOL: Execute tool
- TOOL->>AGENT: Tool result
- AGENT->>HOOK: after_tool_call
- AGENT->>HOOK: tool_result_persist
- AGENT->>MODEL: Feed result back
- end
-
- MODEL->>AGENT: Final assistant reply
- AGENT->>HOOK: agent_end
- GW->>HOOK: message_sending
- Note over GW: Deliver reply
- GW->>HOOK: message_sent
- GW->>HOOK: session_end
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-graph TD
- subgraph Workspace ["Agent Workspace (~/clawd)"]
- AGENTS[AGENTS.md\nOperating instructions]
- SOUL[SOUL.md\nPersona + tone]
- USER[USER.md\nUser profile]
- IDENTITY[IDENTITY.md\nAgent name + emoji]
- TOOLS[TOOLS.md\nTool notes]
- HEARTBEAT[HEARTBEAT.md\nHeartbeat checklist]
- BOOT[BOOT.md\nStartup checklist]
- BOOTSTRAP[BOOTSTRAP.md\nFirst-run ritual]
-
- subgraph MemoryDir [memory/]
- DAILY[YYYY-MM-DD.md\nDaily logs]
- end
-
- MEMORY_MD[MEMORY.md\nLong-term memory]
-
- subgraph SkillsDir [skills/]
- SKILL[Custom skills]
- end
-
- subgraph CanvasDir [canvas/]
- CANVAS_HTML[index.html\nCanvas UI]
- end
- end
-
- subgraph StateDir ["State Directory (~/.clawdbot)"]
- CONFIG[moltbot.json\nConfiguration]
- CREDS[credentials/\nOAuth, API keys]
- SESSIONS[agents/agentId/sessions/\nTranscripts + metadata]
- MANAGED_SKILLS[skills/\nManaged skills]
- end
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-graph TD
- subgraph Channels
- WA[WhatsApp/Baileys]
- TG[Telegram/grammY]
- SL[Slack]
- DC[Discord]
- SIG[Signal]
- IM[iMessage]
- WC[WebChat]
- end
-
- subgraph Clients
- CLI[CLI]
- MAC[macOS App]
- WEB[Web UI]
- AUTO[Automations]
- end
-
- subgraph Nodes
- MACOS_N[macOS Node]
- IOS_N[iOS Node]
- AND_N[Android Node]
- HEAD_N[Headless Node]
- end
-
- GW[Gateway\nWebSocket Server\n127.0.0.1:18789]
-
- WA & TG & SL & DC & SIG & IM & WC --> GW
- CLI & MAC & WEB & AUTO -->|WS: role=operator| GW
- MACOS_N & IOS_N & AND_N & HEAD_N -->|WS: role=node| GW
-
- GW --> AGENT[Agent Runtime\npi-agent-core]
- AGENT --> TOOLS[Tools\nbrowser, exec, canvas,\nmessage, cron, nodes]
-
- CANVAS[Canvas Host\n:18793]
- GW -.-> CANVAS
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- MSG[Inbound Message] --> P1{Exact Peer Match?}
- P1 -->|Yes| FOUND[Agent Found]
- P1 -->|No| P2{Guild Match?\nDiscord guildId}
- P2 -->|Yes| FOUND
- P2 -->|No| P3{Team Match?\nSlack teamId}
- P3 -->|Yes| FOUND
- P3 -->|No| P4{Account Match?\naccountId}
- P4 -->|Yes| FOUND
- P4 -->|No| P5{Channel Match?\nany account}
- P5 -->|Yes| FOUND
- P5 -->|No| P6[Default Agent\nagents.list default\nor first entry\nor 'main']
- P6 --> FOUND
- FOUND --> WS[Workspace + Session Store]
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- MSG[Inbound Message\nfrom peer] --> BC{Peer in\nBroadcast Config?}
- BC -->|Yes| MULTI[Broadcast:\nAll listed agents process\nisolated sessions each]
- BC -->|No| BIND{Peer in\nBindings?}
- BIND -->|Yes| SINGLE[Normal Routing:\nOne matched agent]
- BIND -->|No| DEFAULT[Default Agent\nfallback routing]
-
- MULTI --> REPLY_M[Multiple Replies\nfrom each agent]
- SINGLE --> REPLY_S[Single Reply]
- DEFAULT --> REPLY_S
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- A[Session Messages Accumulate] --> B{Near Context Limit?}
- B -->|No| C[Continue Normally]
- B -->|Yes| D{Memory Flush Enabled?}
- D -->|Yes| E[Silent Memory Flush Turn\nWrite durable notes to disk]
- D -->|No| F[Skip Flush]
- E --> F
- F --> G[Auto-Compaction Triggered]
- G --> H[Summarize Older Messages]
- H --> I[Store Compaction Summary\nin Session JSONL]
- I --> J[Keep Recent Messages Intact]
- J --> K[Retry Original Request\nwith Compacted Context]
- K --> C
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- subgraph WorkspaceFiles [Workspace Memory Files]
- MEM_MD[MEMORY.md\nCurated long-term]
- DAILY[memory/YYYY-MM-DD.md\nDaily logs]
- end
-
- subgraph VectorIndex [Vector Memory Search]
- EMB[Embedding Provider\nOpenAI / Gemini / Local]
- IDX[SQLite Index\n~/.clawdbot/memory/agentId.sqlite]
- BM25[BM25 Full-Text\nKeyword matching]
- end
-
- subgraph FlushCycle [Pre-Compaction Flush]
- NEAR[Session Nears Limit] --> FLUSH[Silent Memory Flush Turn]
- FLUSH --> WRITE[Write Notes to Disk]
- WRITE --> COMPACT[Compaction Proceeds]
- end
-
- MEM_MD --> EMB
- DAILY --> EMB
- EMB --> IDX
- IDX --> SEARCH[memory_search Tool]
- BM25 --> SEARCH
- MEM_MD --> READ[memory_get Tool]
- DAILY --> READ
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- A[Inbound Message] --> B{Dedupe Cache}
- B -->|Duplicate| DROP[Drop]
- B -->|New| C{Debounce Window}
- C -->|Batched| D[Combined Message]
- C -->|Single| D
- D --> E[Routing / Bindings]
- E --> F[Session Key Resolution]
- F --> G{Run Active?}
- G -->|No| H[Start Agent Run]
- G -->|Yes| I{Queue Mode}
- I -->|steer| J[Inject into Current Run]
- I -->|followup| K[Queue for Next Turn]
- I -->|collect| L[Coalesce into Single Followup]
- H --> M[Streaming + Tools]
- J --> M
- K --> M
- L --> M
- M --> N[Outbound Reply]
- N --> O[Channel Chunking + Limits]
- O --> P[Delivered]
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- REQ[Agent Run Request] --> PROF[Select Auth Profile\nSession-pinned or round-robin]
- PROF --> CALL[API Call to Provider]
- CALL --> OK{Success?}
- OK -->|Yes| DONE[Run Completes]
- OK -->|No| ERR{Error Type?}
- ERR -->|Rate limit / Auth| CD[Cooldown Profile\nExponential: 1m β 5m β 25m β 1hr]
- ERR -->|Billing / Credits| DIS[Disable Profile\n5hr β 24hr backoff]
- ERR -->|Format / Invalid| CD
- CD --> NEXT{More Profiles\nfor Provider?}
- DIS --> NEXT
- NEXT -->|Yes| PROF
- NEXT -->|No| FB{Model Fallbacks\nConfigured?}
- FB -->|Yes| SWITCH[Switch to Next Model\nin fallbacks list]
- FB -->|No| FAIL[Run Fails]
- SWITCH --> PROF
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-graph TD
- GW[Gateway Process] --> A1[Agent: home]
- GW --> A2[Agent: work]
-
- subgraph Agent_home [Agent 'home']
- W1[Workspace\n~/clawd-home]
- S1[Sessions\n~/.clawdbot/agents/home/sessions]
- AP1[Auth Profiles\n~/.clawdbot/agents/home/agent/auth-profiles.json]
- SK1[Skills\n~/clawd-home/skills/]
- end
-
- subgraph Agent_work [Agent 'work']
- W2[Workspace\n~/clawd-work]
- S2[Sessions\n~/.clawdbot/agents/work/sessions]
- AP2[Auth Profiles\n~/.clawdbot/agents/work/agent/auth-profiles.json]
- SK2[Skills\n~/clawd-work/skills/]
- end
-
- B1[Binding: WhatsApp personal] --> A1
- B2[Binding: WhatsApp biz] --> A2
- B3[Binding: Telegram] --> A2
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart LR
- subgraph SessionLanes [Session Lanes\none run per session]
- SL1[session:agent:main:main]
- SL2[session:agent:main:telegram:group:123]
- SL3[session:agent:work:main]
- end
-
- subgraph GlobalLanes [Global Lanes]
- ML[Main Lane\nconcurrency: 4]
- SAL[Subagent Lane\nconcurrency: 8]
- CL[Cron Lane]
- end
-
- SL1 --> ML
- SL2 --> ML
- SL3 --> ML
- SAL -.->|parallel| ML
- CL -.->|parallel| ML
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-stateDiagram-v2
- [*] --> Idle: No active run
-
- Idle --> Running: Message arrives
- Running --> Steer: steer mode\ninject into run
- Running --> Followup: followup mode\nqueue for next turn
- Running --> Collect: collect mode\ncoalesce messages
- Running --> Interrupt: interrupt mode\nabort + run newest
-
- Steer --> Running: Tool boundary reached
- Followup --> Idle: Current run ends
- Followup --> Running: Followup turn starts
- Collect --> Idle: Current run ends
- Collect --> Running: Single combined turn
- Interrupt --> Running: New run starts
-
- Running --> SteerBacklog: steer-backlog mode
- SteerBacklog --> Running: Steer now + preserve for followup
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- CREATE[Session Created\nNew inbound message] --> LOAD[Load Session\nfrom sessions.json + JSONL]
- LOAD --> EXEC[Execute Agent Run\nStreaming + tools]
- EXEC --> UPDATE[Update Session\nAppend to JSONL transcript]
- UPDATE --> CHECK{Near Context Limit?}
- CHECK -->|No| WAIT[Wait for Next Message]
- CHECK -->|Yes| COMPACT[Auto-Compaction\nSummarize + retain recent]
- COMPACT --> WAIT
- WAIT --> RESET{Reset Triggered?}
- RESET -->|Daily reset / idle / /new| ARCHIVE[Archive Session\nFresh session ID]
- RESET -->|No| LOAD
- ARCHIVE --> CREATE
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- MODEL[Model Output\ntext_delta events] --> BS{Block Streaming\nEnabled?}
- BS -->|Off| FINAL[Wait for Final Reply]
- BS -->|On| BREAK{Break Mode?}
- BREAK -->|text_end| CHUNK1[Chunker Emits\nas Buffer Grows]
- BREAK -->|message_end| CHUNK2[Chunker Flushes\nat message_end]
- CHUNK1 --> COAL{Coalesce?}
- CHUNK2 --> COAL
- COAL -->|Yes| MERGE[Merge Consecutive Chunks\nidle-gap based]
- COAL -->|No| SEND[Channel Send]
- MERGE --> SEND
- FINAL --> SEND
- SEND --> LIMIT{Channel Limits}
- LIMIT --> SPLIT[Split by textChunkLimit\npreserve code fences]
- SPLIT --> DELIVER[Delivered to Channel]
-
- MODEL --> TG{Telegram?}
- TG -->|Yes| DRAFT[Draft Bubble\nsendMessageDraft]
- DRAFT --> TGFINAL[Final: Normal Message]
- TG -->|No| BS
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-stateDiagram-v2
- [*] --> NotInstalled
- NotInstalled --> Installing: moltbot gateway install
- Installing --> Installed: LaunchAgent / systemd unit created
- Installed --> Running: Service starts
- Running --> Running: Config hot-reload\nSIGUSR1 in-process restart
- Running --> Stopped: moltbot gateway stop\nSIGTERM
- Stopped --> Running: moltbot gateway restart\nService supervisor
- Running --> Error: Fatal error
- Error --> Running: Supervisor auto-restart\nRestartSec=5
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart LR
- WATCH[File Watcher\n~/.clawdbot/moltbot.json] --> DEBOUNCE[Debounce]
- DEBOUNCE --> ANALYZE{Analyze Changes}
- ANALYZE -->|Safe changes\nthresholds, toggles| HOT[Hot Apply\nNo restart needed]
- ANALYZE -->|Critical changes\nport, auth, channels| RESTART[In-Process Restart\nSIGUSR1]
- ANALYZE -->|reload.mode=off| IGNORE[Ignored]
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-sequenceDiagram
- participant C as Client
- participant G as Gateway
-
- G->>C: event: connect.challenge {nonce, ts}
- C->>G: req: connect {protocol, client, role, scopes, auth, device}
- alt Valid credentials + device
- G->>C: res: hello-ok {protocol, snapshot, policy}
- Note over G,C: Includes presence + health snapshot
- opt New device
- G->>C: hello-ok.auth {deviceToken, role, scopes}
- end
- else Invalid
- G->>C: res: error
- G--xC: Socket closed
- end
-
- loop Normal operation
- C->>G: req {method, params}
- G->>C: res {ok, payload}
- G->>C: event {presence, tick, agent, ...}
- end
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-graph TD
- subgraph Layer1 [Layer 1: Inbound Access Control]
- DM[DM Policy\npairing / allowlist / open / disabled]
- GP[Group Policy\nallowlist + mention gating]
- AL[Allowlists\nper-channel sender lists]
- end
-
- subgraph Layer2 [Layer 2: Tool & Execution Scope]
- TP[Tool Policy\nallow / deny lists]
- SB[Sandboxing\nDocker isolation]
- EL[Elevated Mode\nhost exec gating]
- BR[Browser Control\nprofile isolation]
- end
-
- subgraph Layer3 [Layer 3: Model & Prompt]
- MI[Model Choice\ninstruction-hardened models]
- SP[System Prompt\nsafety rules + persona]
- PI[Prompt Injection\nresistance varies by model]
- end
-
- INBOUND[Inbound Message] --> Layer1
- Layer1 -->|Authorized| Layer2
- Layer1 -->|Blocked| REJECT[Rejected]
- Layer2 -->|Scoped| Layer3
- Layer3 --> AGENT[Agent Executes]
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- START[Install Moltbot] --> OS{Operating System?}
- OS -->|macOS| MAC[macOS]
- OS -->|Linux| LINUX[Linux]
- OS -->|Windows| WIN[Windows WSL2]
- MAC --> METHOD{Install Method?}
- LINUX --> METHOD
- WIN --> WSL[Install WSL2 First] --> METHOD
- METHOD -->|Installer Script| CURL["curl -fsSL https://molt.bot/install.sh | bash"]
- METHOD -->|npm Global| NPM[npm install -g moltbot@latest]
- METHOD -->|From Source| GIT[git clone + pnpm install + pnpm build]
- METHOD -->|Docker| DOCKER[Docker container]
- METHOD -->|Nix| NIX[Nix flake]
- CURL --> ONBOARD[moltbot onboard --install-daemon]
- NPM --> ONBOARD
- GIT --> ONBOARD
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- A[Plugin Discovery] --> B[1. Config Paths\nplugins.load.paths]
- B --> C[2. Workspace Extensions\nworkspace/.clawdbot/extensions/]
- C --> D[3. Global Extensions\n~/.clawdbot/extensions/]
- D --> E[4. Bundled Extensions\nmoltbot/extensions/\ndisabled by default]
-
- E --> F{Duplicate ID?}
- F -->|Yes| G[First Match Wins\nlower-precedence ignored]
- F -->|No| H[Load Plugin]
-
- H --> I{plugins.allow / deny?}
- I -->|Denied| J[Skip Plugin]
- I -->|Allowed| K[Register Plugin]
-
- K --> L[Gateway RPC Methods]
- K --> M[Agent Tools]
- K --> N[CLI Commands]
- K --> O[Background Services]
- K --> P[Skills]
- K --> Q[Plugin Hooks]
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- A[Install Moltbot\nnpm install -g moltbot] --> B[Run Onboarding Wizard\nmoltbot onboard --install-daemon]
- B --> C[Model Auth\nOAuth or API Key]
- C --> D[Gateway Settings\nport, bind, token]
- D --> E[Channel Setup\nWhatsApp / Telegram / etc.]
- E --> F[Pairing Defaults\nSecure DM access]
- F --> G[Workspace Bootstrap\nAGENTS.md, SOUL.md, etc.]
- G --> H[Install Daemon\nlaunchd / systemd]
- H --> I[Gateway Running\nAlways-on service]
- I --> J[Send First Message\nmoltbot agent --message 'Hello']
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-sequenceDiagram
- participant S as Sender / Device
- participant GW as Gateway
- participant O as Owner (CLI)
-
- Note over S,GW: DM Pairing Flow
- S->>GW: Send DM message
- GW->>GW: Unknown sender β generate 8-char code
- GW->>S: Reply with pairing code (expires 1hr)
- O->>GW: moltbot pairing list
- GW->>GW: Add sender to allowlist
- S->>GW: Next message β processed normally
-
- Note over S,GW: Node Device Pairing Flow
- S->>GW: WS connect (role: node, device identity)
- GW->>GW: New device β create pairing request
- O->>GW: moltbot devices approve Diagram source (Mermaid)
-
-```mermaid
-flowchart TD
- AGENT[Agent Tool Call\nbrowser action] --> TARGET{Target?}
- TARGET -->|sandbox| SB[Sandbox Browser\nDocker container]
- TARGET -->|host| LOCAL{Local Browser\nRunning?}
- TARGET -->|node| NODE[Node Host\nProxy to remote browser]
- LOCAL -->|No| START[Launch Chromium\nvia CDP on loopback]
- LOCAL -->|Yes| CDP[Connect via CDP]
- START --> CDP
- CDP --> PW{Playwright\nAvailable?}
- PW -->|Yes| ACTIONS[Full Actions\nclick/type/snapshot/PDF]
- PW -->|No| BASIC[Basic Only\nARIA snapshot + screenshot]
- ACTIONS --> RESULT[Return to Agent\nsnapshot / screenshot / action result]
- BASIC --> RESULT
- NODE --> RESULT
- SB --> RESULT
-```
-
-Diagram source (Mermaid)
-
-```mermaid
-graph LR
- subgraph Runtime [group:runtime]
- EXEC[exec]
- BASH[bash]
- PROC[process]
- end
-
- subgraph FS [group:fs]
- READ[read]
- WRITE[write]
- EDIT[edit]
- PATCH[apply_patch]
- end
-
- subgraph Sessions [group:sessions]
- SL[sessions_list]
- SH[sessions_history]
- SS[sessions_send]
- SP[sessions_spawn]
- SST[session_status]
- end
-
- subgraph Web [group:web]
- WS[web_search]
- WF[web_fetch]
- end
-
- subgraph UI [group:ui]
- BROWSER[browser]
- CANVAS[canvas]
- end
-
- subgraph Automation [group:automation]
- CRON[cron]
- GATEWAY[gateway]
- end
-
- subgraph Messaging [group:messaging]
- MSG[message]
- end
-
- subgraph Other
- NODES[nodes]
- IMAGE[image]
- AGENTS_LIST[agents_list]
- end
-```
-
-