Skip to content

Architecture

┌─────────────────────────────────────────────────────────────────┐
│ Web UI (Next.js :3007) │
├─────────────────────────────────────────────────────────────────┤
│ API Server (Elysia :3005) │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ REST API │ │WebSocket │ │ Swagger │ │Auth Guard│ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
├─────────────────────────────────────────────────────────────────┤
│ Core Runtime │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Agent │ │ Agent │ │ Router │ │Scheduler │ │
│ │ Manager │ │ Worker │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
├──────────┬──────────┬──────────┬──────────┬────────────────────┤
│ Channels │ Skills │ Security │ Models │ Integrations │
│──────────│──────────│──────────│──────────│────────────────────│
│ Telegram │Filesystem│ Sessions │ Ollama │ MCP Bridge │
│ Slack │ Shell │ Passkeys │ OpenAI │ N8N Workflows │
│ Teams │ Git │ TOTP 2FA │Anthropic │ Hooks/Automation │
│ WebChat │ Browser │ Vault │ Gemini │ Voice (STT/TTS) │
│ │ │Permissions│CLI Tools│ Pipelines │
│ │ │ Notifs │ LiteLLM │ Notifications │
├──────────┴──────────┴──────────┴──────────┴────────────────────┤
│ Data Layer │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ PostgreSQL │ │ Redis │ │ Drizzle │ │
│ │ + pgvector │ │ Cache/PubSub│ │ ORM │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────┘
LayerTechnology
RuntimeBun
Backend FrameworkElysia
Database ORMDrizzle
DatabasePostgreSQL + pgvector
CacheRedis (ioredis)
Web UINext.js 14, React 18, Tailwind CSS, Zustand, TanStack Query
LLM ClientOpenAI SDK (via LiteLLM proxy)
TelegramgrammY
SlackBolt.js
TeamsBot Framework
Authargon2, @simplewebauthn/server, otplib
BrowserPlaywright
LoggingPino
ValidationZod
assistant/
├── bin/ # CLI scripts (assistant start/stop)
├── src/
│ ├── api/ # REST API & WebSocket
│ │ ├── routes/ # Endpoint handlers
│ │ ├── middleware/ # Auth guard
│ │ ├── context.ts # Elysia context plugin
│ │ ├── server.ts # Server setup
│ │ └── websocket.ts # WebSocket handler
│ ├── channels/ # Messaging channels
│ │ ├── telegram/ # grammY bot
│ │ ├── slack/ # Bolt.js integration
│ │ ├── teams/ # Bot Framework
│ │ ├── webchat/ # WebSocket chat
│ │ └── linking.ts # Cross-channel user linking
│ ├── config/ # Zod-validated configuration
│ │ ├── index.ts # Cache, getConfig(), re-exports
│ │ ├── schema.ts # Zod schema & Config type
│ │ ├── defaults.ts # Default values
│ │ ├── bootstrap-loader.ts # Env-only config (pre-DB)
│ │ ├── legacy-loader.ts # Full env config (migration)
│ │ ├── runtime-loader.ts # DB-backed config loader
│ │ ├── settings-service.ts # Three-tier cache + pub/sub
│ │ ├── settings-registry.ts # Setting definitions manifest
│ │ ├── hot-reload.ts # Live config updates
│ │ └── utils.ts # deepMerge helper
│ ├── core/ # Agent runtime
│ │ ├── agent-base.ts # BaseAgentWorker abstract class
│ │ ├── agent-worker.ts # LLM agent (extends base)
│ │ ├── cli-agent-worker.ts # CLI agent (extends base)
│ │ ├── tool-executor.ts # Tool execution & permissions
│ │ ├── cli-adapters.ts # CLI argument builder & output parser
│ │ ├── agent-manager.ts
│ │ ├── gateway.ts
│ │ ├── router.ts
│ │ ├── scheduler.ts
│ │ ├── notification-service.ts
│ │ ├── orchestrator/ # Multi-agent orchestration
│ │ │ ├── service.ts # Message routing
│ │ │ ├── approval-manager.ts # User approval lifecycle
│ │ │ ├── model-selector.ts # Model selection & fallback
│ │ │ ├── meta-tools.ts # Orchestrator tool definitions
│ │ │ ├── pipeline-manager.ts # Multi-stage pipelines
│ │ │ ├── classifier.ts # Message classification
│ │ │ ├── roles.ts # Role configs & tool sets
│ │ │ └── types.ts
│ │ └── types.ts
│ ├── db/ # Database layer
│ │ ├── schema/ # Drizzle table definitions
│ │ ├── repositories/ # Data access layer
│ │ ├── migrations/ # SQL migrations
│ │ ├── postgres.ts # Connection management
│ │ └── redis.ts # Redis cache wrapper
│ ├── hooks/ # Event-driven automation
│ ├── mcp/ # Model Context Protocol
│ │ ├── bridge.ts # Server connection manager
│ │ ├── protocol.ts # MCP message handling
│ │ └── transports/ # Stdio & SSE transports
│ ├── models/ # LLM management
│ │ ├── providers/ # Direct, CLI, LiteLLM providers
│ │ ├── litellm-client.ts
│ │ ├── model-registry.ts
│ │ ├── cost-tracker.ts
│ │ ├── quota-tracker.ts
│ │ └── health-checker.ts
│ ├── security/ # Auth & encryption
│ │ ├── auth/ # Session, passkey, TOTP
│ │ ├── vault.ts # AES-256-GCM encrypted storage
│ │ ├── permissions.ts # Three-tier permission system
│ │ └── secret-injector.ts
│ ├── skills/ # Built-in tool implementations
│ │ ├── filesystem/
│ │ ├── shell/
│ │ ├── git/
│ │ ├── browser/
│ │ ├── websearch/
│ │ └── docker/
│ ├── utils/ # Crypto, logger, sanitize
│ ├── visual/ # Playwright visual debugger
│ ├── voice/ # STT, TTS, wake word
│ └── index.ts # Entry point
├── mcp-server/ # MCP server bridge for CLI models
│ ├── src/
│ │ ├── index.ts # Entry point (stdio/HTTP)
│ │ ├── server.ts # McpServer setup
│ │ ├── client.ts # HTTP client
│ │ ├── auth.ts # Auth helper
│ │ └── tools/ # Tool definitions
│ ├── package.json
│ └── tsconfig.json
├── web/ # Next.js 14 web UI
│ ├── app/ # App Router pages
│ ├── components/ # React components
│ └── lib/
│ ├── api.ts # API client
│ └── types/ # TypeScript interfaces
├── scripts/
│ ├── db/ # Database utility scripts
│ ├── e2e/ # E2E test suite
│ └── setup.ts # Bootstrap setup wizard
├── octipus.desktop # Linux desktop entry
├── .mcp.json # Claude Code MCP server config
├── package.json
├── tsconfig.json
└── drizzle.config.ts

Key database tables managed by Drizzle ORM:

TablePurpose
usersUser accounts and credentials
sessionsChat sessions
messagesMessage history
model_configModel registry and configuration
cost_logToken cost tracking
audit_logSecurity event audit trail
vaultEncrypted credential storage
hooksAutomation hook definitions
skill_permissionsPer-user permission overrides
permission_requestsPending approval requests
embeddingsVector embeddings (pgvector)
pipelinesPipeline run instances
pipeline_stagesIndividual pipeline stages
pipeline_templatesReusable pipeline templates
notificationsPersistent notification storage

Migrations run automatically on startup unless SKIP_MIGRATIONS=true is set.