mo commited on
Commit ·
a9876bc
1
Parent(s): 76916b3
docs: project documentation — guides, FAQ, architecture, security policy and contribution workflow
Browse files- .github/ISSUE_TEMPLATE/bug_report.yml +46 -0
- .github/ISSUE_TEMPLATE/config.yml +11 -0
- .github/ISSUE_TEMPLATE/feature_request.yml +30 -0
- CODE_OF_CONDUCT.md +51 -0
- CONTRIBUTING.md +54 -0
- README.md +106 -164
- SECURITY.md +50 -0
- docs/ARCHITECTURE.md +96 -0
- docs/CHANGELOG.md +41 -0
- docs/FAQ.md +79 -0
- docs/GETTING-STARTED.md +72 -0
- docs/TOOLS.md +70 -0
- docs/_config.yml +11 -0
- docs/index.md +14 -0
.github/ISSUE_TEMPLATE/bug_report.yml
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: Bug report
|
| 2 |
+
description: Something is broken — help us fix it
|
| 3 |
+
title: "[Bug]: "
|
| 4 |
+
labels: ["bug"]
|
| 5 |
+
body:
|
| 6 |
+
- type: markdown
|
| 7 |
+
attributes:
|
| 8 |
+
value: |
|
| 9 |
+
Thanks for reporting! Please check [the FAQ](../docs/FAQ.md) first.
|
| 10 |
+
- type: input
|
| 11 |
+
id: version
|
| 12 |
+
attributes:
|
| 13 |
+
label: Version
|
| 14 |
+
description: "Output of `mona-agent --version` (or `node -e \"console.log(require('./apps/desktop/package.json').version)\"`)"
|
| 15 |
+
placeholder: "2.0.0"
|
| 16 |
+
validations:
|
| 17 |
+
required: true
|
| 18 |
+
- type: dropdown
|
| 19 |
+
id: os
|
| 20 |
+
attributes:
|
| 21 |
+
label: Operating system
|
| 22 |
+
options: [macOS, Linux, WSL2, Other]
|
| 23 |
+
validations:
|
| 24 |
+
required: true
|
| 25 |
+
- type: textarea
|
| 26 |
+
id: what
|
| 27 |
+
attributes:
|
| 28 |
+
label: What happened?
|
| 29 |
+
description: Steps to reproduce + expected vs actual behavior
|
| 30 |
+
validations:
|
| 31 |
+
required: true
|
| 32 |
+
- type: textarea
|
| 33 |
+
id: logs
|
| 34 |
+
attributes:
|
| 35 |
+
label: Logs
|
| 36 |
+
description: "Relevant output of `mona-agent start` / `mona-agent gui` (no secrets!)"
|
| 37 |
+
render: shell
|
| 38 |
+
- type: checkboxes
|
| 39 |
+
id: checks
|
| 40 |
+
attributes:
|
| 41 |
+
label: Confirmations
|
| 42 |
+
options:
|
| 43 |
+
- label: I removed API keys / tokens from the logs
|
| 44 |
+
required: true
|
| 45 |
+
- label: I searched existing issues
|
| 46 |
+
required: true
|
.github/ISSUE_TEMPLATE/config.yml
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
blank_issues_enabled: false
|
| 2 |
+
contact_links:
|
| 3 |
+
- name: 📖 Documentation
|
| 4 |
+
url: https://github.com/MONAEXPERT/agent/tree/main/docs
|
| 5 |
+
about: Getting started, architecture, tools reference and FAQ
|
| 6 |
+
- name: 🌐 mona.expert
|
| 7 |
+
url: https://agent.mona.expert
|
| 8 |
+
about: The cloud dashboard — create an account and get your device key
|
| 9 |
+
- name: 🔒 Security issue?
|
| 10 |
+
url: https://github.com/MONAEXPERT/agent/blob/main/SECURITY.md
|
| 11 |
+
about: Report vulnerabilities privately (do NOT open a public issue)
|
.github/ISSUE_TEMPLATE/feature_request.yml
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
name: Feature request
|
| 2 |
+
description: Suggest an idea for mona-agent
|
| 3 |
+
title: "[Feature]: "
|
| 4 |
+
labels: ["enhancement"]
|
| 5 |
+
body:
|
| 6 |
+
- type: textarea
|
| 7 |
+
id: problem
|
| 8 |
+
attributes:
|
| 9 |
+
label: Problem
|
| 10 |
+
description: What pain does this solve?
|
| 11 |
+
validations:
|
| 12 |
+
required: true
|
| 13 |
+
- type: textarea
|
| 14 |
+
id: idea
|
| 15 |
+
attributes:
|
| 16 |
+
label: Proposed solution
|
| 17 |
+
description: How would it look from the user's side?
|
| 18 |
+
validations:
|
| 19 |
+
required: true
|
| 20 |
+
- type: textarea
|
| 21 |
+
id: alternatives
|
| 22 |
+
attributes:
|
| 23 |
+
label: Alternatives considered
|
| 24 |
+
- type: checkboxes
|
| 25 |
+
id: checks
|
| 26 |
+
attributes:
|
| 27 |
+
label: Confirmations
|
| 28 |
+
options:
|
| 29 |
+
- label: I searched existing issues
|
| 30 |
+
required: true
|
CODE_OF_CONDUCT.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Contributor Covenant Code of Conduct
|
| 2 |
+
|
| 3 |
+
## Our Pledge
|
| 4 |
+
|
| 5 |
+
We as members, contributors, and leaders pledge to make participation in our
|
| 6 |
+
community a harassment-free experience for everyone, regardless of age, body
|
| 7 |
+
size, visible or invisible disability, ethnicity, sex characteristics,
|
| 8 |
+
gender identity and expression, level of experience, education,
|
| 9 |
+
socio-economic status, nationality, personal appearance, race, religion, or
|
| 10 |
+
sexual identity and orientation.
|
| 11 |
+
|
| 12 |
+
We pledge to act and interact in ways that contribute to an open, welcoming,
|
| 13 |
+
diverse, inclusive, and healthy community.
|
| 14 |
+
|
| 15 |
+
## Our Standards
|
| 16 |
+
|
| 17 |
+
Examples of behavior that contributes to a positive environment:
|
| 18 |
+
|
| 19 |
+
- Demonstrating empathy and kindness toward other people
|
| 20 |
+
- Being respectful of differing opinions, viewpoints, and experiences
|
| 21 |
+
- Giving and gracefully accepting constructive feedback
|
| 22 |
+
- Accepting responsibility and apologizing to those affected by our mistakes
|
| 23 |
+
- Focusing on what is best not just for us as individuals, but for the
|
| 24 |
+
overall community
|
| 25 |
+
|
| 26 |
+
Examples of unacceptable behavior:
|
| 27 |
+
|
| 28 |
+
- The use of sexualized language or imagery, and sexual attention or
|
| 29 |
+
advances of any kind
|
| 30 |
+
- Trolling, insulting or derogatory comments, and personal or political
|
| 31 |
+
attacks
|
| 32 |
+
- Public or private harassment
|
| 33 |
+
- Publishing others' private information without explicit permission
|
| 34 |
+
- Other conduct which could reasonably be considered inappropriate in a
|
| 35 |
+
professional setting
|
| 36 |
+
|
| 37 |
+
## Enforcement
|
| 38 |
+
|
| 39 |
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
| 40 |
+
reported to the community leaders responsible for enforcement at
|
| 41 |
+
`hello@mona.expert`. All complaints will be reviewed and investigated
|
| 42 |
+
promptly and fairly.
|
| 43 |
+
|
| 44 |
+
## Attribution
|
| 45 |
+
|
| 46 |
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
| 47 |
+
version 2.1, available at
|
| 48 |
+
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
| 49 |
+
|
| 50 |
+
[homepage]: https://www.contributor-covenant.org
|
| 51 |
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Contributing to mona-agent
|
| 2 |
+
|
| 3 |
+
Thanks for helping build the open-source client! This file tells you how to
|
| 4 |
+
set up, test and propose changes.
|
| 5 |
+
|
| 6 |
+
## Setup
|
| 7 |
+
|
| 8 |
+
```bash
|
| 9 |
+
git clone git@github.com:MONAEXPERT/agent.git
|
| 10 |
+
cd agent
|
| 11 |
+
npm install
|
| 12 |
+
```
|
| 13 |
+
|
| 14 |
+
Requirements: Node.js ≥ 20, npm ≥ 9. No build step — plain ESM.
|
| 15 |
+
|
| 16 |
+
## Layout
|
| 17 |
+
|
| 18 |
+
```
|
| 19 |
+
apps/desktop/ the device agent (CLI, daemon, TUI, tools, tests)
|
| 20 |
+
packages/engine/ cloud-brain client (self-contained)
|
| 21 |
+
packages/protocol/ typed message schemas
|
| 22 |
+
docs/ user + architecture docs
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
## Testing
|
| 26 |
+
|
| 27 |
+
```bash
|
| 28 |
+
npm test
|
| 29 |
+
```
|
| 30 |
+
|
| 31 |
+
The suite covers the control channel (against a fake in-process server),
|
| 32 |
+
the agent loop, tool behavior and the TUI scrollback. Please keep it green
|
| 33 |
+
and add tests for new behavior.
|
| 34 |
+
|
| 35 |
+
## Conventions
|
| 36 |
+
|
| 37 |
+
- Plain modern JavaScript, ES modules, no build step.
|
| 38 |
+
- Keep the runtime dependency count at **one** (`ws`). Prefer Node built-ins.
|
| 39 |
+
- Commands executed by `tools/shell` must pass the guard allowlist — never
|
| 40 |
+
weaken the guard to make a test pass.
|
| 41 |
+
- Commits: `type(scope): summary` (feat, fix, docs, refactor, test).
|
| 42 |
+
- The public repo contains **client code only**. Server-side code must not
|
| 43 |
+
be committed here (SaaS boundary).
|
| 44 |
+
|
| 45 |
+
## Pull requests
|
| 46 |
+
|
| 47 |
+
1. Fork, branch, implement, test.
|
| 48 |
+
2. `npm test` green.
|
| 49 |
+
3. Open a PR with a clear description of what/why.
|
| 50 |
+
4. One logical change per PR. Small is beautiful.
|
| 51 |
+
|
| 52 |
+
## Code of Conduct
|
| 53 |
+
|
| 54 |
+
See [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md).
|
README.md
CHANGED
|
@@ -1,220 +1,162 @@
|
|
| 1 |
-
# mona-agent —
|
| 2 |
|
| 3 |
<p align="center">
|
| 4 |
-
<strong>
|
|
|
|
| 5 |
</p>
|
| 6 |
|
| 7 |
<p align="center">
|
| 8 |
<a href="https://github.com/MONAEXPERT/agent/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT"></a>
|
| 9 |
-
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg" alt="Node.js"></a>
|
| 10 |
-
<img src="https://img.shields.io/badge/
|
| 11 |
-
<img src="https://img.shields.io/badge/
|
|
|
|
|
|
|
| 12 |
</p>
|
| 13 |
|
| 14 |
---
|
| 15 |
|
| 16 |
-
## What is
|
| 17 |
|
| 18 |
-
**mona-agent** is a headless daemon that runs on
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
|
| 22 |
```
|
| 23 |
-
Your Device
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
+-------------------+ +----------------------------+
|
| 25 |
-
| mona-agent |--- WSS ------+ | Dashboard / Website |
|
| 26 |
-
| | | Auth / User Management |
|
| 27 |
-
| * Terminal GUI |<-- commands -- | API Key Vault (AES-256) |
|
| 28 |
-
| * Local tools |-- telemetry -+ | LLM Proxy (5 providers) |
|
| 29 |
-
| * File sandbox |-- tokens ----+ | Agent Orchestration |
|
| 30 |
-
| * Shell guard |-- metrics ---+ | Audit Log |
|
| 31 |
-
| | | |
|
| 32 |
-
| <- NO API KEYS ->| | <-- YOUR KEYS STAY HERE --> |
|
| 33 |
-
+-------------------+ +----------------------------+
|
| 34 |
```
|
| 35 |
|
| 36 |
-
##
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
```bash
|
| 39 |
-
# Install
|
| 40 |
curl -fsSL https://agent.mona.expert/install.sh | bash
|
| 41 |
|
| 42 |
-
#
|
| 43 |
-
mona-agent login
|
| 44 |
|
| 45 |
-
#
|
| 46 |
-
mona-agent connect
|
| 47 |
-
|
| 48 |
-
# 3. Run the terminal dashboard (auto-starts the agent)
|
| 49 |
mona-agent gui
|
| 50 |
-
```
|
| 51 |
-
|
| 52 |
-
Once connected, send commands to this device from the
|
| 53 |
-
[agent.mona.expert](https://agent.mona.expert) dashboard — tasks, tools
|
| 54 |
-
and results stream live into the terminal.
|
| 55 |
-
|
| 56 |
-
## Terminal Dashboard
|
| 57 |
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
```
|
| 62 |
-
┌─ mona-agent v1.2.0 🍎 ● agent-1 │ ● connected ─┐
|
| 63 |
-
┌─ System ─────────────────────┐ ┌─ Activity ────────────────────────┐
|
| 64 |
-
│ Host MacBook-Air │ │ 22:54 ● Connected to │
|
| 65 |
-
│ OS macOS x64 │ │ agent.mona.expert │
|
| 66 |
-
│ CPUs 10 cores │ │ 22:55 ▸ Task: "sys info" │
|
| 67 |
-
│ Mem ████████████░░░░ 62% │ │ 22:55 ⚙ Tool: sysinfo │
|
| 68 |
-
│ 5.3 GB / 8.6 GB │ │ 22:56 ✓ Complete (142 tok, 3.1s) │
|
| 69 |
-
│ Load 1.20 0.80 0.50 │ │ │
|
| 70 |
-
│ IP 192.168.1.42 │ │ │
|
| 71 |
-
│ Up 3h 25m │ │ │
|
| 72 |
-
├─ Task ────────────────────────┤ │ │
|
| 73 |
-
│ ✓ Idle — waiting for commands │ │ │
|
| 74 |
-
│ Control this agent from │ │ │
|
| 75 |
-
│ agent.mona.expert │ │ │
|
| 76 |
-
└───────────────────────────────┘ └───────────────────────────────────┘
|
| 77 |
-
├──────────────────────────────────────────────────────────────────────┤
|
| 78 |
-
│ q quit · l login · c clear · r reconnect · d debug · h help ● online│
|
| 79 |
-
└──────────────────────────────────────────────────────────────────────┘
|
| 80 |
```
|
| 81 |
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
| Key | Action |
|
| 85 |
-
|-----|--------|
|
| 86 |
-
| `l` | Login — paste your API key right in the dashboard |
|
| 87 |
-
| `r` | (Re)connect to the cloud |
|
| 88 |
-
| `q` / `Ctrl+C` | Quit |
|
| 89 |
-
| `c` | Clear activity log |
|
| 90 |
-
| `d` | Toggle debug bar (cloud URL, WS URL, creds path) |
|
| 91 |
-
| `h` / `?` | Help overlay with the full connect guide |
|
| 92 |
-
| `↑` / `↓` | Scroll activity log |
|
| 93 |
-
|
| 94 |
-
No key saved yet? The dashboard opens in setup mode and shows the
|
| 95 |
-
connect steps — press `l` and paste your key, the agent connects
|
| 96 |
-
automatically. Works headless too: `mona-agent start`.
|
| 97 |
-
|
| 98 |
-
## Tools
|
| 99 |
-
|
| 100 |
-
The agent ships with four sandboxed tool modules:
|
| 101 |
-
|
| 102 |
-
| Tool | Capabilities | Security |
|
| 103 |
-
|------|-------------|----------|
|
| 104 |
-
| `sysinfo` | OS, CPU, memory, load, network, uptime | Read-only |
|
| 105 |
-
| `shell` | Command execution | Allowlist + blocked patterns |
|
| 106 |
-
| `files` | Read/write/list/delete/stat | Path sandboxed |
|
| 107 |
-
| `net` | HTTP fetch/check, connectivity | HTTP(S)-only |
|
| 108 |
|
| 109 |
-
##
|
| 110 |
-
|
| 111 |
-
By default only safe commands are allowed. Extend via environment:
|
| 112 |
|
| 113 |
```bash
|
| 114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
```
|
| 116 |
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
## Commands
|
| 120 |
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
mona-agent exec <t> Execute a tool directly (sysinfo, shell, files, net)
|
| 128 |
-
mona-agent status Show login state and config paths
|
| 129 |
-
mona-agent debug Verbose system + connection info
|
| 130 |
-
mona-agent help Show all commands and environment vars
|
| 131 |
-
```
|
| 132 |
|
| 133 |
-
|
| 134 |
|
| 135 |
-
##
|
| 136 |
|
| 137 |
-
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
| `MONA_SHELL_UNSAFE` | — | Set to `1` for unrestricted shell |
|
| 143 |
-
| `MONA_WORKSPACE` | `~/.mona-agent/workspace` | File tool sandbox directory |
|
| 144 |
-
| `MONA_LLM_PROVIDER` | `openai` | Docker platform: LLM provider (openai, anthropic, google, deepseek, openrouter) |
|
| 145 |
-
| `MONA_LLM_MODEL` | `gpt-4o-mini` | Docker platform: default model |
|
| 146 |
|
| 147 |
-
##
|
| 148 |
-
|
| 149 |
-
```
|
| 150 |
-
agent/
|
| 151 |
-
+-- bin/mona-agent.js CLI entry point
|
| 152 |
-
+-- src/
|
| 153 |
-
| +-- agent.js Agent daemon (reasoning loop)
|
| 154 |
-
| +-- cloud.js Cloud API client (SSE streaming)
|
| 155 |
-
| +-- config.js Configuration & credential management
|
| 156 |
-
| +-- control.js WebSocket control channel (reconnect, metrics)
|
| 157 |
-
| +-- log.js Structured event-driven logger
|
| 158 |
-
| +-- tui.js Terminal dashboard (pure ANSI)
|
| 159 |
-
| +-- tools/
|
| 160 |
-
| +-- index.js Tool registry & dispatcher
|
| 161 |
-
| +-- sysinfo.js System information
|
| 162 |
-
| +-- shell.js Sandboxed shell execution
|
| 163 |
-
| +-- files.js File system operations
|
| 164 |
-
| +-- net.js Network operations
|
| 165 |
-
+-- test/
|
| 166 |
-
| +-- agent.test.mjs 14 unit tests
|
| 167 |
-
+-- install.sh One-line install script
|
| 168 |
-
+-- README.md
|
| 169 |
-
+-- LICENSE
|
| 170 |
-
+-- package.json
|
| 171 |
-
```
|
| 172 |
|
| 173 |
-
|
|
|
|
|
|
|
| 174 |
|
| 175 |
-
**
|
|
|
|
|
|
|
| 176 |
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
- **API keys** never leave the control plane
|
| 180 |
|
| 181 |
-
|
|
|
|
|
|
|
| 182 |
|
| 183 |
-
|
| 184 |
|
| 185 |
-
|
| 186 |
-
|------|-------|-------|
|
| 187 |
-
| **Device agent** | This repo — install, modify, fork | Free & open source (MIT) |
|
| 188 |
-
| **Control plane** | Self-host or SaaS at [agent.mona.expert](https://agent.mona.expert) | Free tier available |
|
| 189 |
|
| 190 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 191 |
|
| 192 |
## Development
|
| 193 |
|
| 194 |
```bash
|
| 195 |
-
git clone
|
| 196 |
cd agent
|
| 197 |
npm install
|
| 198 |
-
npm test
|
|
|
|
| 199 |
```
|
| 200 |
|
|
|
|
|
|
|
|
|
|
| 201 |
## License
|
| 202 |
|
| 203 |
-
MIT —
|
| 204 |
|
| 205 |
---
|
| 206 |
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
mona-agent · <a href="https://agent.mona.expert">agent.mona.expert</a> ·
|
| 210 |
-
<a href="https://github.com/MONAEXPERT/agent">GitHub</a> ·
|
| 211 |
-
<a href="https://github.com/MONAEXPERT/agent/issues">Issues</a>
|
| 212 |
-
</sub>
|
| 213 |
-
</p>
|
| 214 |
-
|
| 215 |
-
<p align="center">
|
| 216 |
-
<sub>Open-source device agent. No LLM keys on your device. Ever.</sub>
|
| 217 |
-
</p>
|
| 218 |
-
|
| 219 |
-
# monorepo (merged enterprise version)
|
| 220 |
-
See docs/ARCHITECTURE.md — one key (mona.expert), one brain (mona.expert engine).
|
|
|
|
| 1 |
+
# mona-agent — the cloud-brained AI agent for your device ⚡
|
| 2 |
|
| 3 |
<p align="center">
|
| 4 |
+
<strong>An open-source AI agent that lives on your Mac or Linux machine.<br/>
|
| 5 |
+
Chat with it, let it run commands, manage files — from any device, anywhere.</strong>
|
| 6 |
</p>
|
| 7 |
|
| 8 |
<p align="center">
|
| 9 |
<a href="https://github.com/MONAEXPERT/agent/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="License: MIT"></a>
|
| 10 |
+
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg" alt="Node.js 20+"></a>
|
| 11 |
+
<a href="https://github.com/MONAEXPERT/agent/actions"><img src="https://img.shields.io/badge/tests-26%2F26-passing-brightgreen.svg" alt="Tests: 26/26 passing"></a>
|
| 12 |
+
<a href="https://github.com/MONAEXPERT/agent/blob/main/package.json"><img src="https://img.shields.io/badge/dependencies-1-lightgrey.svg" alt="1 runtime dependency"></a>
|
| 13 |
+
<img src="https://img.shields.io/badge/platform-macOS%20%7C%20Linux%20%7C%20WSL2-informational.svg" alt="Platforms: macOS, Linux, WSL2">
|
| 14 |
+
<img src="https://img.shields.io/badge/cloud-agent.mona.expert-blueviolet.svg" alt="Cloud: agent.mona.expert">
|
| 15 |
</p>
|
| 16 |
|
| 17 |
---
|
| 18 |
|
| 19 |
+
## What is mona-agent?
|
| 20 |
|
| 21 |
+
**mona-agent** is a lightweight, headless **AI agent daemon** that runs on your
|
| 22 |
+
computer. It connects to the mona.expert cloud, receives commands from your
|
| 23 |
+
dashboard or chat, executes **local tools** (files, shell, network, system
|
| 24 |
+
info), and streams the results back in real time.
|
| 25 |
|
| 26 |
+
Think of it as a **smart terminal for your machine** — an AI assistant with
|
| 27 |
+
hands. You can be at the office and ask your Mac at home to check disk space,
|
| 28 |
+
restart a service, or find a file. The agent does it and answers.
|
| 29 |
+
|
| 30 |
+
**No AI API keys ever live on your device.** All reasoning happens in the
|
| 31 |
+
cloud. Your device is a secure, capable pair of hands.
|
| 32 |
|
| 33 |
```
|
| 34 |
+
Your Device mona.expert Cloud (SaaS)
|
| 35 |
+
+-------------------+ +----------------------------+
|
| 36 |
+
| mona-agent | | Dashboard (agent.mona.expert)
|
| 37 |
+
| |--- HTTPS ----+ | Agent orchestration
|
| 38 |
+
| * Terminal UI | | AI engine (the brain)
|
| 39 |
+
| * File tools |<-- commands --+ Chat & history
|
| 40 |
+
| * Shell guard | | API key vault (AES-256)
|
| 41 |
+
| * Network tools |-- metrics --->+ Live device monitoring
|
| 42 |
+
| * System info |-- results --->+ Audit log
|
| 43 |
+-------------------+ +----------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
```
|
| 45 |
|
| 46 |
+
## Why mona-agent?
|
| 47 |
+
|
| 48 |
+
- 🖥 **Remote control with AI** — chat with your computer from anywhere, or
|
| 49 |
+
let the cloud agent act on its own
|
| 50 |
+
- 🔐 **Zero secrets on the device** — no OpenAI/Anthropic/Google keys are
|
| 51 |
+
stored locally; they live in the encrypted cloud vault
|
| 52 |
+
- ⚡ **Terminal-native** — a fast TUI dashboard with live log streaming,
|
| 53 |
+
or a fully headless daemon mode
|
| 54 |
+
- 🛠 **Real tools, real actions** — files, shell commands, network checks,
|
| 55 |
+
system metrics
|
| 56 |
+
- 📊 **Live device monitoring** — CPU, RAM, disk, load, uptime streamed to
|
| 57 |
+
your dashboard every 10 seconds
|
| 58 |
+
- 📦 **One command install** — no build step, single runtime dependency
|
| 59 |
+
(`ws`), works on macOS, Linux and WSL2
|
| 60 |
+
- 🆓 **Free and open source** — MIT licensed
|
| 61 |
+
|
| 62 |
+
## Quickstart — up and running in 60 seconds
|
| 63 |
|
| 64 |
```bash
|
| 65 |
+
# 1. Install (macOS / Linux / WSL2, needs Node.js 20+)
|
| 66 |
curl -fsSL https://agent.mona.expert/install.sh | bash
|
| 67 |
|
| 68 |
+
# 2. Log in with your mona.expert API key
|
| 69 |
+
mona-agent login
|
| 70 |
|
| 71 |
+
# 3. Start the terminal dashboard
|
|
|
|
|
|
|
|
|
|
| 72 |
mona-agent gui
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
|
| 74 |
+
# …or run fully headless in the background
|
| 75 |
+
mona-agent start
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
```
|
| 77 |
|
| 78 |
+
Now open **<https://agent.mona.expert/dashboard>** — your device appears
|
| 79 |
+
with live stats, and you can chat with it right from the browser.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
|
| 81 |
+
## Usage
|
|
|
|
|
|
|
| 82 |
|
| 83 |
```bash
|
| 84 |
+
mona-agent login # store your mona.expert API key
|
| 85 |
+
mona-agent connect # connect to the cloud control plane
|
| 86 |
+
mona-agent gui # terminal dashboard (live log, status)
|
| 87 |
+
mona-agent chat "Check disk usage and free up old logs" # one-shot command
|
| 88 |
+
mona-agent exec "uptime && df -h" # run a command
|
| 89 |
+
mona-agent start # daemon mode (background, auto-reconnect)
|
| 90 |
```
|
| 91 |
|
| 92 |
+
## Built-in tools
|
|
|
|
|
|
|
| 93 |
|
| 94 |
+
| Tool | What the agent can do with it |
|
| 95 |
+
|-----------|------------------------------------------------------------|
|
| 96 |
+
| `files` | List, read, write, move, delete — confined to safe paths |
|
| 97 |
+
| `shell` | Run commands through a guarded, allowlisted shell |
|
| 98 |
+
| `net` | HTTP requests, connectivity checks, DNS lookups |
|
| 99 |
+
| `sysinfo` | CPU, memory, disk, load, uptime, platform, network info |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 100 |
|
| 101 |
+
Full reference: **[docs/TOOLS.md](docs/TOOLS.md)**
|
| 102 |
|
| 103 |
+
## How it works
|
| 104 |
|
| 105 |
+
The daemon maintains a **control channel** to the cloud over HTTPS + WebSocket
|
| 106 |
+
(where available). It streams device metrics every 10 seconds, receives
|
| 107 |
+
**commands** from the cloud engine, executes them with the local tool
|
| 108 |
+
sandbox, and streams results back. Read the full walkthrough in
|
| 109 |
+
**[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)**.
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
|
| 111 |
+
## FAQ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 112 |
|
| 113 |
+
**Is mona-agent free?** — Yes. The client is MIT licensed and free forever.
|
| 114 |
+
The mona.expert cloud has a free tier at
|
| 115 |
+
[agent.mona.expert](https://agent.mona.expert).
|
| 116 |
|
| 117 |
+
**Does my API key get stored on the device?** — Only your mona.expert
|
| 118 |
+
device token is stored locally (`~/.mona-agent/credentials.json`). AI
|
| 119 |
+
provider keys live only in the cloud vault, AES-256 encrypted.
|
| 120 |
|
| 121 |
+
**Can I run it on a server?** — Yes. Any Node.js 20+ machine works,
|
| 122 |
+
including headless Linux servers and Raspberry Pi class devices.
|
|
|
|
| 123 |
|
| 124 |
+
**What data leaves my device?** — Command results and system metrics, only
|
| 125 |
+
to the mona.expert cloud you are logged into. See
|
| 126 |
+
**[SECURITY.md](SECURITY.md)**.
|
| 127 |
|
| 128 |
+
More answers: **[docs/FAQ.md](docs/FAQ.md)**
|
| 129 |
|
| 130 |
+
## Documentation
|
|
|
|
|
|
|
|
|
|
| 131 |
|
| 132 |
+
| Page | Contents |
|
| 133 |
+
|------|----------|
|
| 134 |
+
| [docs/GETTING-STARTED.md](docs/GETTING-STARTED.md) | Install, login, first steps, troubleshooting |
|
| 135 |
+
| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | Daemon internals, control channel, metrics pipeline |
|
| 136 |
+
| [docs/TOOLS.md](docs/TOOLS.md) | Tool-by-tool reference with examples |
|
| 137 |
+
| [docs/FAQ.md](docs/FAQ.md) | Frequently asked questions |
|
| 138 |
+
| [docs/CHANGELOG.md](docs/CHANGELOG.md) | Release history |
|
| 139 |
+
| [SECURITY.md](SECURITY.md) | Security model & vulnerability reporting |
|
| 140 |
+
| [CONTRIBUTING.md](CONTRIBUTING.md) | Development setup, tests, conventions |
|
| 141 |
|
| 142 |
## Development
|
| 143 |
|
| 144 |
```bash
|
| 145 |
+
git clone git@github.com:MONAEXPERT/agent.git
|
| 146 |
cd agent
|
| 147 |
npm install
|
| 148 |
+
npm test # 26 tests, 9 suites
|
| 149 |
+
npm run gui # run the dev build of the TUI
|
| 150 |
```
|
| 151 |
|
| 152 |
+
Requires Node.js ≥ 20. The codebase is plain modern JavaScript (ESM), no
|
| 153 |
+
build step.
|
| 154 |
+
|
| 155 |
## License
|
| 156 |
|
| 157 |
+
MIT — see [LICENSE](LICENSE). Free forever.
|
| 158 |
|
| 159 |
---
|
| 160 |
|
| 161 |
+
**[mona.expert](https://agent.mona.expert)** — one key, one brain, any
|
| 162 |
+
device. ⚡
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SECURITY.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Security Policy
|
| 2 |
+
|
| 3 |
+
mona-agent is a client for the mona.expert cloud. This document describes
|
| 4 |
+
the client-side security model and how to report vulnerabilities.
|
| 5 |
+
|
| 6 |
+
## Supported versions
|
| 7 |
+
|
| 8 |
+
| Version | Supported |
|
| 9 |
+
|---|---|
|
| 10 |
+
| 2.x (current) | ✅ |
|
| 11 |
+
| < 2.0 | ❌ |
|
| 12 |
+
|
| 13 |
+
## Security model
|
| 14 |
+
|
| 15 |
+
- **No AI provider keys on the device.** The client stores only a
|
| 16 |
+
mona.expert device token (`~/.mona-agent/credentials.json`, mode 0600).
|
| 17 |
+
All third-party keys live in the cloud vault, AES-256 encrypted.
|
| 18 |
+
- **Guarded shell.** Commands run through an allowlist; dangerous patterns
|
| 19 |
+
are rejected before execution.
|
| 20 |
+
- **Confined file tool.** Reads and writes are limited to safe roots;
|
| 21 |
+
symlink escapes are refused.
|
| 22 |
+
- **Egress-only networking.** The daemon opens outbound connections only
|
| 23 |
+
and listens on localhost exclusively (for the local dashboard). No
|
| 24 |
+
inbound ports, no public exposure.
|
| 25 |
+
- **Metrics minimization.** Only system metrics and requested results are
|
| 26 |
+
sent, only to the cloud endpoint you configured (`MONA_CLOUD`).
|
| 27 |
+
- **Transparent transport.** HTTPS with Bearer-auth; WebSocket upgrade when
|
| 28 |
+
available, HTTPS polling fallback otherwise.
|
| 29 |
+
|
| 30 |
+
## Reporting a vulnerability
|
| 31 |
+
|
| 32 |
+
**Do not open a public issue for security bugs.**
|
| 33 |
+
|
| 34 |
+
Please report privately first so we can fix before disclosure:
|
| 35 |
+
|
| 36 |
+
1. Email: `security@mona.expert`
|
| 37 |
+
2. Include: affected version, steps to reproduce, impact, and (if you have
|
| 38 |
+
it) a suggested fix.
|
| 39 |
+
3. We will acknowledge within 48 hours and aim to publish a fix + advisory
|
| 40 |
+
within 14 days, crediting you if you wish.
|
| 41 |
+
|
| 42 |
+
### Disclosure policy
|
| 43 |
+
|
| 44 |
+
- 48 h — acknowledgment
|
| 45 |
+
- 14 days — fix + coordinated disclosure (extendable on request)
|
| 46 |
+
|
| 47 |
+
## Hall of fame
|
| 48 |
+
|
| 49 |
+
We appreciate all responsible disclosures. With your permission, we list
|
| 50 |
+
contributors here.
|
docs/ARCHITECTURE.md
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# mona-agent Architecture
|
| 2 |
+
|
| 3 |
+
How the open-source device daemon is built, and how it talks to the
|
| 4 |
+
mona.expert cloud.
|
| 5 |
+
|
| 6 |
+
## Overview
|
| 7 |
+
|
| 8 |
+
mona-agent is a **headless Node.js daemon** with two jobs:
|
| 9 |
+
|
| 10 |
+
1. **Execute** — run local tools (files, shell, network, system info) on
|
| 11 |
+
behalf of the cloud agent.
|
| 12 |
+
2. **Report** — stream device metrics and command results back to the cloud
|
| 13 |
+
in real time.
|
| 14 |
+
|
| 15 |
+
```
|
| 16 |
+
┌─────────────────────────────────────┐ ┌──────────────────────────────┐
|
| 17 |
+
│ Device (your machine) │ │ mona.expert cloud (SaaS) │
|
| 18 |
+
│ │ │ │
|
| 19 |
+
│ mona-agent │ │ Control plane API │
|
| 20 |
+
│ ┌──────────────┐ ┌────────────┐ │ │ /api/v1/agent/verify │
|
| 21 |
+
│ │ ControlChannel│◄─►│ tools/ │ │ │ /api/v1/agent/stats │
|
| 22 |
+
│ │ (HTTPS + WS) │ │ files │ │ │ /api/v1/agent/chat … │
|
| 23 |
+
│ │ │ │ shell │ │ │ │
|
| 24 |
+
│ │ ↕ metrics │ │ net │ │ │ AI engine (the brain) │
|
| 25 |
+
│ │ ↕ commands │ │ sysinfo │ │ │ Dashboard + device overview │
|
| 26 |
+
│ └──────────────┘ └────────────┘ │ │ Key vault (AES-256) │
|
| 27 |
+
│ │ │ │ Audit log │
|
| 28 |
+
│ ▼ │ └──────────────────────────────┘
|
| 29 |
+
│ TUI (mona-agent gui) │
|
| 30 |
+
│ headless daemon (mona-agent start) │
|
| 31 |
+
└─────────────────────────────────────┘
|
| 32 |
+
```
|
| 33 |
+
|
| 34 |
+
## Modules
|
| 35 |
+
|
| 36 |
+
| Module | Responsibility |
|
| 37 |
+
|---|---|
|
| 38 |
+
| `bin/mona-agent.js` | CLI entrypoint — `gui`, `start`, `login`, `connect`, `chat`, `exec` |
|
| 39 |
+
| `src/config.js` | Credentials, cloud endpoint resolution, platform detection |
|
| 40 |
+
| `src/cloud.js` | REST client for the control plane API (Bearer-auth) |
|
| 41 |
+
| `src/control.js` | Control channel: registration, command dispatch, metrics streaming |
|
| 42 |
+
| `src/api.js` | Local HTTP API + WebSocket (used by the local dashboard / desktop UI) |
|
| 43 |
+
| `src/tools/*` | The tool sandbox: `files`, `shell`, `net`, `sysinfo` |
|
| 44 |
+
| `src/tui.js` | Terminal dashboard — live log, scrollback, status bar |
|
| 45 |
+
| `src/log.js` | Structured logging (quiet in daemon mode) |
|
| 46 |
+
|
| 47 |
+
## Control channel lifecycle
|
| 48 |
+
|
| 49 |
+
1. **Boot** — `config.js` loads `~/.mona-agent/credentials.json` and
|
| 50 |
+
resolves the cloud endpoint (`MONA_CLOUD` or `https://agent.mona.expert`).
|
| 51 |
+
2. **Verify** — the daemon authenticates with `POST /api/v1/agent/verify`
|
| 52 |
+
(Bearer token). The server returns the agent identity and capabilities.
|
| 53 |
+
3. **Metrics** — every 10 seconds the daemon POSTs a snapshot to
|
| 54 |
+
`/api/v1/agent/stats`: CPU %, load average, memory, disk, uptime, host
|
| 55 |
+
and platform info.
|
| 56 |
+
4. **Commands** — the cloud pushes commands (chat messages, tool calls) over
|
| 57 |
+
the control channel. The daemon executes them with the tool sandbox and
|
| 58 |
+
streams results back.
|
| 59 |
+
5. **Resilience** — metrics streaming is independent of the WebSocket
|
| 60 |
+
channel. If the server cannot upgrade to WebSocket (e.g. shared hosting
|
| 61 |
+
behind LiteSpeed), the daemon transparently falls back to HTTPS polling
|
| 62 |
+
and keeps streaming — no reconnect storm.
|
| 63 |
+
|
| 64 |
+
## Metrics pipeline (HTTP-first)
|
| 65 |
+
|
| 66 |
+
The client was designed so that **metrics never depend on a WebSocket
|
| 67 |
+
upgrade**:
|
| 68 |
+
|
| 69 |
+
- Every 10 s: `POST /api/v1/agent/stats` with CPU, memory, disk, load,
|
| 70 |
+
uptime, hostname, platform, arch, version, IP.
|
| 71 |
+
- The cloud keeps the latest snapshot plus a rolling 180-point history per
|
| 72 |
+
device; the dashboard polls every 3 s — effectively live.
|
| 73 |
+
- A device is shown as **online** when its last snapshot is ≤ 20 s old.
|
| 74 |
+
|
| 75 |
+
## Security model (client side)
|
| 76 |
+
|
| 77 |
+
- **No AI provider keys on the device.** Only a mona.expert device token is
|
| 78 |
+
stored (`~/.mona-agent/credentials.json`, mode 0600).
|
| 79 |
+
- **Guarded shell** — commands run through an allowlist; dangerous patterns
|
| 80 |
+
are blocked before execution.
|
| 81 |
+
- **Confined files tool** — reads/writes are limited to safe, allowed paths.
|
| 82 |
+
- **Egress-only** — the daemon opens outbound connections only; it listens
|
| 83 |
+
on localhost only (for the local dashboard).
|
| 84 |
+
|
| 85 |
+
See [SECURITY.md](../SECURITY.md) for the full model and disclosure policy.
|
| 86 |
+
|
| 87 |
+
## Why HTTPS polling instead of WebSockets?
|
| 88 |
+
|
| 89 |
+
The control plane runs on shared hosting (LiteSpeed), where WebSocket
|
| 90 |
+
proxying is not always available and long-running Node processes are not
|
| 91 |
+
possible. The client therefore uses:
|
| 92 |
+
|
| 93 |
+
- **WebSocket** when the server upgrades it (self-hosted / VPS setups),
|
| 94 |
+
- **HTTPS polling + streaming metrics** everywhere else.
|
| 95 |
+
|
| 96 |
+
One code path, two transports — the daemon decides at runtime.
|
docs/CHANGELOG.md
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Changelog
|
| 2 |
+
|
| 3 |
+
All notable changes to the mona-agent client are documented here.
|
| 4 |
+
Format: [Keep a Changelog](https://keepachangelog.com), versioning:
|
| 5 |
+
[SemVer](https://semver.org).
|
| 6 |
+
|
| 7 |
+
## [2.0.0] — 2026-08-13
|
| 8 |
+
|
| 9 |
+
### Added
|
| 10 |
+
|
| 11 |
+
- **HTTP metrics pipeline** — device metrics (CPU, memory, disk, load,
|
| 12 |
+
uptime, host info) stream to the cloud every 10 s via HTTPS POST,
|
| 13 |
+
independent of the WebSocket channel. Live monitoring works on every
|
| 14 |
+
hosting setup, including shared hosting without WS proxying.
|
| 15 |
+
- **Resilient control channel** — WebSocket upgrade is detected at runtime;
|
| 16 |
+
when unavailable the daemon transparently keeps streaming over HTTPS and
|
| 17 |
+
skips the reconnect storm.
|
| 18 |
+
- **Local dashboard API** — the daemon serves a localhost API + WebSocket
|
| 19 |
+
for the terminal dashboard and desktop UI.
|
| 20 |
+
- Extended device metrics: CPU %, load average, memory, disk, uptime,
|
| 21 |
+
CPU model, core count.
|
| 22 |
+
- Monorepo layout: `apps/desktop` (agent), `packages/engine` (cloud-brain
|
| 23 |
+
client), `packages/protocol` (message schemas).
|
| 24 |
+
- One-line installer with PATH persistence for zsh/bash/profile.
|
| 25 |
+
|
| 26 |
+
### Changed
|
| 27 |
+
|
| 28 |
+
- Repo is now **client-only** (SaaS boundary) — server-side code moved to a
|
| 29 |
+
private codebase.
|
| 30 |
+
- `mona-agent login` flow stores credentials outside the install dir.
|
| 31 |
+
|
| 32 |
+
## [1.x] — earlier
|
| 33 |
+
|
| 34 |
+
### Added
|
| 35 |
+
|
| 36 |
+
- Terminal dashboard (TUI): live log, auto-follow, scrollback, status.
|
| 37 |
+
- Tool sandbox: files, shell (guarded), net, sysinfo.
|
| 38 |
+
- Control-plane protocol: register, chat RPC, LLM proxy.
|
| 39 |
+
- Docker-platform protocol support (self-hosted control plane).
|
| 40 |
+
|
| 41 |
+
[2.0.0]: https://github.com/MONAEXPERT/agent/releases/tag/v2.0.0
|
docs/FAQ.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Frequently Asked Questions
|
| 2 |
+
|
| 3 |
+
## What is mona-agent?
|
| 4 |
+
|
| 5 |
+
An open-source AI agent daemon for macOS, Linux and WSL2. It connects your
|
| 6 |
+
machine to the mona.expert cloud, executes local tools on your behalf, and
|
| 7 |
+
streams live metrics to your dashboard.
|
| 8 |
+
|
| 9 |
+
## Is mona-agent free?
|
| 10 |
+
|
| 11 |
+
Yes — MIT licensed, free forever. The [mona.expert](https://agent.mona.expert)
|
| 12 |
+
cloud has a free tier.
|
| 13 |
+
|
| 14 |
+
## Does mona-agent need an API key?
|
| 15 |
+
|
| 16 |
+
It needs **one key**: your mona.expert device token (created in the
|
| 17 |
+
dashboard → Settings). AI provider keys (OpenAI, Anthropic, …) live only in
|
| 18 |
+
the cloud vault — never on your device.
|
| 19 |
+
|
| 20 |
+
## Where is my key stored?
|
| 21 |
+
|
| 22 |
+
`~/.mona-agent/credentials.json`, with restrictive permissions, outside the
|
| 23 |
+
install directory (which can be wiped and reinstalled safely).
|
| 24 |
+
|
| 25 |
+
## What does mona-agent send to the cloud?
|
| 26 |
+
|
| 27 |
+
Only to the cloud you are logged into:
|
| 28 |
+
|
| 29 |
+
- device metrics (CPU, memory, disk, load, uptime, host info)
|
| 30 |
+
- results of commands/tools the cloud agent asked for
|
| 31 |
+
- chat messages you send from the dashboard
|
| 32 |
+
|
| 33 |
+
Nothing is sent to third parties. Full details: [SECURITY.md](../SECURITY.md).
|
| 34 |
+
|
| 35 |
+
## Does the device need a public IP or open ports?
|
| 36 |
+
|
| 37 |
+
No. The daemon opens **outbound** connections only. It works behind NAT,
|
| 38 |
+
firewalls and CGNAT. It listens on localhost only (for the local dashboard).
|
| 39 |
+
|
| 40 |
+
## Can I run mona-agent on a server / Raspberry Pi?
|
| 41 |
+
|
| 42 |
+
Yes — any Node.js 20+ machine. Headless mode: `mona-agent start` (or a
|
| 43 |
+
systemd unit). Small footprint, one runtime dependency.
|
| 44 |
+
|
| 45 |
+
## Does it work on Windows?
|
| 46 |
+
|
| 47 |
+
In WSL2 or Git Bash, yes. Native PowerShell is not a target today.
|
| 48 |
+
|
| 49 |
+
## How do I update mona-agent?
|
| 50 |
+
|
| 51 |
+
```bash
|
| 52 |
+
curl -fsSL https://agent.mona.expert/install.sh | bash
|
| 53 |
+
```
|
| 54 |
+
|
| 55 |
+
The installer replaces the agent in place; your credentials are untouched.
|
| 56 |
+
|
| 57 |
+
## How do I uninstall?
|
| 58 |
+
|
| 59 |
+
```bash
|
| 60 |
+
rm -rf ~/.mona-agent ~/.local/bin/mona-agent
|
| 61 |
+
```
|
| 62 |
+
|
| 63 |
+
## Why does my dashboard show my device as offline?
|
| 64 |
+
|
| 65 |
+
The device is marked online when its last metrics snapshot is ≤ 20 seconds
|
| 66 |
+
old. Check `mona-agent start` is running and that the device has HTTPS
|
| 67 |
+
egress to agent.mona.expert.
|
| 68 |
+
|
| 69 |
+
## Can the agent damage my machine?
|
| 70 |
+
|
| 71 |
+
The tool sandbox blocks dangerous patterns before execution, the files tool
|
| 72 |
+
is confined to safe paths, and every action is recorded in the cloud audit
|
| 73 |
+
log. Treat the agent like any other user with shell access: grant what you
|
| 74 |
+
trust.
|
| 75 |
+
|
| 76 |
+
## Where do I report bugs or security issues?
|
| 77 |
+
|
| 78 |
+
Bugs: [GitHub issues](https://github.com/MONAEXPERT/agent/issues).
|
| 79 |
+
Security: [SECURITY.md](../SECURITY.md) (private disclosure first).
|
docs/GETTING-STARTED.md
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Getting Started with mona-agent
|
| 2 |
+
|
| 3 |
+
Install the mona-agent device daemon, log in with your mona.expert key, and
|
| 4 |
+
have your machine connected to the cloud in under a minute.
|
| 5 |
+
|
| 6 |
+
## 1. Prerequisites
|
| 7 |
+
|
| 8 |
+
- **Node.js 20 or newer** — check with `node -v`.
|
| 9 |
+
- macOS: `brew install node`
|
| 10 |
+
- Ubuntu/Debian: `curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && apt install nodejs`
|
| 11 |
+
- Windows: use [WSL2](https://learn.microsoft.com/windows/wsl/install) (native Windows Git Bash works too)
|
| 12 |
+
- An account + **API key** at [agent.mona.expert](https://agent.mona.expert/dashboard) → Settings.
|
| 13 |
+
|
| 14 |
+
## 2. Install
|
| 15 |
+
|
| 16 |
+
```bash
|
| 17 |
+
curl -fsSL https://agent.mona.expert/install.sh | bash
|
| 18 |
+
```
|
| 19 |
+
|
| 20 |
+
The installer:
|
| 21 |
+
|
| 22 |
+
- Downloads the agent from GitHub (`MONAEXPERT/agent`)
|
| 23 |
+
- Installs dependencies (`ws` only)
|
| 24 |
+
- Places the daemon in `~/.mona-agent/agent`
|
| 25 |
+
- Adds `mona-agent` to your PATH (via `~/.local/bin`, persisted in your shell rc)
|
| 26 |
+
|
| 27 |
+
## 3. Log in
|
| 28 |
+
|
| 29 |
+
```bash
|
| 30 |
+
mona-agent login
|
| 31 |
+
```
|
| 32 |
+
|
| 33 |
+
Paste your mona.expert API key when prompted. The key is stored in
|
| 34 |
+
`~/.mona-agent/credentials.json` (outside the agent install directory).
|
| 35 |
+
|
| 36 |
+
## 4. Connect and use
|
| 37 |
+
|
| 38 |
+
```bash
|
| 39 |
+
mona-agent gui # terminal dashboard with live log
|
| 40 |
+
mona-agent chat "free disk space" # one-shot conversation
|
| 41 |
+
mona-agent exec "uptime" # run a single command
|
| 42 |
+
mona-agent start # headless daemon (auto-reconnect)
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
## 5. See it in the browser
|
| 46 |
+
|
| 47 |
+
Open <https://agent.mona.expert/dashboard>. Your device appears with live
|
| 48 |
+
CPU, memory, disk and load — and a chat window connected to the cloud brain.
|
| 49 |
+
|
| 50 |
+
## Troubleshooting
|
| 51 |
+
|
| 52 |
+
| Symptom | Fix |
|
| 53 |
+
|---|---|
|
| 54 |
+
| `mona-agent: command not found` | Re-open your terminal, or run `export PATH="$HOME/.local/bin:$PATH"` |
|
| 55 |
+
| `Node.js 20+ required` | Upgrade Node (`brew upgrade node` / nodesource) |
|
| 56 |
+
| Agent connects but dashboard shows no device | Confirm you ran `mona-agent login` with the key from your account |
|
| 57 |
+
| Metrics stream, chat replies "No API key configured" | Add an AI provider key in the dashboard → Settings (the cloud brain needs one) |
|
| 58 |
+
| Firewall / corporate proxy | Set `MONA_CLOUD=https://agent.mona.expert` and check HTTPS egress |
|
| 59 |
+
|
| 60 |
+
## Uninstall
|
| 61 |
+
|
| 62 |
+
```bash
|
| 63 |
+
rm -rf ~/.mona-agent ~/.local/bin/mona-agent
|
| 64 |
+
# optional: remove the PATH line added to ~/.zshrc / ~/.bashrc / ~/.profile
|
| 65 |
+
```
|
| 66 |
+
|
| 67 |
+
## Next steps
|
| 68 |
+
|
| 69 |
+
- [TOOLS.md](TOOLS.md) — what the agent can do on your device
|
| 70 |
+
- [ARCHITECTURE.md](ARCHITECTURE.md) — how the daemon works under the hood
|
| 71 |
+
- [FAQ.md](FAQ.md) — common questions
|
| 72 |
+
- [SECURITY.md](../SECURITY.md) — security model & responsible disclosure
|
docs/TOOLS.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Tools Reference
|
| 2 |
+
|
| 3 |
+
The built-in tools give the cloud agent real hands on your machine. Each tool
|
| 4 |
+
runs in a sandbox with clear boundaries.
|
| 5 |
+
|
| 6 |
+
## files
|
| 7 |
+
|
| 8 |
+
File operations confined to safe paths.
|
| 9 |
+
|
| 10 |
+
| Operation | Notes |
|
| 11 |
+
|---|---|
|
| 12 |
+
| `list` | Directory listing with sizes and mtimes |
|
| 13 |
+
| `read` | Read text files (size-capped) |
|
| 14 |
+
| `write` | Write text files (atomic) |
|
| 15 |
+
| `move` / `delete` | Rename / remove within allowed paths |
|
| 16 |
+
|
| 17 |
+
**Safety:** the tool refuses to touch paths outside the allowed roots
|
| 18 |
+
(home, workspace, temp). Symlink escapes are rejected.
|
| 19 |
+
|
| 20 |
+
## shell
|
| 21 |
+
|
| 22 |
+
A guarded, allowlisted command shell.
|
| 23 |
+
|
| 24 |
+
- Commands run through an allowlist of safe patterns (`ls`, `cat`, `df`,
|
| 25 |
+
`uptime`, …); anything matching a dangerous pattern (`rm -rf /`,
|
| 26 |
+
fork bombs, `sudo` without confirmation) is **blocked before execution**.
|
| 27 |
+
- Output is streamed back line-buffered, so the dashboard log feels live.
|
| 28 |
+
- Each execution is logged and attached to the audit trail in the cloud.
|
| 29 |
+
|
| 30 |
+
Example the agent might run:
|
| 31 |
+
|
| 32 |
+
```bash
|
| 33 |
+
df -h / && du -sh ~/Downloads | sort -h | tail -5
|
| 34 |
+
```
|
| 35 |
+
|
| 36 |
+
## net
|
| 37 |
+
|
| 38 |
+
Network helpers for connectivity checks and HTTP.
|
| 39 |
+
|
| 40 |
+
| Helper | Use |
|
| 41 |
+
|---|---|
|
| 42 |
+
| `http` | GET/POST JSON requests (outbound only) |
|
| 43 |
+
| `ping` / `reachable` | Host / port reachability |
|
| 44 |
+
| `dns` | DNS lookups |
|
| 45 |
+
| `wake` | (LAN) wake-on-LAN helper, where supported |
|
| 46 |
+
|
| 47 |
+
Used by the cloud agent for health checks, webhooks and diagnostics.
|
| 48 |
+
|
| 49 |
+
## sysinfo
|
| 50 |
+
|
| 51 |
+
System metrics for the live device dashboard.
|
| 52 |
+
|
| 53 |
+
| Metric | Snapshot interval |
|
| 54 |
+
|---|---|
|
| 55 |
+
| CPU usage % | every 10 s |
|
| 56 |
+
| Load average (1/5/15) | every 10 s |
|
| 57 |
+
| Memory total / used / % | every 10 s |
|
| 58 |
+
| Disk usage % | every 10 s |
|
| 59 |
+
| Uptime | every 10 s |
|
| 60 |
+
| Hostname, platform, arch, CPU model, cores, version, IP | on connect |
|
| 61 |
+
|
| 62 |
+
The cloud keeps the latest snapshot plus a rolling 180-point history per
|
| 63 |
+
device and renders sparklines for CPU and memory in the dashboard.
|
| 64 |
+
|
| 65 |
+
## Adding your own tool
|
| 66 |
+
|
| 67 |
+
Tools live in `apps/desktop/src/tools/` and are plain ES modules. Each tool
|
| 68 |
+
exposes a `run(action, args)` and registers itself in
|
| 69 |
+
`src/tools/index.js`. Keep the same rules: validate input, never execute
|
| 70 |
+
untrusted data, and always stream results.
|
docs/_config.yml
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# GitHub Pages config for the docs site (optional)
|
| 2 |
+
# Enable in repo Settings → Pages → Source: main /docs to publish
|
| 3 |
+
# at https://monaexpert.github.io/agent/
|
| 4 |
+
title: mona-agent — cloud-brained AI agent for your device
|
| 5 |
+
description: >-
|
| 6 |
+
Open-source AI agent daemon for macOS, Linux and WSL2. Chat with your
|
| 7 |
+
computer from anywhere, run commands, manage files, stream live metrics
|
| 8 |
+
to your dashboard. One command install, free forever, MIT licensed.
|
| 9 |
+
url: "https://agent.mona.expert"
|
| 10 |
+
github_username: MONAEXPERT
|
| 11 |
+
theme: jekyll-theme-minimal
|
docs/index.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# mona-agent Documentation
|
| 2 |
+
|
| 3 |
+
Open-source cloud-brained AI agent for your device — macOS, Linux, WSL2.
|
| 4 |
+
|
| 5 |
+
- [Getting started](GETTING-STARTED.md) — install in 60 seconds
|
| 6 |
+
- [Architecture](ARCHITECTURE.md) — how the daemon works
|
| 7 |
+
- [Tools reference](TOOLS.md) — files, shell, net, sysinfo
|
| 8 |
+
- [FAQ](FAQ.md) — common questions
|
| 9 |
+
- [Changelog](CHANGELOG.md) — release history
|
| 10 |
+
- [Security](../SECURITY.md) — security model & disclosure
|
| 11 |
+
- [Contributing](../CONTRIBUTING.md) — development setup
|
| 12 |
+
|
| 13 |
+
**Cloud:** [agent.mona.expert](https://agent.mona.expert) ·
|
| 14 |
+
**Repo:** [MONAEXPERT/agent](https://github.com/MONAEXPERT/agent)
|