# AnnoVibe

AI-native bioinformatics workspace by Annoroad，基于 pi coding agent。在浏览器中浏览会话、与智能体对话、分叉对话、切换消息分支。

## 快速开始

```bash
npm install -g @seqyuan/annovibe
annovibe
```

启动后打开 [http://localhost:30141](http://localhost:30141)。首次启动会提示设置密码（可选，类似 Jupyter）。

## CLI 命令

```bash
annovibe                      # 启动服务（后台运行）
annovibe start                # 启动后台服务（已运行则直接返回）
annovibe restart              # 停止后重新启动后台服务
annovibe stop                 # 停止后台服务
annovibe status               # 查看后台服务状态
annovibe logs                 # 查看最近日志
annovibe logs -f              # 持续跟随日志
annovibe --port 8080          # 自定义端口
annovibe --hostname 127.0.0.1 # 仅本机访问
annovibe --version            # 查看版本
annovibe --help               # 查看帮助
annovibe update               # 更新到最新版
annovibe passwd               # 修改密码
annovibe passwd --reset       # 删除密码（禁用认证）

PORT=8080 annovibe            # 也支持环境变量
ANNOVIBE_PASSWORD=xxx annovibe # 环境变量设置密码
```

后台服务默认会在检测到已安装版本变化后，等待当前 agent 运行空闲，然后自动优雅重启到新版本。可设置 `ANNOVIBE_AUTO_RESTART=0` 关闭。

## 功能介绍

- **密码保护** — 可选密码认证（bcrypt 哈希），类似 Jupyter。`annovibe passwd` 管理。
- **会话浏览器** — 按工作目录分组展示所有 pi 会话
- **实时对话** — 通过 SSE 流式输出与智能体实时交互
- **会话分叉** — 从任意用户消息创建独立的新会话分支
- **会话内分支** — 回退到任意节点继续对话，在同一文件内创建分支
- **分支导航器** — 可视化切换同一会话内的各个分支
- **模型切换** — 对话中途随时切换模型
- **工具面板** — 控制智能体可使用的工具
- **子代理面板** — 追踪子 agent 运行状态（运行中/已完成/失败）
- **流式绘图** — `show-widget` fence 支持，LLM 输出图表/SVG/HTML 实时渲染
- **压缩会话** — 对长会话进行摘要，节省上下文窗口
- **引导 / 追加** — 打断正在运行的智能体，或在其完成后追加消息
- **文件编辑** — 侧边栏文本文件支持 CodeMirror 6 编辑，Ctrl+S 保存
- **文档预览** — PDF/DOCX/XLSX/PPTX 内嵌预览
- **可拖拽面板** — 侧边栏和右侧面板自由拖拽调整宽度
- **上下文文件** — soul.md（全局 persona / 语气 / 工作风格）、harness.md（行为约束）、memory.md（项目记忆）

## 注意事项

- **数据目录** — 默认读取 `~/.pi/agent/sessions` 下的会话文件。可通过环境变量 `PI_CODING_AGENT_DIR` 指定其他目录。
- **模型配置** — 从智能体数据目录下的 `models.json` 读取可用模型，可在侧边栏的「Models」面板中编辑。
- **文件浏览** — 侧边栏内置文件浏览器，可在标签页中查看和编辑当前工作目录下的文件。
- **密码存储** — `~/.pi/agent/web-auth.json`，忘记密码可删除此文件重新设置。
- **全局上下文** — `~/.pi/agent/soul.md`（全局 persona / 语气 / 工作风格）、`~/.pi/agent/harness.md`（行为约束）首次启动自动 seed。

## 开发

```bash
npm install
npm run dev   # 端口 30141
```

## 项目结构

```
app/
  api/
    sessions/      # 读写会话文件
    agent/         # 发送命令、SSE 事件流
    files/         # 文件内容读取
    models/        # 可用模型列表与默认模型
    models-config/ # 读写 models.json
    auth/          # 密码认证
components/
  viewers/         # PDF/DOCX/XLSX/PPTX 查看器
lib/
  session-reader.ts  # 解析 .jsonl 会话文件
  rpc-manager.ts     # 管理 AgentSession 生命周期
  auth.ts            # 密码管理
  widget-utils.ts    # 流式绘图解析
```

会话文件存储路径：`~/.pi/agent/sessions/<编码后的工作目录>/<时间戳>_<uuid>.jsonl`
