Decepticon 中间件插件开发实战:基于 decepticon-example-middleware 掌握 SDK 脚手架、入口点注册与框架装配
【免费下载链接】DecepticonAutonomous Hacking Agent for Red Team项目地址https://gitcode.com/gh_mirrors/de/Decepticon点击查看免费下载Decepticon 是面向红队场景的自主攻击 Agent 框架其插件体系允许在不修改开源主代码的前提下向任意 Agent 追加或替换中间件middleware。本文以官方示例decepticon-example-middleware为骨架完整讲解中间件插件从decepticon-sdk plugin new脚手架生成、pyproject.toml入口点注册、uv build构建安装到框架端build_middleware装配的完整生命周期并给出基于FakeBackend/FakeLLM/FakeSandbox的免框架 hermetic 测试方法。读完本文你将能独立编写、打包、安装并测试一个可被 Decepticon 自动发现的中间件插件。中间件在 Decepticon 中的定位一个协议、一组命名槽位在 Decepticon 中中间件是 Agent 每次模型调用model call前后的拦截与改写层负责承载知识库注入、RoE 规则执行、HITL 审批、prompt 注入防护、预算控制、事件日志等横切能力。插件作者实现的中间件需要满足MiddlewareProtocol这是一个runtime_checkable协议定义于 decepticon_core/protocols/middleware.py必备属性name人读的中间件标识用于内省、slot该中间件占据的MiddlewareSlot接受枚举值或插件自定义字符串、priority槽位内的装配排序提示数值越小越靠前官方约定 OSS 中间件用 100/200/…插件常用 50 表示替换在标准之前、150 表示替换在标准之后。必备方法wrap_model_call(state, runtime, config)——Agent 运行器在每次模型调用时调用主回调。可选钩子框架只调用存在的部分before_agent、after_agent、modify_request。MiddlewareSlot是一个StrEnum声明顺序即装配顺序完整枚举定义于 decepticon_core/contracts/slots.py包括ENGAGEMENT_CONTEXT、ROE_GUARDRAIL、HITL_APPROVAL、UNTRUSTED_OUTPUT、PROMPT_INJECTION_SHIELD、SKILLS、FILESYSTEM、SUBAGENT、OPPLAN、KG、EVENT_LOG、SANDBOX_NOTIFICATION、OPSCONTROL_NOTIFICATION、BUDGET、MODEL_OVERRIDE、MODEL_FALLBACK、PROXY_KEY_OVERRIDE、SUMMARIZATION、PROMPT_CACHING、PATCH_TOOL_CALLS等约 20 个命名槽位。每个 Agent 角色role只装配自己声明的那部分槽位映射关系集中在SLOTS_PER_ROLE同样定义于 slots.py例如recon/exploit/postexploit等 bash 执行型专家使用_BASH_AGENT_SLOTSanalyst/contract_auditor/ad_operator在 bash 槽位集之上额外启用KG槽位而blue_cell有独立的最小槽位集。插件中间件通过slot属性声明自己挂靠的位置——示例中挂到SKILLS槽位MiddlewareSlot.SKILLS。值得注意的安全约束SAFETY_CRITICAL_SLOTS集合slots.py标记了ENGAGEMENT_CONTEXT、ROE_GUARDRAIL、UNTRUSTED_OUTPUT、PROMPT_INJECTION_SHIELD、HITL_APPROVAL等槽位为安全关键项。插件对这些槽位做替换是允许的前提是新实现遵守原契约但直接禁用会触发装配期异常除非设置环境变量DECEPTICON_ALLOW_SAFETY_OVERRIDES1——这一门禁由 decepticon/agents/build.py 中的_check_safety_gate强制实施防止误装插件静默瓦解安全护栏。示例项目解剖HelloMiddleware 的三处关键代码示例项目位于 packages/decepticon-sdk/examples/middleware是标准的 src-layout PyPI 包由脚手架命令decepticon-sdk plugin new生成命令本身定义于 decepticon_sdk/scaffold/cli.py对应的中间件代码模板在 decepticon_sdk/scaffold/templates.py。其源码只有一份文件 src/decepticon_example_middleware/init.py包含三处关键结构Custom middleware contributed to Decepticon. from __future__ import annotations from decepticon_sdk import MiddlewareProtocol, MiddlewareSlot class HelloMiddleware: Minimal MiddlewareProtocol-compliant middleware. name decepticon_example_middleware slot: MiddlewareSlot | str MiddlewareSlot.SKILLS priority 150 def wrap_model_call(self, state: object, runtime: object, config: object) - object: return state def get_middleware(role: str | None None, **_: object) - list[MiddlewareProtocol]: Plugin factory called by the frameworks middleware loader. del role return [HelloMiddleware()]逐段解读导入面Import surface只从decepticon_sdk导入不触碰任何带下划线前缀的框架内部模块。SDK 的init.py 重新导出decepticon-core的协议、契约与注册表这正是一个完整的插件只需要一条 import 语句的设计目标Phase 3 surface。__all__中列出的公开名称遵循 SemVer 稳定性承诺。中间件类HelloMiddleware声明slot MiddlewareSlot.SKILLS挂靠 skills 槽位与priority 150在标准 skills 中间件之后装配。wrap_model_call原样透传state是一个最小可用实现——真实中间件在此处对 state 做改写例如向系统消息追加策略、记录日志、改写模型请求。MiddlewareProtocol是runtime_checkable的因此isinstance(mw, MiddlewareProtocol)在运行时可以用于防御性校验。工厂函数get_middleware这是框架 loader 约定的可调用形状——接收role关键字可据此按角色裁剪贡献内容返回中间件实例列表。示例中忽略role并固定返回[HelloMiddleware()]。配套的 pyproject.toml 中注册入口是插件被发现的关键[project.entry-points.decepticon.middleware] decepticon_example_middleware decepticon_example_middleware这里decepticon.middleware是入口点组名右侧值指向模块decepticon_example_middleware模块级get_middleware工厂会被 loader 调用。其余构建元数据requires-python 3.13、依赖decepticon-sdk、构建后端hatchling、wheel 打包目标src/decepticon_example_middleware。仓库对示例结构有结构不变式测试保障tests/test_examples.py 参数化地对六类示例tool / middleware / agent / callback / skill / prompt断言三件事示例目录存在且含pyproject.toml、README.md、src/decepticon_example_kind/__init__.pypyproject.toml声明了与 kind 匹配的入口点组middleware 对应decepticon.middleware且入口点引用模块名decepticon_example_middleware生成的__init__.py在 Python 3.13 下可被 AST 解析语法可编译。构建与安装uv build 到 pip install按示例 README 的指引构建与安装分两步uv build pip install dist/*.whluv build使用 hatchling 构建出 wheel产出物位于dist/下pip install dist/*.whl将 wheel 装入当前 Python 环境。安装完成后wheel 的 metadata 会携带decepticon.middleware入口点声明此后任何 Decepticon Agent 工厂在构造时都会通过importlib.metadata.entry_points发现该贡献无需对框架做任何注册动作。也可以不先构建直接以可编辑方式安装pip install -e .入口点同样生效。适用前提示例与 SDK 均要求 Python3.13SDK 依赖decepticon-core协议与契约的载体与typer0.9.0脚手架 CLI 用。安装 SDK 本体使用pip install decepticon-sdk若需要测试辅助设施FakeBackend/FakeLLM/FakeSandbox与脚手架能力安装pip install decepticon-sdk[testing]若需要基于真实mock框架实例的 fixture则安装pip install decepticon-sdk[fixtures]该 extra 会拉入decepticon框架本体详见 packages/decepticon-sdk/README.md。框架端装配build_middleware 如何把插件放进 Agent 栈安装后插件中间件进入 Agent 栈的路径是build_middlewaredecepticon/agents/build.py其装配逻辑可以概括为四个阶段角色槽位解析slots未显式传入时按SLOTS_PER_ROLE.get(role)查表查不到且未显式传入则抛KeyError——插件自带的编排 Agent 使用自定义角色名时必须显式传slots框架拒绝静默构建空栈。覆盖解析与安全门禁_resolve_overrides合并显式overrides/disabled_slots与插件入口点返回的PluginBundle覆盖随后_check_safety_gate校验安全关键槽位前文所述。按枚举顺序装配标准槽位以DEFAULT_SLOT_FACTORIESdecepticon/agents/middleware_slots.py为基座factories.update(resolved.middleware_replace)浅合并插件替换然后遍历MiddlewareSlot枚举声明顺序跳过角色未启用或已禁用的槽位逐槽调用工厂统一签名f(*, backend, llm, role, fallback_models, sandbox, subagents)工厂返回None的槽位如无条件成立的MODEL_FALLBACK、KG 不可用时的KG被静默跳过。追加插件中间件result.extend(load_plugin_middleware(rolerole, backendbackend))build.py——非覆盖式additive插件中间件统一追加在标准槽位之后这是不替换任何标准槽位、只想尾巴上挂一个中间件的向后兼容逃生口。load_plugin_middleware最终落到decepticon_core.plugin_loader的_discover通用发现逻辑plugin_loader.py通过entry_points(groupdecepticon.middleware)枚举入口点逐个ep.load()加载失败的插件记录日志后跳过框架回退到 OSS 行为保证纯 OSS 环境与坏插件环境下框架不被拖垮对返回值做三种形状归一化可调用且不是运行时对象_looks_like_runtime_object通过invoke/before_agent/modify_request/after_agent等属性启发式判别→ 以obj(rolerole, **deps)调用工厂list/tuple→ 原样展平单个运行时实例 → 包装成单元素列表若返回PluginBundle包装则先经is_bundle_enabled(result.bundle)做 bundle 白名单过滤默认只启用standardDECEPTICON_PLUGINS环境变量或.decepticon.toml/pyproject.toml的[plugins].enabled可扩展*为通配再展平result.items。关于priority的语义示例 README 只标注了priority 150从 middleware.py 的约定看这是一个装配顺序提示数值小者优先——OSS 中间件用 100/200/…插件常用 50replace before或 150replace after。需要说明的是非覆盖式插件中间件在build_middleware中统一追加到标准槽位之后第 4 阶段因此priority的实际影响主要体现于插件之间的相对顺序及作为面向未来的契约字段。用 SDK 测试辅助设施编写免框架的 hermetic 测试示例 README 的测试部分是关键工程实践pip install decepticon-sdk[testing] pytest测试辅助设施位于 decepticon_sdk/testing/init.py提供三个内存级 fake各自满足decepticon_core.protocols对应的 Protocol因此被测代码可以安全地做isinstance(fake, BackendProtocol)之类的运行时检查而无需拉起真实框架FakeBackend以 Python dict 为后端的BackendProtocol实现。read(path, offset, limit)兼容 deepagents 的切片语义write/list/exists均无 IO。构造示例FakeBackend({/skills/recon/index.md: ...})。FakeLLM脚本化的LLMProtocol。按顺序逐次返回responses列表中的条目calls属性记录每次invoke()的输入便于断言响应耗尽后再调用会抛IndexError防止多调一次却静默成功的假阳性测试。FakeSandbox无操作SandboxProtocol。execute_command()被记录进self.commands并按构造时的responses队列返回 stdout队列耗尽后返回空串用于断言命令构造逻辑而不启动沙箱容器。一个典型的 hermetic 测试形态README 的指导用法展开from decepticon_sdk.testing import FakeBackend, FakeLLM, FakeSandbox from decepticon_example_middleware import HelloMiddleware def test_middleware_passthrough(): mw HelloMiddleware() state {messages: []} # wrap_model_call 的第二个参数是 runtime如 llm第三个是 config out mw.wrap_model_call(state, object(), object()) assert out is state # 透传语义针对更真实的中间件会读取 backend、调用 llm、执行沙箱命令可组合三者用FakeBackend预置技能文件、用FakeLLM(responses[...])固化模型输出、用FakeSandbox记录命令序列从而在完全脱离框架与容器的前提下验证插件的输入输出契约。这三个 fake 覆盖约 80% 的插件测试场景README 亦注明未来会补充make_test_engagement/make_test_opplan以支持更丰富的 engagement 级 fixture。从示例到生产替换/禁用/安全门禁与常见扩展方向示例是最小可运行真实插件往往需要与框架的PluginBundle机制配合plugin_loader.py。中间件相关的覆盖字段disabled_middleware按槽位名MiddlewareSlot的枚举值字符串跳过装配replaced_middleware槽位名 → 工厂可调用工厂签名与DEFAULT_SLOT_FACTORIES一致f(*, backend, llm, role, fallback_models, sandbox, subagents)返回中间件实例或Noneitems纯追加形态等同本文主线的入口点直返列表roles覆盖作用域过滤空元组 作用于所有触发加载的角色bundlebundle 白名单标签None 安装即加载。示例来自 plugin_loader.py 的文档示例禁用 OSS 的 prompt-caching 并用厂商版替代——PluginBundle( bundlevendor, disabled_middleware(prompt-caching,), items(VendorCacheMiddleware(),), )替换ask_user_question之类的工具、按角色重定向模型等其它能力同理。此外contracts/contributions.py 还提供聚焦的MiddlewareContributionitems/disabled_slots/replaced_slots/rolesroles为空元组时构造直接抛ValueError杜绝隐式全角色生效以及SafetyDeclaration插件只能新增安全关键项不能撤销 OSS 声明的安全项。扩展路径的常见选择对已有槽位做增强如企业审计策略注入EVENT_LOG前后优先考虑replaced_middleware或追加模式实现全新横切能力如自定义加密、流量改写可声明自定义 slot 字符串或直接追加无论如何务必遵守安全门禁——涉及SAFETY_CRITICAL_SLOTS的替换必须保证新实现遵守原契约例如替换ENGAGEMENT_CONTEXT的中间件仍须注入 RoE 范围约束否则不仅装配期会被拒更可能在运行时静默破坏安全叙事。小结从decepticon-sdk plugin new --kindmiddleware生成骨架、在__init__.py中实现MiddlewareProtocol与get_middleware工厂、在pyproject.toml的decepticon.middleware入口点组注册、uv build打包安装到框架build_middleware按枚举顺序装配并追加插件中间件——Decepticon 的中间件插件链路是一条无侵入、可回退、带安全门禁的完整闭环。配合decepticon-sdk[testing]的FakeBackend/FakeLLM/FakeSandbox插件作者可以在不启动框架、不拉起容器的前提下获得确定性的单元测试体验。本文相关的可继续深入阅读材料协议契约 decepticon_core/protocols/middleware.py、槽位与角色映射 decepticon_core/contracts/slots.py、发现机制 decepticon_core/plugin_loader.py、框架装配 decepticon/agents/build.py、默认槽位工厂 decepticon/agents/middleware_slots.py 以及 SDK 测试辅助设施 decepticon_sdk/testing/init.py。赞分享【免费下载链接】DecepticonAutonomous Hacking Agent for Red Team项目地址https://gitcode.com/gh_mirrors/de/Decepticon点击查看免费下载相关推荐Decepticon Prompt 插件开发指南从 decepticon-sdk plugin new 脚手架到 decepticon.prompts 入口点的完整实战Decepticon Prompt 插件开发指南从 decepticon sdk plugin new 脚手架到 decepticon.prompts 入口点Decepticon 插件开发完全指南基于 decepticon-sdk 构建工具、中间件与子智能体的权威实战手册Decepticon 插件开发完全指南基于 decepticon sdk 构建工具、中间件与子智能体的权威实战手册 导读 本文以 Decepticon 开源Decepticon Callback 插件开发实战基于 decepticon-sdk 构建、安装与测试可观测性回调插件Decepticon Callback 插件开发实战基于 decepticon sdk 构建、安装与测试可观测性回调插件 本文以 Decepticon 官方示上一篇TFLearn 深度学习库指南基于 TensorFlow 的高层 API 从安装、建模到训练可视化下一篇RPFM的DB表格编辑器深度评测像Excel一样编辑总战争兵种与科技数据表创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

