Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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