mirror of
https://github.com/openai/codex.git
synced 2026-04-27 16:15:09 +00:00
## 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
99 lines
3.5 KiB
Markdown
99 lines
3.5 KiB
Markdown
# codex-tools
|
|
|
|
`codex-tools` is intended to become the home for tool-related code that is
|
|
shared across multiple crates and does not need to stay coupled to
|
|
`codex-core`.
|
|
|
|
Today this crate is intentionally small. It currently owns the shared tool
|
|
schema and Responses API tool primitives that no longer need to live in
|
|
`core/src/tools/spec.rs` or `core/src/client_common.rs`:
|
|
|
|
- `JsonSchema`
|
|
- `AdditionalProperties`
|
|
- `ToolDefinition`
|
|
- `ToolSpec`
|
|
- `ConfiguredToolSpec`
|
|
- `ResponsesApiTool`
|
|
- `FreeformTool`
|
|
- `FreeformToolFormat`
|
|
- `ToolSearchOutputTool`
|
|
- `ResponsesApiWebSearchFilters`
|
|
- `ResponsesApiWebSearchUserLocation`
|
|
- `ResponsesApiNamespace`
|
|
- `ResponsesApiNamespaceTool`
|
|
- code-mode `ToolSpec` adapters and `exec` / `wait` spec builders
|
|
- JS REPL spec builders
|
|
- MCP resource, `list_dir`, and `test_sync_tool` spec builders
|
|
- local host tool spec builders for shell/exec/request-permissions/view-image
|
|
- collaboration and agent-job `ToolSpec` builders for spawn/send/wait/close,
|
|
`request_user_input`, and CSV fanout/reporting
|
|
- `parse_tool_input_schema()`
|
|
- `parse_dynamic_tool()`
|
|
- `parse_mcp_tool()`
|
|
- `create_tools_json_for_responses_api()`
|
|
- `mcp_call_tool_result_output_schema()`
|
|
- `tool_definition_to_responses_api_tool()`
|
|
- `dynamic_tool_to_responses_api_tool()`
|
|
- `mcp_tool_to_responses_api_tool()`
|
|
- `mcp_tool_to_deferred_responses_api_tool()`
|
|
- `augment_tool_spec_for_code_mode()`
|
|
- `tool_spec_to_code_mode_tool_definition()`
|
|
|
|
That extraction is the first step in a longer migration. The goal is not to
|
|
move all of `core/src/tools` into this crate in one shot. Instead, the plan is
|
|
to peel off reusable pieces in reviewable increments while keeping
|
|
compatibility-sensitive orchestration in `codex-core` until the surrounding
|
|
boundaries are ready.
|
|
|
|
## Vision
|
|
|
|
Over time, this crate should hold tool-facing primitives that are shared by
|
|
multiple consumers, for example:
|
|
|
|
- schema and spec data models
|
|
- tool input/output parsing helpers
|
|
- tool metadata and compatibility shims that do not depend on `codex-core`
|
|
- other narrowly scoped utility code that multiple crates need
|
|
|
|
The corresponding non-goals are just as important:
|
|
|
|
- do not move `codex-core` orchestration here prematurely
|
|
- do not pull `Session` / `TurnContext` / approval flow / runtime execution
|
|
logic into this crate unless those dependencies have first been split into
|
|
stable shared interfaces
|
|
- do not turn this crate into a grab-bag for unrelated helper code
|
|
|
|
## Migration approach
|
|
|
|
The expected migration shape is:
|
|
|
|
1. Move low-coupling tool primitives here.
|
|
2. Switch non-core consumers to depend on `codex-tools` directly.
|
|
3. Leave compatibility-sensitive adapters in `codex-core` while downstream
|
|
call sites are updated.
|
|
4. Only extract higher-level tool infrastructure after the crate boundaries are
|
|
clear and independently testable.
|
|
|
|
That means it is normal for `codex-core` to temporarily re-export types or
|
|
helpers from `codex-tools` during the transition.
|
|
|
|
## Crate conventions
|
|
|
|
This crate should start with stricter structure than `core/src/tools` so it
|
|
stays easy to grow:
|
|
|
|
- `src/lib.rs` should remain exports-only.
|
|
- Business logic should live in named module files such as `foo.rs`.
|
|
- Unit tests for `foo.rs` should live in a sibling `foo_tests.rs`.
|
|
- The implementation file should wire tests with:
|
|
|
|
```rust
|
|
#[cfg(test)]
|
|
#[path = "foo_tests.rs"]
|
|
mod tests;
|
|
```
|
|
|
|
If this crate starts accumulating code that needs runtime state from
|
|
`codex-core`, that is a sign to revisit the extraction boundary before adding
|
|
more here.
|