codex-agent-framework 0.1.51__tar.gz → 0.1.53__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/CHANGELOG.md +18 -0
- {codex_agent_framework-0.1.51/codex_agent_framework.egg-info → codex_agent_framework-0.1.53}/PKG-INFO +3 -2
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/README.md +2 -1
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/agent.py +1 -0
- codex_agent_framework-0.1.53/codex_agent/builtin_plugins/web_search/__init__.py +11 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/config.py +1 -3
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tool.py +1 -2
- codex_agent_framework-0.1.53/codex_agent/version.py +1 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53/codex_agent_framework.egg-info}/PKG-INFO +3 -2
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/SOURCES.txt +1 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/pyproject.toml +1 -1
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent.py +16 -24
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_image_generation.py +6 -4
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_plugins.py +15 -21
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_providers_config.py +12 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_response.py +14 -11
- codex_agent_framework-0.1.51/codex_agent/version.py +0 -1
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/LICENSE +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/MANIFEST.in +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/__main__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/agent_runtime.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/ai.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/browser.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_commands.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/content/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/content/system.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/content/vision.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/context/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/files/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/files/tools.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/python/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/session.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/cli/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/cli/headless.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/cli/main.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/cli/output.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/cli/root.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/cli/runner.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/client.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/command.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/context.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/desktop.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/event.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/get_text/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/get_text/default_gitignore +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/get_text/get_text.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/get_text/simpler_get_text.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/hooks.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/image.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/latex.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/mainloop.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/message.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/plugin.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/prompts/system_prompt.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/provider.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/runtime.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/scheduler.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/scripts/install-system-dependencies.sh +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/server/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/server/app.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/server/core.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/service.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/sessions.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/status.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/stream.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/stream_utils.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tray.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tui/__init__.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tui/app.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tui/chat.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tui/lifecycle.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tui/log.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tui/state.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tui/status_bar.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tui/style.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/tui/transcript.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/utils.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/worker.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/entry_points.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/requires.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/top_level.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/dependencies.txt +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/setup.cfg +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_audio_hooks.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_commands.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_context.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_desktop.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_environment.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_observe.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_realtime.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_runtime.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_sessions.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_subagents.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_tools.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_turns.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_ai.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_browser.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_builtin_config.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_chat.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_cli.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_cli_headless.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_cli_root.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_client.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_events.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_get_text_browser.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_hooks.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_image_message.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_local_desktop.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_memory.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_messages.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_planner.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_scheduler.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_server.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_service.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_tui.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_utils.py +0 -0
- {codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_worker.py +0 -0
|
@@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
This project loosely follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and uses semantic versioning where practical.
|
|
6
6
|
|
|
7
|
+
## [0.1.53] - 2026-05-16
|
|
8
|
+
### Changed
|
|
9
|
+
- Default new agents to a smaller built-in plugin surface: `files`, `environment`, `memory`, `planner`, `scheduler`, and `context`.
|
|
10
|
+
- Create `~/.codex-agent/agent.config.json` automatically on agent initialization instead of waiting for an explicit config update.
|
|
11
|
+
- Make `web_search` and `image_generation` plugin-first server tools: loading the plugin now controls whether the corresponding Responses API tool is exposed.
|
|
12
|
+
- Remove the redundant `web_search_enabled` and `image_generation_enabled` config flags from the public agent config surface.
|
|
13
|
+
- Update docs and tests to reflect the minimal default plugin set and plugin-driven server tool activation.
|
|
14
|
+
|
|
15
|
+
### Tests
|
|
16
|
+
- Validate with targeted agent/plugin/image-generation coverage and a package build.
|
|
17
|
+
|
|
18
|
+
## [0.1.52] - 2026-05-16
|
|
19
|
+
### Changed
|
|
20
|
+
- Document current synchronous Bash tool behavior and the planned direction for pollable, cancellable long-running shell jobs with durable logs and clear UI/API status.
|
|
21
|
+
|
|
22
|
+
### Tests
|
|
23
|
+
- Validate the documentation update with the compileall guard and 557-test offline CI suite.
|
|
24
|
+
|
|
7
25
|
## [0.1.51] - 2026-05-16
|
|
8
26
|
### Changed
|
|
9
27
|
- Add regression coverage that turn failures emit an observable `AssistantTurnErrorEvent` followed by `AssistantTurnEndEvent(reason="error")`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codex-agent-framework
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.53
|
|
4
4
|
Summary: A lightweight event-driven Codex agent runtime.
|
|
5
5
|
Author: Baptiste
|
|
6
6
|
License-Expression: MIT
|
|
@@ -188,7 +188,8 @@ agent = Agent(
|
|
|
188
188
|
)
|
|
189
189
|
```
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
By default, the agent starts with a minimal built-in surface: `files`, `environment`, `memory`, `planner`, `scheduler`, and `context`.
|
|
192
|
+
Pass `builtin_plugins=None` to load all built-ins, `[]` to load none, or an explicit list to select plugin module names.
|
|
192
193
|
|
|
193
194
|
## Project health
|
|
194
195
|
|
|
@@ -139,7 +139,8 @@ agent = Agent(
|
|
|
139
139
|
)
|
|
140
140
|
```
|
|
141
141
|
|
|
142
|
-
|
|
142
|
+
By default, the agent starts with a minimal built-in surface: `files`, `environment`, `memory`, `planner`, `scheduler`, and `context`.
|
|
143
|
+
Pass `builtin_plugins=None` to load all built-ins, `[]` to load none, or an explicit list to select plugin module names.
|
|
143
144
|
|
|
144
145
|
## Project health
|
|
145
146
|
|
|
@@ -54,6 +54,7 @@ class Agent:
|
|
|
54
54
|
self.config_manager.update(kwargs, save=False)
|
|
55
55
|
self.init_working_directories(root_dir=explicit_root_dir or launch_cwd, cwd=explicit_cwd)
|
|
56
56
|
self.config_manager.apply_openai_capability_defaults()
|
|
57
|
+
self.config_manager.save()
|
|
57
58
|
self.events = EventBus()
|
|
58
59
|
self.tools_manager = ToolsManager(self)
|
|
59
60
|
self.providers_manager = ProvidersManager(self)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from ...plugin import Plugin
|
|
2
|
+
from ...tool import WebSearchTool
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class WebSearchPlugin(Plugin):
|
|
6
|
+
name = "web_search"
|
|
7
|
+
description = "OpenAI Responses API web search server tool."
|
|
8
|
+
|
|
9
|
+
def __init__(self, agent):
|
|
10
|
+
super().__init__(agent)
|
|
11
|
+
self.agent.tools_manager.add_server_tool(WebSearchTool())
|
|
@@ -35,14 +35,12 @@ class AgentConfig(modict):
|
|
|
35
35
|
vision_enabled = True
|
|
36
36
|
max_images = 10
|
|
37
37
|
prune_orphaned_tool_outputs_on_context_build = True
|
|
38
|
-
web_search_enabled = False
|
|
39
|
-
image_generation_enabled = False
|
|
40
38
|
image_generation_output_format = "png"
|
|
41
39
|
image_generation_size = None
|
|
42
40
|
image_generation_quality = None
|
|
43
41
|
image_generation_background = None
|
|
44
42
|
image_generation_moderation = None
|
|
45
|
-
builtin_plugins =
|
|
43
|
+
builtin_plugins = ["files", "environment", "memory", "planner", "scheduler", "context"]
|
|
46
44
|
custom_plugins = None
|
|
47
45
|
exclude_tools = modict.factory(list)
|
|
48
46
|
server_url = "http://127.0.0.1:8765"
|
|
@@ -265,7 +265,7 @@ class ToolsManager:
|
|
|
265
265
|
self.owners = modict()
|
|
266
266
|
|
|
267
267
|
def init_server_tools(self):
|
|
268
|
-
|
|
268
|
+
return None
|
|
269
269
|
|
|
270
270
|
def add_from_module(self, module, filter=None, owner=None):
|
|
271
271
|
for name, obj in module.__dict__.items():
|
|
@@ -440,4 +440,3 @@ class ToolsManager:
|
|
|
440
440
|
|
|
441
441
|
def get_response_tools(self):
|
|
442
442
|
return [tool.to_response_tool() for tool in self.get_tools()]
|
|
443
|
-
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.1.53"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codex-agent-framework
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.53
|
|
4
4
|
Summary: A lightweight event-driven Codex agent runtime.
|
|
5
5
|
Author: Baptiste
|
|
6
6
|
License-Expression: MIT
|
|
@@ -188,7 +188,8 @@ agent = Agent(
|
|
|
188
188
|
)
|
|
189
189
|
```
|
|
190
190
|
|
|
191
|
-
|
|
191
|
+
By default, the agent starts with a minimal built-in surface: `files`, `environment`, `memory`, `planner`, `scheduler`, and `context`.
|
|
192
|
+
Pass `builtin_plugins=None` to load all built-ins, `[]` to load none, or an explicit list to select plugin module names.
|
|
192
193
|
|
|
193
194
|
## Project health
|
|
194
195
|
|
|
@@ -77,6 +77,7 @@ codex_agent/builtin_plugins/subagents/requirements.txt
|
|
|
77
77
|
codex_agent/builtin_plugins/subagents/profiles/explorer.json
|
|
78
78
|
codex_agent/builtin_plugins/tts/__init__.py
|
|
79
79
|
codex_agent/builtin_plugins/tts/requirements.txt
|
|
80
|
+
codex_agent/builtin_plugins/web_search/__init__.py
|
|
80
81
|
codex_agent/cli/__init__.py
|
|
81
82
|
codex_agent/cli/headless.py
|
|
82
83
|
codex_agent/cli/main.py
|
|
@@ -121,40 +121,32 @@ def test_agent_initializes_new_session(isolated_runtime_dir):
|
|
|
121
121
|
assert "auto_archive_memory" not in agent.config
|
|
122
122
|
assert agent.plugins.memory.config.auto_archive is False
|
|
123
123
|
assert "token_limit" not in agent.config
|
|
124
|
-
assert
|
|
125
|
-
assert set(agent.plugins)
|
|
126
|
-
assert "
|
|
124
|
+
assert agent.tools_manager.get_server_tools() == []
|
|
125
|
+
assert set(agent.plugins) == {"context", "environment", "files", "memory", "planner", "scheduler"}
|
|
126
|
+
assert "read" in agent.tools
|
|
127
|
+
assert "write" in agent.tools
|
|
128
|
+
assert "edit" in agent.tools
|
|
129
|
+
assert "environment_list_plugins" in agent.tools
|
|
130
|
+
assert "browser_open" not in agent.tools
|
|
127
131
|
assert "browser_snapshot" not in agent.tools
|
|
128
132
|
assert "browser_screenshot" not in agent.tools
|
|
129
|
-
assert
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
"select_tab",
|
|
133
|
-
"previous_page",
|
|
134
|
-
"goto",
|
|
135
|
-
"click",
|
|
136
|
-
"fill",
|
|
137
|
-
"select",
|
|
138
|
-
"press",
|
|
139
|
-
}
|
|
140
|
-
assert "desktop_start_session" in agent.tools
|
|
141
|
-
assert "desktop_stop_session" in agent.tools
|
|
142
|
-
assert "desktop_run_commands" in agent.tools
|
|
133
|
+
assert "desktop_start_session" not in agent.tools
|
|
134
|
+
assert "desktop_stop_session" not in agent.tools
|
|
135
|
+
assert "desktop_run_commands" not in agent.tools
|
|
143
136
|
assert "desktop" not in agent.tools
|
|
144
|
-
assert [method.__name__ for method in agent.plugins.desktop.get_tools()] == ["run_commands", "start_session", "stop_session"]
|
|
145
137
|
assert "memory_add" in agent.tools
|
|
146
138
|
assert "planner_create" in agent.tools
|
|
147
139
|
assert "planner_add" in agent.tools
|
|
148
140
|
assert "planner_check" in agent.tools
|
|
149
141
|
assert "scheduler_schedule" in agent.tools
|
|
150
|
-
assert "
|
|
142
|
+
assert "context_status" in agent.tools
|
|
143
|
+
assert "subagents_run" not in agent.tools
|
|
151
144
|
assert "subagents_set_result" not in agent.tools
|
|
152
|
-
assert "browser_state" in agent.providers
|
|
153
|
-
assert "desktop_state" in agent.providers
|
|
145
|
+
assert "browser_state" not in agent.providers
|
|
146
|
+
assert "desktop_state" not in agent.providers
|
|
154
147
|
assert "retrieved_memory" in agent.providers
|
|
155
148
|
assert "current_todos" in agent.providers
|
|
156
|
-
assert "python" in agent.plugins
|
|
157
|
-
assert agent.plugins.python.shell.silent is True
|
|
149
|
+
assert "python" not in agent.plugins
|
|
158
150
|
assert not hasattr(agent, "shell")
|
|
159
151
|
|
|
160
152
|
def test_agent_keeps_memory_available_without_openai_api_key(monkeypatch):
|
|
@@ -162,7 +154,7 @@ def test_agent_keeps_memory_available_without_openai_api_key(monkeypatch):
|
|
|
162
154
|
|
|
163
155
|
agent = Agent(session="new")
|
|
164
156
|
|
|
165
|
-
assert agent.plugins
|
|
157
|
+
assert "tts" not in agent.plugins
|
|
166
158
|
assert "memory" in agent.plugins
|
|
167
159
|
assert "memory_add" in agent.tools
|
|
168
160
|
assert "retrieved_memory" in agent.providers
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_image_generation.py
RENAMED
|
@@ -74,6 +74,7 @@ class FakeImageAI:
|
|
|
74
74
|
def test_agent_applies_image_generation_tool_config():
|
|
75
75
|
agent = Agent(
|
|
76
76
|
session="new",
|
|
77
|
+
builtin_plugins=["image_generation"],
|
|
77
78
|
image_generation_size="1024x1024",
|
|
78
79
|
image_generation_quality="low",
|
|
79
80
|
image_generation_background="opaque",
|
|
@@ -95,7 +96,7 @@ def test_agent_applies_image_generation_tool_config():
|
|
|
95
96
|
|
|
96
97
|
def test_agent_create_image_generates_without_touching_session(tmp_path, monkeypatch):
|
|
97
98
|
monkeypatch.setattr(utils, "RUNTIME_DIR", str(tmp_path))
|
|
98
|
-
agent = Agent(session="new")
|
|
99
|
+
agent = Agent(session="new", builtin_plugins=["image_generation"])
|
|
99
100
|
agent.ai = FakeImageAI(agent)
|
|
100
101
|
before = len(agent.session.messages)
|
|
101
102
|
|
|
@@ -119,7 +120,7 @@ def test_agent_create_image_generates_without_touching_session(tmp_path, monkeyp
|
|
|
119
120
|
|
|
120
121
|
def test_agent_create_image_accepts_input_images(tmp_path, monkeypatch):
|
|
121
122
|
monkeypatch.setattr(utils, "RUNTIME_DIR", str(tmp_path))
|
|
122
|
-
agent = Agent(session="new")
|
|
123
|
+
agent = Agent(session="new", builtin_plugins=["image_generation"])
|
|
123
124
|
agent.ai = FakeImageAI(agent)
|
|
124
125
|
source = b"source image bytes"
|
|
125
126
|
|
|
@@ -133,7 +134,7 @@ def test_agent_create_image_accepts_input_images(tmp_path, monkeypatch):
|
|
|
133
134
|
|
|
134
135
|
def test_agent_create_image_allows_llm_parameter_overrides(tmp_path, monkeypatch):
|
|
135
136
|
monkeypatch.setattr(utils, "RUNTIME_DIR", str(tmp_path))
|
|
136
|
-
agent = Agent(session="new")
|
|
137
|
+
agent = Agent(session="new", builtin_plugins=["image_generation"])
|
|
137
138
|
agent.ai = FakeImageAI(agent)
|
|
138
139
|
|
|
139
140
|
agent.plugins.image_generation.create_image(
|
|
@@ -152,6 +153,7 @@ def test_agent_create_image_uses_explicit_generation_parameters(tmp_path, monkey
|
|
|
152
153
|
monkeypatch.setattr(utils, "RUNTIME_DIR", str(tmp_path))
|
|
153
154
|
agent = Agent(
|
|
154
155
|
session="new",
|
|
156
|
+
builtin_plugins=["image_generation"],
|
|
155
157
|
image_generation_size="should-not-leak",
|
|
156
158
|
image_generation_quality="should-not-leak",
|
|
157
159
|
)
|
|
@@ -178,7 +180,7 @@ def test_agent_create_image_uses_explicit_generation_parameters(tmp_path, monkey
|
|
|
178
180
|
|
|
179
181
|
def test_agent_persists_generated_images_as_observable_files(tmp_path, monkeypatch):
|
|
180
182
|
monkeypatch.setattr(utils, "RUNTIME_DIR", str(tmp_path))
|
|
181
|
-
agent = Agent(session="new")
|
|
183
|
+
agent = Agent(session="new", builtin_plugins=["image_generation"])
|
|
182
184
|
item = {
|
|
183
185
|
"type": "image_generation_call",
|
|
184
186
|
"id": "ig_123",
|
|
@@ -22,35 +22,29 @@ def test_runtime_state_change_events_exported():
|
|
|
22
22
|
def test_agent_loads_memory_plugin_with_configured_openai_key(monkeypatch):
|
|
23
23
|
monkeypatch.delenv("OPENAI_API_KEY", raising=False)
|
|
24
24
|
|
|
25
|
-
agent = Agent(session="new", openai_api_key="sk-test")
|
|
26
|
-
agent.plugins.tts.config.enabled = True
|
|
25
|
+
agent = Agent(session="new", openai_api_key="sk-test", builtin_plugins=["memory"])
|
|
27
26
|
|
|
28
|
-
assert agent.plugins.tts.config.enabled is True
|
|
29
27
|
assert "memory" in agent.plugins
|
|
30
28
|
assert "memory_add" in agent.tools
|
|
31
29
|
assert "retrieved_memory" in agent.providers
|
|
32
30
|
|
|
33
31
|
|
|
34
|
-
def
|
|
32
|
+
def test_agent_loads_minimal_builtin_plugins_by_default():
|
|
35
33
|
agent = Agent(session="new", openai_api_key="sk-test")
|
|
36
34
|
|
|
37
|
-
assert {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"subagents",
|
|
51
|
-
"tts",
|
|
52
|
-
}.issubset(agent.plugins.keys())
|
|
53
|
-
assert agent.plugins.tts.process_content_stream in agent.get_stream_processors("content")
|
|
35
|
+
assert set(agent.plugins.keys()) == {"context", "environment", "files", "memory", "planner", "scheduler"}
|
|
36
|
+
assert "read" in agent.tools
|
|
37
|
+
assert "write" in agent.tools
|
|
38
|
+
assert "edit" in agent.tools
|
|
39
|
+
assert "environment_list_plugins" in agent.tools
|
|
40
|
+
assert "memory_add" in agent.tools
|
|
41
|
+
assert "planner_create" in agent.tools
|
|
42
|
+
assert "scheduler_schedule" in agent.tools
|
|
43
|
+
assert "context_status" in agent.tools
|
|
44
|
+
assert "bash" not in agent.tools
|
|
45
|
+
assert "python" not in agent.tools
|
|
46
|
+
assert "view" not in agent.tools
|
|
47
|
+
assert "browser_open" not in agent.tools
|
|
54
48
|
|
|
55
49
|
|
|
56
50
|
def test_agent_config_can_exclude_tools_by_canonical_plugin_name():
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_providers_config.py
RENAMED
|
@@ -66,6 +66,18 @@ def test_agent_config_exposes_stable_system_prompt_infos():
|
|
|
66
66
|
assert "Python" in agent.config.platform
|
|
67
67
|
|
|
68
68
|
|
|
69
|
+
def test_agent_config_file_is_created_on_agent_init(tmp_path, monkeypatch):
|
|
70
|
+
monkeypatch.setattr(utils, "RUNTIME_DIR", str(tmp_path))
|
|
71
|
+
|
|
72
|
+
agent = Agent(session="new")
|
|
73
|
+
|
|
74
|
+
config_file = tmp_path / "agent.config.json"
|
|
75
|
+
assert config_file.is_file()
|
|
76
|
+
saved = json.loads(config_file.read_text())
|
|
77
|
+
assert saved["name"] == agent.config.name
|
|
78
|
+
assert saved["model"] == agent.config.model
|
|
79
|
+
|
|
80
|
+
|
|
69
81
|
def test_agent_config_helpers_persist_in_runtime_dir(tmp_path, monkeypatch):
|
|
70
82
|
monkeypatch.setattr(utils, "RUNTIME_DIR", str(tmp_path))
|
|
71
83
|
|
|
@@ -93,12 +93,13 @@ def test_agent_get_response_emits_events_and_persists_assistant_message():
|
|
|
93
93
|
assert agent.ai.params["reasoning"] == agent.config.reasoning
|
|
94
94
|
assert agent.ai.params["parallel_tool_calls"] is True
|
|
95
95
|
assert agent.ai.params["prompt_cache_key"] == agent.current_session_id
|
|
96
|
-
assert any(tool["type"] == "custom" and tool["name"] == "python" for tool in agent.ai.params["tools"])
|
|
97
|
-
assert any(tool["type"] == "custom" and tool["name"] == "bash" for tool in agent.ai.params["tools"])
|
|
98
96
|
assert any(tool["type"] == "function" and tool["name"] == "read" for tool in agent.ai.params["tools"])
|
|
99
|
-
assert any(tool["type"] == "function" and tool["name"] == "
|
|
100
|
-
assert
|
|
101
|
-
assert
|
|
97
|
+
assert any(tool["type"] == "function" and tool["name"] == "edit" for tool in agent.ai.params["tools"])
|
|
98
|
+
assert not any(tool["type"] == "custom" and tool["name"] == "python" for tool in agent.ai.params["tools"])
|
|
99
|
+
assert not any(tool["type"] == "custom" and tool["name"] == "bash" for tool in agent.ai.params["tools"])
|
|
100
|
+
assert not any(tool["type"] == "function" and tool["name"] == "show" for tool in agent.ai.params["tools"])
|
|
101
|
+
assert {"type": "web_search"} not in agent.ai.params["tools"]
|
|
102
|
+
assert {"type": "image_generation", "output_format": "png"} not in agent.ai.params["tools"]
|
|
102
103
|
|
|
103
104
|
|
|
104
105
|
def test_agent_get_response_does_not_write_api_success_session_backup(tmp_path, monkeypatch):
|
|
@@ -209,7 +210,10 @@ def test_agent_get_response_auto_compacts_before_backend_call(monkeypatch):
|
|
|
209
210
|
|
|
210
211
|
|
|
211
212
|
def test_agent_combines_local_and_server_tools_for_response():
|
|
212
|
-
agent = Agent(
|
|
213
|
+
agent = Agent(
|
|
214
|
+
session="new",
|
|
215
|
+
builtin_plugins=["files", "python", "bash", "content"],
|
|
216
|
+
)
|
|
213
217
|
agent.ai = FakeAI(agent)
|
|
214
218
|
agent.tools_manager.add_server_tool(WebSearchTool())
|
|
215
219
|
agent.tools_manager.add_server_tool(ImageGenerationTool())
|
|
@@ -227,7 +231,7 @@ def test_agent_combines_local_and_server_tools_for_response():
|
|
|
227
231
|
|
|
228
232
|
|
|
229
233
|
def test_agent_emits_server_tool_call_event_from_output_items():
|
|
230
|
-
agent = Agent(session="new")
|
|
234
|
+
agent = Agent(session="new", builtin_plugins=["files", "web_search"])
|
|
231
235
|
item = {
|
|
232
236
|
"type": "web_search_call",
|
|
233
237
|
"id": "ws_123",
|
|
@@ -263,7 +267,7 @@ def test_agent_caches_status_from_completed_response():
|
|
|
263
267
|
|
|
264
268
|
|
|
265
269
|
def test_agent_persists_server_tool_output_items_as_messages():
|
|
266
|
-
agent = Agent(session="new")
|
|
270
|
+
agent = Agent(session="new", builtin_plugins=["web_search"])
|
|
267
271
|
item = {
|
|
268
272
|
"type": "web_search_call",
|
|
269
273
|
"id": "ws_123",
|
|
@@ -355,11 +359,10 @@ def test_agent_keeps_tool_outputs_contiguous_and_wrappers_pending():
|
|
|
355
359
|
assert [wrapper.turns_left for wrapper in agent.mainloop_manager.pending[-2:]] == [3, 3]
|
|
356
360
|
|
|
357
361
|
|
|
358
|
-
def
|
|
362
|
+
def test_agent_can_enable_builtin_server_tools_from_plugins():
|
|
359
363
|
agent = Agent(
|
|
360
364
|
session="new",
|
|
361
|
-
|
|
362
|
-
image_generation_enabled=True,
|
|
365
|
+
builtin_plugins=["web_search", "image_generation"],
|
|
363
366
|
)
|
|
364
367
|
|
|
365
368
|
assert {tool.type for tool in agent.tools_manager.get_server_tools()} == {"web_search", "image_generation"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.1.51"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/builtin_commands.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/get_text/__init__.py
RENAMED
|
File without changes
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/get_text/default_gitignore
RENAMED
|
File without changes
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/get_text/get_text.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/prompts/system_prompt.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/codex_agent/server/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_audio_hooks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_agent_environment.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{codex_agent_framework-0.1.51 → codex_agent_framework-0.1.53}/tests/test_get_text_browser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|