feat: v0.8.2 安全纵深补全 · 协议保真 · 断链修复 — 图片SSRF/根MEMORY.md保护根治 · Anthropic thinking回传+pause_turn续传 · 2523 用例全量回归 + E2E 扩充
CI / 类型检查 + Lint + 单元测试 (push) Failing after 9m45s
CI / 全量测试 (Electron ABI) (push) Failing after 6m28s
CI / 产物编译验证 (push) Successful in 11m18s

This commit is contained in:
2026-09-08 14:30:27 +08:00
parent 69776e447f
commit 4cd6e997b5
86 changed files with 4303 additions and 956 deletions
+7 -3
View File
@@ -30,14 +30,18 @@ export type {
MetonaTokenUsage,
MetonaStreamEvent,
MetonaValidationPayload,
MetonaThinking,
MetonaError,
} from './metona-response';
export { MetonaFinishReason, MetonaStreamEventType, MetonaErrorCode } from './metona-response';
// ===== 上下文与记忆 =====
export type { MetonaContext, MetonaMemoryItem } from './metona-context';
// v0.8.2 P3-6 IR 卫生: 删除 metona-context.tsMetonaContext / MetonaMemoryItem)——
// P1-12 已移除唯一的 build() 组装路径后二者零消费方;MetonaMemoryItem 的真实形态
// 由 memory 子系统的存储行结构承担。纸面类型遵循 v0.7.2 P3-12(删 THINKING_START/
// END)同一治理先例:不为"文档曾如此描述"保留死契约。
// ===== 思考块 =====
export type { MetonaThinkingBlock } from './metona-request';
// ===== 适配器接口 =====
export type { IMetonaProviderAdapter, AdapterConfig } from './metona-adapter';
-61
View File
@@ -1,61 +0,0 @@
/**
* Metona IR — 上下文与记忆类型定义
*
* @see docs/MetonaAI-Desktop 内部API请求与响应标准.html
*/
import type { MetonaMessage, MetonaSystemPrompt, MetonaToolDef } from './metona-request';
// ===== 上下文标准 =====
export interface MetonaContext {
/** 上下文唯一标识 */
id: string;
/** 关联的会话 */
sessionId: string;
/** System Prompt 分区 */
systemPrompt: MetonaSystemPrompt;
/** 会话历史(最近 N 轮) */
history: MetonaMessage[];
/** 检索到的相关记忆 */
relevantMemories: MetonaMemoryItem[];
/** 当前任务信息 */
currentTask: {
userInput: string;
iteration: number;
taskGoal?: string;
};
/** 可用工具列表 */
availableTools: MetonaToolDef[];
/** 预估 Token 数 */
estimatedTokens: number;
/** 上下文使用率(estimatedTokens / contextWindow */
usageRatio: number;
/** 是否需要压缩 */
needsCompression: boolean;
}
// ===== 记忆格式 =====
export interface MetonaMemoryItem {
id: string;
type: 'episodic' | 'semantic' | 'working';
/** 可被 LLM 阅读的记忆内容 */
content: string;
/** 精简摘要(上下文紧张时使用) */
summary?: string;
/** 来源 */
source: 'user_input' | 'tool_result' | 'agent_thought' | 'imported';
/** 重要程度 0-1 */
importance: number;
/** 检索相关性分数(仅在检索结果中出现) */
relevanceScore?: number;
sessionId?: string;
createdAt: number;
expiresAt?: number;
}
+40
View File
@@ -78,6 +78,23 @@ export interface MetonaConstraints {
// ===== 消息格式 =====
/**
* v0.8.2 P1-1: 思考块(含 Provider 签名)—— Anthropic extended thinking + tool use
* 多轮回传的协议要求:assistant 消息(尤其含 tool_use 的轮次)必须携带原始 thinking /
* redacted_thinking 块(含 signature),否则 API 400 或推理上下文丢失。
* IR 层不感知签名细节,仅做透传容器;由 AnthropicAdapter 写入与消费,
* 其余 Provider 忽略该字段。
*/
export interface MetonaThinkingBlock {
type: 'thinking' | 'redacted_thinking';
/** thinking 块的推理文本 */
thinking?: string;
/** thinking 块的 Provider 签名(回传校验必需;缺失时消费方必须丢弃该块) */
signature?: string;
/** redacted_thinking 块的不透明载荷(原样回传) */
data?: string;
}
export interface MetonaMessage {
role: 'system' | 'user' | 'assistant' | 'tool';
@@ -92,6 +109,15 @@ export interface MetonaMessage {
/** (仅 assistant)思考/推理内容 */
reasoningContent?: string;
/**
* (仅 assistant)原始思考块(v0.8.2 P1-1
*
* 与 reasoningContent(展示用纯文本)并行:thinkingBlocks 保留 Provider 原始块
* 结构与签名,由引擎从流式 DONE 事件透传到其 push 的 assistant 消息上,
* AnthropicAdapter 在构建下一轮请求时按协议回传。
*/
thinkingBlocks?: MetonaThinkingBlock[];
/** (仅 assistant)工具调用请求 */
toolCalls?: MetonaToolCall[];
@@ -144,6 +170,20 @@ export interface MetonaParamField {
description: string;
enum?: string[];
items?: MetonaParamField;
/**
* v0.8.2 P2-7: MCP schema 保真扩展 —— 旧 convertSchema 只保留 type/description
* 丢弃 enum/anyOf/oneOf/嵌套对象/items/default,模型看到的 MCP 参数定义大幅退化,
* 复杂 MCP 工具易产生非法参数。现保留以下结构(内置工具的 Zod 转换路径不受影响)。
*/
/** 嵌套对象属性(type=object 时) */
properties?: Record<string, MetonaParamField>;
/** 嵌套对象的必填键 */
required?: string[];
/** 类型组合(anyOf/oneOf 的原样保留) */
anyOf?: MetonaParamField[];
oneOf?: MetonaParamField[];
/** 默认值(原样透传) */
default?: unknown;
}
export enum MetonaToolCategory {
+20 -12
View File
@@ -4,7 +4,7 @@
* @see docs/MetonaAI-Desktop 内部API请求与响应标准.html
*/
import type { MetonaToolCall, MetonaToolResult } from './metona-request';
import type { MetonaToolCall, MetonaToolResult, MetonaThinkingBlock } from './metona-request';
// ===== 响应元信息 =====
@@ -64,6 +64,11 @@ export interface MetonaResponse {
content: string;
/** 思考/推理内容(Thinking 模式) */
reasoningContent?: string;
/**
* v0.8.2 P1-1: 原始思考块(非流式路径)—— 与 reasoningContent 并行保留
* Provider 原始块结构与签名,供引擎透传到 assistant 消息实现协议回传。
*/
thinkingBlocks?: MetonaThinkingBlock[];
/** 结构化输出(如果模型原生支持 JSON Schema */
structuredOutput?: unknown;
/** 工具调用请求列表 */
@@ -156,6 +161,17 @@ export interface MetonaStreamEvent {
* v0.7.4 及之前硬编码 'stop'length 截断在录制文件中不可归因)。
*/
finishReason?: string;
/**
* DONE — 原始思考块(v0.8.2 P1-1Anthropic 专用)。
*
* Anthropic extended thinking 的 thinking/redacted_thinking 块携带 Provider
* 签名,工具循环多轮请求必须原样回传。流式路径下块结构随 content_block_* 事件
* 消散,adapter 在 DONE 事件上集中携带本响应收集到的全部思考块(仅含签名完备
* 的块),引擎据此写入其 push 的 assistant 消息(MetonaMessage.thinkingBlocks)。
* 其余 Provider 不携带该字段。
*/
thinkingBlocks?: MetonaThinkingBlock[];
}
/** v0.4.1: 输出验证事件载荷 — OutputValidator 检出的疑似问题(幻觉/事实矛盾/敏感信息/格式) */
@@ -173,17 +189,9 @@ export interface MetonaValidationPayload {
}
// ===== 思考内容 =====
export interface MetonaThinking {
/** 思考内容文本 */
content: string;
/** 思考状态 */
status: 'thinking' | 'complete';
/** 思考耗时 (ms) */
durationMs: number;
/** 思考消耗的 token 数 */
tokensUsed: number;
}
// v0.8.2 P3-6 IR 卫生: 删除 MetonaThinking —— 自注册以来全链路零发送方零消费者
// (思考边界由 reasoning_delta 流语义承载),且其字段与 P1-1 引入的
// MetonaThinkingBlock(协议回传所需的真实块结构)概念重叠,保留只会误导读者。
// ===== 错误格式 =====