codex-agent-framework 0.1.34__tar.gz → 0.1.36__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 (151) hide show
  1. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/CHANGELOG.md +16 -0
  2. {codex_agent_framework-0.1.34/codex_agent_framework.egg-info → codex_agent_framework-0.1.36}/PKG-INFO +1 -1
  3. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/agent.py +78 -41
  4. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/plugin.py +9 -4
  5. codex_agent_framework-0.1.36/codex_agent/version.py +1 -0
  6. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  7. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/pyproject.toml +1 -1
  8. codex_agent_framework-0.1.34/codex_agent/version.py +0 -1
  9. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/LICENSE +0 -0
  10. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/MANIFEST.in +0 -0
  11. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/README.md +0 -0
  12. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/__init__.py +0 -0
  13. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/__main__.py +0 -0
  14. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/agent_runtime.py +0 -0
  15. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/ai.py +0 -0
  16. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/browser.py +0 -0
  17. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_commands.py +0 -0
  18. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/__init__.py +0 -0
  19. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  20. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  21. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  22. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  23. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  24. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  25. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/content/system.py +0 -0
  26. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/content/vision.py +0 -0
  27. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  28. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  29. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  30. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  31. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  32. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  33. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  34. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/files/tools.py +0 -0
  35. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  36. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  37. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  38. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  39. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  40. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  41. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  42. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  43. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  44. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  45. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  46. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  47. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  48. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  49. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  50. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  51. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  52. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  53. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  54. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  55. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  56. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  57. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  58. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  59. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/cli/__init__.py +0 -0
  60. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/cli/headless.py +0 -0
  61. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/cli/main.py +0 -0
  62. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/cli/output.py +0 -0
  63. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/cli/root.py +0 -0
  64. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/cli/runner.py +0 -0
  65. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/client.py +0 -0
  66. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/command.py +0 -0
  67. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/config.py +0 -0
  68. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/context.py +0 -0
  69. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/desktop.py +0 -0
  70. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/event.py +0 -0
  71. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/get_text/__init__.py +0 -0
  72. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/get_text/default_gitignore +0 -0
  73. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/get_text/get_text.py +0 -0
  74. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/get_text/simpler_get_text.py +0 -0
  75. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/hooks.py +0 -0
  76. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/image.py +0 -0
  77. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/latex.py +0 -0
  78. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/mainloop.py +0 -0
  79. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/message.py +0 -0
  80. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/prompts/system_prompt.txt +0 -0
  81. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/provider.py +0 -0
  82. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/runtime.py +0 -0
  83. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/scheduler.py +0 -0
  84. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  85. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/server/__init__.py +0 -0
  86. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/server/app.py +0 -0
  87. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/server/core.py +0 -0
  88. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/service.py +0 -0
  89. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/sessions.py +0 -0
  90. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/status.py +0 -0
  91. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/stream.py +0 -0
  92. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/stream_utils.py +0 -0
  93. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tool.py +0 -0
  94. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tray.py +0 -0
  95. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tui/__init__.py +0 -0
  96. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tui/app.py +0 -0
  97. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tui/chat.py +0 -0
  98. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tui/lifecycle.py +0 -0
  99. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tui/log.py +0 -0
  100. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tui/state.py +0 -0
  101. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tui/status_bar.py +0 -0
  102. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tui/style.py +0 -0
  103. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/tui/transcript.py +0 -0
  104. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/utils.py +0 -0
  105. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent/worker.py +0 -0
  106. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  107. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  108. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  109. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent_framework.egg-info/requires.txt +0 -0
  110. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/codex_agent_framework.egg-info/top_level.txt +0 -0
  111. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/dependencies.txt +0 -0
  112. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/setup.cfg +0 -0
  113. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent.py +0 -0
  114. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_audio_hooks.py +0 -0
  115. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_commands.py +0 -0
  116. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_context.py +0 -0
  117. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_desktop.py +0 -0
  118. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_environment.py +0 -0
  119. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_image_generation.py +0 -0
  120. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_observe.py +0 -0
  121. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_plugins.py +0 -0
  122. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_providers_config.py +0 -0
  123. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_realtime.py +0 -0
  124. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_response.py +0 -0
  125. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_runtime.py +0 -0
  126. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_sessions.py +0 -0
  127. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_subagents.py +0 -0
  128. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_tools.py +0 -0
  129. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_agent_turns.py +0 -0
  130. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_ai.py +0 -0
  131. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_browser.py +0 -0
  132. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_builtin_config.py +0 -0
  133. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_chat.py +0 -0
  134. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_cli.py +0 -0
  135. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_cli_headless.py +0 -0
  136. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_cli_root.py +0 -0
  137. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_client.py +0 -0
  138. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_events.py +0 -0
  139. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_get_text_browser.py +0 -0
  140. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_hooks.py +0 -0
  141. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_image_message.py +0 -0
  142. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_local_desktop.py +0 -0
  143. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_memory.py +0 -0
  144. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_messages.py +0 -0
  145. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_planner.py +0 -0
  146. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_scheduler.py +0 -0
  147. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_server.py +0 -0
  148. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_service.py +0 -0
  149. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_tui.py +0 -0
  150. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_utils.py +0 -0
  151. {codex_agent_framework-0.1.34 → codex_agent_framework-0.1.36}/tests/test_worker.py +0 -0
