deepseek-helper-userscript

this is userscript's description

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         deepseek-helper-userscript
// @namespace    https://github.com/llm-sec/deepseek-helper-userscript
// @version      0.0.1
// @description  this is userscript's description
// @document     https://github.com/llm-sec/deepseek-helper-userscript
// @author       CC11001100 <[email protected]>
// @match        https://chat.deepseek.com/*
// @run-at       document-start
// ==/UserScript==


//    8888888b.                              .d8888b.                    888
//    888  "Y88b                            d88P  Y88b                   888
//    888    888                            Y88b.                        888
//    888    888  .d88b.   .d88b.  88888b.   "Y888b.    .d88b.   .d88b.  888  888
//    888    888 d8P  Y8b d8P  Y8b 888 "88b     "Y88b. d8P  Y8b d8P  Y8b 888 .88P
//    888    888 88888888 88888888 888  888       "888 88888888 88888888 888888K
//    888  .d88P Y8b.     Y8b.     888 d88P Y88b  d88P Y8b.     Y8b.     888 "88b
//    8888888P"   "Y8888   "Y8888  88888P"   "Y8888P"   "Y8888   "Y8888  888  888
//                                 888
//                                 888
//                                 888
//    

/******/ (() => { // webpackBootstrap
/******/ 	"use strict";
/******/ 	var __webpack_modules__ = ([
/* 0 */,
/* 1 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ init)
/* harmony export */ });
/* harmony import */ var _crazy_retry_crazy_retry__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2);
/* harmony import */ var _logger_Logger__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
/**
 * 应用初始化模块
 *
 * 此模块负责整合并执行应用启动时所需的各项初始化任务
 * 通过统一入口管理初始化流程,确保启动顺序和依赖关系
 */
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};


/**
 * 应用主初始化函数
 *
 * @async
 * @function
 * @description 执行核心初始化流程,当前包含:
 * - 异常重试机制初始化
 *
 * @example
 * // 在应用启动入口调用
 * import init from './init/init';
 * await init();
 *
 * @returns {Promise<void>} 初始化完成Promise
 */
function init() {
    return __awaiter(this, void 0, void 0, function* () {
        _logger_Logger__WEBPACK_IMPORTED_MODULE_1__["default"].configure({
            level: _logger_Logger__WEBPACK_IMPORTED_MODULE_1__.LogLevel.DEBUG,
            enableColors: false
        });
        // 初始化异常重试机制
        // 配置全局请求失败时的重试策略
        yield (0,_crazy_retry_crazy_retry__WEBPACK_IMPORTED_MODULE_0__["default"])();
        // 可在此处添加其他初始化任务
        // 例如:await initLogger();
        //      await initAnalytics();
    });
}


/***/ }),
/* 2 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ runCrazyRetry)
/* harmony export */ });
/* harmony import */ var _selector_SessionElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3);
/* harmony import */ var _utils_sleep_util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
/* harmony import */ var _ui_component_Toast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6);
/* harmony import */ var _selector_DeepSeekToastElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7);
/* harmony import */ var _logger_Logger__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8);
/* harmony import */ var _utils_element_fingerprint__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(9);
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};






