|
|
@@ -0,0 +1,160 @@
|
|
|
+# 容器取证问答:agent-node-lj-test
|
|
|
+
|
|
|
+- 时间:2026-11-14T08:40:31.550Z
|
|
|
+- 房间:`!jM953JxoHPBxS1int2DZxEu5Z9GMiWmBV1xhJ7ThpsI`(临时房间,可保留查阅)
|
|
|
+- 消息统计:正文 2 段 / 工具过程 4 段 / 文件 0 个
|
|
|
+- 结束原因:收到 ✅ reaction
|
|
|
+
|
|
|
+## 我发出的问题
|
|
|
+
|
|
|
+```text
|
|
|
+# 最终验证:三件事,逐项给真实结果
|
|
|
+
|
|
|
+## 背景:两台底座不同,先各自报现状
|
|
|
+
|
|
|
+kangshifu 已确认:它这台**没有** `fmode-deliverable-hook.py`(全盘 find 0 命中)。
|
|
|
+lj-test 那台有,而且已经改成 800MB。
|
|
|
+
|
|
|
+所以两台的上传路径本来就不是同一套 `/opt/data/scripts/`。**各自确认自己的现状即可。**
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# 验证 1:上限现在是多少
|
|
|
+
|
|
|
+```bash
|
|
|
+echo "=== 你这边所有大小上限 ==="
|
|
|
+grep -rn "1024 \* 1024\|1024\*1024\|MAX_BYTES\|max_media_bytes" \
|
|
|
+ /opt/data/scripts/ /opt/data/plugins/ 2>/dev/null | grep -v ".pyc" | head -20
|
|
|
+
|
|
|
+echo "=== 内核默认值 ==="
|
|
|
+grep -n "_max_media_bytes" /opt/hermes/gateway/relay/adapter.py 2>/dev/null | head -5
|
|
|
+
|
|
|
+echo "=== env 里显式设置了吗 ==="
|
|
|
+grep -n "MATRIX_MAX_MEDIA_BYTES\|FMODE_DELIVERABLE_MAX_BYTES" /opt/data/.env 2>/dev/null || echo "(未设置)"
|
|
|
+```
|
|
|
+
|
|
|
+**要回答**:当前生效的上限是几 MB?在哪个文件哪一行?
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# 验证 2:mxc 分支删干净了吗
|
|
|
+
|
|
|
+```bash
|
|
|
+grep -rn "mxc://\|upload_media\|needs_encrypted" \
|
|
|
+ /opt/data/plugins/ /opt/data/scripts/ 2>/dev/null | grep -v ".pyc" | head -20
|
|
|
+```
|
|
|
+
|
|
|
+**要回答**:还有几处会产生或接受 mxc?**目标:0。**
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# 验证 3:超限时的提示
|
|
|
+
|
|
|
+```bash
|
|
|
+grep -rn "too-large\|Rejecting oversized\|oversize" \
|
|
|
+ /opt/data/plugins/ /opt/data/scripts/ 2>/dev/null | grep -v ".pyc" | head -10
|
|
|
+```
|
|
|
+
|
|
|
+**要回答**:超限时会不会**回复用户**?还是只写日志?
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# 回答格式
|
|
|
+
|
|
|
+```
|
|
|
+## 验证 1 上限
|
|
|
+生效值 = ? MB
|
|
|
+文件:行号 = ?
|
|
|
+env 显式设置 = 有/无
|
|
|
+
|
|
|
+## 验证 2 mxc
|
|
|
+还剩几处 = ?
|
|
|
+列出文件:行号 = ?
|
|
|
+
|
|
|
+## 验证 3 超限提示
|
|
|
+会回复用户吗 = 会/不会
|
|
|
+代码位置 = ?
|
|
|
+```
|
|
|
+
|
|
|
+🔴 只要事实,原样贴 grep 输出。
|
|
|
+🔴 **不要改任何东西**,先把现状报给我。
|
|
|
+```
|
|
|
+
|
|
|
+## 容器回答(原文,按时间顺序,未删改)
|
|
|
+
|
|
|
+### 1【prose】
|
|
|
+
|
|
|
+```text
|
|
|
+terminal · echo "=== 1. 所有大小上限 ==="; grep -rn "1024 \* 1024\|1024\*1024…
|
|
|
+```
|
|
|
+
|
|
|
+### 2【prose】
|
|
|
+
|
|
|
+```text
|
|
|
+## 验证 1 上限
|
|
|
+
|
|
|
+**生效值 = 800 MB**(838860800 字节)
|
|
|
+
|
|
|
+**文件:行号 =**
|
|
|
+- `/opt/data/scripts/fmode-deliverable-hook.py:124` — `MAX_BYTES = int(os.environ.get("FMODE_DELIVERABLE_MAX_BYTES", str(800 * 1024 * 1024)))`
|
|
|
+- `/opt/data/plugins/plugin-matrix-outbound-s3/__init__.py:219` — `_MAX_MEDIA_BYTES = 800 * 1024 * 1024`
|
|
|
+- 内核默认:`/opt/hermes/plugins/platforms/matrix/adapter.py:905` — `self._max_media_bytes = _env_number("MATRIX_MAX_MEDIA_BYTES", 100 * 1024 * 1024, int)`(默认 100MB,会被 env 覆盖)
|
|
|
+
|
|
|
+注意:你给的 `/opt/hermes/gateway/relay/adapter.py` grep 无输出(0 命中),MATRIX adapter 真实路径是 `/opt/hermes/plugins/platforms/matrix/adapter.py`。
|
|
|
+
|
|
|
+**env 显式设置 = 有**
|
|
|
+```
|
|
|
+559:MATRIX_MAX_MEDIA_BYTES=838860800
|
|
|
+560:FMODE_DELIVERABLE_MAX_BYTES=838860800
|
|
|
+```
|
|
|
+运行时回读(`/proc/156766/environ`):`MATRIX_MAX_MEDIA_BYTES=838860800` ,实打实进到进程里了。
|
|
|
+
|
|
|
+两个 .bak 文件残留旧的 40MB(`fmode-deliverable-hook.py.bak-20261114-153807:124` / `.bak-800mb-162930:124`),不参与运行。
|
|
|
+
|
|
|
+## 验证 2 mxc
|
|
|
+
|
|
|
+**还剩几处 = 0 处会"产生"mxc;另有 1 处"接受"分支 = 拒绝闸门(按设计保留,会回消息拒收)**
|
|
|
+
|
|
|
+grep 命中 18 条,逐条性质:
|
|
|
+- `plugin-matrix-outbound-s3/plugin.yaml:3`、`__init__.py:1,11,14` — 文档/注释描述「不再产生 mxc」
|
|
|
+- `__init__.py:191,194` — 已注释掉的 legacy 函数(`# MatrixAdapter._upload_media_to_object_storage`)
|
|
|
+- `__init__.py:210,211,212` — 注释说明改前/改后语义
|
|
|
+- `__init__.py:253,254,258` — **入站闸门**:`if url.startswith("mxc://")` → 拒绝并回「mxc:// 已停用」
|
|
|
+- `__init__.py:336,374` — 注释说明不注入 E2EE 分支
|
|
|
+- `fmode_outbound_media.py:4` + 同名 `.bak-20261114-153807:4` — 文件头注释
|
|
|
+
|
|
|
+真正的 `upload_media()` 调用 = 0 处;`needs_encrypted` 只出现在注释里(336 行)。**产生方全部走
|
|
|
+
|
|
|
+## 验证 3 超限提示
|
|
|
+
|
|
|
+**会回复用户吗 = 会**(两条路径都回,不是只写日志)
|
|
|
+
|
|
|
+**代码位置 =**
|
|
|
+
|
|
|
+出站(交付文件超限):
|
|
|
+- `/opt/data/scripts/fmode-deliverable-hook.py:913` `_too_large_note()` 生成提示文案
|
|
|
+- `:936-940` `_emit()` 里 `note = _too_large_note()` → 拼进 `body` → `print(json.dumps({"response_text": body}))`
|
|
|
+- `:358` 记录 `TOO-LARGE-NOTICE`,`:914` 注释写明「2026-11-14 用户裁决:超限必须有提示,不许静默丢弃」
|
|
|
+- 文案:`- 文件「xxx」有 %.1f MB,超过 800MB 交付上限,未上传云端。`
|
|
|
+
|
|
|
+入站(用户发来附件超限):
|
|
|
+- `/opt/data/plugins/plugin-matrix-outbound-s3/__init__.py:270-278` — 先 `logger.warning("REJECT oversized inbound...")`,**紧接着** `await _notify_user_blocked(...)` 回「⚠️ 附件「x」有 N MB,超过 800MB 上限,未接收。」
|
|
|
+- `:232-240` `_notify_user_blocked()` 用 `_send_content_event` 发 m.text,异常不上抛
|
|
|
+
|
|
|
+未修改任何文件。
|
|
|
+```
|
|
|
+
|
|
|
+### 3【ack】
|
|
|
+
|
|
|
+```text
|
|
|
+✅ 容器已标记完成
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 工具过程(仅供核对,非回答内容)
|
|
|
+
|
|
|
+- `💻 terminal ``` echo "=== 1. 所有大小上限 ==="; grep -rn "1... ````
|
|
|
+- `* 💻 terminal ``` echo "=== 1. 所有大小上限 ==="; grep -rn "1... ``` ``` echo "=== 2. mxc 残留 ==="; grep -rn "m... ``` ``` echo "=== adapter.py 实际路径确认 ==="; ls ... ````
|
|
|
+- `* 💻 terminal ``` echo "=== 1. 所有大小上限 ==="; grep -rn "1... ``` ``` echo "=== 2. mxc 残留 ==="; grep -rn "m... ``` ``` echo "=== adapter.py 实际路径确认 ==="; ls ... ``` ``` echo "=== _MAX_MEDIA_BYTES 上下文 ==="`
|
|
|
+- `* 💻 terminal ``` echo "=== 1. 所有大小上限 ==="; grep -rn "1... ``` ``` echo "=== 2. mxc 残留 ==="; grep -rn "m... ``` ``` echo "=== adapter.py 实际路径确认 ==="; ls ... ``` ``` echo "=== _MAX_MEDIA_BYTES 上下文 ==="`
|