@@ -4,6 +4,22 @@ 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.36] - 2026-05-16
8
+ ### Changed
9
+ - Clean up residual `Agent` facade style around response dispatch and transcription helpers.
10
+ - Deduplicate plugin name resolution for add, remove, unload, and reload flows.
11
+
12
+ ### Tests
13
+ - Validate with targeted Agent response/audio/tool coverage, plugin coverage, and the 553-test offline CI suite.
14
+
15
+ ## [0.1.35] - 2026-05-16
16
+ ### Changed
17
+ - Normalize formatting in the `Agent` facade around initialization, message helpers, image helpers, and tool registration.
18
+ - Wrap long `Agent` facade lines for imports, interrupt events, working-directory resolution, and upload notifications.
19
+
20
+ ### Tests
21
+ - Validate with targeted Agent/session/tool/environment/response coverage and the 553-test offline CI suite.
22
+
7
23
  ## [0.1.34] - 2026-05-16
8
24
  ### Changed
9
25
  - Share the broken-session backup path used by session repair and truncation flows.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.34
3
+ Version: 0.1.36
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -1,7 +1,20 @@
1
- from .utils import text_content, ensure_runtime_dir, upload_file_to_folder, project_python_env, runtime_join, root_join
1
+ from .utils import (
2
+ ensure_runtime_dir,
3
+ project_python_env,
4
+ root_join,
5
+ runtime_join,
6
+ text_content,
7
+ upload_file_to_folder,
8
+ )
2
9
  import os
3
10
  from modict import modict
4
- from .message import DeveloperMessage, ServerToolResponseMessage, ToolResultMessage, UserMessage, message_from_data
11
+ from .message import (
12
+ DeveloperMessage,
13
+ ServerToolResponseMessage,
14
+ ToolResultMessage,
15
+ UserMessage,
16
+ message_from_data,
17
+ )
5
18
  from .image import ImageMessage
6
19
  from .command import CommandManager
7
20
  from .config import ConfigManager
@@ -22,7 +35,7 @@ from threading import Event as ThreadEvent
22
35
 
23
36
  class Agent:
24
37
 
