Task configuration:
{"task_id": "09", "task_name": "findDefination", "description": "\u5728\u5f53\u524d\u5de5\u4f5c\u533a\u4e2d\u641c\u7d22\u7279\u5b9a\u7c7b\u7684\u8fd0\u7b97\u7b26\u91cd\u8f7d\u51fd\u6570\u5b9a\u4e49, \u5e76\u4e14\u51fd\u6570\u7684return\u8bed\u53e5\u5904\u6253\u65ad\u70b9", "application_info": {"name": "vscode", "executable_path": "/usr/share/code/code", "args": ["--no-sandbox", "--user-data-dir=/root/vscode_user_data_dir/"]}, "task_parameters": {"class_name": "uint256_t", "operator": "+=", "expected_file": "/root/C-Plus-Plus/ciphers/uint256_t.hpp", "expected_line_begin": 241, "expected_line_end": 248}, "instruction_template": "\u5728\u5f53\u524d\u5de5\u4f5c\u533a\u4e2d\u641c\u7d22 class ${class_name} \u7684 ${operator} \u8fd0\u7b97\u7b26\u7684\u91cd\u8f7d\u51fd\u6570\u5b9a\u4e49, \u5e76\u4e14\u5728\u8be5\u51fd\u6570\u7684return\u4f4d\u7f6e\u6253\u65ad\u70b9, \u5e76\u4e0d\u9700\u8981\u5f00\u542fdebug\u4f1a\u8bdd", "evaluation_setup": {"scripts": [{"role": "hook", "path": "hooker.js"}, {"role": "handler", "path": "handler.py"}], "timeout": 120, "evaluator_type": "IpcInjector", "evaluate_on_completion": true}, "total_key_steps": 2, "preconditions": {"vscode_running": true}, "events": {"evaluate_on_completion": {"description": "\u5728\u4efb\u52a1\u5b8c\u6210\u65f6\u68c0\u67e5\u65ad\u70b9\u8bbe\u7f6e\u60c5\u51b5", "is_key_step": true, "key_step_index": 2, "key_step_name": "\u4efb\u52a1\u6210\u529f\u5b8c\u6210"}, "open_file": {"description": "\u6210\u529f\u6253\u5f00\u76ee\u6807\u6587\u4ef6", "is_key_step": true, "key_step_index": 1, "key_step_name": "\u6253\u5f00\u6587\u4ef6"}}, "mcp_servers": [{"command": "mcp-proxy", "args": ["http://127.0.0.1:6010/sse"]}], "context_data": [{"from": "tests/context_data/vscode/user_data", "to": "/root/vscode_user_data_dir"}, {"from": "tests/context_data/vscode/extensions", "to": "/root/.vscode/"}, {"from": "tests/context_data/vscode/C-Plus-Plus", "to": "/root/C-Plus-Plus"}]}

Hook script:
/**
 * Inspects the current C++ debug session and returns breakpoint and stop location information
 * @returns {Promise<{breakpoints: Array, currentFile: string, currentLine: string}> | null} Debug information or null if invalid session
 */
async function inspectCppDebugSession() {
    try {
        // Get all breakpoints
        const breakpoints = vscode.debug.breakpoints;
        let breakpointDetails = [];
        
        for (const bp of breakpoints) {
            if (bp instanceof vscode.SourceBreakpoint) {
                const location = bp.location;
                breakpointDetails.push({
                    file: location.uri.fsPath,
                    line: location.range.start.line + 1,
                    enabled: bp.enabled,
                    condition: bp.condition || 'None'
                });
            }
        }

        return breakpointDetails;
    } catch (error) {
        socket.emit("send", {
            'event_type': "error",
            'message': `在获取debug会话时出现错误: ${error}`
        });
        console.error('Inspection error:', error);
        throw error;
    }
}

// Listen for 'evaluate' event
socket.on('evaluate', async () => {
    const breakpoints = await inspectCppDebugSession();
    // vscode.window.showInformationMessage(message);
    socket.emit("send", {
        'event_type': "evaluate_on_completion",
        'message': "在任务结束时检查断点信息",
        'breakpoints': breakpoints
    });
});

// Register a listener for when a text document is opened
vscode.workspace.onDidOpenTextDocument(async (document) => {
    const filePath = document.uri.fsPath;
    socket.emit("send", {
        event_type: "open_file",
        message: "打开文件",
        path: filePath,
        scheme: document.uri.scheme
    });
});

Evaluation handler:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from typing import Dict, Any, Optional, List

def message_handler(message: Dict[str, Any], logger, task_parameter: Dict[str, Any]) -> Optional[List[Dict[str, Any]]]:    
    event_type = message.get('event_type')
    logger.info(message.get('message'))
    expected_line_begin = task_parameter.get("expected_line_begin", 241)
    expected_line_end = task_parameter.get("expected_line_end", 248)
    expected_file_name = task_parameter.get("expected_file", '/root/C-Plus-Plus/ciphers/uint256_t.hpp')
    if event_type == "evaluate_on_completion":
        breakpoints_info = message.get('breakpoints')
        if any([i['file'] == expected_file_name and i['line'] >= expected_line_begin and i['line'] <= expected_line_end for i in breakpoints_info]):
            return [
                {"status": "key_step", "index": 2},
                {"status": "success", "reason": f"任务成功完成"}
            ]
        else:
            return [{"status": "error", "type": "evaluate_on_completion", "message": "任务没有完成"}]
    elif event_type == "open_file":
        file_path = message.get("path")
        if message.get("scheme") == "git":
            file_path = file_path[:-4]
        if file_path == expected_file_name:
            return [{"status": "key_step", "index": 1}]
    return None