回退列表工具 offset 上限的收窄,agc_list_registered_assets 恢复无上限
Project CI / AI game creator shell Rust lane 1/2 (pull_request) Failing after 38s
Project CI / AI game creator shell Rust lane 2/2 (pull_request) Failing after 47s
Project CI / AI game creator shell Rust smoke (pull_request) Failing after 43s
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / AI game creator shell Rust crates (pull_request) Successful in 1m17s
Project CI / Repository checks (pull_request) Failing after 28s
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / AI game creator shell web tests (pull_request) Has been cancelled

- 回退 4e5adb2a3:page 的 max_offset 恢复成 Option<usize>,删掉 TOOL_PAGE_MAX_OFFSET 常量
- agc_list_registered_assets 传 None(offset 无上限,与它原本的行为一致),agc_list_project_files / agc_list_account_assets 仍传原来的 Some(500)
- agc_list_registered_assets 的 inputSchema offset 去掉 maximum: 500,恢复到原公开入参范围

验证:cargo test --bin genarrative-ai-game-creator-shell -- agent::direct_tool_bridge:: 41 passed / 0 failed
This commit is contained in:
2026-10-01 15:56:49 +08:00
parent 75d9e25634
commit a723d10ce3
3 changed files with 8 additions and 19 deletions
@@ -1,8 +1,6 @@
use super::*;
use crate::agent::tool::apply_patch::error::ApplyPatchError;
use crate::agent::tool::arguments::{
optional_text, page, required_text, ToolPage, ToolTextField, TOOL_PAGE_MAX_OFFSET,
};
use crate::agent::tool::arguments::{optional_text, page, required_text, ToolPage, ToolTextField};
use crate::agent::tool::browser_playtest::error::BrowserPlaytestError;
#[cfg(all(windows, feature = "cocos-editor-execute"))]
use crate::agent::tool::cocos_execute::error::CocosExecuteError;
@@ -1212,7 +1210,7 @@ pub(in crate::agent) fn list_registered_assets_input(
arguments,
50,
DIRECT_TOOL_BRIDGE_MAX_RESOURCE_PAGE_SIZE,
TOOL_PAGE_MAX_OFFSET,
None,
)?;
Ok(ListRegisteredAssetsInput {
kind,
@@ -1566,7 +1564,7 @@ pub(in crate::agent) fn list_project_files_input(
arguments,
100,
DIRECT_TOOL_BRIDGE_MAX_RESOURCE_PAGE_SIZE,
TOOL_PAGE_MAX_OFFSET,
Some(500),
)?;
Ok(ListProjectFilesInput {
path,
@@ -1991,7 +1989,7 @@ pub(in crate::agent) fn list_account_assets_input(
arguments,
100,
DIRECT_TOOL_BRIDGE_MAX_RESOURCE_PAGE_SIZE,
TOOL_PAGE_MAX_OFFSET,
Some(500),
)?;
Ok(ListAccountAssetsInput {
folder_id,
@@ -405,7 +405,7 @@ fn direct_tools_mcp_specs_for_plugins(
"default": false,
"description": prompt_text!("directTools.agc_list_registered_assets.parameters.includeSequenceFrames")
},
"offset": { "type": "integer", "minimum": 0, "maximum": 500, "default": 0 },
"offset": { "type": "integer", "minimum": 0, "default": 0 },
"limit": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50 }
},
"additionalProperties": false
@@ -57,18 +57,12 @@ pub(crate) struct ToolPage {
pub limit: usize,
}
/// 三个列表工具共用的 `offset` 上限:每个调用点都必须显式传值,避免某一路悄悄不设上限。
///
/// 取值与 `agc_list_project_files` / `agc_list_account_assets` 的 inputSchema
/// `offset.maximum` 一致;`agc_list_registered_assets` 的 schema 同步为同一个值。
pub(crate) const TOOL_PAGE_MAX_OFFSET: usize = 500;
/// 解析 `offset`/`limit`。分页规则在三个列表工具之间一致,只有默认值与上限不同。
pub(crate) fn page(
arguments: &Value,
default_limit: usize,
max_limit: usize,
max_offset: usize,
max_offset: Option<usize>,
) -> Result<ToolPage, ToolPageRejection> {
let offset = arguments
.get("offset")
@@ -83,11 +77,8 @@ pub(crate) fn page(
})
.transpose()?
.unwrap_or(0);
if offset > max_offset {
return Err(ToolPageRejection::OffsetTooLarge {
got: offset,
max: max_offset,
});
if let Some(max) = max_offset.filter(|max| offset > *max) {
return Err(ToolPageRejection::OffsetTooLarge { got: offset, max });
}
let limit = arguments
.get("limit")