Octopus 产品形态分析
基于代码目录结构、入口文件、构建配置和 UI 组件的产品形态全面分析。
1. 产品形态总览
Octopus 提供 6 种产品形态 + 1 个内部成长模块,覆盖从命令行到原生应用的全渠道。
┌─────────────────────────────────────────────────────┐
│ Octopus 产品矩阵 │
│ │
│ CLI ──── 开发者 / DevOps 首选 │
│ TUI ──── 服务器运维人员首选 │
│ Web ──── 通用 Web 控制台 │
│ Desktop ─ 日常桌面用户 │
│ Mobile ── 移动端监控和交互 │
│ Base ──── Agent 自主成长模块 │
│ Server ── 所有产品的统一后端 │
└─────────────────────────────────────────────────────┘
所有产品通过 HTTP REST API 连接到统一的 Octopus Server。
2. CLI 产品 — 命令行界面
定位
面向开发者和运维人员的高效命令行交互工具。
代码位置
- 入口:
products/cli/__main__.py - 核心:
products/cli/目录 - 测试:
products/cli/tests/— 9 个测试文件
技术栈
- Python argparse(非 Click)— 轻量无外部依赖
- httpx 同步客户端
- 纯 ANSI escape code 渲染(无 rich/colorama 依赖)
功能模块
| 模块 | 文件 | 核心功能 |
|---|---|---|
| Chat REPL | chat.py | 交互式对话、SSE 流式输出、历史持久化 |
| 服务管理 | up.py | octopus up/down/status |
| 学习触发 | learn.py | octopus learn <target> 触发能力学习 |
| 渲染器 | renderer.py | 表头/表格/卡片/图表/差异/时间线/指标 |
| 偏好学习 | preferences.py | 学习用户首选输出格式 |
| HTTP 客户端 | client.py | OctopusClient(重试/退避) |
| 认证 | auth.py | Token 管理 |
| 配置 | config.py | ~/.octopus/config.yaml |
| 初始化 | init_wizard.py | 首次配置向导 |
交互特性
$ octopus chat
🐙 Octopus Chat (type /help for commands)
> 检查所有服务状态
⠋ 思考中...
┌── 服务状态 ──────────────────────┐
│ ✓ octopus-http running :8000 │
│ ✓ redis running :6379 │
│ ⚠ octopus-worker degraded │
└──────────────────────────────────┘
特殊命令: /help, /roles, /switch, /status, /history, /clear, /prefs, /learn
管道模式: echo "检查磁盘空间" | octopus chat --pipe
数据持久化
| 数据 | 格式 | 路径 |
|---|---|---|
| 聊天历史 | JSONL(追加式) | ~/.octopus/chat_history.jsonl |
| 显示偏好 | JSON | ~/.octopus/display_prefs.json |
| 认证 Token | JSON | ~/.octopus/auth.json |
| 配置 | YAML | ~/.octopus/config.yaml |
3. TUI 产品 — 终端用户界面
定位
面向服务器运维人员的富终端仪表盘,无需 Web 浏览器即可获得图形化体验。
代码位置
- 入口:
products/tui/__main__.py - 核心:
products/tui/app.py—OctopusTUI(App)类 - 样式:
products/tui/styles/app.tcss
技术栈
- Textual(Python 终端 UI 框架)
- httpx.AsyncClient(异步 HTTP)
五屏布局
| 屏幕 | 快捷键 | 文件 | 功能 |
|---|---|---|---|
| Dashboard | F1 | screens/dashboard.py | 健康/队列/SLA/告警/最近工单 |
| Chat | F2 | screens/chat.py | 对话界面 + slash 命令 |
| Tickets | F3 | screens/tickets.py | 任务/工单管理 |
| Capabilities | F4 | screens/capabilities.py | 能力注册表(彩色徽章 + 操作按钮) |
| Logs | F5 | screens/logs.py | 服务器日志查看 |
UI 结构
┌─────────────────────────────────────────┐
│ Header (Octopus TUI) │
├────────┬────────────────────────────────┤
│Sidebar │ │
│ │ Content Area │
│ ■ Dash │ (Dashboard/Chat/Tickets/ │
│ ■ Chat │ Capabilities/Logs) │
│ ■ Tick │ │
│ ■ Caps │ │
│ ■ Logs │ │
│ │ │
├────────┴────────────────────────────────┤
│ Footer (状态栏) │
└─────────────────────────────────────────┘
异步客户端
# products/tui/client.py
class AsyncOctopusClient:
# 使用 httpx.AsyncClient 非阻塞 I/O
async def server_info(self) -> dict: ...
async def health(self) -> dict: ...
async def submit_and_stream(self, text, role) -> AsyncGenerator: ...
4. Web 控制台 — 浏览器端
定位
通用 Web 控制台,适用于任何有浏览器的环境,也是 Desktop 产品的内核。
代码位置
- 入口:
products/web/src/main.tsx - 应用:
products/web/src/App.tsx - 构建:
products/web/vite.config.ts
技术栈
- React 18.3.1 + TypeScript 5.6.2
- Vite 5.4.10
- React Router v6
- Vitest + React Testing Library
9 个页面路由
| 路由 | 页面 | 功能 |
|---|---|---|
/ | ChatPage | 默认对话界面 |
/dashboard | DashboardPage | 系统仪表盘 |
/organization | OrganizationPage | 组织视图 |
/tasks | TaskListPage | 任务列表 |
/roles | RolesPage | 角色管理 |
/roles/:roleId | RoleDetailPage | 角色详情 |
/memory | MemoryPage | 记忆管理 |
/history | HistoryPage | 历史回放 |
/settings | SettingsPage | 系统设置 |
富输出渲染器
| 组件 | 用途 |
|---|---|
RichOutputRenderer | 统一输出路由 |
TableOutput | 表格渲染 |
ChartOutput | 图表渲染 |
TimelineOutput | 时间线 |
DiffOutput | 差异对比 |
MetricOutput | 指标展示 |
CardOutput | 卡片布局 |
MarkdownOutput | Markdown 渲染 |
StatusCardOutput | 状态卡片 |
CapabilityGapOutput | 能力缺口展示 |
Hooks
| Hook | 功能 |
|---|---|
useKeyboardShortcuts | 全局键盘快捷键(Ctrl+K 聚焦) |
useLocalStorage | 客户端持久状态 |
useFormatPreferences | 显示格式偏好学习 |
Desktop 集成检测
// products/web/src/lib/desktop.ts
export function isDesktop(): boolean {
return window.__TAURI__ !== undefined;
}
// 在 Tauri 环境中启用窗口状态持久化、About 对话框等
5. Desktop 产品 — 原生桌面应用
定位
将 Web 控制台封装为原生桌面应用,提供 OS 级集成能力。
代码位置
- 配置:
products/desktop/package.json - Rust 源码:
products/desktop/src-tauri/
技术栈
- Tauri 2.1.0(Rust 原生壳层)
- Web 控制台(React/Vite,复用 products/web)
构建方式
# 开发模式:启动 Vite dev + Tauri dev
npm run dev
# 生产构建:构建 Web + 编译 Tauri 二进制
npm run tauri:build
OS 集成能力
| 能力 | 说明 |
|---|---|
| 窗口状态持久化 | 记住窗口大小和位置 |
| 系统托盘 | 常驻系统托盘/菜单栏 |
| About 对话框 | 原生”关于”窗口 |
| 原生文件对话框 | 文件选择器(规划中) |
| 安全沙盒 | Tauri 安全策略 |
产品关系
Desktop = Tauri Shell + Web Console
(Rust 原生) (React/TypeScript)
Web 控制台代码完全复用,通过 isDesktop() 检测环境差异
6. Mobile 产品 — 移动应用
定位
iOS/Android 原生应用,支持移动端监控、对话和管理。
代码位置
- 入口:
products/mobile/App.tsx - 配置:
products/mobile/package.json
技术栈
- Expo 53.0.0
- React Native 0.79.2
- TypeScript
- Jest + jest-expo
7 个 Tab 屏
| Tab | 图标 | 屏幕 | 功能 |
|---|---|---|---|
| Chat | 🗣️ | ChatScreen | 对话界面 |
| Plans | 📋 | PlansScreen | 计划视图 |
| Execution | ⚡ | (按 ID 获取) | 执行仪表盘 |
| Graph | 📊 | GraphScreen | 图形可视化 |
| KPI | 📈 | (KPI 仪表盘) | 关键指标 |
| Learning | 🎓 | (学习仪表盘) | 学习进度 |
| Settings | ⚙️ | SettingsScreen | 设置 |
响应式布局
手机(< 768px):
┌──────────────────────────────┐
│ │
│ Content Area │
│ │
├──────────────────────────────┤
│ 🗣️ │ 📋 │ ⚡ │ 📊 │ 📈 │ 🎓 │ ⚙️ │
└──────────────────────────────┘
平板(≥ 768px):
┌────────┬─────────────────────┐
│Sidebar │ │
│ │ Content Area │
│ 🗣️ Chat│ │
│ 📋 Plans│ │
│ ⚡ Exec │ │
│ 📊 Graph│ │
│ 📈 KPI │ │
│ 🎓 Learn│ │
│ ⚙️ Set │ │
└────────┴─────────────────────┘
状态指示
- ConnectionDot — 状态栏连接指示器
- LoadingOverlay — 应用初始化加载层
- ErrorBoundary — 崩溃恢复边界
7. Base 产品 — Agent 自主成长
定位
内部模块,不直接面向用户。负责 Agent 技能的自动发现、学习、代码生成和部署。
代码位置
- 核心:
products/base/agent/growth/
组件
| 模块 | 文件 | 功能 |
|---|---|---|
| 成长协调器 | skill_grower.py | 完整生命周期:discover → pipeline → codegen → deploy → reload |
| 已学存储 | learned_store.py | 已学技能持久存储 |
| 代码生成 | handler_codegen.py | 自动生成 handler 模块 + 验证 |
| 加载器 | learned_loader.py | 启动时加载已学技能 |
| 晋升引擎 | promotion_engine.py | 基于成功指标晋升技能 |
| 治理 | growth_governance.py | 策略执行 + 门禁检查 |
| HTTP 路由 | routes_learned.py | REST API 暴露 |
运行模式
| 模式 | 触发方式 | 说明 |
|---|---|---|
| 手动 | POST /api/learned/grow | REST API 触发 |
| 定时 | octopus-grower.timer | systemd 定时器,每 6 小时 |
| API | CLI octopus learn <target> | 用户命令触发 |
治理门禁
# growth_governance.py
# 部署前必须通过的门禁:
# - 风险评估通过
# - 沙盒验证成功
# - 每日部署配额未超限
# - 策略文件允许
配置
# /data/octopus/agent/config/grower_policy.yaml
# 控制自动成长的策略参数
8. Server — 统一后端
定位
所有产品形态的统一 HTTP 后端,承载业务逻辑、路由分发和端口协调。
代码位置
- 应用工厂:
server/shared/shared.py - 路由核心:
server/shared/adapters/http/routes_core.py - 端口实现:
server/shared/ports_impl/
连接模式
CLI ──────┐
TUI ──────┤
Web ──────┼──── HTTP REST ────▶ Octopus Server (:8000)
Desktop ──┤ │
Mobile ───┘ ▼
FastAPI + Uvicorn
│
┌─────┼─────┐
│ │ │
Dispatch Router
┌───┤ │ ├───┐
SYSTEM │ INTERNAL │ API
(CLI/sh) │ (Python) │(httpx)
│ │
Kernel Worker Loop
(12 Mixin × Tick)
认证方式
Authorization: Bearer <token>
│
├── 优先: $OCTOPUS_TOKEN 环境变量
└── 回退: ~/.octopus/auth.json
SSE 流式输出
POST /api/intent → 202 Accepted + run_id
GET /api/runs/{run_id} → 轮询结果
→ SSE 流式事件(可选)
9. 产品间共享模式
显示偏好学习(三端一致)
CLI、Web、Mobile 使用完全相同的置信度模型:
confidence = count / (count + 2)
threshold = 0.6
聊天历史持久化
| 产品 | 存储方式 |
|---|---|
| CLI | ~/.octopus/chat_history.jsonl(追加式 JSONL) |
| Web | localStorage |
| Mobile | AsyncStorage |
输出数据格式
所有产品使用统一的输出形状,按平台渲染:
| 形状 | CLI 渲染 | Web 渲染 | TUI 渲染 |
|---|---|---|---|
| table | ANSI 表格 | HTML 表格 | Textual DataTable |
| chart | ASCII 图表 | React 图表 | 文本图表 |
| card | 文本卡片 | CSS 卡片 | Panel 组件 |
| timeline | 文本时间线 | CSS 时间线 | RichLog |
| diff | ANSI 颜色差异 | HTML 差异 | RichLog |
| metric | 数字指标 | 仪表盘组件 | Static 面板 |
Token 管理
所有产品统一的认证流程:
- 检查
$OCTOPUS_TOKEN环境变量 - 读取
~/.octopus/auth.json - 传递
Authorization: Bearer <token>头
10. 产品形态关系图
┌──────────────────────────────────────────────────────────────┐
│ 用户接触面 │
│ │
│ CLI TUI Web Desktop Mobile │
│ (Python) (Textual) (React) (Tauri) (Expo/RN) │
│ │ │ │ ┌─────┘ │ │
│ │ │ │ │ 复用 │ │
│ │ │ ├────┘ │ │
│ │ │ │ │ │
│ └────┬─────┴─────────┴────────────────────────┘ │
│ │ │
│ ▼ HTTP REST + SSE │
│ ┌─────────────────────────┐ │
│ │ Octopus Server │ │
│ │ FastAPI :8000 │ │
│ │ 546 Endpoints │ │
│ └─────────┬───────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────┐ ┌─────────────────┐ │
│ │ Kernel Runtime │ │ Base/Growth │ │
│ │ 12 Mixin Worker Loop │◄───│ Agent 自主 │ │
│ │ 52 Gates │ │ 成长模块 │ │
│ └─────────────────────────┘ └─────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────┘