// 指数退避配置参数
const RETRY_CONFIG = {
    BASE_DELAY: 1000,
    MAX_DELAY: 64 * 1000,
    BACKOFF_FACTOR: 2
};
// 新增元素级重试限制配置
const ELEMENT_RETRY_LIMIT = 128; // 每个元素最大重试次数
const elementRetryMap = new Map(); // 存储元素哈希和重试次数的映射
function runCrazyRetry() {
    return __awaiter(this, void 0, void 0, function* () {
        _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].info("启动智能重试功能(元素级指数退避重试限制)");
        let currentDelay = RETRY_CONFIG.BASE_DELAY;
        let lastContentHash = null;
        while (true) {
            try {
                yield (0,_utils_sleep_util__WEBPACK_IMPORTED_MODULE_1__["default"])(currentDelay);
                const session = new _selector_SessionElement__WEBPACK_IMPORTED_MODULE_0__["default"]();
                const lastAnswerElement = session.findLastAnswerElement();
                if (!lastAnswerElement) {
                    handleNoElementCase();
                    continue;
                }
                const currentHash = yield getContentHash(lastAnswerElement);
                // 检测到新内容时清理旧记录的计数器
                if (currentHash && currentHash !== lastContentHash) {
                    cleanupOldHashRecord(lastContentHash);
                    lastContentHash = currentHash;
                }
                // 检查元素重试次数
                if (currentHash && isElementOverRetryLimit(currentHash)) {
                    handleRetryLimit(currentHash);
                    continue;
                }
                if (!lastAnswerElement.isServerBusy()) {
                    handleUnchangedContent();
                    continue;
                }
                yield performRetry(lastAnswerElement);
                resetBackoff();
            }
            catch (error) {
                yield handleRetryError(error, lastContentHash);
                updateBackoff();
            }
        }
        // 内部工具函数
        function getContentHash(element) {
            return __awaiter(this, void 0, void 0, function* () {
                try {
                    return (0,_utils_element_fingerprint__WEBPACK_IMPORTED_MODULE_5__["default"])(element.answerElement);
                }
                catch (_a) {
                    return null;
                }
            });
        }
        function isElementOverRetryLimit(hash) {
            const count = elementRetryMap.get(hash) || 0;
            return count >= ELEMENT_RETRY_LIMIT;
        }
        function cleanupOldHashRecord(oldHash) {
            if (oldHash && elementRetryMap.has(oldHash)) {
                elementRetryMap.delete(oldHash);
                _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].debug(`清理旧元素记录: ${oldHash}`);
            }
        }
        function handleNoElementCase() {
            _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].debug("未检测到回答元素,保持退避策略");
        }
        function handleRetryLimit(hash) {
            _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].warn(`元素 ${hash.slice(0, 6)}... 已达重试上限(${ELEMENT_RETRY_LIMIT}次)`);
            _ui_component_Toast__WEBPACK_IMPORTED_MODULE_2__["default"].show("当前内容已达重试上限,请手动刷新", 5000);
            currentDelay = RETRY_CONFIG.MAX_DELAY; // 进入最大等待状态
        }
        function handleUnchangedContent() {
            _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].debug("内容未更新,维持退避策略");
        }
        function performRetry(element) {
            return __awaiter(this, void 0, void 0, function* () {
                _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].info(`[重试 ${elementRetryMap.get(lastContentHash) || 0 + 1}/${ELEMENT_RETRY_LIMIT}] 服务器繁忙`);
                _ui_component_Toast__WEBPACK_IMPORTED_MODULE_2__["default"].show("检测到回答失败,尝试自动刷新响应...", 3000);
                element.clickRefreshBtn();
                const toastElement = yield _selector_DeepSeekToastElement__WEBPACK_IMPORTED_MODULE_3__["default"].captureDeepSeekToast(3000);
                if (toastElement === null || toastElement === void 0 ? void 0 : toastElement.isTooFast()) {
                    throw new Error("CLICK_TOO_FAST");
                }
            });
        }
        function handleRetryError(error, hash) {
            return __awaiter(this, void 0, void 0, function* () {
                if (error.message === "CLICK_TOO_FAST") {
                    yield handleTooFastError();
                }
                else {
                    updateElementRetryCount(hash);
                    _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].error(`重试异常: ${error.message}`);
                }
            });
        }
        function updateElementRetryCount(hash) {
            if (hash) {
                const count = (elementRetryMap.get(hash) || 0) + 1;
                elementRetryMap.set(hash, count);
                _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].debug(`元素 ${hash.slice(0, 6)}... 重试计数: ${count}/${ELEMENT_RETRY_LIMIT}`);
            }
        }
        function handleTooFastError() {
            return __awaiter(this, void 0, void 0, function* () {
                const waitMinutes = 30;
                _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].warn(`操作频率限制,等待${waitMinutes}分钟`);
                _ui_component_Toast__WEBPACK_IMPORTED_MODULE_2__["default"].show(`操作过快,触发高等级封禁,功能临时不可用,${waitMinutes}分钟后再试`, 60 * 30 * 1000);
                yield (0,_utils_sleep_util__WEBPACK_IMPORTED_MODULE_1__["default"])(1000 * 60 * 30);
                resetBackoff();
            });
        }
        function updateBackoff() {
            currentDelay = Math.min(currentDelay * RETRY_CONFIG.BACKOFF_FACTOR, RETRY_CONFIG.MAX_DELAY);
            _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].debug(`退避策略更新 → 等待时长:${currentDelay}ms`);
        }
        function resetBackoff() {
            currentDelay = RETRY_CONFIG.BASE_DELAY;
            _logger_Logger__WEBPACK_IMPORTED_MODULE_4__["default"].debug("重置基础等待时间");
        }
    });
}


