feat: 升级至 v0.2.1 — 流式渲染修复、安全增强、工具自动执行

流式渲染修复:
- runId 机制防止 abort 后旧流事件污染新 run
- run lock 防止并发 run 污染引擎状态
- abort race 提前退出工具执行等待
- TERMINATED 状态通过 stateChange 发射
- tool_call_delta 流式参数拼接 + pending 占位替换
- 首轮卡片创建路径统一,traceStep 按 ID 精确匹配
- compressed 事件转发为 toast 通知

安全增强:
- ConfirmationHook 支持持久化自动执行(跨会话)
- 设置面板新增自动执行工具管理 UI
- SandboxManager 双重安全校验 fail-closed
- 审计日志链式哈希防篡改
- PromptInjectionDefender 中文注入标记清理
- scanCode 28 模式 + base64/$() 检测
- validatePath realpathSync 防符号链接逃逸
- code-search 使用 execFile 防命令注入

新增工具:
- file_editor、code_search、task_manager、diff_viewer

其他:
- Agent Loop 加 PARSING/REFLECTING 状态 + 指数退避重试
- MemoryManager TF-IDF 语义检索
- run_command Windows 中文编码修复(chcp 65001)
- 版本号 0.2.0 → 0.2.1
This commit is contained in:
thzxx
2026-07-12 12:54:52 +08:00
parent 469f53b623
commit 3c5aea8fb7
41 changed files with 4972 additions and 423 deletions
+97 -1
View File
@@ -59,7 +59,13 @@ interface MetonaAgentAPI {
/** 发送 MetonaMessageIR 类型)+ sessionId 到主进程 */
sendMessage: (message: MetonaMessageInput, sessionId: string) => Promise<{ success: boolean }>;
onStreamEvent: (callback: (event: MetonaStreamEventData) => void) => () => void;
onStateChange: (callback: (state: { sessionId: string; state: string }) => void) => () => void;
onStateChange: (callback: (state: {
sessionId: string | null;
iteration: number;
state: string;
previous: string;
current: string;
}) => void) => () => void;
abortSession: (sessionId: string) => Promise<{ success: boolean }>;
onProviderSwitched: (callback: (data: { from?: string; to?: string; reason?: string }) => void) => () => void;
}
@@ -93,6 +99,7 @@ interface MetonaSessionsAPI {
timestamp: number;
}>>;
pin: (sessionId: string, pinned: boolean) => Promise<{ success: boolean }>;
archive: (sessionId: string, archived: boolean) => Promise<{ success: boolean }>;
deleteMessage: (messageId: string) => Promise<{ success: boolean }>;
clearMessages: (sessionId: string) => Promise<{ success: boolean }>;
saveTrace: (sessionId: string, data: { traceSteps: unknown[]; tokenUsage: unknown }) => Promise<{ success: boolean }>;
@@ -142,6 +149,12 @@ interface MetonaMemoryAPI {
type?: 'episodic' | 'semantic' | 'working';
minImportance?: number;
}) => Promise<MetonaMemorySearchResult[]>;
listAll: (options?: { type?: string; limit?: number }) => Promise<{
success: boolean;
data?: { episodic?: unknown[]; semantic?: unknown[]; working?: unknown[] };
error?: string;
}>;
delete: (type: string, id: string) => Promise<{ success: boolean; error?: string }>;
}
// ===== Config API =====
@@ -210,6 +223,86 @@ interface MetonaDataAPI {
clearAuditLogs: () => Promise<{ success: boolean; error?: string }>;
}
// ===== v0.2.0: Tasks API =====
interface MetonaTask {
id: string;
session_id: string;
title: string;
description: string;
status: 'pending' | 'in_progress' | 'completed' | 'blocked' | 'cancelled';
priority: 'low' | 'medium' | 'high' | 'critical';
parent_id: string | null;
assigned_to: string | null;
order_idx: number;
created_at: number;
updated_at: number;
completed_at: number | null;
}
interface MetonaTasksAPI {
list: (sessionId?: string) => Promise<{ success: boolean; data: MetonaTask[] }>;
create: (data: {
sessionId: string;
title: string;
description?: string;
priority?: string;
parentId?: string;
}) => Promise<{ success: boolean; id?: string; error?: string }>;
update: (
id: string,
updates: {
title?: string;
description?: string;
status?: string;
priority?: string;
assignedTo?: string;
},
) => Promise<{ success: boolean; error?: string }>;
delete: (id: string) => Promise<{ success: boolean; error?: string }>;
}
// ===== v0.2.0: Audit API =====
interface MetonaAuditVerifyResult {
success: boolean;
valid: boolean;
totalRecords: number;
verifiedRecords: number;
tamperedId: number | null;
error?: string;
}
interface MetonaAuditAPI {
verifyChain: () => Promise<MetonaAuditVerifyResult>;
query: (filters?: { sessionId?: string; eventType?: string; limit?: number }) =>
Promise<{ success: boolean; data?: unknown[]; error?: string }>;
}
// ===== v0.2.0: Tool Confirmation API =====
interface MetonaConfirmationRequest {
toolCallId: string;
toolName: string;
args: Record<string, unknown>;
riskLevel: string;
reason: string;
}
interface MetonaToolAPI {
onConfirmationRequest: (callback: (request: MetonaConfirmationRequest) => void) => () => void;
sendConfirmationResponse: (response: {
toolCallId: string;
approved: boolean;
remember: boolean;
autoExecute?: boolean;
}) => void;
/** 设置/取消工具的持久化自动执行(跨会话不再询问) */
setAutoExecute: (toolName: string, enabled: boolean) => Promise<{ success: boolean; error?: string }>;
/** 获取已设置为自动执行的工具列表 */
getAutoExecuteList: () => Promise<{ success: boolean; data: string[] }>;
}
// ===== Bridge 接口 =====
interface MetonaBridge {
@@ -223,6 +316,9 @@ interface MetonaBridge {
tools: MetonaToolsAPI;
data: MetonaDataAPI;
searxng: MetonaSearXNGAPI;
tasks: MetonaTasksAPI;
audit: MetonaAuditAPI;
tool: MetonaToolAPI;
}
// ===== 全局 Window 增强 =====