25
- def __init__(self,session="latest",**kwargs):
38
+ def __init__(self, session="latest", **kwargs):
26
39
  """Initializes the Agent instance with configuration, events, tools, and message history.
27
40
 
28
41
  Args:
@@ -36,33 +49,33 @@ class Agent:
36
49
  explicit_root_dir = kwargs.pop("root_dir", None)
37
50
  explicit_cwd = kwargs.pop("cwd", None)
38
51
  self.init_execution_environment()
39
- self.config_manager=ConfigManager(self)
52
+ self.config_manager = ConfigManager(self)
40
53
  self.config_manager.load()
41
54
  self.config_manager.update(kwargs, save=False)
42
55
  self.init_working_directories(root_dir=explicit_root_dir or launch_cwd, cwd=explicit_cwd)
43
56
  self.config_manager.apply_openai_capability_defaults()
44
- self.events=EventBus()
45
- self.tools_manager=ToolsManager(self)
46
- self.providers_manager=ProvidersManager(self)
47
- self.command_manager=CommandManager(self)
48
- self.context_manager=ContextManager(self)
49
- self.plugins_manager=PluginsManager(self)
50
- self.sessions_manager=SessionsManager(self)
51
- self.runtime=RuntimeManager(self)
52
- self.scheduler=AgentScheduler(self)
53
- self.hooks=HookManager(self)
54
- self.stream_manager=StreamManager(self)
55
- self.mainloop_manager=MainLoopManager(self)
56
- self._interrupt_requested=ThreadEvent()
57
- self.current_session_id=None
58
- self.session=None
59
- self.status_manager=StatusManager(self)
60
- self.context_namespace=self.create_context_namespace()
57
+ self.events = EventBus()
58
+ self.tools_manager = ToolsManager(self)
59
+ self.providers_manager = ProvidersManager(self)
60
+ self.command_manager = CommandManager(self)
61
+ self.context_manager = ContextManager(self)
62
+ self.plugins_manager = PluginsManager(self)
63
+ self.sessions_manager = SessionsManager(self)
64
+ self.runtime = RuntimeManager(self)
65
+ self.scheduler = AgentScheduler(self)
66
+ self.hooks = HookManager(self)
67
+ self.stream_manager = StreamManager(self)
68
+ self.mainloop_manager = MainLoopManager(self)
69
+ self._interrupt_requested = ThreadEvent()
70
+ self.current_session_id = None
71
+ self.session = None
72
+ self.status_manager = StatusManager(self)
73
+ self.context_namespace = self.create_context_namespace()
61
74
  self.init_workfolder()
62
75
  self.sessions_manager.init_folder()
63
76
  self.command_manager.init_folder()
64
77
  self.plugins_manager.init_folder()
65
- self.ai=AIClient(self)
78
+ self.ai = AIClient(self)
66
79
  self.command_manager.init_builtin()
67
80
  self.plugins_manager.init_builtin()
68
81
  self.plugins_manager.init_runtime()
@@ -192,7 +205,12 @@ class Agent:
192
205
  except Exception as exc:
193
206
  abort_error = exc
194
207
  self.emit(AssistantInterruptedEvent, reason=reason)
195
- self.emit(AssistantInterruptRequestedEvent, reason=reason, interrupted=True, error=str(abort_error) if abort_error else "")
208
+ self.emit(
209
+ AssistantInterruptRequestedEvent,
210
+ reason=reason,
211
+ interrupted=True,
212
+ error=str(abort_error) if abort_error else "",
213
+ )
196
214
  return True
197
215
 
198
216
  def clear_interrupt(self):
@@ -233,7 +251,9 @@ class Agent:
233
251
  return self.sync_working_cwd_from_process(save_session=save_session)
234
252
 
235
253
  def init_working_directories(self, root_dir=None, cwd=None):
236
- root_dir = self.normalize_directory(root_dir or getattr(self, "process_launch_cwd", None) or self.config.root_dir)
254
+ root_dir = self.normalize_directory(
255
+ root_dir or getattr(self, "process_launch_cwd", None) or self.config.root_dir
256
+ )
237
257
  cwd = self.normalize_directory(cwd or root_dir)
238
258
  self.config.root_dir = root_dir
239
259
  self.set_process_cwd(cwd)
@@ -242,7 +262,11 @@ class Agent:
242
262
  def apply_session_working_directories(self):
243
263
  if not self.session:
244
264
  return self.config.cwd
245
- root_dir = getattr(self.session, "root_dir", None) or self.config.root_dir or getattr(self, "process_launch_cwd", None)
265
+ root_dir = (
266
+ getattr(self.session, "root_dir", None)
267
+ or self.config.root_dir
268
+ or getattr(self, "process_launch_cwd", None)
269
+ )
246
270
  cwd = getattr(self.session, "cwd", None) or root_dir
247
271
  self.config.root_dir = self.normalize_directory(root_dir)
248
272
  self.session.root_dir = self.config.root_dir
@@ -261,7 +285,7 @@ class Agent:
261
285
 
262
286
  def init_workfolder(self):
263
287
  if not os.path.isdir(self.config.workfolder):
264
- os.makedirs(self.config.workfolder,exist_ok=True)
288
+ os.makedirs(self.config.workfolder, exist_ok=True)
265
289
 
266
290
  def init_execution_environment(self):
267
291
  os.environ.update(project_python_env())
@@ -298,7 +322,7 @@ class Agent:
298
322
  max_compacted_turns=max_compacted_turns,
299
323
  )
300
324
 
301
- def add_message(self,msg,pending=False):
325
+ def add_message(self, msg, pending=False):
302
326
  """Queue a message for the next pending flush, except tool results."""
303
327
  if isinstance(msg, ToolResultMessage):
304
328
  return self.sessions_manager.append_message(msg)
@@ -306,7 +330,7 @@ class Agent:
306
330
  return self.sessions_manager.append_message(msg)
307
331
  return self.mainloop_manager.add_pending_message(msg)
308
332
 
309
- def new_message(self,pending=False,**kwargs):
333
+ def new_message(self, pending=False, **kwargs):
310
334
  """Helper to create and add a message based on provided keyword arguments.