/***/ }),
/* 3 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ SessionElement)
/* harmony export */ });
/* harmony import */ var _AnswertElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(4);
// [file name]: Session.ts

/**
 * 会话元素管理类
 * 处理当前会话中回答元素的定位和操作
 */
class SessionElement {
    /**
     * 查找最近生成的回答元素
     * @returns 最新回答元素的封装对象,找不到返回null
     */
    findLastAnswerElement() {
        var _a, _b;
        // 通过DOM层级关系定位回答元素(依赖当前DOM结构)
        const refreshBtn = this.findLastRefreshIcon();
        const answerElement = (_b = (_a = refreshBtn === null || refreshBtn === void 0 ? void 0 : refreshBtn.parentElement) === null || _a === void 0 ? void 0 : _a.parentElement) === null || _b === void 0 ? void 0 : _b.parentElement;
        return answerElement ? new _AnswertElement__WEBPACK_IMPORTED_MODULE_0__["default"](answerElement) : null;
    }
    /**
     * 查找最后一个刷新按钮元素
     * @private
     * @returns 包含#重新生成子元素的按钮,找不到返回null
     */
    findLastRefreshIcon() {
        // 获取所有候选按钮元素
        const elements = document.querySelectorAll('.ds-icon-button');
        // 逆向遍历查找最新元素(从最后元素开始)
        for (let i = elements.length - 1; i >= 0; i--) {
            const element = elements[i];
            // 通过ID选择器验证按钮功能
            if (element.querySelector('#重新生成')) {
                return element;
            }
        }
        return null;
    }
}


/***/ }),
/* 4 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ AnswertElement)
/* harmony export */ });
// [file name]: AnswertElement.ts
/**
 * 回答元素封装类
 * 封装单个回答元素的DOM操作和状态判断
 */
class AnswertElement {
    /**
     * 构造函数
     * @param answerElement - 需要封装的回答元素DOM节点
     */
    constructor(answerElement) {
        this.answerElement = answerElement;
    }
    /**
     * 判断当前回答是否显示服务器繁忙状态
     * @returns 当回答内容包含"服务器繁忙,请稍后再试。"时返回true
     */
    isServerBusy() {
        var _a;
        // 通过特定class选择器定位内容区域
        const content = this.answerElement.querySelector(".ds-markdown");
        return ((_a = content === null || content === void 0 ? void 0 : content.textContent) === null || _a === void 0 ? void 0 : _a.trim()) === "服务器繁忙,请稍后再试。";
    }
    /**
     * 点击当前回答的刷新按钮
     * @returns 找到并点击按钮返回true,否则返回false
     */
    clickRefreshBtn() {
        // 在当前回答元素范围内搜索按钮(限定查找范围避免干扰其他会话)
        const buttons = this.answerElement.querySelectorAll('.ds-icon-button');
        // 逆向遍历查找最新按钮(从最后元素开始)
        for (let i = buttons.length - 1; i >= 0; i--) {
            const btn = buttons[i];
            if (btn.querySelector('#重新生成')) {
                // 执行点击操作
                btn.click();
                return true;
            }
        }
        return false;
    }
}


/***/ }),
/* 5 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ sleep)
/* harmony export */ });
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
/**
 * 异步休眠函数
 * @param ms 休眠时间(毫秒)
 * @returns Promise<void>
 *
 * @example
 * // 在async函数中使用
 * async function demo() {
 *   console.log('开始');
 *   await sleep(2000); // 暂停2秒
 *   console.log('2秒后执行');
 * }
 */
function sleep(ms) {
    return __awaiter(this, void 0, void 0, function* () {
        return new Promise(resolve => setTimeout(resolve, ms));
    });
}


/***/ }),
/* 6 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ Toast)
/* harmony export */ });
/**
 * 提示框工具类
 * 提供静态方法调用的提示框功能
 */
