codex-agent-framework 0.1.35__tar.gz → 0.1.37__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.35 → codex_agent_framework-0.1.37}/CHANGELOG.md +16 -0
  2. {codex_agent_framework-0.1.35/codex_agent_framework.egg-info → codex_agent_framework-0.1.37}/PKG-INFO +1 -1
  3. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/agent.py +4 -5
  4. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/context.py +27 -7
  5. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/plugin.py +9 -4
  6. codex_agent_framework-0.1.37/codex_agent/version.py +1 -0
  7. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  8. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/pyproject.toml +1 -1
  9. codex_agent_framework-0.1.35/codex_agent/version.py +0 -1
  10. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/LICENSE +0 -0
  11. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/MANIFEST.in +0 -0
  12. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/README.md +0 -0
  13. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/__init__.py +0 -0
  14. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/__main__.py +0 -0
  15. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/agent_runtime.py +0 -0
  16. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/ai.py +0 -0
  17. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/browser.py +0 -0
  18. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_commands.py +0 -0
  19. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/__init__.py +0 -0
  20. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  21. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  22. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  23. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  24. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  25. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  26. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/content/system.py +0 -0
  27. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/content/vision.py +0 -0
  28. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  29. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  30. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  31. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  32. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  33. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  34. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  35. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/files/tools.py +0 -0
  36. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  37. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  38. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  39. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  40. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  41. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  42. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  43. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  44. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  45. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  46. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  47. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  48. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  49. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  50. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  51. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  52. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  53. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  54. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  55. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  56. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  57. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  58. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  59. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  60. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/cli/__init__.py +0 -0
  61. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/cli/headless.py +0 -0
  62. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/cli/main.py +0 -0
  63. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/cli/output.py +0 -0
  64. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/cli/root.py +0 -0
  65. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/cli/runner.py +0 -0
  66. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/client.py +0 -0
  67. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/command.py +0 -0
  68. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/config.py +0 -0
  69. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/desktop.py +0 -0
  70. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/event.py +0 -0
  71. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/get_text/__init__.py +0 -0
  72. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/get_text/default_gitignore +0 -0
  73. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/get_text/get_text.py +0 -0
  74. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/get_text/simpler_get_text.py +0 -0
  75. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/hooks.py +0 -0
  76. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/image.py +0 -0
  77. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/latex.py +0 -0
  78. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/mainloop.py +0 -0
  79. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/message.py +0 -0
  80. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/prompts/system_prompt.txt +0 -0
  81. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/provider.py +0 -0
  82. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/runtime.py +0 -0
  83. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/scheduler.py +0 -0
  84. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  85. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/server/__init__.py +0 -0
  86. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/server/app.py +0 -0
  87. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/server/core.py +0 -0
  88. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/service.py +0 -0
  89. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/sessions.py +0 -0
  90. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/status.py +0 -0
  91. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/stream.py +0 -0
  92. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/stream_utils.py +0 -0
  93. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tool.py +0 -0
  94. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tray.py +0 -0
  95. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tui/__init__.py +0 -0
  96. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tui/app.py +0 -0
  97. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tui/chat.py +0 -0
  98. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tui/lifecycle.py +0 -0
  99. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tui/log.py +0 -0
  100. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tui/state.py +0 -0
  101. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tui/status_bar.py +0 -0
  102. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tui/style.py +0 -0
  103. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/tui/transcript.py +0 -0
  104. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/utils.py +0 -0
  105. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent/worker.py +0 -0
  106. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  107. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  108. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  109. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent_framework.egg-info/requires.txt +0 -0
  110. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/codex_agent_framework.egg-info/top_level.txt +0 -0
  111. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/dependencies.txt +0 -0
  112. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/setup.cfg +0 -0
  113. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent.py +0 -0
  114. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_audio_hooks.py +0 -0
  115. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_commands.py +0 -0
  116. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_context.py +0 -0
  117. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_desktop.py +0 -0
  118. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_environment.py +0 -0
  119. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_image_generation.py +0 -0
  120. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_observe.py +0 -0
  121. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_plugins.py +0 -0
  122. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_providers_config.py +0 -0
  123. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_realtime.py +0 -0
  124. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_response.py +0 -0
  125. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_runtime.py +0 -0
  126. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_sessions.py +0 -0
  127. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_subagents.py +0 -0
  128. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_tools.py +0 -0
  129. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_agent_turns.py +0 -0
  130. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_ai.py +0 -0
  131. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_browser.py +0 -0
  132. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_builtin_config.py +0 -0
  133. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_chat.py +0 -0
  134. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_cli.py +0 -0
  135. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_cli_headless.py +0 -0
  136. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_cli_root.py +0 -0
  137. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_client.py +0 -0
  138. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_events.py +0 -0
  139. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_get_text_browser.py +0 -0
  140. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_hooks.py +0 -0
  141. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_image_message.py +0 -0
  142. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_local_desktop.py +0 -0
  143. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_memory.py +0 -0
  144. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_messages.py +0 -0
  145. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_planner.py +0 -0
  146. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_scheduler.py +0 -0
  147. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_server.py +0 -0
  148. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_service.py +0 -0
  149. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_tui.py +0 -0
  150. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/tests/test_utils.py +0 -0
  151. {codex_agent_framework-0.1.35 → codex_agent_framework-0.1.37}/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.37] - 2026-05-16
8
+ ### Changed
9
+ - Clarify context status token calculations by naming percent values and local token totals.
10
+ - Reflow long context-provider hook and token-count calls for better readability without behavior changes.
11
+
12
+ ### Tests
13
+ - Validate with targeted context, response, session, and core Agent coverage plus the 553-test offline CI suite.
14
+
15
+ ## [0.1.36] - 2026-05-16
16
+ ### Changed
17
+ - Clean up residual `Agent` facade style around response dispatch and transcription helpers.
18
+ - Deduplicate plugin name resolution for add, remove, unload, and reload flows.
19
+
20
+ ### Tests
21
+ - Validate with targeted Agent response/audio/tool coverage, plugin coverage, and the 553-test offline CI suite.
22
+
7
23
  ## [0.1.35] - 2026-05-16
