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:
@@ -186,10 +186,10 @@ describe('Crypto Utils', () => {
|
||||
// ============================================================================
|
||||
|
||||
describe('Security Utils', () => {
|
||||
let securityUtils: typeof import('../security-utils');
|
||||
let securityUtils: typeof import('../../src/lib/security-utils');
|
||||
|
||||
beforeEach(async () => {
|
||||
securityUtils = await import('../security-utils');
|
||||
securityUtils = await import('../../src/lib/security-utils');
|
||||
});
|
||||
|
||||
describe('escapeHtml', () => {
|
||||
@@ -265,9 +265,10 @@ describe('Security Utils', () => {
|
||||
|
||||
it('should allow localhost when allowed', () => {
|
||||
const url = 'http://localhost:3000';
|
||||
expect(
|
||||
securityUtils.validateUrl(url, { allowLocalhost: true })
|
||||
).toBe(url);
|
||||
const result = securityUtils.validateUrl(url, { allowLocalhost: true });
|
||||
// URL.toString() may add trailing slash
|
||||
expect(result).not.toBeNull();
|
||||
expect(result?.startsWith('http://localhost:3000')).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -326,7 +327,8 @@ describe('Security Utils', () => {
|
||||
|
||||
describe('sanitizeFilename', () => {
|
||||
it('should remove path separators', () => {
|
||||
expect(securityUtils.sanitizeFilename('../test.txt')).toBe('.._test.txt');
|
||||
// Path separators are replaced with _, and leading dots are trimmed to prevent hidden files
|
||||
expect(securityUtils.sanitizeFilename('../test.txt')).toBe('_test.txt');
|
||||
});
|
||||
|
||||
it('should remove dangerous characters', () => {
|
||||
@@ -419,10 +421,10 @@ describe('Security Utils', () => {
|
||||
// ============================================================================
|
||||
|
||||
describe('Security Audit', () => {
|
||||
let securityAudit: typeof import('../security-audit');
|
||||
let securityAudit: typeof import('../../src/lib/security-audit');
|
||||
|
||||
beforeEach(async () => {
|
||||
securityAudit = await import('../security-audit');
|
||||
securityAudit = await import('../../src/lib/security-audit');
|
||||
localStorage.clear();
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user