107 lines
2.3 KiB
Markdown
107 lines
2.3 KiB
Markdown
|
|
# Gerhard Hermes architecture
|
||
|
|
|
||
|
|
## Identity
|
||
|
|
|
||
|
|
Gerhard Rug is the first priority Hermes agent in Agent0.
|
||
|
|
|
||
|
|
Gerhard's identity file is:
|
||
|
|
|
||
|
|
```text
|
||
|
|
agents/gerhard-hermes/SOUL.md
|
||
|
|
```
|
||
|
|
|
||
|
|
Inside the container, Hermes home is:
|
||
|
|
|
||
|
|
```text
|
||
|
|
/opt/data
|
||
|
|
```
|
||
|
|
|
||
|
|
So Gerhard reads his soul at:
|
||
|
|
|
||
|
|
```text
|
||
|
|
/opt/data/SOUL.md
|
||
|
|
```
|
||
|
|
|
||
|
|
## Container mounts
|
||
|
|
|
||
|
|
Gerhard is expected to mount:
|
||
|
|
|
||
|
|
```text
|
||
|
|
./agents/gerhard-hermes -> /opt/data
|
||
|
|
./agents/gerhard-workspace -> /workspace
|
||
|
|
../gutasktool -> /opt/gutasktool
|
||
|
|
./shared/knowledge -> /knowledge
|
||
|
|
${HOME}/.ssh -> /root/.ssh
|
||
|
|
```
|
||
|
|
|
||
|
|
`/opt/gutasktool` is read-write so Gerhard can improve gutasktool, commit, and push to Gitea when instructed or when a task requires it.
|
||
|
|
|
||
|
|
`/knowledge` is the shared library. It is not Hermes memory. It is version-controlled institutional knowledge.
|
||
|
|
|
||
|
|
## Environment
|
||
|
|
|
||
|
|
Gerhard receives local credentials from Agent0's host-local `.env` via Docker Compose.
|
||
|
|
|
||
|
|
Expected variables include:
|
||
|
|
|
||
|
|
- `API_URL`
|
||
|
|
- `CONTENT_API_KEY`
|
||
|
|
- `AGENT_ID`
|
||
|
|
- `AGENT_NAME`
|
||
|
|
- `AGENT_PASSWORD`
|
||
|
|
- provider keys such as `ANTHROPIC_TOKEN` when needed
|
||
|
|
|
||
|
|
Do not commit these values.
|
||
|
|
|
||
|
|
## gutask access
|
||
|
|
|
||
|
|
Gerhard has a wrapper at:
|
||
|
|
|
||
|
|
```text
|
||
|
|
/opt/data/bin/gutask
|
||
|
|
```
|
||
|
|
|
||
|
|
The wrapper runs:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
python3 /opt/gutasktool/gutasktool/cli.py "$@"
|
||
|
|
```
|
||
|
|
|
||
|
|
Use the absolute path in cron prompts because container `PATH` may vary:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
/opt/data/bin/gutask orient --agent "$AGENT_ID"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Scheduled orientation
|
||
|
|
|
||
|
|
The desired source of truth for Gerhard scheduled jobs is:
|
||
|
|
|
||
|
|
```text
|
||
|
|
agents/gerhard-hermes/cron/desired-jobs.json
|
||
|
|
```
|
||
|
|
|
||
|
|
Hermes live cron runtime state is stored in `cron/jobs.json` and should remain ignored because it mutates as jobs run.
|
||
|
|
|
||
|
|
On wake, Gerhard should:
|
||
|
|
|
||
|
|
1. Read `/opt/data/SOUL.md`.
|
||
|
|
2. Read `/knowledge/README.md` and relevant shared knowledge files.
|
||
|
|
3. Run `/opt/data/bin/gutask orient --agent "$AGENT_ID"`.
|
||
|
|
4. Use the returned task orientation as current work context.
|
||
|
|
5. Keep final reports short, in Gerhard voice.
|
||
|
|
|
||
|
|
## Runtime state
|
||
|
|
|
||
|
|
Do not version Hermes runtime state unless explicitly reviewed.
|
||
|
|
|
||
|
|
Examples to keep ignored:
|
||
|
|
|
||
|
|
- `agents/gerhard-hermes/state.db*`
|
||
|
|
- `agents/gerhard-hermes/sessions/`
|
||
|
|
- `agents/gerhard-hermes/logs/`
|
||
|
|
- `agents/gerhard-hermes/gateway_state.json`
|
||
|
|
- `agents/gerhard-hermes/channel_directory.json`
|
||
|
|
- `agents/gerhard-hermes/cron/jobs.json`
|
||
|
|
- `agents/gerhard-hermes/cron/output/`
|