# DSL Agent Logs

实时 DSL Agent 日志查看器扩展。

## 功能特性

- ✅ 多路日志流展示（按 session 分组）
- ✅ Stream 列表视图（独立的 Streams 面板）
- ✅ 按日志等级过滤（支持 ERROR/WARN/INFO/DEBUG）
- ✅ 关键词搜索
- ✅ 日志导出到文件
- ✅ 清空日志（清空当前选中的 Stream）
- ✅ 复制单条日志
- ✅ 不同等级的日志有不同的图标和颜色
- ✅ Stream 管理（启用/禁用、移除、选择）
- ✅ 活跃 Stream 高亮显示

## 使用方法

### 1. 查看日志

在控制面板中打开 "DSLAgentLogs" 栏目，可以看到两个视图：
- **Logs**: 显示当前选中 Stream 的日志
- **Streams**: 显示所有可用的 Stream 列表

日志会按照 session_id 自动分组，每个 session 对应一个独立的日志流。

### 2. 选择 Stream

在 **Streams** 视图中：
- 点击任意 Stream 即可切换到该 Stream 的日志视图
- 当前活跃的 Stream 会以蓝色图标显示
- 非活跃的 Stream 显示为灰色图标
- 每个 Stream 显示其包含的日志数量

### 3. 过滤日志

在 **Logs** 视图的工具栏中：
- 点击过滤按钮 📋，选择要过滤的日志级别：
  - ❌ ERROR: 只显示错误日志
  - ⚠️ WARN: 只显示警告日志
  - ℹ️ INFO: 只显示信息日志
  - 🐛 DEBUG: 只显示调试日志
- 点击 📋（填充图标）清除级别过滤

### 4. 搜索日志

在 **Logs** 视图的工具栏中：
- 点击搜索按钮 🔍，输入关键词进行搜索
- 搜索会在日志消息和原始文本中匹配
- 点击 🔍（停止图标）清除搜索过滤

### 5. 管理 Stream

在 **Streams** 视图中，右键点击 Stream 节点：
- **Enable/Disable Stream**: 启用/禁用该 Stream（禁用后不再接收新日志）
  - 启用状态显示 ▶️ 图标
  - 禁用状态显示 ⏸️ 图标
- **Remove Stream**: 移除该 Stream 及其所有日志

### 6. 导出日志

点击 **Logs** 视图工具栏的导出按钮 📤：
- 导出当前选中 Stream 的所有日志
- 选择保存位置和文件名
- 支持 .log 和 .txt 格式

### 7. 清空日志

点击 **Logs** 视图工具栏的清空按钮 🗑️：
- 清空当前选中 Stream 的所有日志
- Stream 本身保留，只清除日志内容

### 8. 复制日志

点击 **Logs** 视图中的任意日志条目：
- 直接点击日志条目即可复制到剪贴板
- 支持长文本自动换行显示

## 架构说明

### 日志推送模式

扩展采用**推送模式**接收日志，不主动连接任何服务。日志由 Rust 侧通过命令推送：

```typescript
vscode.commands.executeCommand(
  'dsl-agent-logs.addLogEntry',
  streamId,    // 基于 session_id 生成
  streamName,  // 显示名称
  logEntry     // 日志对象
);
```

### 双视图架构

扩展提供两个独立的视图:

1. **Logs 视图** (`dsl-agent-logs-view`) - WebView
   - 使用 WebView 实现,支持长文本自动换行
   - 显示当前选中 Stream 的日志条目
   - 支持过滤和搜索
   - 支持导出和清空操作
   - 点击日志条目即可复制

2. **Streams 视图** (`dsl-agent-logs-streams`) - TreeView
   - 显示所有可用的 Stream 列表
   - 显示每个 Stream 的日志数量
   - 高亮显示当前活跃的 Stream
   - 支持启用/禁用和移除操作

### 多路展示

- 每个 `session_id` 对应一个独立的日志流
- Stream 自动创建（首次收到日志时）
- 支持同时管理多个 session 的日志
- 每个 Stream 可以独立管理（启用/禁用/清空/移除）
- 每个 Stream 维护独立的过滤条件

### 日志对象格式

```typescript
interface LogEntry {
  id: string;              // 唯一标识
  streamId: string;        // Stream ID（基于 session_id）
  streamName: string;      // Stream 显示名称
  timestamp: Date;         // 时间戳
  level: LogLevel;         // 日志级别
  message: string;         // 日志消息
  source?: string;         // 日志来源
  taskId?: string;         // Task ID（用于 UI 展示）
  rawText: string;         // 原始文本
}
```

## 数据流

```
Rust 端 (dsl_agent.rs)
  ↓ 发送 DSLAgentServerSendEvent
TypeScript 端 (dslAgent.impl.ts)
  ↓ handleLogPayload 解析
  ↓ 调用命令 'dsl-agent-logs.addLogEntry'
VSCode 扩展 (extension.ts)
  ↓ multiStreamService.addLogEntry()
  ↓ 自动创建/更新 Stream
  ↓ 设置为活跃 Stream
  ↓ 触发事件更新
LogWebviewProvider & StreamListDataProvider
  ↓ 监听事件并刷新视图
WebView + TreeView 展示（Logs WebView + Streams TreeView）
```

## 开发

### 编译

```bash
cd extensions/dsl-agent-logs
npm install
npm run compile
```

### 监听模式

```bash
npm run watch
```

### 打包

```bash
npm run package
```

## 依赖

- VSCode ^1.74.0
- TypeScript ~5.3.3

## 许可证

MIT
