codex-agent-framework 0.1.33__tar.gz → 0.1.35__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.33 → codex_agent_framework-0.1.35}/CHANGELOG.md +16 -0
  2. {codex_agent_framework-0.1.33/codex_agent_framework.egg-info → codex_agent_framework-0.1.35}/PKG-INFO +1 -1
  3. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/agent.py +74 -36
  4. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/plugin.py +1 -1
  5. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/sessions.py +9 -8
  6. codex_agent_framework-0.1.35/codex_agent/version.py +1 -0
  7. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  8. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/pyproject.toml +1 -1
  9. codex_agent_framework-0.1.33/codex_agent/version.py +0 -1
  10. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/LICENSE +0 -0
  11. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/MANIFEST.in +0 -0
  12. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/README.md +0 -0
  13. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/__init__.py +0 -0
  14. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/__main__.py +0 -0
  15. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/agent_runtime.py +0 -0
  16. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/ai.py +0 -0
  17. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/browser.py +0 -0
  18. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_commands.py +0 -0
  19. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/__init__.py +0 -0
  20. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  21. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  22. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  23. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  24. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  25. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  26. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/content/system.py +0 -0
  27. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/content/vision.py +0 -0
  28. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  29. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  30. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  31. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  32. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  33. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  34. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  35. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/files/tools.py +0 -0
  36. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  37. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  38. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  39. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  40. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  41. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  42. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  43. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  44. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  45. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  46. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  47. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  48. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  49. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  50. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  51. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  52. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  53. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  54. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  55. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  56. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  57. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  58. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  59. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  60. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/cli/__init__.py +0 -0
  61. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/cli/headless.py +0 -0
  62. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/cli/main.py +0 -0
  63. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/cli/output.py +0 -0
  64. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/cli/root.py +0 -0
  65. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/cli/runner.py +0 -0
  66. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/client.py +0 -0
  67. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/command.py +0 -0
  68. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/config.py +0 -0
  69. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/context.py +0 -0
  70. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/desktop.py +0 -0
  71. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/event.py +0 -0
  72. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/get_text/__init__.py +0 -0
  73. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/get_text/default_gitignore +0 -0
  74. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/get_text/get_text.py +0 -0
  75. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/get_text/simpler_get_text.py +0 -0
  76. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/hooks.py +0 -0
  77. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/image.py +0 -0
  78. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/latex.py +0 -0
  79. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/mainloop.py +0 -0
  80. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/message.py +0 -0
  81. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/prompts/system_prompt.txt +0 -0
  82. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/provider.py +0 -0
  83. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/runtime.py +0 -0
  84. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/scheduler.py +0 -0
  85. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  86. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/server/__init__.py +0 -0
  87. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/server/app.py +0 -0
  88. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/server/core.py +0 -0
  89. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/service.py +0 -0
  90. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/status.py +0 -0
  91. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/stream.py +0 -0
  92. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/stream_utils.py +0 -0
  93. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tool.py +0 -0
  94. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tray.py +0 -0
  95. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tui/__init__.py +0 -0
  96. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tui/app.py +0 -0
  97. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tui/chat.py +0 -0
  98. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tui/lifecycle.py +0 -0
  99. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tui/log.py +0 -0
  100. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tui/state.py +0 -0
  101. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tui/status_bar.py +0 -0
  102. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tui/style.py +0 -0
  103. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/tui/transcript.py +0 -0
  104. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/utils.py +0 -0
  105. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent/worker.py +0 -0
  106. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  107. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  108. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  109. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent_framework.egg-info/requires.txt +0 -0
  110. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/codex_agent_framework.egg-info/top_level.txt +0 -0
  111. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/dependencies.txt +0 -0
  112. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/setup.cfg +0 -0
  113. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent.py +0 -0
  114. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_audio_hooks.py +0 -0
  115. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_commands.py +0 -0
  116. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_context.py +0 -0
  117. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_desktop.py +0 -0
  118. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_environment.py +0 -0
  119. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_image_generation.py +0 -0
  120. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_observe.py +0 -0
  121. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_plugins.py +0 -0
  122. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_providers_config.py +0 -0
  123. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_realtime.py +0 -0
  124. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_response.py +0 -0
  125. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_runtime.py +0 -0
  126. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_sessions.py +0 -0
  127. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_subagents.py +0 -0
  128. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_tools.py +0 -0
  129. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_agent_turns.py +0 -0
  130. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_ai.py +0 -0
  131. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_browser.py +0 -0
  132. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_builtin_config.py +0 -0
  133. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_chat.py +0 -0
  134. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_cli.py +0 -0
  135. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_cli_headless.py +0 -0
  136. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_cli_root.py +0 -0
  137. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_client.py +0 -0
  138. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_events.py +0 -0
  139. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_get_text_browser.py +0 -0
  140. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_hooks.py +0 -0
  141. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_image_message.py +0 -0
  142. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_local_desktop.py +0 -0
  143. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_memory.py +0 -0
  144. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_messages.py +0 -0
  145. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_planner.py +0 -0
  146. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_scheduler.py +0 -0
  147. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_server.py +0 -0
  148. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_service.py +0 -0
  149. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_tui.py +0 -0
  150. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/tests/test_utils.py +0 -0
  151. {codex_agent_framework-0.1.33 → codex_agent_framework-0.1.35}/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.35] - 2026-05-16