红外小目标检测实战:YOLOv5预训练权重与4000张数据集快速上手

红外小目标检测实战:YOLOv5预训练权重与4000张数据集快速上手

简介:本资源面向红外场景下的目标检测学习者与研究者,提供一套可直接复用的YOLOv5红外微小无人机、直升机、飞机、飞鸟检测方案,解决红外小目标样本稀缺、标注与训练环境搭建繁琐的问题。包内包含4000余张YOLO格式红外图像数据集,…

2026/10/13 9:28:06 阅读更多 →
coremltools Palettization 技术全解析:权重聚类查找表压缩的原理、粒度控制与三套算法实战

coremltools Palettization 技术全解析:权重聚类查找表压缩的原理、粒度控制与三套算法实战

AI 应用机器学习模型优化 【免费下载链接】coremltools Core ML tools contain supporting tools for Core ML model conversion, editing, and validation. 项目地址: https://gitcode.com/gh_mirrors/co/coremltools 点击查看 免费下载 Palettization&#xff08…

2026/10/13 9:28:06 阅读更多 →
红外小目标检测实战:4000张数据集处理与YOLOv5训练部署

红外小目标检测实战:4000张数据集处理与YOLOv5训练部署

简介:本资源面向红外场景下的目标检测学习者与开发者,提供一套可直接复用的YOLOv5红外微小无人机、直升机、飞机、飞鸟检测方案,适合课程设计、科研实验与算法对比等场景。压缩包共约2000个文件,以1994个XML标注文件为主&#xff…