class Toast {
    /**
     * 初始化样式(惰性加载)
     */
    static ensureStylesInjected() {
        if (!Toast.styleElement) {
            const style = document.createElement('style');
            style.textContent = `
                .custom-tip {
                    position: fixed;
                    top: 100px;
                    left: 50%;
                    transform: translateX(-50%);
                    background: #4CAF50;
                    color: white;
                    padding: 15px 25px;
                    border-radius: 25px;
                    box-shadow: 0 3px 6px rgba(0,0,0,0.16);
                    opacity: 0;
                    animation: fadeIn 0.3s forwards;
                    z-index: 1000;
                }

                @keyframes fadeIn {
                    to { opacity: 1; }
                }

                .fade-out {
                    animation: fadeOut 0.3s forwards !important;
                }

                @keyframes fadeOut {
                    from { opacity: 1; }
                    to { opacity: 0; }
                }
            `;
            document.head.appendChild(style);
            Toast.styleElement = style;
        }
    }
    /**
     * 显示提示框
     * @param text 提示文字
     * @param duration 显示持续时间(毫秒),默认3000
     */
    static show(text, duration = 3000) {
        Toast.ensureStylesInjected();
        const tip = Toast.createTipElement(text);
        Toast.setupAutoClose(tip, duration);
    }
    /**
     * 创建提示框元素
     */
    static createTipElement(text) {
        const tip = document.createElement('div');
        tip.className = 'custom-tip';
        tip.textContent = text;
        document.body.appendChild(tip);
        return tip;
    }
    /**
     * 设置自动关闭逻辑
     */
    static setupAutoClose(element, duration) {
        setTimeout(() => {
            element.classList.add('fade-out');
            element.addEventListener('animationend', () => {
                element.remove();
            }, { once: true });
        }, duration);
    }
}
// 使用示例:
// Tips.show('操作成功!');
// Tips.show('文件已上传', 5000);


/***/ }),
/* 7 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ DeepSeekToastElement)
/* harmony export */ });
/* harmony import */ var _utils_sleep_util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(5);
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
// [file name]: DeepSeekToastElement.ts

/**
 * Toast提示元素封装类
 * 用于操作和管理DeepSeek系统中的Toast提示组件
 */
class DeepSeekToastElement {
    /**
     * 构造函数
     * @param toastElement - 需要封装的Toast元素DOM节点
     */
    constructor(toastElement) {
        this.toastElement = toastElement;
    }
    /**
     * 捕获Toast元素(带超时的轮询方法)
     * @param timeoutMs - 最大等待时间(毫秒)
     * @returns Promise<DeepSeekToastElement | null> 成功捕获返回实例,超时返回null
     *
     * @example
     * // 等待最多3秒捕获Toast
     * const toast = await DeepSeekToastElement.captureDeepSeekToast(3000);
     * if(toast?.isTooFast()) {
     *   // 处理频率过高情况
     * }
     */
    static captureDeepSeekToast(timeoutMs) {
        return __awaiter(this, void 0, void 0, function* () {
            const startTs = Date.now();
            while (Date.now() - startTs < timeoutMs) {
                // 通过复合选择器定位完整Toast容器
                const element = document.querySelector(".ds-toast__content");
                if (element === null || element === void 0 ? void 0 : element.parentElement) {
                    return new DeepSeekToastElement(element.parentElement);
                }
                // 每100ms轮询一次以平衡性能与响应速度
                yield (0,_utils_sleep_util__WEBPACK_IMPORTED_MODULE_0__["default"])(100);
            }
            return null;
        });
    }
    /**
     * 获取弹窗内容
     */
    getContent() {
        var _a, _b;
        return ((_b = (_a = this.toastElement.querySelector(".ds-toast__content")) === null || _a === void 0 ? void 0 : _a.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || "";
    }
    /**
     * 判断是否为"发送频率过快"提示
     * @returns 当Toast内容匹配预设文案时返回true
     */
    isTooFast() {
        // 精确匹配系统预设提示文案
        return this.getContent() === "你发送消息的频率过快,请稍后再发";
    }
}


/***/ }),
/* 8 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   LogLevel: () => (/* binding */ LogLevel),
/* harmony export */   Logger: () => (/* binding */ Logger),
/* harmony export */   "default": () => (/* binding */ logger)
/* harmony export */ });
// Logger.ts
/**
 * 日志级别枚举
 * DEBUG < INFO < WARN < ERROR < NONE
 */
