Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
# Changelog

## v2.6.5 — http_get 健壮性:编码嗅探 / 指数退避重试 / 二进制分流 / final_url

- **http_get 编码嗅探**: 响应体解码从硬编码 UTF-8 改为三级嗅探(Content-Type charset → charset_normalizer → chardet,均为可选降级,兜底 UTF-8),修复 GBK/GB18030 中文站点静默乱码(`errors="replace"` 产生的 `` 属于"成功但内容全毁"的静默错误)。
- **http_get 指数退避重试**: 新增 `_open_with_retry`,对 5xx 与连接错误(超时/断连)自动重试,默认 2 次、0.5s 起指数退避;4xx 与 SSRF 重定向拦截(安全决策)立即失败不重试。POST 非幂等,明确不重试以避免重复提交。
- **http_get 二进制分流**: 响应 Content-Type 为 PDF/图片/音视频/压缩包等二进制类型时,不再把字节流当文本 decode 成乱码返回,改为明确报错并附 `hint` 引导改用 http_download。
- **http_get 可观测性**: 返回新增 `final_url`(重定向后的落地地址,短链展开/跳转调试可用)与 `content_type` 字段,分页缓存条目同步携带。
- **http_get 截断误报修复**: `_read_limited` 原 `total >= max_bytes` 在恰好等于上限时误报截断,改为多读 1 字节确认。
- **http_get 翻页缓存前置(正确性)**: 原实现缓存检查在 HTTP 下载之后,翻页时整页重下再丢弃(缓存只省转换不省下载),且翻页瞬间对端宕机/限流时即使缓存完好也直接报错;现翻页请求先查缓存,命中零网络请求直接切片返回。
- **http_get gzip/deflate 解压**: 自动广告 `Accept-Encoding: gzip, deflate` 并解压响应(服务器强制压缩时原会 decode 出乱码);解压后再过一次 5MB 截断防压缩炸弹。
- **http_get 脚本内容剔除**: markdownify 的 `strip` 只去标签不去文本,内联 `<script>/<style>` 源码原会泄漏进转换结果(SPA 页可泄漏数千字符 JS 浪费 token);现转换前正则剔除整块。
- **http_get SPA 检测**: 转换后几乎无文本但原始 HTML 含大量脚本时,返回附 `hint` 提示疑似 JS 动态渲染(本工具不执行 JS)并给出替代建议,不再让 LLM 面对"成功但空白"误判。
- **http_get/http_post 错误可操作化**: HTTP 错误按状态码附排查 hint(401 认证 / 403 反爬 WAF / 404 失效 / 405 方法 / 429 限流 / 5xx 服务端),连接层错误区分 DNS 解析失败/超时(含当前 timeout 值)/拒连;自动重试后仍失败时透传 `retries` 次数;SSRF 拦截不再被"连接失败"前缀伪装成网络故障。
- **http_get/http_post timeout clamp**: 直接调用也钳制到 1~600s(原仅注册表层对 post 生效),非法值回退默认。
- **http_get review 修复(安全)**: ① 解压改 `zlib.decompressobj` 流式限长,压缩炸弹内存有界(原全量解压后才截断,1MB gzip 实测可撑 2GB);② 翻页缓存 key 纳入 headers 规范化指纹,修复跨凭据缓存命中导致的机密内容泄露,`next_call` 同步透传 headers;③ script/style 剔除从正则改为线性扫描,修复大量无闭合标签构造的 O(n·m) DoS;④ SSRF 拦截改用专用异常 `SsrfBlocked`(原靠消息文案字符串匹配,脆弱耦合)。
- **http_get review 修复(健壮性)**: `RemoteDisconnected`/`ConnectionResetError` 等非 URLError 连接错误纳入重试;offset 非整型返回错误而非 TypeError 泄漏;下载截断的压缩流返回已解压部分内容并标记(原静默返回压缩垃圾);br/zstd 等不支持编码明确报错;HTTP 错误体读取限长 4KB;重试加总耗时预算(cap 180s,防大 timeout×重试放大);重试前 close 失败响应;429 hint 与不重试行为对齐;自定义 UA/Accept-Encoding 大小写不敏感匹配;http_post 补二进制分流;编码嗅探只取前 64KB。
- **测试修复**: 分页衔接断言原切片恒空(`startswith("")` 恒真)的假阳性改为与缓存全文比对;FakeResponse headers 改大小写不敏感(对齐真实 HTTPMessage);GBK 嗅探 skip 守卫修正为任一嗅探库。
- **db_query**: params schema 补 `items`(数组类型缺 items 导致 Gemini function calling 400 INVALID_ARGUMENT,43004d6)。

## v2.6.4 — 全量 code review 修复:响应协议 / 备份生命周期 / 行号寻址编辑 / CI 日志

- **safe_edit 行号寻址**: 新增 `mode=insert_at_line`(`line` 后插入,`0`=文件开头)/ `delete_lines`(`start_line~end_line` 闭区间删除),走完整备份→语法检查→回滚链路;参数 `preserve_inner_indent` 更名 `align_whitespace`(语义不变)。
Expand Down
2 changes: 1 addition & 1 deletion metadata.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: astrbot_plugin_irmia_devkit
display_name: 弥亚开发工具箱
desc: 为 Agent 提供实用且安全的开发工具 — 备份/语法检查/回滚,65 工具 + 1 Skill
author: 伊尔弥亚
version: 2.6.4
version: 2.6.5
repo: https://github.com/irmia2026/irmia_devkit_open
short_desc: 安全代码编辑 — 备份/语法检查/回滚,65 工具 + 1 Skill
astrbot_version: ">=4.16"
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "astrbot_plugin_irmia_devkit"
version = "2.6.4"
version = "2.6.5"
description = "弥亚开发工具箱 — 为 LLM Agent 提供安全的代码开发工具集"
requires-python = ">=3.10"

Expand Down
Loading