2026/10/13 9:28:06 阅读更多 →

最新新闻

大模型面试避坑指南:小白程序员如何通过真实项目斩获Offer(收藏版)

大模型面试避坑指南:小白程序员如何通过真实项目斩获Offer(收藏版)

本文基于作者上百场大模型面试经验,提炼出2026年大模型面试的核心考察点,包括Agent方向岗位增多、简历价值变化、准备时机等。文章强调“为可靠付钱”的行业趋势,建议候选人关注Agentic与推理能力、业务链路闭环、项目深度和评价维度变化。此…

2026/10/13 10:16:45 阅读更多 →
Windows Terminal 定制全攻略:配色、字体与提示符打造专属控制台

Windows Terminal 定制全攻略:配色、字体与提示符打造专属控制台

各位用 Windows 的朋友应该都有过这样的经历:每天打开系统自带的 CMD 或者 PowerShell 窗口,黑底白字,一条条命令敲下去,总觉得少了点什么。直到我第一次接触 Windows Terminal,才意识到原来控制台也可以玩出这么多花样…

2026/10/13 10:16:45 阅读更多 →
液压伺服电动机状态空间建模与控制器设计仿真

液压伺服电动机状态空间建模与控制器设计仿真

这个题目我太熟了,控制类和机电类专业做课设、毕设,十个里有八个会碰到“液压伺服电动机的状态空间设计与仿真”这种组合。对象是电液伺服系统,方法是现代控制理论的状态空间法,工具是Matlab。这套源程序迭代到14900期&#xff0c…