var LogLevel;
(function (LogLevel) {
    LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
    LogLevel[LogLevel["INFO"] = 1] = "INFO";
    LogLevel[LogLevel["WARN"] = 2] = "WARN";
    LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
    LogLevel[LogLevel["NONE"] = 4] = "NONE"; // 关闭所有日志
})(LogLevel || (LogLevel = {}));
// 默认配置选项
const DEFAULT_OPTIONS = {
    level: LogLevel.DEBUG,
    enableTimestamp: true,
    enableColors: true,
};
/**
 * 浏览器环境日志记录器
 * 功能特性:
 * - 分级日志输出
 * - 颜色区分级别
 * - 动态配置
 * - 保留原始调用堆栈
 */
class Logger {
    constructor(options = {}) {
        // 各日志级别的CSS样式配置
        this.colorStyles = {
            [LogLevel.DEBUG]: 'color: #666; background-color: #f0f0f0',
            [LogLevel.INFO]: 'color: #1e88e5; background-color: #e3f2fd',
            [LogLevel.WARN]: 'color: #ffa000; background-color: #fff3e0',
            [LogLevel.ERROR]: 'color: #d32f2f; background-color: #ffebee',
            [LogLevel.NONE]: '' // NONE级别不需要样式
        };
        this.options = Object.assign(Object.assign({}, DEFAULT_OPTIONS), options);
    }
    // 设置日志级别
    setLevel(level) {
        this.options.level = level;
    }
    // 动态更新配置
    configure(options) {
        this.options = Object.assign(Object.assign({}, this.options), options);
    }
    // 调试日志
    debug(...args) {
        this.log(LogLevel.DEBUG, args);
    }
    // 信息日志
    info(...args) {
        this.log(LogLevel.INFO, args);
    }
    // 警告日志
    warn(...args) {
        this.log(LogLevel.WARN, args);
    }
    // 错误日志
    error(...args) {
        this.log(LogLevel.ERROR, args);
    }
    // 获取ISO格式时间戳
    getTimestamp() {
        return new Date().toISOString();
    }
    // 获取日志级别标签
    getLabel(level) {
        const labels = {
            [LogLevel.DEBUG]: 'DEBUG',
            [LogLevel.INFO]: 'INFO',
            [LogLevel.WARN]: 'WARN',
            [LogLevel.ERROR]: 'ERROR',
            [LogLevel.NONE]: 'NONE'
        };
        return labels[level] || 'LOG';
    }
    /**
     * 核心日志方法
     * @param level 日志级别
     * @param args 日志参数
     */
    log(level, args) {
        // 过滤低于当前级别的日志
        if (level < this.options.level)
            return;
        const label = this.getLabel(level);
        const timestamp = this.options.enableTimestamp ? `${this.getTimestamp()} ` : '';
        const styles = this.options.enableColors
            ? this.colorStyles[level]
            : '';
        // 构造格式化参数,保留原始调用堆栈
        const formattedArgs = [
            `%c${timestamp}${label}:`, // 带样式的首参数
            styles, // CSS样式
            ...args // 原始日志内容
        ];
        // 根据级别调用对应的console方法
        switch (level) { // ✅ 正确变量名(小写level)
            case LogLevel.DEBUG:
                console.debug(...formattedArgs); // ✅ 正确方法名和变量名
                break;
            case LogLevel.INFO: // ✅ 正确枚举值
                console.info(...formattedArgs);
                break;
            case LogLevel.WARN:
                console.warn(...formattedArgs); // ✅ 正确方法名
                break;
            case LogLevel.ERROR:
                console.error(...formattedArgs);
                break;
            default:
                // 穷举检查确保处理所有枚举值
                console.info(...formattedArgs);
                break;
        }
    }
}
// 导出默认单例实例
const logger = new Logger();

/* 使用示例:
// 基础使用
logger.debug('User login', { username: 'alice' });
logger.info('API response', responseData);
logger.warn('Deprecation warning');
logger.error('Network error', error);

// 生产环境配置
logger.configure({
  level: LogLevel.ERROR,
  enableColors: false
});

// 自定义实例
const customLogger = new Logger({
  enableTimestamp: false,
  level: LogLevel.WARN
});
*/ 


