Merge origin/main into feat/et

This commit is contained in:
bincxz
2026-06-04 18:12:54 +08:00
194 changed files with 13272 additions and 5763 deletions

View File

@@ -5,7 +5,7 @@ declare global {
aiSyncProviders?(providers: Array<{ id: string; providerId: string; apiKey?: string; baseURL?: string; enabled: boolean }>): Promise<{ ok: boolean }>;
aiChatStream?(requestId: string, url: string, headers?: Record<string, string>, body?: string, providerId?: string): Promise<{ ok: boolean; statusCode?: number; statusText?: string; error?: string }>;
aiChatCancel?(requestId: string): Promise<boolean>;
aiFetch?(url: string, method?: string, headers?: Record<string, string>, body?: string, providerId?: string): Promise<{ ok: boolean; status: number; data: string; error?: string }>;
aiFetch?(url: string, method?: string, headers?: Record<string, string>, body?: string, providerId?: string, skipHostCheck?: boolean, followRedirects?: boolean, skipTLSVerify?: boolean): Promise<{ ok: boolean; status?: number; data: string; error?: string }>;
aiAllowlistAddHost?(baseURL: string): Promise<{ ok: boolean; error?: string }>;
aiExec?(sessionId: string, command: string, chatSessionId?: string): Promise<{ ok: boolean; stdout?: string; stderr?: string; exitCode?: number | null; error?: string }>;
aiCattyCancelExec?(chatSessionId: string): Promise<{ ok: boolean; error?: string }>;
@@ -16,8 +16,14 @@ declare global {
description: string;
args: string[];
path: string;
binPath?: string;
version: string;
available: boolean;
installed?: boolean;
authenticated?: boolean;
authSource?: string | null;
sdkBackend?: string;
/** @deprecated Legacy persisted field from the pre-SDK migration. */
acpCommand?: string;
acpArgs?: string[];
}>>;
@@ -137,19 +143,16 @@ declare global {
context?: string;
error?: string;
}>;
aiSpawnAgent?(agentId: string, command: string, args?: string[], env?: Record<string, string>, options?: { closeStdin?: boolean }): Promise<{ ok: boolean; pid?: number; error?: string }>;
aiWriteToAgent?(agentId: string, data: string): Promise<{ ok: boolean; error?: string }>;
aiCloseAgentStdin?(agentId: string): Promise<{ ok: boolean; error?: string }>;
aiKillAgent?(agentId: string): Promise<{ ok: boolean; error?: string }>;
aiAcpStream?(requestId: string, chatSessionId: string, acpCommand: string, acpArgs: string[], prompt: string, cwd?: string, providerId?: string, model?: string, existingSessionId?: string, historyMessages?: Array<{ role: 'user' | 'assistant'; content: string }>, images?: Array<{ base64Data: string; mediaType: string; filename?: string }>, toolIntegrationMode?: 'mcp' | 'skills', defaultTargetSession?: { sessionId: string; hostname: string; label: string; os?: string; username?: string; protocol?: string; shellType?: string; deviceType?: string; connected: boolean; source: 'scope-target' | 'only-connected-in-scope' }, userSkillsContext?: string, agentEnv?: Record<string, string>): Promise<{ ok: boolean; error?: string }>;
aiAcpListModels?(acpCommand: string, acpArgs?: string[], cwd?: string, providerId?: string, chatSessionId?: string, agentEnv?: Record<string, string>): Promise<{ ok: boolean; models?: Array<{ id: string; name: string; description?: string; thinkingLevels?: string[] }>; currentModelId?: string | null; error?: string }>;
aiAcpCancel?(requestId: string, chatSessionId?: string): Promise<{ ok: boolean; error?: string }>;
aiAcpCleanup?(chatSessionId: string): Promise<{ ok: boolean }>;
onAiAcpEvent?(requestId: string, cb: (event: Record<string, unknown>) => void): () => void;
onAiAcpDone?(requestId: string, cb: () => void): () => void;
onAiAcpError?(requestId: string, cb: (error: string) => void): () => void;
aiSdkAgentStream?(requestId: string, chatSessionId: string, sdkBackend: string, prompt: string, cwd?: string, providerId?: string, model?: string, existingSessionId?: string, historyMessages?: Array<{ role: 'user' | 'assistant'; content: string }>, images?: Array<{ base64Data: string; mediaType: string; filename?: string; filePath?: string }>, toolIntegrationMode?: 'mcp' | 'skills', defaultTargetSession?: { sessionId: string; hostname: string; label: string; os?: string; username?: string; protocol?: string; shellType?: string; deviceType?: string; connected: boolean; source: 'scope-target' | 'only-connected-in-scope' }, userSkillsContext?: string, agentEnv?: Record<string, string>): Promise<{ ok: boolean; error?: string }>;
aiSdkAgentListModels?(sdkBackend: string, cwd?: string, providerId?: string, chatSessionId?: string, agentEnv?: Record<string, string>): Promise<{ ok: boolean; models?: Array<{ id: string; name: string; description?: string; thinkingLevels?: string[] }>; currentModelId?: string | null; error?: string }>;
aiSdkAgentCancel?(requestId: string, chatSessionId?: string): Promise<{ ok: boolean; error?: string }>;
aiSdkAgentCleanup?(chatSessionId: string): Promise<{ ok: boolean }>;
onAiSdkAgentEvent?(requestId: string, cb: (event: Record<string, unknown>) => void): () => void;
onAiSdkAgentDone?(requestId: string, cb: () => void): () => void;
onAiSdkAgentError?(requestId: string, cb: (error: string) => void): () => void;
onAiStreamData?(requestId: string, cb: (data: string) => void): () => void;
onAiStreamEnd?(requestId: string, cb: () => void): () => void;
onAiStreamError?(requestId: string, cb: (error: string) => void): () => void;
onAiAgentStdout?(agentId: string, cb: (data: string) => void): () => void;
onAiAgentStderr?(agentId: string, cb: (data: string) => void): () => void;
onAiAgentExit?(agentId: string, cb: (code: number | null) => void): () => void;

View File

@@ -29,6 +29,8 @@ declare global {
onUpdateNotAvailable?(cb: () => void): () => void;
onUpdateDownloaded?(cb: () => void): () => void;
onUpdateError?(cb: (payload: { error: string }) => void): () => void;
// Fired when an install was requested but blocked by unsaved editors (#1215).
onUpdateNeedsSave?(cb: () => void): () => void;
// Global Toggle Hotkey (Quake Mode)
registerGlobalHotkey?(hotkey: string): Promise<{ success: boolean; enabled?: boolean; error?: string; accelerator?: string }>;
@@ -39,6 +41,15 @@ declare global {
getAutoUpdate?(): Promise<{ enabled: boolean }>;
setAutoUpdate?(enabled: boolean): Promise<{ success: boolean }>;
// SSH diagnostic logs
getSshDebugLogInfo?(): Promise<{
enabled: boolean;
path: string;
exists: boolean;
size: number;
}>;
openSshDebugLogDir?(): Promise<{ success: boolean; error?: string }>;
// System Tray / Close to Tray
setCloseToTray?(enabled: boolean): Promise<{ success: boolean; enabled: boolean }>;
isCloseToTray?(): Promise<{ enabled: boolean }>;

View File

@@ -29,6 +29,15 @@ declare global {
moshServerPath?: string;
moshClientPath?: string;
agentForwarding?: boolean;
// Algorithm settings, forwarded so the host-info stats companion SSH
// connection (issue #1198) negotiates the same KEX / cipher / host-key
// set the interactive session would.
legacyAlgorithms?: boolean;
skipEcdsaHostKey?: boolean;
algorithmOverrides?: import("../../domain/models").HostAlgorithmOverrides;
// Known hosts, used to verify the host key before the stats companion
// connection (issue #1198) sends a saved password.
knownHosts?: import("../../domain/models").KnownHost[];
cols?: number;
rows?: number;
charset?: string;
@@ -133,6 +142,10 @@ declare global {
/** Get server stats (CPU, Memory, Disk, Network) from an active SSH session */
getServerStats?(sessionId: string): Promise<{
success: boolean;
// Transient "not ready yet" (e.g. a Mosh session whose SSH handshake is
// still in progress, #1198). Callers should keep polling and NOT count
// this toward any consecutive-failure give-up.
pending?: boolean;
error?: string;
stats?: {
cpu: number | null; // CPU usage percentage (0-100)

View File

@@ -12,6 +12,7 @@ declare global {
windowIsMaximized?(): Promise<boolean>;
windowIsFullscreen?(): Promise<boolean>;
windowFocus?(): Promise<boolean>;
onWindowCommandCloseRequested?(cb: () => void): () => void;
onWindowFullScreenChanged?(cb: (isFullscreen: boolean) => void): () => void;
// Settings window