From 85d51a074e507bd310fd09d43fb2cf1ebb15dbbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Fri, 2 Oct 2026 14:39:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=85=E7=BD=AE=E5=B7=A5=E5=85=B7=E5=88=86?= =?UTF-8?q?=E9=A1=B5=20offset=20=E5=8A=A0=E7=BB=9D=E5=AF=B9=E4=B8=8A?= =?UTF-8?q?=E9=99=90=EF=BC=8C=E9=81=BF=E5=85=8D=20nextOffset=20=E6=BA=A2?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - arguments.rs 新增 MAX_PAGE_OFFSET 常量 - page() 在 max_offset 为 None 时也按 MAX_PAGE_OFFSET 封顶,挡住 offset + page.len() 的溢出 --- .../src-tauri/src/agent/tool/arguments.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/tool/arguments.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/tool/arguments.rs index 7d05a2772..7381e3559 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/tool/arguments.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/tool/arguments.rs @@ -75,6 +75,13 @@ pub(crate) struct ToolPage { pub limit: usize, } +/// 分页 `offset` 的绝对上限。 +/// +/// `max_offset=None` 的列表工具也必须封顶:`offset` 直接来自模型/客户端,若不设界, +/// 调用方用 `offset + page.len()` 计算 `nextOffset` 时会溢出(debug 直接 panic,release +/// 静默回绕成一个错误的小偏移)。这个上限远高于任何真实列表长度,只用来挡住溢出。 +pub(crate) const MAX_PAGE_OFFSET: usize = 1_000_000; + /// 解析 `offset`/`limit`。分页规则在三个列表工具之间一致,只有默认值与上限不同。 /// /// 调用点必须保证 `default_limit <= max_limit`:否则省略 `limit` 的请求会拿一个本身就越界的 @@ -106,8 +113,12 @@ pub(crate) fn page( }) .transpose()? .unwrap_or(0); - if let Some(max) = max_offset.filter(|max| offset > *max) { - return Err(ToolPageRejection::OffsetTooLarge { got: offset, max }); + let effective_max = max_offset.unwrap_or(MAX_PAGE_OFFSET); + if offset > effective_max { + return Err(ToolPageRejection::OffsetTooLarge { + got: offset, + max: effective_max, + }); } let limit = arguments .get("limit")