Pi Session Manager

架构概览

Pi Session Manager 的技术架构——前端、后端与多协议通信。

"架构是对空间的深思熟虑的营造。" — Louis Kahn

Pi Session Manager 基于三层架构构建:React 前端、Rust 后端,以及连接两者的多协议通信层。

总览

┌─────────────────────────────────────────────────────────────────────┐
│                          客户端                                      │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────────────────┐  │
│  │    桌面端     │  │    移动端     │  │       Web 浏览器          │  │
│  │  (Tauri App) │  │  (PWA/Web)   │  │  (Chrome/Safari/Firefox) │  │
│  └──────┬───────┘  └──────┬───────┘  └────────────┬─────────────┘  │
└─────────┼─────────────────┼───────────────────────┼────────────────┘
          │                 │                       │
          └─────────────────┼───────────────────────┘

┌───────────────────────────▼─────────────────────────────────────────┐
│                    前端 (React 18 / TypeScript / Vite)               │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  172 组件 · 41 Hooks · 插件系统 · i18n (6 语言)            │   │
│  │  React Flow · Recharts · dnd-kit · cmdk · 虚拟滚动          │   │
│  └─────────────────────────────────────────────────────────────┘   │
├───────────────────────────┬───────────────────┬─────────────────────┤
│       Tauri IPC           │    WebSocket      │  HTTP + 嵌入式 UI   │
│       (桌面端)             │   http://:52131 (WS at /ws)            │
└───────────────────────────┴───────────────────┴─────────────────────┘

┌───────────────────────────▼─────────────────────────────────────────┐
│                    Rust 后端 (Tauri 2)                               │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  扫描器 · SQLite 缓存 · FTS5 · Tantivy · 文件监听器         │   │
│  │  PTY 终端 · 认证 · 导出 · 配置 · 统计 · 标签               │   │
│  │  Pi 实时注册 · Subagent 追踪 · 写入缓冲                     │   │
│  └─────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────┘

前端

技术用途
React 18UI 框架,支持 Hooks 和并发特性
TypeScript172 组件的类型安全
Vite构建工具,开发时支持 HMR
Tailwind CSS原子化样式,通过 CSS 自定义属性实现主题
i18next国际化(en-US、zh-CN、ja-JP、de-DE、fr-FR、es-ES)
xterm.js浏览器内终端模拟器
React Flow流程视图的图形可视化
Recharts仪表板图表
dnd-kit看板拖拽
cmdk命令面板
@tanstack/react-virtual大型会话列表的虚拟滚动

关键模式

  • 传输层抽象transport.ts 提供统一接口,自动检测运行环境(Tauri IPC vs. WebSocket vs. HTTP)并路由命令
  • 插件系统src/plugins/ 中的搜索插件允许扩展搜索源
  • Context 提供者TransportContextSettingsContextSessionViewContext 管理共享状态
  • 41 个自定义 Hooks — 封装可复用逻辑(快捷键、文件监听、移动端检测、Pi 实时同步、会话查看器虚拟滚动、消息内搜索、会话树查找等)

后端

技术用途
Tauri 2桌面应用框架,提供原生 API
Rust系统级语言,兼顾性能与安全
Tokio异步运行时,支持并发 I/O
AxumHTTP/WebSocket 服务器框架
SQLite (rusqlite)持久化缓存、设置、标签、收藏
Tantivy辅助全文搜索索引(类 Lucene,结果与 FTS5 合并)
portable-ptyPTY 终端会话
rust-embed将前端资源嵌入二进制文件
notify文件系统监听器

模块结构