/***/ }),
/* 9 */
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ getElementFingerprint)
/* harmony export */ });
/**
 * 生成HTML元素的字符串指纹
 * @param element - 目标元素
 * @returns 元素的指纹哈希值
 */
function getElementFingerprint(element) {
    var _a;
    // 1. 提取核心特征
    const features = {
        tag: element.tagName.toLowerCase(),
        id: element.id,
        classes: Array.from(element.classList).sort().join(' '),
        text: ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim().replace(/\s+/g, ' ')) || '',
        children: element.children.length,
        attributes: getKeyAttributes(element)
    };
    // 2. 生成特征字符串
    const featureString = JSON.stringify(features);
    // 3. 计算哈希值
    return simpleHash(featureString);
}
/**
 * 获取元素的关键自定义属性
 * @param element - 目标元素
 * @returns 包含data-*属性的对象
 */
function getKeyAttributes(element) {
    const attrs = {};
    Array.from(element.attributes).forEach((attr) => {
        if (attr.name.startsWith('data-')) {
            attrs[attr.name] = attr.value;
        }
    });
    return attrs;
}
/**
 * 快速哈希函数(32位)
 * @param str - 输入字符串
 * @returns 十六进制哈希值
 */
function simpleHash(str) {
    let hash = 5381;
    for (let i = 0; i < str.length; i++) {
        hash = (hash << 5) + hash + str.charCodeAt(i);
    }
    return (hash & 0x7fffffff).toString(16);
}
// // 使用示例
// const element = document.getElementById('app') as HTMLElement;
// if (element) {
//     console.log(getElementFingerprint(element));
//
//     // 修改内容后重新生成
//     element.textContent = 'Updated Content';
//     console.log(getElementFingerprint(element));
// }


/***/ })
/******/ 	]);
/************************************************************************/
/******/ 	// The module cache
/******/ 	var __webpack_module_cache__ = {};
/******/ 	
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/ 		// Check if module is in cache
/******/ 		var cachedModule = __webpack_module_cache__[moduleId];
/******/ 		if (cachedModule !== undefined) {
/******/ 			return cachedModule.exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = __webpack_module_cache__[moduleId] = {
/******/ 			// no module.id needed
/******/ 			// no module.loaded needed
/******/ 			exports: {}
/******/ 		};
/******/ 	
/******/ 		// Execute the module function
/******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/ 	
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/ 	
/************************************************************************/
/******/ 	/* webpack/runtime/define property getters */
/******/ 	(() => {
/******/ 		// define getter functions for harmony exports
/******/ 		__webpack_require__.d = (exports, definition) => {
/******/ 			for(var key in definition) {
/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ 				}
/******/ 			}
/******/ 		};
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
/******/ 	(() => {
/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ 	})();
/******/ 	
/******/ 	/* webpack/runtime/make namespace object */
/******/ 	(() => {
/******/ 		// define __esModule on exports
/******/ 		__webpack_require__.r = (exports) => {
/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 			}
/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
/******/ 		};
/******/ 	})();
/******/ 	
/************************************************************************/
var __webpack_exports__ = {};
// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.
(() => {
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _init_init__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
/**
 * 应用主入口文件
 *
 * 该文件是应用的启动入口,负责调用初始化函数并启动应用。
 * 使用立即执行的异步函数来处理初始化过程中的异步操作。
 */
var __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
// 引入初始化模块,该模块负责应用启动前的配置、服务连接等初始化工作

/**
 * 异步立即执行函数
 *
 * 使用IIFE(立即调用函数表达式)包裹异步逻辑,便于使用await语法
 * 在初始化完成后可根据需要扩展其他启动逻辑
 */
(() => __awaiter(void 0, void 0, void 0, function* () {
    try {
        // 执行初始化流程并等待完成
        yield (0,_init_init__WEBPACK_IMPORTED_MODULE_0__["default"])();
        // 初始化完成后可添加其他启动逻辑
        // 例如:启动HTTP服务、注册定时任务等
    }
    catch (error) {
        // 捕获并处理初始化过程中出现的错误
        console.error("DeepSeek助手初始化失败:", error);
    }
}))();

})();

/******/ })()
;
//# sourceMappingURL=index.js.map