311
335
 
312
336
  Args:
@@ -316,21 +340,31 @@ class Agent:
316
340
  Returns:
317
341
  The created message object.
318
342
  """
319
- msg=message_from_data(kwargs)
320
- return self.add_message(msg,pending=pending)
343
+ msg = message_from_data(kwargs)
344
+ return self.add_message(msg, pending=pending)
321
345
 
322
- def add_image(self,source,pending=False,**kwargs):
346
+ def add_image(self, source, pending=False, **kwargs):
323
347
  if source:
324
- img=ImageMessage(
348
+ img = ImageMessage(
325
349
  content=source,
326
- **kwargs
350
+ **kwargs,
327
351
  )
328
352
  if not img.is_valid():
329
353
  raise ValueError(f"Invalid or inaccessible image source: {source!r}")
330
- self.add_message(img,pending=pending)
354
+ self.add_message(img, pending=pending)
331
355
  return img
332
356
 
333
- def add_tool(self,func=None,name=None,description=None,parameters=None,required=None,tool_type=None,format=None,owner=None):
357
+ def add_tool(
358
+ self,
359
+ func=None,
360
+ name=None,
361
+ description=None,
362
+ parameters=None,
363
+ required=None,
364
+ tool_type=None,
365
+ format=None,
366
+ owner=None,
367
+ ):
334
368
  return self.tools_manager.add(
335
369
  func=func,
336
370
  name=name,
@@ -409,7 +443,7 @@ class Agent:
409
443
  finally:
410
444
  reset_current_agent(agent_context)
411
445
 
412
- def get_messages(self,filter=None):
446
+ def get_messages(self, filter=None):
413
447
  return self.sessions_manager.messages(filter=filter)
414
448
 
415
449
  def get_status(self):
@@ -433,11 +467,11 @@ class Agent:
433
467
  )
434
468
  messages = self.context_manager.get_context()
435
469
 
436
- message=self.ai.run(
470
+ message = self.ai.run(
437
471
  messages=messages,
438
472
  tools=self.tools_manager.get_response_tools(),
439
473
  prompt_cache_key=self.current_session_id,
440
- **self.config.extract('model','reasoning','text','parallel_tool_calls')
474
+ **self.config.extract("model", "reasoning", "text", "parallel_tool_calls"),
441
475
  )
442
476
  self.sessions_manager.append_message(message)
443
477
  for item in message.output_items:
@@ -475,11 +509,10 @@ class Agent:
475
509
  if source is None:
476
510
  raise ValueError("An audio source must be provided")
477
511
 
478
- # Transcribe audio to text
479
512
  transcribed_text = self.ai.audio_to_text(
480
513
  source=source,
481
514
  language=language,
482
- **kwargs
515
+ **kwargs,
483
516
  )
484
517
 
485
518
  return transcribed_text
@@ -498,7 +531,11 @@ class Agent:
498
531
  dest_path = upload_file_to_folder(source, self.config.workfolder, name=name)
499
532
  dest_filename = os.path.basename(dest_path)
500
533
 
501
- self.add_message(DeveloperMessage(content=f"File '{dest_filename}' has been uploaded to the workfolder at: {dest_path}"))
534
+ self.add_message(
535
+ DeveloperMessage(
536
+ content=f"File '{dest_filename}' has been uploaded to the workfolder at: {dest_path}"
537
+ )
538
+ )
502
539
 
503
540
  return dest_path
504
541
 
@@ -461,8 +461,13 @@ class PluginsManager:
461
461
  raise RuntimeError(f"Runtime plugin {name_or_path!r} requires an OpenAI API key")
462
462
  return self.add_from_module(module)
463
463
 
464
+ def _plugin_name(self, plugin_or_name):
465
+ if isinstance(plugin_or_name, str):
466
+ return plugin_or_name
467
+ return getattr(plugin_or_name, "name", None) or type(plugin_or_name).__name__
468
+
464
469
  def add_plugin(self, plugin):
465
- plugin_name = getattr(plugin, "name", None) or type(plugin).__name__
470
+ plugin_name = self._plugin_name(plugin)
466
471
  if plugin_name in self.plugins:
467
472
  self.unload_plugin(plugin_name)
468
473
  self.plugins[plugin_name] = plugin
@@ -472,7 +477,7 @@ class PluginsManager:
472
477
  return plugin
473
478
 
474
479
  def remove_plugin_members(self, plugin_or_name):
475
- plugin_name = plugin_or_name if isinstance(plugin_or_name, str) else getattr(plugin_or_name, "name", None) or type(plugin_or_name).__name__
480
+ plugin_name = self._plugin_name(plugin_or_name)
476
481
  return modict(
477
482
  tools=self.agent.tools_manager.remove_by_owner(plugin_name),
478
483
  providers=self.agent.providers_manager.remove_by_owner(plugin_name),
@@ -483,7 +488,7 @@ class PluginsManager:
483
488
  )
484
489
 
485
490
  def unload_plugin(self, plugin_or_name, timeout=None):
486
- plugin_name = plugin_or_name if isinstance(plugin_or_name, str) else getattr(plugin_or_name, "name", None) or type(plugin_or_name).__name__
491
+ plugin_name = self._plugin_name(plugin_or_name)
487
492
  plugin = self.plugins.get(plugin_name)
488
493
  if plugin is None:
489
494
  return None
@@ -494,7 +499,7 @@ class PluginsManager:
494
499
  return modict(plugin=plugin, removed=removed)
495
500
 
496
501
  def reload_plugin(self, plugin_or_name, timeout=None):
497
- plugin_name = plugin_or_name if isinstance(plugin_or_name, str) else getattr(plugin_or_name, "name", None) or type(plugin_or_name).__name__
502
+ plugin_name = self._plugin_name(plugin_or_name)
498
503
  plugin = self.plugins.get(plugin_name)
499
504
  if plugin is None:
500
505
  raise KeyError(f"Unknown plugin: {plugin_name}")
@@ -0,0 +1 @@
1
+ __version__ = "0.1.36"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.34
3
+ Version: 0.1.36
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "codex-agent-framework"
7
- version = "0.1.34"
7
+ version = "0.1.36"
8
8
  description = "A lightweight event-driven Codex agent runtime."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1 +0,0 @@
1
- __version__ = "0.1.34"