Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/main/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@ export const CONFIG_EVENTS = {
AUTO_SCROLL_CHANGED: 'config:auto-scroll-changed',
NOTIFICATIONS_CHANGED: 'config:notifications-changed',
CONTENT_PROTECTION_CHANGED: 'config:content-protection-changed',
SOUND_ENABLED_CHANGED: 'config:sound-enabled-changed', // 新增:声音开关变更事件
COPY_WITH_COT_CHANGED: 'config:copy-with-cot-enabled-changed',
TRACE_DEBUG_CHANGED: 'config:trace-debug-changed', // Trace 调试功能开关变更事件
PROXY_RESOLVED: 'config:proxy-resolved',
Expand Down
9 changes: 2 additions & 7 deletions src/main/presenter/agentPresenter/acp/chatSettingsTools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ const FONT_SIZE_LEVELS = [0, 1, 2, 3, 4] as const

const toggleSchema = z
.object({
setting: z.enum(['soundEnabled', 'copyWithCotEnabled']).describe('Toggle setting id.'),
setting: z.enum(['copyWithCotEnabled']).describe('Toggle setting id.'),
enabled: z.boolean().describe('Enable or disable the setting.')
})
.strict()
Expand Down Expand Up @@ -192,8 +192,6 @@ export class ChatSettingsToolHandler {
private getCurrentValue(key: string): ChatSettingValue | undefined {
const configPresenter = this.options.configPresenter
switch (key) {
case 'soundEnabled':
return configPresenter.getSoundEnabled()
case 'copyWithCotEnabled':
return configPresenter.getCopyWithCotEnabled()
case 'language':
Expand Down Expand Up @@ -224,9 +222,6 @@ export class ChatSettingsToolHandler {

try {
switch (setting) {
case 'soundEnabled':
configPresenter.setSoundEnabled(enabled)
break
case 'copyWithCotEnabled':
configPresenter.setCopyWithCotEnabled(enabled)
break
Expand Down Expand Up @@ -409,7 +404,7 @@ export const buildChatSettingsToolDefinitions = (allowedTools: string[]): MCPToo
type: 'function',
function: {
name: CHAT_SETTINGS_TOOL_NAMES.toggle,
description: 'Toggle a DeepChat setting (sound or copy COT).',
description: 'Toggle a DeepChat setting.',
parameters: zodToJsonSchema(toggleSchema) as {
type: string
properties: Record<string, unknown>
Expand Down
13 changes: 0 additions & 13 deletions src/main/presenter/agentPresenter/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -137,19 +137,6 @@ export class AgentPresenter implements IAgentPresenter {
false,
this.buildMessageMetadata(conversation)
)
try {
const promptPreview = this.extractUserMessageText(content)
presenter.hooksNotifications.dispatchEvent('UserPromptSubmit', {
conversationId: agentId,
messageId: userMessage.id,
promptPreview,
providerId: conversation.settings.providerId,
modelId: conversation.settings.modelId
})
} catch (error) {
console.warn('[AgentPresenter] Failed to dispatch UserPromptSubmit hook:', error)
}

try {
await this.resolvePendingQuestionIfNeeded(agentId, userMessage.id, content)
} catch (error) {
Expand Down
50 changes: 0 additions & 50 deletions src/main/presenter/agentPresenter/loop/toolCallProcessor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import path from 'path'
import { isNonRetryableError } from './errorClassification'
import { resolveToolOffloadPath } from '../../sessionPresenter/sessionPaths'
import { parseQuestionToolArgs, QUESTION_TOOL_NAME } from '../tools/questionTool'
import { presenter } from '@/presenter'

interface ToolCallProcessorOptions {
getAllToolDefinitions: (context: ToolCallExecutionContext) => Promise<MCPToolDefinition[]>
Expand Down Expand Up @@ -104,8 +103,6 @@ export class ToolCallProcessor {
): AsyncGenerator<LLMAgentEvent, ToolCallProcessResult, void> {
let toolCallCount = context.currentToolCallCount
let needContinueConversation = context.toolCalls.length > 0
const shouldDispatchToolHooks = context.providerId === 'acp'

let toolDefinitions = await this.options.getAllToolDefinitions(context)

// Step 1: Pre-check all tool permissions in batch
Expand Down Expand Up @@ -311,21 +308,6 @@ export class ToolCallProcessor {
}

try {
if (shouldDispatchToolHooks) {
try {
presenter.hooksNotifications.dispatchEvent('PreToolUse', {
conversationId: context.conversationId,
tool: {
callId: toolCall.id,
name: toolCall.name,
params: toolCall.arguments
}
})
} catch (error) {
console.warn('[ToolCallProcessor] Failed to dispatch PreToolUse hook:', error)
}
}

const toolResponse = await this.options.callTool(mcpToolInput)
const requiresPermission = Boolean(toolResponse.rawData?.requiresPermission)

Expand Down Expand Up @@ -369,22 +351,6 @@ export class ToolCallProcessor {
toolCall.name
)

if (shouldDispatchToolHooks) {
try {
presenter.hooksNotifications.dispatchEvent('PostToolUse', {
conversationId: context.conversationId,
tool: {
callId: toolCall.id,
name: toolCall.name,
params: toolCall.arguments,
response: toolContent
}
})
} catch (error) {
console.warn('[ToolCallProcessor] Failed to dispatch PostToolUse hook:', error)
}
}

if (supportsFunctionCall) {
this.appendNativeFunctionCallMessages(context.conversationMessages, toolCall, {
content: toolContentForModel
Expand Down Expand Up @@ -436,22 +402,6 @@ export class ToolCallProcessor {
)
const errorMessage = toolError instanceof Error ? toolError.message : String(toolError)

if (shouldDispatchToolHooks) {
try {
presenter.hooksNotifications.dispatchEvent('PostToolUseFailure', {
conversationId: context.conversationId,
tool: {
callId: toolCall.id,
name: toolCall.name,
params: toolCall.arguments,
error: errorMessage
}
})
} catch (error) {
console.warn('[ToolCallProcessor] Failed to dispatch PostToolUseFailure hook:', error)
}
}

// Check if error is non-retryable (should stop the loop)
const errorForClassification: Error | string =
toolError instanceof Error ? toolError : String(toolError)
Expand Down
109 changes: 2 additions & 107 deletions src/main/presenter/agentPresenter/streaming/llmEventHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,51 +151,7 @@ export class LLMEventHandler {

if (tool_call && !shouldSkipToolCall) {
if (isAcpProvider) {
try {
if (tool_call === 'start') {
presenter.hooksNotifications.dispatchEvent('PreToolUse', {
conversationId: state.conversationId,
messageId: eventId,
providerId: state.message.model_provider,
modelId: state.message.model_id,
tool: {
callId: tool_call_id,
name: tool_call_name,
params: tool_call_params
}
})
}
if (tool_call === 'end') {
presenter.hooksNotifications.dispatchEvent('PostToolUse', {
conversationId: state.conversationId,
messageId: eventId,
providerId: state.message.model_provider,
modelId: state.message.model_id,
tool: {
callId: tool_call_id,
name: tool_call_name,
params: tool_call_params,
response: msg.tool_call_response ? String(msg.tool_call_response) : undefined
}
})
}
if (tool_call === 'error') {
presenter.hooksNotifications.dispatchEvent('PostToolUseFailure', {
conversationId: state.conversationId,
messageId: eventId,
providerId: state.message.model_provider,
modelId: state.message.model_id,
tool: {
callId: tool_call_id,
name: tool_call_name,
params: tool_call_params,
error: msg.tool_call_response ? String(msg.tool_call_response) : undefined
}
})
}
} catch (error) {
console.warn('[LLMEventHandler] Failed to dispatch ACP tool hooks:', error)
}
// Legacy hook dispatch disabled. New session hooks are emitted by the new agent pipeline.
}

switch (tool_call) {
Expand All @@ -217,22 +173,6 @@ export class LLMEventHandler {
payload: msg.permission_request ?? {}
})
presenter.sessionManager.setStatus(state.conversationId, 'waiting_permission')
try {
presenter.hooksNotifications.dispatchEvent('PermissionRequest', {
conversationId: state.conversationId,
messageId: eventId,
providerId: state.message.model_provider,
modelId: state.message.model_id,
tool: {
callId: tool_call_id,
name: tool_call_name,
params: tool_call_params
},
permission: msg.permission_request ?? null
})
} catch (error) {
console.warn('[LLMEventHandler] Failed to dispatch PermissionRequest hook:', error)
}
await this.toolCallHandler.processToolCallPermission(state, msg, currentTime)
break
case 'question-required':
Expand Down Expand Up @@ -445,8 +385,6 @@ export class LLMEventHandler {
async handleLLMAgentEnd(msg: LLMAgentEventData): Promise<void> {
const { eventId, userStop } = msg
const state = this.generatingMessages.get(eventId)
const errorSnapshot = this.errorByEventId.get(eventId)

if (state) {
if (state.adaptiveBuffer) {
await this.contentBufferHandler.flushAdaptiveBuffer(eventId)
Expand Down Expand Up @@ -512,51 +450,8 @@ export class LLMEventHandler {
presenter.sessionManager.clearPendingQuestion(state.conversationId)
}

const stopReason = errorSnapshot ? 'error' : userStop ? 'user_stop' : 'complete'
const stopPayload = {
reason: stopReason,
userStop: Boolean(userStop)
}
const usage = state?.totalUsage ?? errorSnapshot?.usage ?? null
const errorInfo = errorSnapshot?.error ?? null
let conversationId = state?.conversationId ?? errorSnapshot?.conversationId
let providerId = state?.message.model_provider ?? errorSnapshot?.providerId
let modelId = state?.message.model_id ?? errorSnapshot?.modelId

if (!conversationId) {
try {
const message = await this.messageManager.getMessage(eventId)
conversationId = message.conversationId
providerId = providerId ?? message.model_provider
modelId = modelId ?? message.model_id
} catch {
// ignore
}
}

try {
try {
presenter.hooksNotifications.dispatchEvent('Stop', {
conversationId,
providerId,
modelId,
stop: stopPayload
})
} catch (error) {
console.warn('[LLMEventHandler] Failed to dispatch Stop hook:', error)
}
try {
presenter.hooksNotifications.dispatchEvent('SessionEnd', {
conversationId,
providerId,
modelId,
stop: stopPayload,
usage,
error: errorInfo
})
} catch (error) {
console.warn('[LLMEventHandler] Failed to dispatch SessionEnd hook:', error)
}
// Legacy hook dispatch disabled. New session hooks are emitted by the new agent pipeline.
} finally {
this.errorByEventId.delete(eventId)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,19 +118,6 @@ export class StreamGenerationHandler extends BaseHandler {
verbosity: currentVerbosity
} = currentConversation.settings

try {
presenter.hooksNotifications.dispatchEvent('SessionStart', {
conversationId,
messageId: userMessage.id,
promptPreview: userContent,
providerId: currentProviderId,
modelId: currentModelId,
workdir: agentWorkspacePath ?? null
})
} catch (error) {
console.warn('[StreamGenerationHandler] Failed to dispatch SessionStart hook:', error)
}

const stream = this.ctx.llmProviderPresenter.startStreamCompletion(
currentProviderId,
finalContent,
Expand Down Expand Up @@ -258,18 +245,6 @@ export class StreamGenerationHandler extends BaseHandler {

await this.updateGenerationState(state, promptTokens)

try {
presenter.hooksNotifications.dispatchEvent('SessionStart', {
conversationId,
messageId: userMessage.id,
promptPreview: 'continue',
providerId,
modelId
})
} catch (error) {
console.warn('[StreamGenerationHandler] Failed to dispatch SessionStart hook:', error)
}

if (toolCallResponse && toolCall) {
eventBus.sendToRenderer(STREAM_EVENTS.RESPONSE, SendTarget.ALL_WINDOWS, {
eventId: state.message.id,
Expand Down
14 changes: 0 additions & 14 deletions src/main/presenter/configPresenter/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ interface IAppSettings {
syncFolderPath?: string // Sync folder path
lastSyncTime?: number // Last sync time
customSearchEngines?: string // Custom search engines JSON string
soundEnabled?: boolean // Whether sound effects are enabled
copyWithCotEnabled?: boolean
loggingEnabled?: boolean // Whether logging is enabled
floatingButtonEnabled?: boolean // Whether floating button is enabled
Expand Down Expand Up @@ -153,7 +152,6 @@ export class ConfigPresenter implements IConfigPresenter {
syncEnabled: false,
syncFolderPath: path.join(this.userDataPath, 'sync'),
lastSyncTime: 0,
soundEnabled: false,
copyWithCotEnabled: true,
loggingEnabled: false,
floatingButtonEnabled: false,
Expand Down Expand Up @@ -962,18 +960,6 @@ export class ConfigPresenter implements IConfigPresenter {
}, 1000)
}

// Get sound effects switch status
getSoundEnabled(): boolean {
const value = this.getSetting<boolean>('soundEnabled') ?? false
return value === undefined || value === null ? false : value
}

// Set sound effects switch status
setSoundEnabled(enabled: boolean): void {
this.setSetting('soundEnabled', enabled)
eventBus.sendToRenderer(CONFIG_EVENTS.SOUND_ENABLED_CHANGED, SendTarget.ALL_WINDOWS, enabled)
}

getCopyWithCotEnabled(): boolean {
return this.uiSettingsHelper.getCopyWithCotEnabled()
}
Expand Down
Loading