Files
metona-ollama-desktop/src/renderer/types.d.ts
T

471 lines
14 KiB
TypeScript

// ── Ollama API 类型 ──
export interface OllamaMessage {
role: 'user' | 'assistant' | 'system' | 'tool';
content: string;
images?: string[];
thinking?: string;
reasoning_content?: string;
tool_calls?: ToolCall[];
tool_name?: string;
/** 标记此消息为 LLM 压缩摘要生成 */
compressed?: boolean;
}
export interface OllamaChatParams {
model: string;
messages: OllamaMessage[];
stream?: boolean;
think?: boolean;
system?: string;
tools?: ToolDefinition[];
keep_alive?: number | string;
options?: {
num_ctx?: number;
temperature?: number;
[key: string]: unknown;
};
}
export interface OllamaStreamChunk {
model?: string;
message?: {
role: string;
content?: string;
thinking?: string;
reasoning_content?: string;
tool_calls?: ToolCall[];
};
done?: boolean;
eval_count?: number;
prompt_eval_count?: number;
total_duration?: number;
}
export interface OllamaModelInfo {
name: string;
size?: number;
digest?: string;
modified_at?: string;
}
export interface OllamaModelDetail {
capabilities?: string[];
[key: string]: unknown;
}
export interface ModelCaps {
think: boolean;
vision: boolean;
tools: boolean;
completion: boolean;
}
export interface OllamaVersionResponse {
version: string;
}
export interface OllamaModelsResponse {
models: OllamaModelInfo[];
}
export interface OllamaPsResponse {
models?: Array<{
name: string;
size_vram?: number;
[key: string]: unknown;
}>;
}
export interface OllamaEmbedResponse {
embedding?: number[];
embeddings?: number[][];
}
// ── 会话类型 ──
export interface ChatFile {
name: string;
language?: string;
size?: number;
}
export interface FileContent {
language: string;
content: string;
}
export interface ChatMessage {
role: 'user' | 'assistant' | 'system';
content: string;
timestamp: number;
model?: string;
think?: string;
eval_count?: number;
prompt_eval_count?: number;
total_duration?: number;
images?: string[];
files?: ChatFile[];
_fileContents?: FileContent[];
stopped?: boolean;
toolCalls?: ToolCallRecord[];
/** 标记此消息为 LLM 压缩摘要生成 */
compressed?: boolean;
}
export interface ChatSession {
id: string;
title: string;
model: string;
messages: ChatMessage[];
createdAt: number;
updatedAt: number;
}
// ── Agent 记忆系统类型 ──
export type MemoryType = 'fact' | 'preference' | 'rule';
export interface MemoryEntry {
id: string;
type: MemoryType;
content: string;
importance: number; // 1-10,越高越重要
tags: string[]; // 用于快速匹配
source?: string; // 来源描述(如会话标题)
sessionId?: string; // 关联的会话 ID
embedding?: number[]; // 向量嵌入
createdAt: number;
updatedAt: number;
lastUsedAt: number; // 最后一次被回忆的时间
useCount: number; // 被回忆的次数
}
export interface MemorySearchResult extends MemoryEntry {
score: number; // 相关性得分
}
export interface MemoryExtractionResult {
entries: Array<{
type: MemoryType;
content: string;
importance: number;
tags: string[];
}>;
}
// ── 向量存储类型(用于记忆向量索引)──
export interface VectorCollection {
id: string;
name: string;
embeddingModel: string;
docCount: number;
chunkCount: number;
createdAt: number;
updatedAt: number;
}
export interface VectorItem {
id: string;
collectionId: string;
docId: string;
filename: string;
chunkIndex: number;
text: string;
charCount: number;
embedding: number[];
}
export interface SearchResult extends VectorItem {
score: number;
}
// ── 桌面 Bridge 类型 ──
export interface WorkspaceFileEntry {
name: string;
type: 'file' | 'directory';
size: number | null;
modified: string;
}
export interface WorkspaceDirResult {
success: boolean;
entries?: WorkspaceFileEntry[];
error?: string;
}
export interface MetonaDesktopAPI {
isDesktop: boolean;
info: () => Promise<AppInfo>;
dialog: {
openFile: (options?: FileFilterOptions) => Promise<string[] | null>;
saveFile: (options?: SaveFileOptions) => Promise<string | null>;
};
fs: {
readFile: (filePath: string) => Promise<{ success: boolean; content?: string; name?: string; error?: string }>;
readFileBase64: (filePath: string) => Promise<{ success: boolean; content?: string; size?: number; name?: string; error?: string }>;
writeFile: (filePath: string, content: string, encoding?: string) => Promise<{ success: boolean; error?: string }>;
};
tool: {
execute: (toolName: string, args: Record<string, unknown>) => Promise<ToolResult>;
getConfig: () => Promise<{ allowedDirs: string[]; blockedDirs: string[] }>;
setAllowedDirs: (dirs: string[]) => Promise<void>;
};
notify: (title: string, body: string) => void;
window: {
minimize: () => void;
maximize: () => void;
close: () => void;
};
openExternal: (url: string) => void;
onMenuAction: (callback: (action: string) => void) => void;
onTrayAction: (callback: (action: string) => void) => void;
onAppQuit: (callback: () => void) => void;
removeAllListeners: (channel: string) => void;
onMainLog: (callback: (data: { level: string; message: string; detail?: string }) => void) => void;
db: DBAPI;
workspace: {
getDir: () => Promise<{ dir: string; defaultDir: string }>;
setDir: (dir: string) => Promise<{ success: boolean; dir?: string; error?: string }>;
listDir: (dirPath?: string) => Promise<WorkspaceDirResult>;
readFile: (filePath: string) => Promise<{ success: boolean; content?: string; path?: string; error?: string; truncated?: boolean; lines?: number }>;
exec: (params: { id: string; command: string; cwd?: string }) => void;
kill: (id: string) => void;
onOutput: (callback: (data: { id: string; type: 'stdout' | 'stderr'; data: string }) => void) => void;
onExit: (callback: (data: { id: string; code: number | null }) => void) => void;
/** 无超时工具命令执行,用于 AI Tool Calling 集成 */
execTool: (command: string, cwd?: string) => Promise<{ success: boolean; stdout: string; stderr: string; exitCode: number | null; duration: number }>;
/** AI 命令实时输出推送到工作空间终端 */
onCmdOutput: (callback: (data: { command: string; type: 'stdout' | 'stderr'; data: string }) => void) => void;
/** AI 命令执行完毕 */
onCmdDone: (callback: (data: { command: string; exitCode: number | null }) => void) => void;
/** 终止当前 AI 命令 */
cmdKill: () => Promise<{ killed: boolean }>;
};
mcp: {
startServer: (config: { name: string; command: string; args: string[]; enabled: boolean; description?: string }) => Promise<{ success: boolean; error?: string }>;
stopServer: (name: string) => Promise<{ success: boolean }>;
stopAll: () => Promise<{ success: boolean }>;
callTool: (serverName: string, toolName: string, args: Record<string, unknown>) => Promise<{ success: boolean; result?: unknown; error?: string }>;
getTools: () => Promise<Array<{ serverName: string; name: string; fullName: string; description: string; inputSchema: { type: string; properties?: Record<string, unknown>; required?: string[] } }>>;
getStatuses: () => Promise<Array<{ name: string; running: boolean; toolCount: number }>>;
refreshTools: (name: string) => Promise<Array<{ name: string; description?: string; inputSchema: Record<string, unknown> }>>;
};
}
export interface AppInfo {
version: string;
platform: string;
arch: string;
electronVersion: string;
userDataPath: string;
}
export interface FileFilterOptions {
filters?: Array<{ name: string; extensions: string[] }>;
}
export interface SaveFileOptions {
defaultPath?: string;
filters?: Array<{ name: string; extensions: string[] }>;
}
// ── State Keys ──
export type StateKey =
| 'db'
| 'api'
| 'currentSession'
| 'isStreaming'
| 'isHistoryView'
| 'pendingImages'
| 'abortController'
| 'numCtx'
| 'historyPage'
| 'historySearchQuery'
| 'temperature'
| 'thinkEnabled'
| 'toolCallingEnabled'
| 'runCommandMode'
| 'memoryEnabled'
| 'memoryEntries'
| 'embeddingModel';
// ═══════════════════════════════════════════════════════════
// Tool Calling 类型
// ═══════════════════════════════════════════════════════════
export interface ToolParameterProperty {
type: string;
description?: string;
enum?: string[];
items?: { type: string };
}
export interface ToolParameters {
type: 'object';
required?: string[];
properties: Record<string, ToolParameterProperty>;
}
export interface ToolFunctionDefinition {
name: string;
description: string;
parameters: ToolParameters;
}
export interface ToolDefinition {
type: 'function';
function: ToolFunctionDefinition;
}
export interface ToolCall {
type: 'function';
function: {
name: string;
arguments: Record<string, unknown>;
};
}
export interface ToolResult {
success: boolean;
error?: string;
[key: string]: unknown;
}
export interface ToolCallRecord {
name: string;
arguments: Record<string, unknown>;
result: ToolResult | null;
status: 'pending' | 'running' | 'success' | 'error' | 'cancelled';
confirmed?: boolean;
timestamp: number;
}
export type AgentState = 'idle' | 'sending' | 'accumulating' | 'executing' | 'confirming' | 'done';
// ═══════════════════════════════════════════════════════════
// ReAct Trace 类型 (v4.0)
// ═══════════════════════════════════════════════════════════
export interface TraceEntry {
id: string;
sessionId: string;
stepIndex: number;
thought: string;
action: string;
actionInput: string;
observation: string;
loopCount: number;
createdAt: number;
}
// ═══════════════════════════════════════════════════════════
// SQLite DB IPC 接口 (v4.0)
// ═══════════════════════════════════════════════════════════
export interface SessionRow {
id: string;
title: string;
model: string;
system_prompt: string | null;
parent_id: string | null;
status: string;
created_at: number;
updated_at: number;
}
export interface MessageRow {
id: string;
session_id: string;
role: string;
content: string | null;
thinking: string | null;
images: string | null;
tool_calls: string | null;
tool_name: string | null;
eval_count: number | null;
total_duration: number | null;
created_at: number;
}
export interface MemoryRow {
id: string;
type: string;
content: string;
importance: number;
tags: string | null;
source: string | null;
session_id: string | null;
use_count: number;
embedding: string | null;
created_at: number;
updated_at: number;
last_used_at: number;
}
export interface DBAPI {
saveSession: (session: SessionRow) => Promise<{ success: boolean; id?: string; error?: string }>;
getSession: (id: string) => Promise<SessionRow | null>;
getAllSessions: () => Promise<SessionRow[]>;
deleteSession: (id: string) => Promise<{ success: boolean; error?: string }>;
clearAllSessions: () => Promise<{ success: boolean; error?: string }>;
saveMessage: (msg: MessageRow) => Promise<{ success: boolean; id?: string; error?: string }>;
getMessages: (sessionId: string) => Promise<MessageRow[]>;
saveMemory: (entry: MemoryRow) => Promise<{ success: boolean; id?: string; error?: string }>;
getMemory: (id: string) => Promise<MemoryRow | null>;
getAllMemories: () => Promise<MemoryRow[]>;
getMemoriesByType: (type: string) => Promise<MemoryRow[]>;
deleteMemory: (id: string) => Promise<{ success: boolean; error?: string }>;
clearAllMemories: () => Promise<{ success: boolean; error?: string }>;
searchMemories: (query: string, limit?: number) => Promise<MemoryRow[]>;
saveSetting: (key: string, value: unknown) => Promise<{ success: boolean; error?: string }>;
getSetting: <T = unknown>(key: string, defaultValue?: T) => Promise<T>;
saveToolCall: (tc: unknown) => Promise<{ success: boolean; id?: string; error?: string }>;
getToolCalls: (sessionId: string) => Promise<unknown[]>;
saveTrace: (trace: unknown) => Promise<{ success: boolean; id?: string; error?: string }>;
getTraces: (sessionId: string) => Promise<TraceEntry[]>;
exportSessions: () => Promise<unknown>;
importSessions: (data: unknown) => Promise<{ imported: number; skipped: number }>;
// v4.2 Skills
saveSkill: (skill: unknown) => Promise<{ success: boolean; id?: string; error?: string }>;
getAllSkills: () => Promise<unknown[]>;
deleteSkill: (id: string) => Promise<{ success: boolean; error?: string }>;
clearAllSkills: () => Promise<{ success: boolean; error?: string }>;
searchSkills: (query: string, limit?: number) => Promise<unknown[]>;
incrementSkillUsage: (id: string, success: boolean, durationMs: number) => Promise<{ success: boolean; error?: string }>;
getAllTokenStats(): Promise<{
sessions: Array<{
session_id: string;
title: string;
model: string;
created_at: number;
total_input: number;
total_output: number;
total_duration: number;
round_count: number;
}>;
totals: {
total_input: number;
total_output: number;
total_duration: number;
total_rounds: number;
session_count: number;
};
} | null>;
}
// ── Window global 声明 ──
declare global {
interface Window {
metonaDesktop?: MetonaDesktopAPI;
}
}
export {};