src-tauri/src/
├── main.rs                   # 入口:CLI 参数、窗口、适配器启动
├── lib.rs                    # 模块声明、命令注册
├── dispatch.rs               # 纯业务逻辑,WS/HTTP/CLI 共享
├── config.rs                 # TOML 配置加载器
├── auth.rs                   # 非本地访问的 Token 认证
├── export.rs                 # 会话导出(HTML、Markdown、JSON)
├── stats.rs                  # 聚合会话统计
├── subagent.rs               # Subagent 成本追踪
├── settings_store.rs         # 基于 SQLite 的应用设置
├── compression.rs            # Gzip 压缩工具
├── metrics.rs                # Prometheus 风格指标收集
├── api_readonly.rs           # 面向外部消费者的只读 HTTP API
├── commands/                 # Tauri IPC 命令处理器(17 个模块)
│   ├── auth.rs               # API Token 管理
│   ├── config_bundle.rs      # 配置导入/导出
│   ├── config_versions.rs    # 设置版本历史
│   ├── favorites.rs          # 收藏会话
│   ├── model_config.rs       # 模型配置 CRUD + 备份/恢复
│   ├── models.rs             # 旧版模型设置
│   ├── pi_live.rs            # Pi CLI 实时会话注册表
│   ├── search.rs             # 全文搜索(会话 + 消息 FTS)
│   ├── session.rs            # 会话重命名、删除、打开
│   ├── session_file.rs       # 文件级会话操作
│   ├── session_list.rs       # 分页会话列表
│   ├── session_open.rs       # 在编辑器中打开会话
│   ├── settings.rs           # 应用设置 CRUD
│   ├── skills.rs             # 技能/模型/Pi 资源管理
│   ├── tags.rs               # 层级标签管理
│   └── terminal.rs           # PTY 终端管理
├── core/                     # 纯业务逻辑(无 Tauri 依赖)
│   ├── delete.rs             # 会话删除逻辑
│   ├── intel.rs              # 结构化召回 / 意图检测
│   ├── parser.rs             # JSONL 会话解析器
│   ├── scanner.rs            # 多路径会话扫描器 + 增量重扫
│   └── write_buffer.rs       # SQLite 异步写入批处理
├── data/
│   ├── search/               # 搜索引擎层
│   │   ├── client.rs         # 统一搜索客户端(FTS5 + Tantivy 合并)
│   │   ├── embedding.rs      # 语义搜索嵌入服务
│   │   ├── index.rs          # Tantivy 索引管理
│   │   └── tantivy.rs        # Tantivy 全文搜索实现
│   └── sqlite/               # SQLite 数据访问层
│       ├── bootstrap.rs      # 数据库初始化、WAL 模式、Schema 创建
│       ├── deps.rs           # 共享 SQLite 依赖
│       ├── details_cache.rs  # 会话详情缓存
│       ├── favorites.rs      # 收藏表操作
│       ├── legacy_fts.rs     # 旧版会话级 FTS(已弃用)
│       ├── maintenance.rs    # Vacuum、清理、预加载
│       ├── message_index.rs  # message_entries + FTS5 触发器
│       ├── migrations.rs     # 版本化 Schema 迁移
│       ├── schema.rs         # Schema 版本管理(v6)
│       ├── sessions.rs       # 会话 upsert / 查询
│       ├── subagent_meta.rs  # Subagent 元数据缓存
│       ├── tags.rs           # 标签表操作
│       ├── types.rs          # SQLite 类型定义
│       └── util.rs           # SQLite 工具
├── domain/                   # 领域模型和业务规则
├── server/                   # 协议适配器
│   ├── http/                 # HTTP 服务(Axum)
│   │   ├── mod.rs            # 路由设置、中间件、CORS
│   │   ├── common.rs         # 共享 HTTP 处理器
│   │   ├── readonly_routes.rs# 只读 API 路由
│   │   ├── realtime.rs       # WebSocket / SSE 事件处理
│   │   ├── embedding.rs      # 嵌入 API 端点
│   │   ├── sessions.rs       # 会话 HTTP 路由
│   │   └── static_assets.rs  # 嵌入式前端(rust-embed)
│   └── ws.rs                 # 独立 WebSocket 服务(旧版)
└── utils/                    # 工具函数
    ├── mod.rs
    ├── payload.rs
    └── string.rs

纯模块

核心业务逻辑模块(scanner.rssearch.rstags.rs 等)不依赖 Tauricommands/ 层是一个薄包装,将 Tauri IPC 桥接到纯逻辑。这种设计使 CLI 二进制文件可以复用相同代码,无需引入 Tauri。

多协议通信

三种协议共享同一个命令路由——dispatch()

协议地址使用场景
Tauri IPCinvoke()桌面应用(仅 GUI 模式)
WebSocketws://127.0.0.1:52131/ws实时双向通信(浏览器)
HTTP POSThttp://127.0.0.1:52131/api无状态单次调用(curl、集成)

单端口架构:WebSocket 现在通过 /ws 路径在与 HTTP 相同的端口上提供,简化了部署和配置。

添加新命令只需在 dispatch() 中增加一个 match 分支。WebSocket 和 HTTP 自动继承。

传输层自动检测

前端检测运行环境并选择合适的传输方式:

  1. Tauri IPC — 当 window.__TAURI__ 可用时(桌面应用)
  2. WebSocket — 浏览器访问的默认方式(实时更新,SSE 作为回退)
  3. HTTP — 移动端 Web 的回退方式(POST 发送命令,SSE 接收事件)

嵌入式前端

HTTP 服务器通过 rust-embed 嵌入前端,因此打包后的二进制文件在 http://localhost:52131 提供完整 UI——无需外部 dist/ 目录。嵌入的资源约增加 12MB 二进制体积。

CLI 二进制文件(pi-session-cli)在单个端口(52131)上通过一个 axum Router 同时提供 API、WebSocket(/ws)和嵌入式前端。

增量更新

后端采用多层缓存和更新策略:

  1. 扫描器缓存 — 持久化内存缓存,带原子版本计数器
  2. 文件监听器notify crate,RecursiveMode::Recursive,批量处理变更路径
  3. 增量重扫 — 仅重新解析变更的 JSONL 文件
  4. SessionsDiff — 通过 WebSocket/SSE 推送差异到前端
  5. 前端补丁patchSessions() 合并差异,无需完整重载

目录