2026/10/13 10:16:45 阅读更多 →
Qt xcb插件加载失败原因与修复指南

Qt xcb插件加载失败原因与修复指南

1. 问题本质:这不是Qt程序崩溃,而是图形系统“失联”了你看到这行报错——This application failed to start because it could not find or load the Qt platform plugin xcb——第一反应可能是“Qt坏了”“程序编译错了”“Linux系统不兼容”。但实话讲…

2026/10/13 10:16:45 阅读更多 →
蓝屏0x10E显存管理内部错误:从驱动到BIOS的笔记本排查实战

蓝屏0x10E显存管理内部错误:从驱动到BIOS的笔记本排查实战

最近手头碰到一台新到的某品牌笔记本,配置是 Ultra X7 358H 处理器加独立显卡的组合,系统装好没两天就开始出问题。现象很典型:浏览网页或者看视频的时候突然画面卡住,随后屏幕一黑,直接蓝屏,错误代码0x10E…

2026/10/13 10:16:45 阅读更多 →
FFMpeg 4.1音频检测实战:命令详解与批处理自动化

FFMpeg 4.1音频检测实战:命令详解与批处理自动化

做内容生产这一年多,我处理过最多的活儿不是剪辑,而是给一堆音频素材做体检。尤其是接手播客剪辑、视频课程批量转码这类项目时,几十个甚至上百个文件摆在面前,里面哪个有静音、哪个音量忽大忽小、哪个爆音了,光靠耳朵…

2026/10/13 10:15:43 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →