import type { ChatMessage, ToolCallInfo } from "../schemas/message"; import type { ContentBlock } from "../schemas/projection"; import { type McpAppData } from "../schemas/mcp-app"; /** * MCP App 卡片(`_meta.ui` → `tool_ui` block)的共享判定层。 * * 判定逻辑不许各写一份(仓库 CLAUDE.md):agent-react 与 apps/web 都从这里消费卡片的 * 实例、可见性、身份和终态规则;样式与状态容器(侧栏页签栈等)两侧各自实现。 */ export interface ToolUiCard { resourceUri?: string; resourceURI?: string; resourceHTML?: string; /** Local HTML source file; hosts can normalize it against the session workspace. */ sourcePath?: string; /** 历史投影标记:绝不重新解析 resourceUri(刷新不重放 MCP/资源读取)。 */ archived?: boolean; target: "inline" | "preview"; height: number; title?: string; /** 留档的 MCP App 来源身份与调用数据(来源 server、ui:// 资源、CSP 元数据)。 */ mcpApp?: McpAppData; } /** 严格守卫:target/height 缺失、archived 无留档 HTML、或 mcpApp 来源身份残缺的 * 卡片一律判无效,消息流、侧栏、toolPreview 事件三处一致降级(不渲染、不发事件、 * 不推送)。后端 `_tool_ui_meta.py` 总会补齐 target/height 默认值,判无效即数据畸形。 */ export declare function isToolUiCard(value: unknown): value is ToolUiCard; export type ToolUiCardContentType = "resource-html" | "resource-uri" | "resource-file"; /** 解析卡片实际要渲染的内容。archived 卡片只认留档 HTML,绝不回退到 * resourceUri——历史恢复/浏览器刷新不得因此重新发起 MCP 资源读取。 */ export declare function resolveToolUiCardContent(card: ToolUiCard): { type: ToolUiCardContentType; content: string; } | null; /** 卡片实例身份/去重键:uri 卡片按内容去重(同一 URI 多次产出只留一份), * 文件 HTML 按来源路径,无来源的 HTML 按 toolCallId 去重。 */ export declare function buildToolUiCardKey(toolCallId: string, type: ToolUiCardContentType, content: string, sourcePath?: string): string; /** 内部「阶段进度」卡片不对用户展示入口。 */ export declare function isInternalStatusToolUiCard(card: { title?: string | null; } | null): boolean; /** app-dev 会话里的应用预览卡片:走专门的预览页签,不开普通侧栏 artifact。 */ export declare function isAppDevToolUiCard(card: ToolUiCard, isAppDev: boolean): boolean; export interface InlineToolUiCardEntry { key: string; toolCallId: string; card: ToolUiCard; } /** 从一轮消息里收集 target=inline 的卡片(渲染进消息流)。 */ export declare function collectInlineToolUiCards(messages: ChatMessage[]): InlineToolUiCardEntry[]; export interface PreviewToolUiCardEntry { key: string; toolCall: ToolCallInfo; card: ToolUiCard; /** 所属消息的 blocks;调用方需要还原卡片所在 block 上下文时用。 */ blocks: ContentBlock[]; } /** 从一轮消息里收集 target=preview 的卡片(进侧栏/面板,不进消息流), * 并绑定回所属的 toolCall。 */ export declare function collectPreviewToolUiCards(messages: ChatMessage[]): PreviewToolUiCardEntry[];