release(v0.2.0): streaming, MCP protocol, Browser Hand, security enhancements

## Major Features

### Streaming Response System
- Implement LlmDriver trait with `stream()` method returning async Stream
- Add SSE parsing for Anthropic and OpenAI API streaming
- Integrate Tauri event system for frontend streaming (`stream:chunk` events)
- Add StreamChunk types: Delta, ToolStart, ToolEnd, Complete, Error

### MCP Protocol Implementation
- Add MCP JSON-RPC 2.0 types (mcp_types.rs)
- Implement stdio-based MCP transport (mcp_transport.rs)
- Support tool discovery, execution, and resource operations

### Browser Hand Implementation
- Complete browser automation with Playwright-style actions
- Support Navigate, Click, Type, Scrape, Screenshot, Wait actions
- Add educational Hands: Whiteboard, Slideshow, Speech, Quiz

### Security Enhancements
- Implement command whitelist/blacklist for shell_exec tool
- Add SSRF protection with private IP blocking
- Create security.toml configuration file

## Test Improvements
- Fix test import paths (security-utils, setup)
- Fix vi.mock hoisting issues with vi.hoisted()
- Update test expectations for validateUrl and sanitizeFilename
- Add getUnsupportedLocalGatewayStatus mock

## Documentation Updates
- Update architecture documentation
- Improve configuration reference
- Add quick-start guide updates

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
iven
2026-03-24 03:24:24 +08:00
parent e49ba4460b
commit 3ff08faa56
78 changed files with 29575 additions and 1682 deletions

119
hands/slideshow.HAND.toml Normal file
View File

@@ -0,0 +1,119 @@
# Slideshow Hand - 幻灯片控制能力包
#
# ZCLAW Hand 配置
# 提供幻灯片演示控制能力,支持翻页、聚焦、激光笔等
[hand]
name = "slideshow"
version = "1.0.0"
description = "幻灯片控制能力包 - 控制演示文稿的播放、导航和标注"
author = "ZCLAW Team"
type = "presentation"
requires_approval = false
timeout = 30
max_concurrent = 1
tags = ["slideshow", "presentation", "slides", "education", "teaching"]
[hand.config]
# 支持的幻灯片格式
supported_formats = ["pptx", "pdf", "html", "markdown"]
# 自动翻页间隔0 表示禁用
auto_advance_interval = 0
# 是否显示进度条
show_progress = true
# 是否显示页码
show_page_number = true
# 激光笔颜色
laser_color = "#ff0000"
# 聚焦框颜色
spotlight_color = "#ffcc00"
[hand.triggers]
manual = true
schedule = false
webhook = false
[[hand.triggers.events]]
type = "chat.intent"
pattern = "幻灯片|演示|翻页|下一页|上一页|slide|presentation|next|prev"
priority = 5
[hand.permissions]
requires = [
"slideshow.navigate",
"slideshow.annotate",
"slideshow.control"
]
roles = ["operator.read"]
[hand.rate_limit]
max_requests = 200
window_seconds = 3600
[hand.audit]
log_inputs = true
log_outputs = false
retention_days = 7
# 幻灯片动作定义
[[hand.actions]]
id = "next_slide"
name = "下一页"
description = "切换到下一张幻灯片"
params = {}
[[hand.actions]]
id = "prev_slide"
name = "上一页"
description = "切换到上一张幻灯片"
params = {}
[[hand.actions]]
id = "goto_slide"
name = "跳转到指定页"
description = "跳转到指定编号的幻灯片"
params = { slide_number = "number" }
[[hand.actions]]
id = "spotlight"
name = "聚焦元素"
description = "用高亮框聚焦指定元素"
params = { element_id = "string", duration = "number?" }
[[hand.actions]]
id = "laser"
name = "激光笔"
description = "在幻灯片上显示激光笔指示"
params = { x = "number", y = "number", duration = "number?" }
[[hand.actions]]
id = "highlight"
name = "高亮区域"
description = "高亮显示幻灯片上的区域"
params = { x = "number", y = "number", width = "number", height = "number", color = "string?" }
[[hand.actions]]
id = "play_animation"
name = "播放动画"
description = "触发幻灯片上的动画效果"
params = { animation_id = "string" }
[[hand.actions]]
id = "pause"
name = "暂停"
description = "暂停自动播放"
params = {}
[[hand.actions]]
id = "resume"
name = "继续"
description = "继续自动播放"
params = {}