vUnreleased
暂无未发布改动。
暂无未发布改动。
/friends 列表展示及 moka 高效缓存。/feed.xml / /rss.xml) 与 JSON Feed 1.1 (/feed.json) 订阅生成与输出端点。docker image inspect 获取 Architecture 标识的问题。ghcr.io) 自动推送与归档。mermaid.render 解析失败时在 document.body 遗留临时 #d${id} 容器导致页面底部出现错误块的视觉问题。fitToScreen 居中计算未乘以 fitScale 导致宽图放大浮层整体向左上偏位的问题。requestIdleCallback)自动预加载 mermaid bundle 模块,并在图像渲染过程中增加转圈角标提示。build-amd64 触发条件(仅主干分支、tag 及手动触发),增加镜像无 DB 启动冒烟测试与 Runner 目录变更检测,提升 CI 执行效率。users.session_generation 版本化机制此前只有读侧(get_user_by_token 命中缓存后回查版本号,不匹配即逐出),但写侧无任何自动 bump——降级/封禁用户后已签发会话仍长期有效。新增 BEFORE UPDATE 触发器(migration 018):仅在 role 真正变化(IS DISTINCT FROM)时 bump 世代号,其它列更新不误伤,触发器内修改 NEW 不递归。端到端语义由既有读侧逐出逻辑承接。use_future 改为 use_resource(依赖 pending 列表自动重启),并加去重 use_effect 兜底,根治 pending 占位项残留。foreignObject 默认 overflow:hidden 在部分浏览器 sub-pixel 渲染下裁切多行节点下沉笔画(g/p/y)。注入 SVG overflow="visible" presentation attribute 修复(CSS overflow 对 foreignObject 无效,须写属性)。posts.search_text 的 trigram GIN 索引(migration 014 以错误理由删除——gin_trgm_ops 本就是为 %pat% 包含匹配设计的;migration 019 按 004 原定义重建)。search_posts 与 MCP search_published 的 ILIKE 不再全表扫。whitespace-nowrap,避免窄屏换行。backups/ 目录且属主为 root、进程以 nobody 运行不可写。修复 .dockerignore 放行 backups/.gitkeep、Dockerfile 预建目录;备份写入失败改为携带真实 io::Error。/doc 路由 404;订正 rustdoc intra-doc 断链与无效 HTML 标签。test + build-amd64 改为每次推送触发,build-arm64/release/deploy 改为仅 tag 推送(v*)或 workflow_dispatch 触发。ubuntu-24.04-arm runner),GitHub Release 自动发布三件产物(amd64 镜像 / arm64 镜像 / x86_64 musl 静态二进制 + public 资源)。lint 目标增加 cargo fmt -- --check;全仓库 cargo fmt 统一格式。.cargo/config.toml 过时的 cross build 叙事;修正 CHANGELOG 代码围栏 Markdown 转义。update_post 部分更新:update_post 改为 PATCH 语义,UpdatePostParams 所有可改字段(title / content_md / summary / slug / tags / status / cover_image)改为 Option,仅 post_id 必填;服务端按提供的字段动态构建 UPDATE SET 子句,未提供 content_md 时跳过 Markdown 重新渲染,省去 spawn_blocking 开销。语义要点:summary 随正文联动(正文变且未给则自动提取);slug 仅显式提供才改动;tags 为 None 不改、Some 替换(空列表清空);cover_image 为 None 不改、空串清空、URL 设置;status 变化时首发自动填 published_at。旧的全量调用(同时传 title+content_md)行为不变,向后兼容。toml 代码块此前回退为纯文本(syntect 默认精选集不含 TOML);现已引入官方 sublimehq TOML v2 语法,支持日期时间、数组表、内联表与多行字符串。Dockerfile.dev + docker-compose.dev.yml,内置 dx 0.7.9、tailwindcss v4、Node 22/pnpm 与 wasm32 target;源码 bind mount 实现热重载,cargo/pnpm 缓存跨重启持久化,直连宿主原生 PostgreSQL。新增 make docker-dev / docker-dev-down / docker-dev-shell 便利 target。Dockerfile.cross 三阶段构建(Trixie 编前端 + Alpine/zig 交叉编 server + scratch 合并产物),arm64 Mac 上不再经 QEMU/Rosetta 翻译,告别 cross 工具链容器在 Rosetta 下的 SIGSEGV 崩溃。upload_media 工具改为接收 URL,由服务端经 SSRF 防护抓取(强制 https、DNS 解析即锁 IP 杜绝 rebinding、禁重定向、流式体积上限、超时);新增 POST /api/mcp/upload bearer multipart 端点,供 host/shell 直接 POST 二进制。二进制不再进 JSON-RPC,不再受 4MiB 请求体上限(原 base64 路径实际仅约 2.8MiB 原始图)约束。新增 server-only 依赖 reqwest(rustls-tls,musl 静态链接友好),移除 base64 依赖。xxh64(CARGO_MANIFEST_DIR + module_path!, 0);host 交叉编译与容器内编译的 CARGO_MANIFEST_DIR 不同,导致前后端算出不同 URL 后缀,POST 落入 SSR 兜底 GET 路由返回 405。改由 .cargo/config.toml 固定 SERVER_FN_OVERRIDE_KEY,两次编译读到同一哈希 key。shared / xterm-terminal / mermaid-renderer。POST /mcp,Streamable HTTP,无状态),管理员的 AI 客户端(Claude Code / Cursor / Cline)可经 bearer token 连接,把已发布文章当知识库检索,并执行几乎所有后台操作。
/admin/mcp 签发令牌,三档作用域(read / write / admin),可选有效期(1/7/30/90 天 / 永不过期)。令牌明文经 AES-GCM-256 静态加密存储(可重查),SHA-256 哈希做每请求查找。search_posts / get_post / list_tags 工具 + 已发布文章作为可枚举的 MCP Resources(post://{slug},游标分页)。last_used_at 节流刷新、鉴权审计日志、Origin→403(spec 强制,rmcp 内置)、协议版本头校验、4MiB 请求体上限。rmcp crate(=3.0.0-beta.3,3.x 才有 Origin 校验等 spec 强制项)挂载于 axum。新增依赖 rmcp、aes-gcm、base64(均 server-only)。MCP_TOKEN_ENC_KEY(hex 编码 32 字节 AES-256 密钥,openssl rand -hex 32 生成)、RATE_LIMIT_MCP_PER_SEC / RATE_LIMIT_MCP_BURST。media_assets 注册表数据层与 /admin/assets 管理页,把上传的图片当作一等公民管理。
posts.content_html 重建每张图片的引用关系(批量 500)。Pagination 组件新增跳转能力)。/changelog 页面:新增更新日志页,内嵌渲染 CHANGELOG.md,并在年轮区接入入口。FormSelect 主题化下拉组件:封装自定义主题化下拉弹层,替代原生 <select>(OS 弹窗无法跟随主题);全项目原生 <select> 统一替换为 FormSelect。tools/common.rs 消除 MCP helper 四重拷贝(R2);放宽 posts helpers 可见性并删除 MCP 内的平行拷贝(R3);抽取 render_post_fields 消除文章渲染 + 字数/阅读时间度量的重复(R4);抽取 fetch_post_tags 消除 9+ 处标签查询重复(R5);抽取 invalidate_for_post_write 统一写后缓存失效序列(R6)。hash_token / EMAIL_REGEX / MAX_FILE_SIZE 的重复定义;集中 MIGRATE_STARTUP_TIMEOUT_SECS 解析;提取 formatted_date 公共实现;统一 LIKE 模式转义(consts)。FormInput:后台文章搜索框、SQL 控制台输入框等统一改用 FormInput 公共组件。spawn_exec_task 消除 start_exec / stream 重复(M10)。\pu 转译:修复 \pu 预转译的 off-by-one 与 UTF-8 破坏(C1+C2)。source_prop_signal 的渲染纯净性违规(C4)。publish_post 标签缓存失效(M1+M6);标签文章数计数 + 批量删除 SSR 失效(M2+M5)。pg_dump/psql 移入 spawn_blocking 并按行读取,避免阻塞异步线程(M3)。spawn_blocking(M4)。PostsByTagPage 缓存键(M7)。LIMIT 避免全表物化(M11);SHOW 只读分类修正。SUM(size_bytes) 显式转 bigint 修复列表 500;引用徽标加 z-10 修复被 blur-img 遮盖;灯箱图集切换不重算几何导致图片压扁;删除返回「素材不存在」时刷新网格自愈过期数据;工具栏右侧按钮沉入 FilterTabs 区域紧贴横幅;操作横幅上下间距不对称(40/8 → 24/24)。Uuid;FormSelect 面板水平居中修复双倍位移;客户端配置格式修正(Claude Code / Cursor / Cline,联网核实 2026);配置生成 use_effect 死循环;开发期放行 0.0.0.0 Host 让 dx 代理可用、Host 白名单加入 APP_BASE_URL 域名。resources.rs、死 User 结构体、未用参数、mhchem 冗余分支、死导出与文档化死分支、未使用且永不失效的缓存键等;收窄模块级 allow。sha2::Digest 导入。sleep_ms 原用 #[cfg(not(target_arch = "wasm32"))] guard tokio 分支,但 tokio 是 server-only optional 依赖。该 guard 在「非 wasm32 主机 + 仅 web feature」组合下误激活导致编译失败(长期被 dev-dependencies 中的 tokio 掩盖,只有排除 dev-deps 的生产构建才暴露)。修复为 #[cfg(all(feature = "server", not(target_arch = "wasm32")))],符合 dual-target gating 规范。ErrorBoundary 捕获错误渲染 fallback,但点击「返回首页」仅更新 URL 不切换页面(ErrorBoundary 需显式 clear_errors() 才能恢复渲染 children)。修复:返回首页改用 button,onclick 内先 clear_errors() 再导航。unwrap():在 panic = "abort" 全局下,任何裸 unwrap() 都会直接崩溃整个进程且无法恢复。将所有非测试代码中的 unwrap() 改写为带不变量说明的 expect()(消息需解释为何不可能失败),并在 AGENTS.md 规范 #16 中固化该约束。panic = "abort" 下化学公式转译器的三处崩溃:". __* " 正则转录错误、find_observe_end 逐字节扫描多字节字符越界、以及 re! 宏编译失败时未降级为不匹配导致直接 panic。前两处为输入触发的运行时 panic,第三处补上缺失的防御性边界。patches/ 目录:构建镜像时未复制 patches/ 目录导致 pnpm install 报 ENOENT,补充复制修复。\ce/\pu 化学方程式语法转 LaTeX 渲染。\d、\od、\textsubscript 等),适配物理学公式写作习惯。/admin/write 新建文章的默认发布状态改为直接发布。@yggdrasil/shared 共享包,统一管理。ssr_generation/version_headers 中间件从 main.rs 抽出至 src/middleware.rs。table-wrap 容器内边框被裁切的问题。svg、path 标签及绘图属性通过 sanitizer。[^id] → \[^id\] 导致脚注失效。katex-rs 在服务端把 $...$/$$...$$ TeX 渲染成视觉层 HTML span(OutputFormat::Html,不含 MathML,XSS 面最小;throw_on_error=false 坏公式渲染成红色错误而非中断);自托管 KaTeX CSS + woff2 字体到 public/katex/(make katex-css 从 npm katex dist 拷贝)。ENABLE_MATH,span 白名单加 style 保留 KaTeX 内联定位样式。language-mermaid 代码块经 IntersectionObserver 视口可见时动态 import('/mermaid/mermaid.js')(独立 IIFE bundle,~3.4MB / gzip ~900KB,非全局注入),mermaid.render 产 SVG 注入;主题经 __initMermaid 传入,securityLevel: 'strict',幂等守卫防重复渲染;渲染失败保留源码并加 .mermaid-error class。yggdrasil-runner-bun 沙箱镜像(官方 bun.sh/install 脚本 + musl 变体 + libstdc++/libgcc C++ 运行时);admin 代码试运行沙箱加 bun 语言按钮;CodeMirror 加 TypeScript 模式;语言别名归一化(ts/typescript→bun,在 parse_fence_info 统一,LANGUAGES.get 只见规范化 key)。<details> 折叠块卡片化,自绘 chevron + hover/focus 态。appearance:none 自绘圆角方框。Server/X-Yggdrasil-Version/X-Yggdrasil-Git 响应头主动暴露版本与 git 描述信息(EXPOSE_VERSION_HEADERS 可关)。make docker-amd64 与 make docker-apple 构建 x86_64 镜像。COMPRESSION_ALGORITHMS 中间件默认值改为 off。#[global_allocator],双 cfg 门控:server feature + 非 wasm32;musl 静态链接友好)。escape_html 链式 5 次 replace 改单遍扫描;slugify 单遍状态机重写(分配 4→1);Markdown 渲染消除双解析 + format! 改 write! 直写;upload 消除 data.to_vec() 多次全文件深拷贝;cache_key 单次拼接 + detect_format 零分配后缀匹配;posts list/search 零 capacity Vec 改 collect 预分配 + helpers retain。/admin/posts 与 /admin/posts/trash 合并为单路由 + tab 切换;Pagination 支持可选 on_prev/on_next 回调;抽取 @yggdrasil/shared 内部源共享包消除跨 IIFE 库的类型/常量重复;抽 main.rs 中间件到 src/middleware.rs;为 Response 类型添加构造器消除 51 处样板;抽 invalidate_post_metadata()/upload_error() 等消除样板;统一 WASM sleep 到 utils::time::sleep_ms;删除死代码(delayed_loading.rs/ui.rs EmptyState/CommentActions/未用 re-export);拆分 system.rs 为 system/ 目录(按 tab 分文件);图片处理合并维度读取函数共享 image_reader_limits。static/ SSR 缓存目录。x-yggdrasil-git 恒为 unknown;预装 binaryen 避免 dx 运行时下载 wasm-opt 失败;补齐 Dockerfile 缺失的 katex-css 与 restore-webp 步骤;升级 builder 至 trixie 满足 dx 对 GLIBC_2.39 的需求;用 tmpfs mode=1777 替换 uid/gid 选项兼容 Podman;GitHub Releases 下载最终改用直连(移除 gh-proxy)。scrollToHash 增加一次性守卫,切主题不再跳回 URL hash;增加 ResizeObserver 布局稳定期,修正 mermaid 异步渲染导致的锚点落点偏移。escape_html,修复代码块单引号未转义。ImageFmt 别名补上 #[cfg(feature = "server")] 门控。useless_borrows_in_formatting 告警、Biome 告警。optimizing-rust-performance 与 rust-advanced-performance 性能优化技能;清理已卸载的第三方 skills 及 lock 注册;deploy-to-linux 添加手动部署模式。.env.example 缺失的 5 个环境变量。 lang runnable ``` 代码块,在隔离的 Docker 容器中执行,支持 Python / Node.js / Go / Rust 四种语言;admin 侧 /admin/runner 试验沙箱页支持任意代码试跑(跳过速率限制)。三层架构:src/infra/docker.rs(bollard 执行层,只读 rootfs + tmpfs + 资源/能力限制 + ContainerGuard Drop 强制清理)、src/api/code_runner/(任务注册表、语言注册表、双速率限制 + 白名单 + 大小检查)、Markdown 渲染层(PostContent 拆分 Html/Runnable 片段,每块渲染为真实 <CodeRunner> vdom 元素)。所有 CODE_RUNNER_* 环境变量可调,支持 per-IP 速率与每日上限。xterm-terminal IIFE 子工程(xterm.js 6.0)、xterm_bridge.rs wasm-bindgen 绑定、/api/exec/stream SSE 端点、Docker 执行层流式路径(wait 与 log 读取并发);支持无缓冲 stdout(python -u)、SSE done 事件回传 duration_ms、运行前隐藏输出区 + skeleton 占位。/admin/system 管理后台:全新管理区,5 个 tab —— 数据库状态(表统计/活跃连接/迁移版本)、服务器状态(sysinfo 主机指标 + moka 缓存命中率轮询)、SQL 控制台(全读写,4 道护栏:sqlparser AST 门 + WHERE 缺失拒绝 + 查询超时 + 前端确认;单元格类型化渲染 NULL/布尔/数字、表头 sticky、行截断展开)、数据导出(Axum 流式 SQL/CSV)、备份恢复(pg_dump 优先 + COPY 回退、DashMap 任务进度表 + 轮询、备份文件签名校验 + 路径白名单)。CodeBlockLowlight + Catppuccin 高亮配色;新增 CodeBlockNodeView(语言标签 + 运行按钮 + 结果区),点语言标签可编辑语言与配置;斜杠菜单新增「可运行代码块」条目 + 模态框配置 runnable fence info;make_run_code_closure 桥接编辑器内运行代码。- [ ] 逐字符输入创建任务列表(appendTransaction,非 InputRule 全量替换);前台与编辑器 checkbox 垂直中线对齐。/admin/system SQL 控制台接通 Ctrl/Cmd+Enter 运行快捷键。make build-freebsd + make freebsd-sysroot,clang + lld + sysroot。ErrorBoundary 包裹公开路由,文章详情页 404 等错误上抛至 ErrorLayout。libs/,单一 libs/pnpm-lock.yaml + 共享 libs/tsconfig.base.json;引入 Biome v2.5 monorepo 配置并全量格式化;Makefile 整合 lint/fix/test 目标。js_sys::eval:DOM 互操作全面从字符串求值迁移到 wasm-bindgen 绑定层(tiptap_bridge、codemirror_bridge、xterm_bridge),清理 wasm32 target 残留 clippy lint。use_paginated(分页加载)、use_event_listener(通用事件监听,解决 use_hook + use_effect + use_drop 资源所有权陷阱)。SqlConsoleTab 改用独立 SqlResultTable 组件。BTN_PRIMARY/BTN_OUTLINE 等按钮令牌与 LoadingButton 组件,消除样式散落。px-10 → px-6),写文章页移除页头条。/admin/trash 合并为 /admin/posts 的 URL 驱动 tab,PostStats 新增回收站计数 badge。tokio-stream(SSE)、bollard(Docker)。CODE_RUNNER_LANGUAGES 默认开放全部语言;admin runner 页展示 Go/Rust。Tooltip 包裹。/post/a → /post/b)后文章正文/列表/标签不更新的严重 bug —— 根因是 use_server_future/use_memo/use_resource 不追踪非 signal 依赖。改为在闭包内读 router.current() signal 或直接内联计算。同理修复评论区 CommentSection 依赖追踪与 SSR hydration 不匹配。animate-page-enter transform(修复代码块被覆盖)、跟随系统模式系统偏好变化时同步 dark class(改回瞬切避免动画冲突)、prefers-reduced-motion 降级。psql 未加 ON_ERROR_STOP=1 导致语句全错仍 exit 0);修复备份/恢复任务轮询永不启动导致按钮卡在 loading。/tmp tmpfs 执行权、去掉 nproc ulimit 修复容器启动 EAGAIN。#hash 时标题被 sticky header 遮住、hydration 后点击标题锚点触发整页刷新、hash 锚点跳转失效。/code 带入 codeBlock)、代码块内 Backspace 删整块(ignoreMutation 误忽略 contentDOM 编辑)、Backspace 在 lowlight decoration 重建后失效、runnable 块 classList.add 抛 InvalidCharacterError、语言下拉展开时 Enter 误触发插入、空项 Enter 不退出列表(畸形文档根因)、TaskInputRule 升级后光标被甩到下一行、升级后折叠行被撑高 + 折叠图标垂直不居中、CodeMirror 折叠图标垂直不居中。height:100% 失效)、行号区背景与代码区割裂、未撑满容器、SQL 编辑器 gutter 与 content 背景割裂。--font-sans 补齐 CJK sans 字体栈、暗色 type 色值。DROP DATABASE/DROP SCHEMA/CREATE DATABASE 绝对禁止(字符串预检 + AST 门);DROP/TRUNCATE/ALTER 需确认;UPDATE/DELETE 无 WHERE 拒绝;多语句默认禁用;结果上限 500 行。backup_path 路径穿越漏洞修复(补单测);pg_dump --clean --if-exists 使 restore 幂等(drop+recreate 而非 relation 已存在报错)。backup_path 路径穿越漏洞补表驱动单测。xterm-terminal:xterm.js 6.0 IIFE 库 + smoke 测试。codemirror-editor:CodeMirror 编辑器 + Rust bridge,Ctrl/Cmd+Enter 运行快捷键。docker/build-runners.sh 构建 base → python → node → go → rust 链;Go 镜像重定向 GOCACHE/GOPATH 到 /tmp,Rust 镜像封装 run-rust.sh 两步编译+运行 wrapper。wrap_images_with_blur 解耦文件系统依赖。xterm-terminal smoke 测试。/admin/trash 管理页面、settings 键值表与可配置的自动清理后台任务(保留天数、上限数量)。prefers-reduced-motion 降级。libs/lightbox/ TypeScript 项目,图库导航(淡入、箭头、键盘)、原点感知缩放、滚动关闭、防止背景滚动与闪烁。post-content 复制按钮与主题切换逻辑,删除 public/js/。healthz 与 readyz。MIGRATE_STARTUP_TIMEOUT_SECS)替代 panic;启动期自动创建目标数据库。APP_BASE_URL 未设置时启动告警。COOKIE_SECURE 环境变量控制 session cookie 的 Secure 标志。X-Forwarded-For 按 TRUSTED_PROXY_COUNT 提取真实 IP;未知 IP 时使用宽松限流桶。Cache-Control 与 ETag 头,支持 If-None-Match 304(RFC 7232 合规);图片内存缓存改用 bytes::Bytes,新增按文件年龄与总大小淘汰的磁盘缓存定时清理任务。MAX_IMAGE_DIMENSION、MAX_IMAGE_PIXELS、WEBP_QUALITY、WEBP_METHOD 等环境变量,默认值翻倍;统一各格式大小上限。posts 表字数与阅读时间:新增 word_count/reading_time 列并在写入时维护;列表/搜索接口不再返回正文,读取预存的字数与阅读时间。PostListItem 轻量 DTO:列表/标签/搜索接口不再返回完整正文,显著降低缓存与序列化体积。EmptyState 组件与装饰性配图(线条小狗等),配图圆角 + 暗色模式降亮。paper-* 主题变量;后台对齐前台主题变量,新增次要按钮冷调玫瑰色。FilterTabs 组件带滑动指示动画;回收站自动清理面板带滑入动画。COMPRESSION_ALGORITHMS 配置;公共页面与静态资源 Cache-Control。FOR UPDATE 避免并发竞态;批量恢复、清空、重建等路径均采用精确失效。get_post_stats 将 3 次独立 COUNT(*) 合并为单次条件聚合查询。tokio::task::spawn_blocking 移至阻塞线程池;Argon2 hash/verify、Markdown 渲染、GIF/WebP 原始校验同样 offload 到阻塞线程池。CompressionLayer 与 TimeoutLayer,/uploads/* 图片路由跳过压缩与全局超时。Verified 改为 Fast;重试从固定 2s 改为指数退避 + 抖动;新增 statement_timeout(STATEMENT_TIMEOUT_SECS)。deadpool-postgres 显式指定 Tokio1 runtime;删除无效的 trgm GIN 索引。js_sys::eval 迁移到 wasm-bindgen 绑定层(tiptap_bridge),EditorOptions/onReady/onUploadEvent 回调替代轮询。include_str! 内联改为配置驱动初始化;移除旧 ImageViewer 组件。blur-img 结构。LazyLock 静态化以避免每次调用分配。content_html/toc_html,写入时存储 toc_html。CoverUploader、FilterTabs、AutoPurgeSettings、RebuildCacheBar,共享 EmptyState 组件。/uploads/{*path} 路径因缺少 ConnectInfo 扩展而返回 HTTP 500 的问题。content_hash 建索引。md-content 类修复高亮与空行。check_pending_status 限流防止状态枚举。cfg gate)、Tailwind v4 与 Tiptap 构建问题。/doc 路由与静态托管冲突的 panic。b7afd12 起的 highlight 大小写匹配导致 Haskell 等高亮失效。COOKIE_SECURE 控制 Secure 标志。check_pending_status 限流。canonicalize 前缀检查(纵深防御);拒绝不可解码图片返回 422,原始文件上限 20MB;所有图片响应加 X-Content-Type-Options: nosniff。per_page 与 page 上限钳制,消除公开接口 DoS 与无界 OFFSET / 缓存键扇出。tiptap-editor(UploadCoordinator、UploadImageNodeView、isValidUrl)、lightbox(geometry、lightbox 生命周期)、yggdrasil-core(post-content、theme-transition 降级)。test(cargo test + vitest)、clippy、fix、doc(ayu 主题)、build-lightbox 等目标。449a545)修复多项关键问题。posts.rs API 拆分为模块目录结构AppError 枚举#[cfg(feature = "server")] 门控缺失导致的编译问题.block 类冲突