Restructure milestones from M1-M11 to M1-M15: - M3: Security Firewall (secret scanner, incognito mode) - M4: Router Foundation (arm registry, pools, task classifier) - M5: TUI with full 6 permission modes - M6: Full compaction (truncate + LLM summarization) - M9: Router Advanced (bandit learning, ensemble strategies) - M11: Task Learning (pattern detection, persistent tasks) Add ADR-007 through ADR-012 for security-as-core, router split, Thompson Sampling, MCP replaceability, task learning, incognito. Add risks R-010 through R-015 for router, security, feedback, task learning, ensemble quality, shell parser. Update architecture dependency graph with security, router, elf, hook, skill, mcp, plugin, tasklearn packages. Update domain model with Router, Arm, LimitPool, Firewall entities.
6.6 KiB
6.6 KiB
essential, status, last_updated, project, depends_on
| essential | status | last_updated | project | depends_on | |
|---|---|---|---|---|---|
| architecture | complete | 2026-04-02 | gnoma |
|
Architecture
System Context
graph TB
User([Developer]) -->|TUI / CLI pipe| gnoma[gnoma binary]
gnoma -->|HTTPS| Anthropic[Anthropic API]
gnoma -->|HTTPS| OpenAI[OpenAI API]
gnoma -->|HTTPS| Google[Google GenAI API]
gnoma -->|HTTPS| Mistral[Mistral API]
gnoma -->|HTTP| Local[Ollama / llama.cpp]
gnoma -->|stdio JSON-RPC| MCP[MCP Servers]
gnoma -->|exec| Tools[Local Tools<br/>bash, file ops]
Container View
graph TB
subgraph "gnoma (single binary, single process)"
CLI[CLI Parser] --> Router{Mode?}
Router -->|TTY| TUI[TUI — Bubble Tea]
Router -->|Pipe| Pipe[CLI Pipe Mode]
TUI --> SM[Session Manager]
Pipe --> SM
SM --> S1[Session goroutine]
SM --> SN[Session N goroutine]
S1 --> E1[Engine]
SN --> EN[Engine N]
E1 --> PR[Provider Registry]
EN --> PR
PR --> Anthropic[Anthropic adapter]
PR --> OpenAI[OpenAI adapter]
PR --> Google[Google adapter]
PR --> Mistral[Mistral adapter]
PR --> OAICompat[OpenAI-compat adapter]
E1 --> TR[Tool Registry]
EN --> TR
TR --> Bash[bash]
TR --> FS[fs.read / write / edit / glob / grep]
E1 --> PM[Permission Checker]
EN --> PM
E1 --> CTX[Context Window]
EN --> CTX
end
subgraph "Config Stack"
Defaults --> Global["~/.config/gnoma/config.toml"]
Global --> Project[".gnoma/config.toml"]
Project --> Env[Environment Variables]
Env --> Flags[CLI Flags]
end
Component Overview
| Component | Responsibility | Technology | Boundary |
|---|---|---|---|
cmd/gnoma |
Binary entrypoint, flag parsing, mode routing | Go stdlib | Internal |
internal/message |
Foundation types: Message, Content, Usage, Response | Pure Go, zero deps | Internal |
internal/stream |
Streaming interface, Event types, Accumulator | Depends on message | Internal |
internal/provider |
Provider interface, Registry, error taxonomy | Depends on message, stream | Internal |
internal/provider/{anthropic,openai,google,mistral} |
SDK adapters: translate + stream | SDK dependencies | Network boundary |
internal/provider/openaicompat |
Thin wrapper for Ollama/llama.cpp | Reuses openai adapter | Network boundary |
internal/tool |
Tool interface, Registry, bash, file ops | Go stdlib, doublestar | Local system boundary |
internal/permission |
Permission modes, rule matching, user prompts | Pure Go | Internal |
internal/context |
Token tracking, compaction strategies, sliding window | Depends on message, provider | Internal |
internal/config |
TOML layered config loading | BurntSushi/toml | Internal |
internal/auth |
API key resolution from env/config | Pure Go | Internal |
internal/security |
Firewall, secret scanner, unicode sanitizer, incognito mode | message, config | Security boundary |
internal/router |
Smart router: arm registry, pools, task classifier, selection | provider, message, config | Internal |
internal/engine |
Agentic query loop, tool execution orchestration | router, security, tool, stream, context | Internal |
internal/session |
Session lifecycle, channel-based UI decoupling | engine, stream | Internal |
internal/elf |
Sub-agent spawning, lifecycle, communication | engine, router, session | Internal |
internal/tui |
Terminal UI: chat, input, status, permission dialogs, config screen | session, stream, permission | Internal |
internal/hook |
Hook system: events, protocol, registration | message, tool | Internal |
internal/skill |
Skill loading, frontmatter parsing, discovery | message | Internal |
internal/mcp |
MCP client, tool discovery, tool replaceability | tool, config | External (stdio) |
internal/plugin |
Plugin manifest, loader, lifecycle | config | Internal |
internal/tasklearn |
Repetitive task detection, suggestions, persistent tasks | router, engine | Internal |
Package Dependency Graph
graph BT
message["message"]
stream["stream"]
provider["provider"]
tool["tool"]
permission["permission"]
security["security"]
router["router"]
context_mgr["context"]
config["config"]
auth["auth"]
engine["engine"]
session["session"]
elf["elf"]
tui["tui"]
hook["hook"]
skill["skill"]
mcp["mcp"]
plugin["plugin"]
tasklearn["tasklearn"]
cmd["cmd/gnoma"]
stream --> message
provider --> message
provider --> stream
tool --> message
permission --> message
permission --> config
security --> message
security --> config
router --> provider
router --> message
router --> config
context_mgr --> message
context_mgr --> provider
engine --> router
engine --> security
engine --> tool
engine --> permission
engine --> stream
engine --> context_mgr
session --> engine
session --> stream
elf --> engine
elf --> router
elf --> session
hook --> message
hook --> tool
skill --> message
mcp --> tool
mcp --> config
plugin --> config
tasklearn --> router
tasklearn --> engine
tui --> session
tui --> stream
tui --> permission
cmd --> tui
cmd --> config
cmd --> auth
cmd --> session
cmd --> provider
cmd --> tool
cmd --> router
cmd --> security
Scope
In scope:
- Streaming chat with tool execution across 5+ LLM providers
- Agentic loop (stream → tool calls → re-query → until done)
- Security firewall with secret scanning, redaction, incognito mode
- Smart router with bandit-based multi-provider collaboration
- 6-mode permission system for tool execution
- TUI and CLI pipe modes
- TOML configuration with layering
- Context management and compaction (truncation + LLM summarization)
- Multi-agent (elfs) with router-integrated provider selection
- Hook, skill, MCP, and plugin extensibility
- Repetitive task learning and persistent tasks
- Session persistence (SQLite) and serve mode
Out of scope:
- Web UI (M15, via serve mode)
- Cloud hosting / SaaS deployment
- Training or fine-tuning models
- IDE extension authoring (gnoma provides the backend, not the extension itself)
Deployment
Single statically-linked Go binary. No runtime dependencies. Runs on Linux, macOS, Windows — anywhere Go compiles. Distributed via go install, release binaries, or package managers.
Changelog
- 2026-04-02: Initial version