mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
af568afdd5
## Why The previous `codex-tools` migration steps moved the shared schema models, local-host specs, collaboration specs, and related adapters out of `codex-core`, but `core/src/tools/spec.rs` still contained a grab bag of pure utility tool builders. Those specs do not need session state or handler logic; they only describe wire shapes for tools that `codex-core` already knows how to execute. Moving that remaining low-coupling layer into `codex-tools` keeps the migration moving in meaningful chunks and trims another large block of passive tool-spec construction out of `codex-core` without touching the runtime-coupled handlers. ## What changed - extended `codex-tools` to own the pure spec builders for: - code-mode `exec` / `wait` - `js_repl` / `js_repl_reset` - MCP resource tools `list_mcp_resources`, `list_mcp_resource_templates`, and `read_mcp_resource` - utility tools `list_dir` and `test_sync_tool` - split those builders across small module files with sibling `*_tests.rs` coverage, keeping `src/lib.rs` exports-only - rewired `core/src/tools/spec.rs` to call the extracted builders and deleted the duplicated core-local implementations - moved the direct JS REPL grammar seam test out of `core/src/tools/spec_tests.rs` so it now lives with the extracted implementation in `codex-tools` - updated `codex-rs/tools/README.md` so the documented crate boundary matches the new utility-spec surface ## Test plan - `CARGO_TARGET_DIR=/tmp/codex-tools-utility-specs cargo test -p codex-tools` - `CARGO_TARGET_DIR=/tmp/codex-core-utility-specs cargo test -p codex-core --lib tools::spec::` - `just fix -p codex-tools -p codex-core` - `just argument-comment-lint` ## References - #15923 - #15928 - #15944 - #15953 - #16031 - #16047 - #16129 - #16132 - #16138 - #16141
120 lines
4.9 KiB
Rust
120 lines
4.9 KiB
Rust
use super::*;
|
|
use pretty_assertions::assert_eq;
|
|
use std::collections::BTreeMap;
|
|
|
|
#[test]
|
|
fn list_mcp_resources_tool_matches_expected_spec() {
|
|
assert_eq!(
|
|
create_list_mcp_resources_tool(),
|
|
ToolSpec::Function(ResponsesApiTool {
|
|
name: "list_mcp_resources".to_string(),
|
|
description: "Lists resources provided by MCP servers. Resources allow servers to share data that provides context to language models, such as files, database schemas, or application-specific information. Prefer resources over web search when possible.".to_string(),
|
|
strict: false,
|
|
defer_loading: None,
|
|
parameters: JsonSchema::Object {
|
|
properties: BTreeMap::from([
|
|
(
|
|
"server".to_string(),
|
|
JsonSchema::String {
|
|
description: Some(
|
|
"Optional MCP server name. When omitted, lists resources from every configured server."
|
|
.to_string(),
|
|
),
|
|
},
|
|
),
|
|
(
|
|
"cursor".to_string(),
|
|
JsonSchema::String {
|
|
description: Some(
|
|
"Opaque cursor returned by a previous list_mcp_resources call for the same server."
|
|
.to_string(),
|
|
),
|
|
},
|
|
),
|
|
]),
|
|
required: None,
|
|
additional_properties: Some(false.into()),
|
|
},
|
|
output_schema: None,
|
|
})
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn list_mcp_resource_templates_tool_matches_expected_spec() {
|
|
assert_eq!(
|
|
create_list_mcp_resource_templates_tool(),
|
|
ToolSpec::Function(ResponsesApiTool {
|
|
name: "list_mcp_resource_templates".to_string(),
|
|
description: "Lists resource templates provided by MCP servers. Parameterized resource templates allow servers to share data that takes parameters and provides context to language models, such as files, database schemas, or application-specific information. Prefer resource templates over web search when possible.".to_string(),
|
|
strict: false,
|
|
defer_loading: None,
|
|
parameters: JsonSchema::Object {
|
|
properties: BTreeMap::from([
|
|
(
|
|
"server".to_string(),
|
|
JsonSchema::String {
|
|
description: Some(
|
|
"Optional MCP server name. When omitted, lists resource templates from all configured servers."
|
|
.to_string(),
|
|
),
|
|
},
|
|
),
|
|
(
|
|
"cursor".to_string(),
|
|
JsonSchema::String {
|
|
description: Some(
|
|
"Opaque cursor returned by a previous list_mcp_resource_templates call for the same server."
|
|
.to_string(),
|
|
),
|
|
},
|
|
),
|
|
]),
|
|
required: None,
|
|
additional_properties: Some(false.into()),
|
|
},
|
|
output_schema: None,
|
|
})
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn read_mcp_resource_tool_matches_expected_spec() {
|
|
assert_eq!(
|
|
create_read_mcp_resource_tool(),
|
|
ToolSpec::Function(ResponsesApiTool {
|
|
name: "read_mcp_resource".to_string(),
|
|
description:
|
|
"Read a specific resource from an MCP server given the server name and resource URI."
|
|
.to_string(),
|
|
strict: false,
|
|
defer_loading: None,
|
|
parameters: JsonSchema::Object {
|
|
properties: BTreeMap::from([
|
|
(
|
|
"server".to_string(),
|
|
JsonSchema::String {
|
|
description: Some(
|
|
"MCP server name exactly as configured. Must match the 'server' field returned by list_mcp_resources."
|
|
.to_string(),
|
|
),
|
|
},
|
|
),
|
|
(
|
|
"uri".to_string(),
|
|
JsonSchema::String {
|
|
description: Some(
|
|
"Resource URI to read. Must be one of the URIs returned by list_mcp_resources."
|
|
.to_string(),
|
|
),
|
|
},
|
|
),
|
|
]),
|
|
required: Some(vec!["server".to_string(), "uri".to_string()]),
|
|
additional_properties: Some(false.into()),
|
|
},
|
|
output_schema: None,
|
|
})
|
|
);
|
|
}
|