8
+ ### Changed
9
+ - Normalize formatting in the `Agent` facade around initialization, message helpers, image helpers, and tool registration.
10
+ - Wrap long `Agent` facade lines for imports, interrupt events, working-directory resolution, and upload notifications.
11
+
12
+ ### Tests
13
+ - Validate with targeted Agent/session/tool/environment/response coverage and the 553-test offline CI suite.
14
+
15
+ ## [0.1.34] - 2026-05-16
16
+ ### Changed
17
+ - Share the broken-session backup path used by session repair and truncation flows.
18
+ - Simplify plugin requirements lookup by removing redundant path branching.
19
+
20
+ ### Tests
21
+ - Validate with session repair/context/response coverage, plugin tests, and the 553-test offline CI suite.
22
+
7
23
  ## [0.1.33] - 2026-05-16
8
24
  ### Changed
9
25
  - Simplify plugin decorated-method accessors by sharing the handler pair construction path.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.33
3
+ Version: 0.1.35
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,
@@ -498,7 +532,11 @@ class Agent:
498
532
  dest_path = upload_file_to_folder(source, self.config.workfolder, name=name)
499
533
  dest_filename = os.path.basename(dest_path)
500
534
 
501
- self.add_message(DeveloperMessage(content=f"File '{dest_filename}' has been uploaded to the workfolder at: {dest_path}"))
535
+ self.add_message(
536
+ DeveloperMessage(
537
+ content=f"File '{dest_filename}' has been uploaded to the workfolder at: {dest_path}"
538
+ )
539
+ )
502
540
 
503
541
  return dest_path
504
542
 
@@ -262,7 +262,7 @@ class PluginsManager:
262
262
  module_file = getattr(module, "__file__", None)
263
263
  if not module_file:
264
264
  return None
265
- base = os.path.dirname(os.path.abspath(module_file)) if os.path.basename(module_file) == "__init__.py" else os.path.dirname(os.path.abspath(module_file))
265
+ base = os.path.dirname(os.path.abspath(module_file))
266
266
  candidate = os.path.join(base, "requirements.txt")
267
267
  return candidate if os.path.isfile(candidate) else None
268
268
 
@@ -352,6 +352,13 @@ class AgentSession(modict):
352
352
  def save_api_success_backup(self):
353
353
  return self.write_messages_file(self.api_success_backup_file)
354
354
 
355
+ def save_broken_backup(self):
356
+ if not os.path.isfile(self.session_file):
357
+ return ""
358
+ backup_file = f"{self.session_file}.broken_{timestamp()}"
359
+ shutil.copy2(self.session_file, backup_file)
360
+ return backup_file
361
+
355
362
  def restore_api_success_backup(self):
356
363
  if not os.path.isfile(self.api_success_backup_file):
357
364
  return False
@@ -471,10 +478,7 @@ class AgentSession(modict):
471
478
  if not removed and not added:
472
479
  return modict(repaired=False, removed=0, added=0, backup_file="", issues=issues)
473
480
 
474
- backup_file = ""
475
- if backup and os.path.isfile(self.session_file):
476
- backup_file = f"{self.session_file}.broken_{timestamp()}"
477
- shutil.copy2(self.session_file, backup_file)
481
+ backup_file = self.save_broken_backup() if backup else ""
478
482
 
479
483
  self.messages = kept
480
484
  if save:
@@ -498,10 +502,7 @@ class AgentSession(modict):
498
502
  if not removed:
499
503
  return modict(repaired=False, removed=0, index=index, backup_file="")
500
504
 
501
- backup_file = ""
502
- if backup and os.path.isfile(self.session_file):
503
- backup_file = f"{self.session_file}.broken_{timestamp()}"
504
- shutil.copy2(self.session_file, backup_file)
505
+ backup_file = self.save_broken_backup() if backup else ""
505
506
 
506
507
  self.messages = self.messages[:index]
507
508
  if save:
@@ -0,0 +1 @@
1
+ __version__ = "0.1.35"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.33
3
+ Version: 0.1.35
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.33"
7
+ version = "0.1.35"
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.33"