156 lines
5.8 KiB
Markdown
156 lines
5.8 KiB
Markdown
# Technology Stack
|
|
|
|
**Analysis Date:** 2026-02-09
|
|
|
|
## Languages
|
|
|
|
**Primary:**
|
|
- TypeScript 5.7+ - All source code in `src/`
|
|
- JSX (react-jsx) - TUI components in `src/frontends/tui/components/`
|
|
|
|
**Secondary:**
|
|
- JavaScript (vanilla) - Gateway web dashboard in `src/gateway/ui/` (HTML/CSS/JS, no framework)
|
|
- SQL - Inline SQLite schema in `src/session/store.ts` and `src/memory/vector-store.ts`
|
|
- YAML - Configuration files in `config/`
|
|
|
|
## Runtime
|
|
|
|
**Environment:**
|
|
- Node.js >= 22.0.0 (required by `engines` in `package.json`)
|
|
- ES2022 target, NodeNext module system
|
|
|
|
**Package Manager:**
|
|
- pnpm
|
|
- Lockfile: `pnpm-lock.yaml` (present, ~6500 lines)
|
|
|
|
## Frameworks
|
|
|
|
**Core:**
|
|
- None (custom daemon architecture — no Express, Fastify, or similar)
|
|
- Raw `http.createServer` + `ws` WebSocket server for the gateway (`src/gateway/server.ts`)
|
|
|
|
**CLI:**
|
|
- Commander 14.x - CLI argument parsing (`src/cli/index.ts`)
|
|
- Ink 6.x + React 19.x - Terminal UI framework (`src/frontends/tui/`)
|
|
|
|
**Testing:**
|
|
- Vitest 3.x - Test runner and assertion library
|
|
|
|
**Build/Dev:**
|
|
- TypeScript compiler (`tsc`) - Production builds
|
|
- tsx 4.x - Development mode with watch (`pnpm dev`)
|
|
|
|
## Key Dependencies
|
|
|
|
**Critical (AI/Model Providers):**
|
|
- `@anthropic-ai/sdk` ^0.39.0 - Anthropic Claude API client (`src/models/anthropic.ts`)
|
|
- `openai` ^4.0.0 - OpenAI API client, also used for OpenRouter/ZhipuAI/xAI/GitHub Models (`src/models/openai.ts`, `src/models/github.ts`)
|
|
- `@google/generative-ai` ^0.24.1 - Google Gemini API client (`src/models/gemini.ts`)
|
|
- `@aws-sdk/client-bedrock-runtime` ^3.985.0 - AWS Bedrock for model inference (`src/models/bedrock.ts`)
|
|
- `ollama` ^0.5.0 - Ollama local model client (`src/models/local/ollama.ts`)
|
|
|
|
**Critical (Channel Adapters):**
|
|
- `grammy` ^1.35.0 - Telegram bot framework (`src/channels/telegram/`)
|
|
- `discord.js` ^14.25.1 - Discord bot library (`src/channels/discord/`)
|
|
- `@slack/bolt` ^4.6.0 - Slack bot framework (`src/channels/slack/`)
|
|
- `whatsapp-web.js` ^1.34.6 - WhatsApp Web client (`src/channels/whatsapp/`)
|
|
|
|
**Critical (Data):**
|
|
- `better-sqlite3` ^11.0.0 - SQLite for sessions (`src/session/store.ts`) and vector storage (`src/memory/vector-store.ts`)
|
|
- `zod` ^3.24.0 - Configuration schema validation (`src/config/schema.ts`)
|
|
- `yaml` ^2.7.0 - Config file parsing (`src/config/loader.ts`)
|
|
|
|
**Infrastructure:**
|
|
- `ws` ^8.19.0 - WebSocket server for gateway (`src/gateway/server.ts`)
|
|
- `@modelcontextprotocol/sdk` ^1.26.0 - MCP client for external tool servers (`src/mcp/client.ts`)
|
|
- `googleapis` ^148.0.0 - Gmail API integration (`src/automation/gmail.ts`)
|
|
- `croner` ^10.0.1 - Cron job scheduling (`src/automation/cron.ts`)
|
|
- `puppeteer-core` ^24.37.2 - Browser automation for web tools (`src/tools/builtin/browser/`)
|
|
|
|
**Content Processing:**
|
|
- `@mozilla/readability` ^0.5.0 - Article extraction from web pages (`src/tools/builtin/web-fetch.ts`)
|
|
- `linkedom` ^0.18.0 - Server-side DOM for Readability (`src/tools/builtin/web-fetch.ts`)
|
|
- `turndown` ^7.2.0 - HTML to Markdown conversion (`src/tools/builtin/web-fetch.ts`)
|
|
- `marked` ^17.0.1 + `marked-terminal` ^7.3.0 - Markdown rendering in terminal
|
|
- `cli-highlight` ^2.1.11 - Syntax highlighting in terminal
|
|
|
|
## Configuration
|
|
|
|
**Format:**
|
|
- YAML config file with `${ENV_VAR}` expansion support
|
|
- Zod schema validation at load time (`src/config/schema.ts`)
|
|
- Config loaded via `loadConfig()` in `src/config/loader.ts`
|
|
|
|
**Config Location:**
|
|
- Default template: `config/default.yaml`
|
|
- User config: `~/.config/flynn/config.yaml` (conventional)
|
|
- CLI flag: `--config <path>` on `flynn start`
|
|
|
|
**Data Directory:**
|
|
- Default: `~/.local/share/flynn/`
|
|
- Override: `FLYNN_DATA_DIR` environment variable
|
|
- Contains: `sessions.db`, `vectors.db`, `memory/` directory
|
|
|
|
**Auth Storage:**
|
|
- GitHub OAuth tokens: `~/.config/flynn/auth.json` (0600 permissions)
|
|
- Gmail OAuth tokens: `~/.config/flynn/gmail-token.json`
|
|
- Gmail credentials: `~/.config/flynn/gmail-credentials.json`
|
|
|
|
**Key Environment Variables:**
|
|
- `ANTHROPIC_API_KEY` - Anthropic API authentication
|
|
- `OPENAI_API_KEY` - OpenAI API authentication
|
|
- `GOOGLE_API_KEY` - Gemini API authentication
|
|
- `GITHUB_TOKEN` - GitHub Models / Copilot authentication
|
|
- `AWS_REGION` - AWS Bedrock region (default: us-east-1)
|
|
- `OPENROUTER_API_KEY` - OpenRouter API authentication
|
|
- `ZHIPUAI_API_KEY` - ZhipuAI API authentication
|
|
- `XAI_API_KEY` - xAI (Grok) API authentication
|
|
- `VOYAGE_API_KEY` - Voyage AI embeddings authentication
|
|
- `FLYNN_TELEGRAM_TOKEN` - Telegram bot token (referenced in default config)
|
|
- `FLYNN_DATA_DIR` - Custom data directory override
|
|
|
|
**Build:**
|
|
- `tsconfig.json` - TypeScript compiler config
|
|
- Target: ES2022
|
|
- Module: NodeNext
|
|
- ModuleResolution: NodeNext
|
|
- Strict mode enabled
|
|
- JSX: react-jsx
|
|
- Source maps, declarations, and declaration maps enabled
|
|
- Root: `src/`, Output: `dist/`
|
|
|
|
## Platform Requirements
|
|
|
|
**Development:**
|
|
- Node.js >= 22.0.0
|
|
- pnpm (package manager)
|
|
- TypeScript 5.7+
|
|
|
|
**Production:**
|
|
- Node.js >= 22.0.0
|
|
- SQLite3 (native binding via better-sqlite3)
|
|
|
|
**Optional Runtime Dependencies:**
|
|
- Docker - For sandbox container execution (`src/sandbox/`)
|
|
- Tailscale CLI - For Tailscale Serve gateway exposure (`src/gateway/tailscale.ts`)
|
|
- Chromium/Chrome - For browser tools via puppeteer-core (`src/tools/builtin/browser/`)
|
|
|
|
## Build Commands
|
|
|
|
```bash
|
|
pnpm build # Compile TypeScript to dist/
|
|
pnpm dev # Run daemon with tsx watch mode
|
|
pnpm start # Start production build (node dist/cli/index.js start)
|
|
pnpm tui # Run TUI (readline mode)
|
|
pnpm tui:fs # Run TUI (fullscreen React/Ink mode)
|
|
pnpm tui:dev # Run TUI with watch mode
|
|
pnpm test # Run Vitest in watch mode
|
|
pnpm test:run # Run Vitest once
|
|
pnpm lint # ESLint
|
|
pnpm typecheck # tsc --noEmit
|
|
```
|
|
|
|
---
|
|
|
|
*Stack analysis: 2026-02-09*
|