deepseek-helper-userscript

this is userscript's description

// ==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

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址