c9b1c607d5
Document all 6 CLI commands with examples, cron scheduling config format with field reference, doctor diagnostics output and check details. Update architecture diagram. Add CHANGELOG covering Phase 5a and the initial 0.1.0 release.
327 lines
8.8 KiB
Markdown
327 lines
8.8 KiB
Markdown
# Flynn
|
|
|
|
Self-hosted personal AI assistant with Telegram and Terminal interfaces.
|
|
|
|
## Features
|
|
|
|
- **Multi-Frontend**: Telegram bot + Terminal UI (minimal & fullscreen modes)
|
|
- **Multi-Model**: Anthropic Claude, OpenAI, Ollama with intelligent routing
|
|
- **Model Switching**: Switch between cloud/local models on demand
|
|
- **Session Persistence**: SQLite-backed conversation history
|
|
- **Fallback Chains**: Automatic failover when primary model fails
|
|
- **Hook Engine**: Confirmation system for sensitive operations
|
|
- **Session Transfer**: Move conversations between frontends
|
|
- **CLI**: Full command-line interface (`flynn start`, `send`, `doctor`, etc.)
|
|
- **Cron Scheduling**: Automated messages on cron schedules with output routing
|
|
- **Health Diagnostics**: `flynn doctor` validates config, connectivity, and system state
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
# Install dependencies
|
|
pnpm install
|
|
|
|
# Copy and configure
|
|
cp config/default.yaml ~/.config/flynn/config.yaml
|
|
# Edit config with your API keys and Telegram bot token
|
|
|
|
# Build and run
|
|
pnpm build
|
|
flynn start
|
|
|
|
# Or run without building
|
|
pnpm start
|
|
```
|
|
|
|
## CLI Commands
|
|
|
|
Flynn provides a full CLI via the `flynn` binary (or `npx tsx src/cli/index.ts` during development):
|
|
|
|
| Command | Description |
|
|
|---------|-------------|
|
|
| `flynn start` | Start the Flynn daemon (Telegram, WebChat, cron) |
|
|
| `flynn tui` | Launch the interactive terminal UI |
|
|
| `flynn send <message>` | Send a one-shot message and print the response |
|
|
| `flynn sessions` | List active sessions |
|
|
| `flynn doctor` | Validate config and check system health |
|
|
| `flynn config` | Show resolved configuration (secrets redacted) |
|
|
|
|
### Examples
|
|
|
|
```bash
|
|
# Start daemon with custom config
|
|
flynn start --config ~/my-config.yaml
|
|
|
|
# One-shot query
|
|
flynn send "What's the weather in London?"
|
|
|
|
# Check system health
|
|
flynn doctor --config ~/.config/flynn/config.yaml
|
|
|
|
# Show current config (secrets masked)
|
|
flynn config
|
|
|
|
# List sessions
|
|
flynn sessions
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Config location: `~/.config/flynn/config.yaml` (or set `FLYNN_CONFIG`)
|
|
|
|
```yaml
|
|
telegram:
|
|
bot_token: "your-telegram-bot-token"
|
|
allowed_chat_ids: [123456789] # Your Telegram user ID
|
|
|
|
models:
|
|
default:
|
|
provider: anthropic
|
|
model: claude-opus-4-5-20251101
|
|
api_key: sk-ant-api03-...
|
|
local:
|
|
provider: ollama
|
|
model: qwen2.5:14b
|
|
fallback_chain: [local]
|
|
|
|
hooks:
|
|
confirm: [shell.*, file.write]
|
|
log: [web.*, file.read]
|
|
silent: [notify]
|
|
```
|
|
|
|
### Model Providers
|
|
|
|
| Provider | Config |
|
|
|----------|--------|
|
|
| Anthropic | `provider: anthropic`, `api_key` or `auth_token` |
|
|
| OpenAI | `provider: openai`, `api_key`, optional `endpoint` |
|
|
| Ollama | `provider: ollama`, `model`, optional `endpoint` |
|
|
|
|
### Model Tiers
|
|
|
|
Configure multiple models for different purposes:
|
|
|
|
```yaml
|
|
models:
|
|
fast: { provider: anthropic, model: claude-sonnet-4-... }
|
|
default: { provider: anthropic, model: claude-opus-4-5-... }
|
|
complex: { provider: anthropic, model: claude-opus-4-5-... }
|
|
local: { provider: ollama, model: qwen2.5:14b }
|
|
```
|
|
|
|
## Telegram Commands
|
|
|
|
| Command | Description |
|
|
|---------|-------------|
|
|
| `/start` | Initialize bot |
|
|
| `/reset` | Clear conversation history |
|
|
| `/status` | Show current model and status |
|
|
| `/local` | Switch to local model |
|
|
| `/cloud` | Switch to cloud model |
|
|
| `/model` | Show model info and options |
|
|
|
|
## Terminal UI
|
|
|
|
```bash
|
|
# Minimal mode (readline)
|
|
pnpm tui
|
|
|
|
# Fullscreen mode (React/Ink)
|
|
pnpm tui:fs
|
|
```
|
|
|
|
### TUI Commands
|
|
|
|
| Command | Description |
|
|
|---------|-------------|
|
|
| `/help` | Show help |
|
|
| `/reset` | Clear history |
|
|
| `/status` | Show session info |
|
|
| `/fullscreen` | Switch to fullscreen mode |
|
|
| `/transfer telegram` | Transfer session to Telegram |
|
|
| `/quit` | Exit |
|
|
|
|
## Running as Service
|
|
|
|
```bash
|
|
# Create systemd user service
|
|
mkdir -p ~/.config/systemd/user
|
|
|
|
cat > ~/.config/systemd/user/flynn.service << 'EOF'
|
|
[Unit]
|
|
Description=Flynn Personal AI Assistant
|
|
After=network.target ollama.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
WorkingDirectory=/path/to/flynn
|
|
ExecStart=/usr/bin/pnpm start
|
|
Restart=on-failure
|
|
RestartSec=5
|
|
Environment=NODE_ENV=production
|
|
|
|
[Install]
|
|
WantedBy=default.target
|
|
EOF
|
|
|
|
# Enable and start
|
|
systemctl --user daemon-reload
|
|
systemctl --user enable --now flynn
|
|
|
|
# View logs
|
|
journalctl --user -u flynn -f
|
|
```
|
|
|
|
## Hook Engine
|
|
|
|
Control sensitive operations with pattern matching:
|
|
|
|
```yaml
|
|
hooks:
|
|
confirm: # Requires user approval via Telegram
|
|
- shell.*
|
|
- file.write
|
|
log: # Logs but doesn't block
|
|
- web.*
|
|
- file.read
|
|
silent: # Executes without notification
|
|
- notify
|
|
```
|
|
|
|
## Cron Scheduling
|
|
|
|
Schedule automated messages on cron schedules. Each job fires an inbound message through the agent pipeline and routes the response to a configured output channel.
|
|
|
|
```yaml
|
|
automation:
|
|
cron:
|
|
- name: daily-summary
|
|
schedule: "0 9 * * *" # 9 AM daily
|
|
message: "Give me a summary of today's tasks"
|
|
output:
|
|
channel: telegram # Route response to Telegram
|
|
peer: "123456789" # Chat ID to send to
|
|
timezone: Europe/London # Optional timezone
|
|
enabled: true
|
|
|
|
- name: hourly-check
|
|
schedule: "0 * * * *" # Every hour
|
|
message: "Check system status"
|
|
output:
|
|
channel: telegram
|
|
peer: "123456789"
|
|
enabled: false # Disabled, won't fire
|
|
```
|
|
|
|
### Cron Config Fields
|
|
|
|
| Field | Required | Description |
|
|
|-------|----------|-------------|
|
|
| `name` | yes | Unique job identifier |
|
|
| `schedule` | yes | Cron expression (standard 5-field) |
|
|
| `message` | yes | Text sent to the agent when the job fires |
|
|
| `output.channel` | yes | Channel name to route the response (e.g. `telegram`) |
|
|
| `output.peer` | yes | Peer/chat ID on the output channel |
|
|
| `timezone` | no | IANA timezone (defaults to system timezone) |
|
|
| `enabled` | no | Whether the job is active (default: `true`) |
|
|
|
|
## Doctor Diagnostics
|
|
|
|
`flynn doctor` runs 10 health checks to validate your setup:
|
|
|
|
```
|
|
$ flynn doctor
|
|
|
|
Flynn Doctor
|
|
============
|
|
|
|
[PASS] Config file exists (/home/user/.config/flynn/config.yaml)
|
|
[PASS] Config parses (valid YAML)
|
|
[PASS] Config validates (schema valid)
|
|
[PASS] Env vars resolved
|
|
[PASS] Data directory writable (/home/user/.local/share/flynn)
|
|
[PASS] Session DB accessible (sessions.db)
|
|
[PASS] Model connectivity (anthropic: claude-sonnet)
|
|
[PASS] Telegram bot configured (1 allowed chat(s))
|
|
[SKIP] MCP servers configured (none configured)
|
|
[PASS] Skills loaded (3 skill(s))
|
|
|
|
Results: 8 passed, 0 failed, 0 warnings, 1 skipped
|
|
```
|
|
|
|
### Check Details
|
|
|
|
| Check | What it validates |
|
|
|-------|-------------------|
|
|
| Config file exists | Config YAML file is present at the expected path |
|
|
| Config parses | File is valid YAML syntax |
|
|
| Config validates | YAML content passes Zod schema validation |
|
|
| Env vars resolved | Any `${VAR}` references in config have values set |
|
|
| Data directory writable | Can write to `~/.local/share/flynn/` |
|
|
| Session DB accessible | SQLite database opens and queries succeed |
|
|
| Model connectivity | Default model provider and model name are configured |
|
|
| Telegram bot configured | Bot token is present and reasonable length |
|
|
| MCP servers configured | Lists configured MCP tool servers |
|
|
| Skills loaded | Discovers and loads skill packages |
|
|
|
|
Exit code is `1` if any check fails, `0` otherwise. Checks that depend on a valid config are skipped when config is invalid.
|
|
|
|
## Session Management
|
|
|
|
- Sessions persist in `~/.local/share/flynn/sessions.db`
|
|
- Session ID format: `{frontend}:{userId}` (e.g., `telegram:123456789`)
|
|
- History survives restarts
|
|
- Transfer sessions between frontends with `/transfer`
|
|
|
|
## Architecture
|
|
|
|
```
|
|
src/
|
|
├── cli/ # CLI commands (commander)
|
|
├── config/ # YAML config + Zod validation
|
|
├── models/ # Model providers + router
|
|
├── backends/native/ # Agent implementation
|
|
├── session/ # SQLite persistence
|
|
├── hooks/ # Confirmation engine
|
|
├── daemon/ # Lifecycle management
|
|
├── channels/ # Channel adapter abstraction
|
|
├── automation/ # Cron scheduler
|
|
├── gateway/ # WebSocket gateway + web UI
|
|
├── mcp/ # MCP tool server integration
|
|
├── skills/ # Skill packages
|
|
├── tools/ # Builtin tools (shell, file, web)
|
|
└── frontends/
|
|
├── telegram/ # Telegram bot
|
|
└── tui/ # Terminal UI
|
|
```
|
|
|
|
## Development
|
|
|
|
```bash
|
|
# Dev mode with watch
|
|
pnpm dev # Daemon
|
|
pnpm tui:dev # TUI
|
|
|
|
# Type check
|
|
pnpm typecheck
|
|
|
|
# Lint
|
|
pnpm lint
|
|
|
|
# Test
|
|
pnpm test
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
| Variable | Description |
|
|
|----------|-------------|
|
|
| `FLYNN_CONFIG` | Override config path |
|
|
| `ANTHROPIC_API_KEY` | Anthropic API key (fallback) |
|
|
| `OPENAI_API_KEY` | OpenAI API key (fallback) |
|
|
|
|
## License
|
|
|
|
MIT
|