8
24
  ### Changed
9
25
  - Normalize formatting in the `Agent` facade around initialization, message helpers, image helpers, and tool registration.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.35
3
+ Version: 0.1.37
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -443,7 +443,7 @@ class Agent:
443
443
  finally:
444
444
  reset_current_agent(agent_context)
445
445
 
446
- def get_messages(self,filter=None):
446
+ def get_messages(self, filter=None):
447
447
  return self.sessions_manager.messages(filter=filter)
448
448
 
449
449
  def get_status(self):
@@ -467,11 +467,11 @@ class Agent:
467
467
  )
468
468
  messages = self.context_manager.get_context()
469
469
 
470
- message=self.ai.run(
470
+ message = self.ai.run(
471
471
  messages=messages,
472
472
  tools=self.tools_manager.get_response_tools(),
473
473
  prompt_cache_key=self.current_session_id,
474
- **self.config.extract('model','reasoning','text','parallel_tool_calls')
474
+ **self.config.extract("model", "reasoning", "text", "parallel_tool_calls"),
475
475
  )
476
476
  self.sessions_manager.append_message(message)
477
477
  for item in message.output_items:
@@ -509,11 +509,10 @@ class Agent:
509
509
  if source is None:
510
510
  raise ValueError("An audio source must be provided")
511
511
 
512
- # Transcribe audio to text
513
512
  transcribed_text = self.ai.audio_to_text(
514
513
  source=source,
515
514
  language=language,
516
- **kwargs
515
+ **kwargs,
517
516
  )
518
517
 
519
518
  return transcribed_text
@@ -58,7 +58,12 @@ class ContextManager:
58
58
  provider_output = provider()
59
59
  finally:
60
60
  reset_current_agent(agent_context)
61
- hook = self.agent.run_hook("provider.call.after", provider_name=provider_name, provider=provider, output=provider_output)
61
+ hook = self.agent.run_hook(
62
+ "provider.call.after",
63
+ provider_name=provider_name,
64
+ provider=provider,
65
+ output=provider_output,
66
+ )
62
67
  provider_output = hook.payload.output
63
68
  if provider_output is None:
64
69
  continue
@@ -86,7 +91,10 @@ class ContextManager:
86
91
  others = [msg for msg in session_messages if not isinstance(msg, ImageMessage)]
87
92
  truncated_others = self.truncate_context_messages(others, max_input_tokens=max_input_tokens)
88
93
 
89
- current_count = self.response_input_token_count(system + images + providers_msgs, response_tools=response_tools)
94
+ current_count = self.response_input_token_count(
95
+ system + images + providers_msgs,
96
+ response_tools=response_tools,
97
+ )
90
98
  history_start = len(truncated_others)
91
99
  for i, msg in enumerate(reversed(truncated_others)):
92
100
  msg_count = self.response_input_token_count([msg], response_tools=[])
@@ -147,13 +155,20 @@ class ContextManager:
147
155
  token_count_source = "openai_input_tokens"
148
156
  except Exception:
149
157
  pass
158
+ input_token_limit = self.agent.config.input_token_limit
159
+ used_token_percent = (current_count / input_token_limit * 100) if input_token_limit else 0
160
+ sent_session_message_percent = (
161
+ sent_session_messages / total_session_messages * 100
162
+ if total_session_messages
163
+ else 0
164
+ )
150
165
  self.agent.status_manager.cache_context_status(modict(
151
166
  used_tokens=current_count,
152
- input_token_limit=self.agent.config.input_token_limit,
153
- percent=(current_count / self.agent.config.input_token_limit * 100) if self.agent.config.input_token_limit else 0,
167
+ input_token_limit=input_token_limit,
168
+ percent=used_token_percent,
154
169
  sent_session_messages=sent_session_messages,
155
170
  total_session_messages=total_session_messages,
156
- sent_session_message_percent=(sent_session_messages / total_session_messages * 100) if total_session_messages else 0,
171
+ sent_session_message_percent=sent_session_message_percent,
157
172
  persistent_session_messages=persistent_session_messages,
158
173
  temporary_session_messages=temporary_session_messages,
159
174
  active_wrapper_messages=len(active_wrappers),
@@ -200,7 +215,8 @@ class ContextManager:
200
215
  return msg.get("turns_left", -1) != 0
201
216
 
202
217
  def response_tools_token_count(self, response_tools=None):
203
- response_tools = self.agent.tools_manager.get_response_tools() if response_tools is None else response_tools
218
+ if response_tools is None:
219
+ response_tools = self.agent.tools_manager.get_response_tools()
204
220
  if not response_tools:
205
221
  return 0
206
222
  return token_count_payload({"tools": response_tools}, model=self.agent.config.model)
@@ -275,7 +291,11 @@ class ContextManager:
275
291
  for msg in messages
276
292
  if isinstance(msg, ImageMessage)
277
293
  )
278
- return token_count_payload(self.local_token_count_payload(payload), model=self.agent.config.model) + media_tokens
294
+ local_tokens = token_count_payload(
295
+ self.local_token_count_payload(payload),
296
+ model=self.agent.config.model,
297
+ )
298
+ return local_tokens + media_tokens
279
299
 
280
300
  def should_auto_compact(self, messages):
281
301
  if not self.agent.config.get("auto_compact", True):
@@ -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.37"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.35
3
+ Version: 0.1.37
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.35"
7
+ version = "0.1.37"
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.35"