codex-agent-framework 0.1.52__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.
Files changed (152) hide show
  1. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/CHANGELOG.md +11 -0
  2. {codex_agent_framework-0.1.52/codex_agent_framework.egg-info → codex_agent_framework-0.1.53}/PKG-INFO +3 -2
  3. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/README.md +2 -1
  4. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/agent.py +1 -0
  5. codex_agent_framework-0.1.53/codex_agent/builtin_plugins/web_search/__init__.py +11 -0
  6. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/config.py +1 -3
  7. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tool.py +1 -2
  8. codex_agent_framework-0.1.53/codex_agent/version.py +1 -0
  9. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53/codex_agent_framework.egg-info}/PKG-INFO +3 -2
  10. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/SOURCES.txt +1 -0
  11. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/pyproject.toml +1 -1
  12. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent.py +16 -24
  13. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_image_generation.py +6 -4
  14. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_plugins.py +15 -21
  15. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_providers_config.py +12 -0
  16. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_response.py +14 -11
  17. codex_agent_framework-0.1.52/codex_agent/version.py +0 -1
  18. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/LICENSE +0 -0
  19. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/MANIFEST.in +0 -0
  20. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/__init__.py +0 -0
  21. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/__main__.py +0 -0
  22. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/agent_runtime.py +0 -0
  23. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/ai.py +0 -0
  24. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/browser.py +0 -0
  25. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_commands.py +0 -0
  26. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/__init__.py +0 -0
  27. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  28. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  29. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  30. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  31. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  32. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  33. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/content/system.py +0 -0
  34. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/content/vision.py +0 -0
  35. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  36. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  37. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  38. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  39. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  40. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  41. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  42. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/files/tools.py +0 -0
  43. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  44. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  45. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  46. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  47. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  48. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  49. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  50. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  51. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  52. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  53. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  54. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  55. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  56. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  57. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  58. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  59. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  60. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  61. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  62. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  63. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  64. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  65. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  66. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  67. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/cli/__init__.py +0 -0
  68. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/cli/headless.py +0 -0
  69. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/cli/main.py +0 -0
  70. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/cli/output.py +0 -0
  71. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/cli/root.py +0 -0
  72. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/cli/runner.py +0 -0
  73. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/client.py +0 -0
  74. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/command.py +0 -0
  75. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/context.py +0 -0
  76. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/desktop.py +0 -0
  77. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/event.py +0 -0
  78. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/get_text/__init__.py +0 -0
  79. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/get_text/default_gitignore +0 -0
  80. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/get_text/get_text.py +0 -0
  81. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/get_text/simpler_get_text.py +0 -0
  82. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/hooks.py +0 -0
  83. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/image.py +0 -0
  84. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/latex.py +0 -0
  85. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/mainloop.py +0 -0
  86. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/message.py +0 -0
  87. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/plugin.py +0 -0
  88. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/prompts/system_prompt.txt +0 -0
  89. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/provider.py +0 -0
  90. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/runtime.py +0 -0
  91. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/scheduler.py +0 -0
  92. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  93. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/server/__init__.py +0 -0
  94. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/server/app.py +0 -0
  95. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/server/core.py +0 -0
  96. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/service.py +0 -0
  97. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/sessions.py +0 -0
  98. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/status.py +0 -0
  99. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/stream.py +0 -0
  100. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/stream_utils.py +0 -0
  101. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tray.py +0 -0
  102. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tui/__init__.py +0 -0
  103. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tui/app.py +0 -0
  104. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tui/chat.py +0 -0
  105. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tui/lifecycle.py +0 -0
  106. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tui/log.py +0 -0
  107. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tui/state.py +0 -0
  108. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tui/status_bar.py +0 -0
  109. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tui/style.py +0 -0
  110. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/tui/transcript.py +0 -0
  111. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/utils.py +0 -0
  112. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent/worker.py +0 -0
  113. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  114. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  115. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/requires.txt +0 -0
  116. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/codex_agent_framework.egg-info/top_level.txt +0 -0
  117. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/dependencies.txt +0 -0
  118. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/setup.cfg +0 -0
  119. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_audio_hooks.py +0 -0
  120. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_commands.py +0 -0
  121. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_context.py +0 -0
  122. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_desktop.py +0 -0
  123. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_environment.py +0 -0
  124. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_observe.py +0 -0
  125. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_realtime.py +0 -0
  126. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_runtime.py +0 -0
  127. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_sessions.py +0 -0
  128. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_subagents.py +0 -0
  129. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_tools.py +0 -0
  130. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_agent_turns.py +0 -0
  131. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_ai.py +0 -0
  132. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_browser.py +0 -0
  133. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_builtin_config.py +0 -0
  134. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_chat.py +0 -0
  135. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_cli.py +0 -0
  136. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_cli_headless.py +0 -0
  137. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_cli_root.py +0 -0
  138. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_client.py +0 -0
  139. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_events.py +0 -0
  140. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_get_text_browser.py +0 -0
  141. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_hooks.py +0 -0
  142. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_image_message.py +0 -0
  143. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_local_desktop.py +0 -0
  144. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_memory.py +0 -0
  145. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_messages.py +0 -0
  146. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_planner.py +0 -0
  147. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_scheduler.py +0 -0
  148. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_server.py +0 -0
  149. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_service.py +0 -0
  150. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_tui.py +0 -0
  151. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_utils.py +0 -0
  152. {codex_agent_framework-0.1.52 → codex_agent_framework-0.1.53}/tests/test_worker.py +0 -0
@@ -4,6 +4,17 @@ 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
+
7
18
  ## [0.1.52] - 2026-05-16
8
19
  ### Changed
9
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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.52
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
- `None` loads all built-ins, `[]` loads none, and an explicit list selects plugin module names.
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
- `None` loads all built-ins, `[]` loads none, and an explicit list selects plugin module names.
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 = None
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
- self.add_server_tool(WebSearchTool())
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.52
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
- `None` loads all built-ins, `[]` loads none, and an explicit list selects plugin module names.
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "codex-agent-framework"
7
- version = "0.1.52"
7
+ version = "0.1.53"
8
8
  description = "A lightweight event-driven Codex agent runtime."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -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 {tool.type for tool in agent.tools_manager.get_server_tools()} == {"web_search", "image_generation"}
125
- assert set(agent.plugins) >= {"browser", "desktop", "image_generation", "memory", "planner", "scheduler"}
126
- assert "browser_open" in agent.tools
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 {method.__name__ for method in agent.plugins.browser.get_tools()} == {
130
- "open",
131
- "close",
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 "subagents_run" in agent.tools
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.tts.config.enabled is False
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
@@ -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 test_agent_loads_all_available_builtin_plugins_by_default():
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
- "bash",
39
- "browser",
40
- "content",
41
- "desktop",
42
- "environment",
43
- "files",
44
- "image_generation",
45
- "interface",
46
- "memory",
47
- "planner",
48
- "python",
49
- "scheduler",
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():
@@ -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"] == "show" for tool in agent.ai.params["tools"])
100
- assert {"type": "web_search"} in agent.ai.params["tools"]
101
- assert {"type": "image_generation", "output_format": "png"} in agent.ai.params["tools"]
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(session="new")
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 test_agent_can_enable_builtin_server_tools_from_config():
362
+ def test_agent_can_enable_builtin_server_tools_from_plugins():
359
363
  agent = Agent(
360
364
  session="new",
361
- web_search_enabled=True,
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.52"