codex-agent-framework 0.1.72__tar.gz → 0.1.74__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 (158) hide show
  1. {codex_agent_framework-0.1.72/codex_agent_framework.egg-info → codex_agent_framework-0.1.74}/PKG-INFO +1 -1
  2. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/cli/main.py +13 -0
  3. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/image.py +14 -0
  4. codex_agent_framework-0.1.74/codex_agent/version.py +1 -0
  5. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  6. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/pyproject.toml +1 -1
  7. codex_agent_framework-0.1.72/codex_agent/version.py +0 -1
  8. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/CHANGELOG.md +0 -0
  9. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/LICENSE +0 -0
  10. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/MANIFEST.in +0 -0
  11. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/README.md +0 -0
  12. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/__init__.py +0 -0
  13. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/__main__.py +0 -0
  14. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/agent.py +0 -0
  15. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/agent_runtime.py +0 -0
  16. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/ai.py +0 -0
  17. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/browser.py +0 -0
  18. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_commands.py +0 -0
  19. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/__init__.py +0 -0
  20. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  21. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  22. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  23. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  24. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  25. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  26. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/content/system.py +0 -0
  27. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/content/vision.py +0 -0
  28. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  29. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  30. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  31. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  32. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  33. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  34. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  35. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/files/tools.py +0 -0
  36. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  37. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  38. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  39. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  40. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  41. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  42. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  43. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  44. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  45. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  46. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  47. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  48. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  49. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  50. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  51. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  52. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  53. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  54. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  55. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  56. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  57. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  58. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  59. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  60. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/builtin_plugins/web_search/__init__.py +0 -0
  61. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/cli/__init__.py +0 -0
  62. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/cli/headless.py +0 -0
  63. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/cli/output.py +0 -0
  64. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/cli/root.py +0 -0
  65. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/cli/runner.py +0 -0
  66. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/client.py +0 -0
  67. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/command.py +0 -0
  68. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/config.py +0 -0
  69. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/context.py +0 -0
  70. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/desktop.py +0 -0
  71. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/event.py +0 -0
  72. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/get_text/__init__.py +0 -0
  73. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/get_text/default_gitignore +0 -0
  74. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/get_text/get_text.py +0 -0
  75. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/get_text/simpler_get_text.py +0 -0
  76. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/hooks.py +0 -0
  77. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/latex.py +0 -0
  78. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/mainloop.py +0 -0
  79. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/message.py +0 -0
  80. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/plugin.py +0 -0
  81. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/prompts/compaction_prompt.txt +0 -0
  82. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/prompts/system_prompt.txt +0 -0
  83. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/provider.py +0 -0
  84. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/runtime.py +0 -0
  85. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/scheduler.py +0 -0
  86. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  87. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/server/__init__.py +0 -0
  88. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/server/app.py +0 -0
  89. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/server/core.py +0 -0
  90. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/service.py +0 -0
  91. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/sessions.py +0 -0
  92. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/status.py +0 -0
  93. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/stream.py +0 -0
  94. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/stream_utils.py +0 -0
  95. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/token_counter.py +0 -0
  96. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tool.py +0 -0
  97. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tray.py +0 -0
  98. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/__init__.py +0 -0
  99. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/app.py +0 -0
  100. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/chat.py +0 -0
  101. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/lifecycle.py +0 -0
  102. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/log.py +0 -0
  103. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/perf.py +0 -0
  104. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/state.py +0 -0
  105. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/status_bar.py +0 -0
  106. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/stream_debug.py +0 -0
  107. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/style.py +0 -0
  108. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/transcript.py +0 -0
  109. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/tui/widgets.py +0 -0
  110. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/utils.py +0 -0
  111. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent/worker.py +0 -0
  112. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  113. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  114. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  115. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent_framework.egg-info/requires.txt +0 -0
  116. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/codex_agent_framework.egg-info/top_level.txt +0 -0
  117. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/dependencies.txt +0 -0
  118. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/setup.cfg +0 -0
  119. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent.py +0 -0
  120. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_audio_hooks.py +0 -0
  121. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_commands.py +0 -0
  122. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_context.py +0 -0
  123. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_desktop.py +0 -0
  124. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_environment.py +0 -0
  125. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_image_generation.py +0 -0
  126. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_observe.py +0 -0
  127. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_plugins.py +0 -0
  128. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_providers_config.py +0 -0
  129. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_realtime.py +0 -0
  130. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_response.py +0 -0
  131. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_runtime.py +0 -0
  132. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_sessions.py +0 -0
  133. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_subagents.py +0 -0
  134. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_tools.py +0 -0
  135. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_agent_turns.py +0 -0
  136. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_ai.py +0 -0
  137. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_browser.py +0 -0
  138. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_builtin_config.py +0 -0
  139. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_chat.py +0 -0
  140. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_cli.py +0 -0
  141. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_cli_headless.py +0 -0
  142. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_cli_root.py +0 -0
  143. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_client.py +0 -0
  144. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_events.py +0 -0
  145. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_get_text_browser.py +0 -0
  146. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_hooks.py +0 -0
  147. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_image_message.py +0 -0
  148. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_local_desktop.py +0 -0
  149. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_memory.py +0 -0
  150. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_messages.py +0 -0
  151. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_planner.py +0 -0
  152. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_scheduler.py +0 -0
  153. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_server.py +0 -0
  154. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_service.py +0 -0
  155. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_token_counter.py +0 -0
  156. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_tui.py +0 -0
  157. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_utils.py +0 -0
  158. {codex_agent_framework-0.1.72 → codex_agent_framework-0.1.74}/tests/test_worker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.72
3
+ Version: 0.1.74
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -13,6 +13,7 @@ PACKAGE_DIR = Path(__file__).resolve().parents[1]
13
13
 
14
14
 
15
15
  def default_agent_kwargs(host=None, port=None):
16
+ """Build default Agent constructor kwargs used by CLI entrypoints."""
16
17
  kwargs = dict(
17
18
  system=str(PACKAGE_DIR / 'prompts' / 'system_prompt.txt'),
18
19
  username="Baptiste",
@@ -24,15 +25,18 @@ def default_agent_kwargs(host=None, port=None):
24
25
 
25
26
 
26
27
  def default_agent():
28
+ """Create the default CLI Agent instance."""
27
29
  return Agent(**default_agent_kwargs())
28
30
 
29
31
 
30
32
  def configure_server_url(agent, host, port):
33
+ """Point an Agent at the CLI-managed local server URL."""
31
34
  agent.config_manager.update(server_url=f"http://{host}:{port}", save=False)
32
35
  return agent
33
36
 
34
37
 
35
38
  def run_server(host="127.0.0.1", port=8765):
39
+ """Run the local HTTP server in the foreground."""
36
40
  import uvicorn
37
41
 
38
42
  app = create_app(process_agent=True, **default_agent_kwargs(host, port))
@@ -42,10 +46,12 @@ def run_server(host="127.0.0.1", port=8765):
42
46
 
43
47
 
44
48
  def run_chat(base_url="http://127.0.0.1:8765"):
49
+ """Run the Textual chat interface against a server URL."""
45
50
  Chat(base_url=base_url).run()
46
51
 
47
52
 
48
53
  def server_is_available(base_url, timeout=0.5):
54
+ """Return whether the local agent server responds to health checks."""
49
55
  try:
50
56
  from codex_agent.client import AgentClient
51
57
  AgentClient(base_url, timeout=timeout).health()
@@ -55,10 +61,12 @@ def server_is_available(base_url, timeout=0.5):
55
61
 
56
62
 
57
63
  def run_tray_mode(base_url="http://127.0.0.1:8765"):
64
+ """Run the desktop tray integration against a server URL."""
58
65
  run_tray(base_url=base_url)
59
66
 
60
67
 
61
68
  def run_system_deps_installer(extra_args=None):
69
+ """Run the packaged system dependency installer script."""
62
70
  script = PACKAGE_DIR / "scripts" / "install-system-dependencies.sh"
63
71
  if not script.is_file():
64
72
  raise RuntimeError(f"System dependency installer not found: {script}")
@@ -74,6 +82,7 @@ def run_bootstrap(
74
82
  install_service=True,
75
83
  start_service=True,
76
84
  ):
85
+ """Install optional system dependencies and user service components."""
77
86
  if install_system_deps:
78
87
  code = run_system_deps_installer(system_deps_args or [])
79
88
  if code:
@@ -86,6 +95,7 @@ def run_bootstrap(
86
95
 
87
96
 
88
97
  def run_local(host="127.0.0.1", port=8765):
98
+ """Open chat on an existing server or a temporary local server."""
89
99
  import threading
90
100
  import time
91
101
 
@@ -112,6 +122,7 @@ def run_local(host="127.0.0.1", port=8765):
112
122
 
113
123
 
114
124
  def build_parser():
125
+ """Build the legacy single-command CLI argument parser."""
115
126
  import argparse
116
127
 
117
128
  parser = argparse.ArgumentParser(prog="codex-agent")
@@ -138,6 +149,7 @@ def build_parser():
138
149
 
139
150
 
140
151
  def run_agent_cli(argv=None):
152
+ """Dispatch legacy CLI modes and headless API subcommands."""
141
153
  parser = build_parser()
142
154
  args, extra_args = parser.parse_known_args(argv)
143
155
  headless_modes = {"run", "prompt", "status", "tools", "sessions", "config", "interrupt"}
@@ -186,6 +198,7 @@ def run_agent_cli(argv=None):
186
198
 
187
199
 
188
200
  def main(argv=None):
201
+ """Run the public codex-agent command-line entrypoint."""
189
202
  load_runtime_env()
190
203
  from .root import dispatch
191
204
  dispatch(argv, fallback=run_agent_cli)
@@ -18,6 +18,7 @@ IMAGE_DIR = 'images'
18
18
 
19
19
 
20
20
  def ext_to_mime(ext):
21
+ """Return the MIME type matching a common image extension."""
21
22
  ext = ext.lower().lstrip('.')
22
23
  if ext in ('jpg', 'jpeg'):
23
24
  return 'image/jpeg'
@@ -36,6 +37,7 @@ def _data_url(data, mime_type):
36
37
 
37
38
 
38
39
  def data_url_from_file(path):
40
+ """Read a local image file and encode it as a data URL."""
39
41
  ext = os.path.splitext(path)[1]
40
42
  mime_type = ext_to_mime(ext) or 'image/jpeg'
41
43
  with open(path, 'rb') as f:
@@ -64,6 +66,7 @@ def image_request_headers(url):
64
66
 
65
67
 
66
68
  def image_mime_from_source(source, content_type=None):
69
+ """Infer an image MIME type from headers, paths, or bytes-like sources."""
67
70
  content_type = (content_type or '').split(';')[0].strip()
68
71
  if content_type.startswith('image/'):
69
72
  return content_type
@@ -74,6 +77,7 @@ def image_mime_from_source(source, content_type=None):
74
77
 
75
78
 
76
79
  def fetch_image_bytes(url, timeout=15):
80
+ """Download image bytes and validate or infer their MIME type."""
77
81
  response = requests.get(url, timeout=timeout, headers=image_request_headers(url))
78
82
  response.raise_for_status()
79
83
 
@@ -94,11 +98,13 @@ def fetch_image_bytes(url, timeout=15):
94
98
 
95
99
 
96
100
  def data_url_from_url(url):
101
+ """Fetch a remote image URL and encode it as a data URL."""
97
102
  data, mime_type = fetch_image_bytes(url)
98
103
  return _data_url(data, mime_type)
99
104
 
100
105
 
101
106
  def persist_image_url(url):
107
+ """Download a remote image and persist it in the runtime image cache."""
102
108
  data, mime_type = fetch_image_bytes(url)
103
109
  ext = os.path.splitext(url.split('?', 1)[0])[1] or None
104
110
  mime_ext = {
@@ -113,6 +119,7 @@ def persist_image_url(url):
113
119
 
114
120
 
115
121
  def get_data_url(source):
122
+ """Return a data URL for a supported local path or remote URL source."""
116
123
  if isinstance(source, str) and os.path.isfile(source):
117
124
  return data_url_from_file(source)
118
125
  if isinstance(source, str) and source.startswith(('http://', 'https://')):
@@ -121,6 +128,7 @@ def get_data_url(source):
121
128
 
122
129
 
123
130
  def persist_image_bytes(data, name=None):
131
+ """Persist raw image bytes under the runtime image cache directory."""
124
132
  _, ext = os.path.splitext(name) if isinstance(name, str) else ('', '')
125
133
  ext = ext or guess_extension_from_bytes(data) or '.png'
126
134
 
@@ -134,10 +142,12 @@ def persist_image_bytes(data, name=None):
134
142
 
135
143
 
136
144
  def persist_bytesio(source):
145
+ """Persist a BytesIO image source, preserving its filename extension."""
137
146
  return persist_image_bytes(source.getvalue(), name=getattr(source, 'name', None))
138
147
 
139
148
 
140
149
  def image_name_from_source(source):
150
+ """Return a human-friendly image name for paths, URLs, or byte streams."""
141
151
  if isinstance(source, BytesIO) and getattr(source, 'name', None):
142
152
  return os.path.basename(source.name)
143
153
  if isinstance(source, str) and os.path.isfile(source):
@@ -386,6 +396,7 @@ class ImageMessage(Message):
386
396
  return "\n".join(parts)
387
397
 
388
398
  def as_bytesio(self):
399
+ """Return the in-memory image payload as bytes, when available."""
389
400
  data_url = self.get_base64()
390
401
  if not data_url:
391
402
  return None
@@ -396,6 +407,7 @@ class ImageMessage(Message):
396
407
  return BytesIO(base64.b64decode(match.group(1)))
397
408
 
398
409
  def image_size(self):
410
+ """Return image dimensions, or None when the payload is unavailable."""
399
411
  img_bytes = self.as_bytesio()
400
412
  if not img_bytes:
401
413
  return None
@@ -406,6 +418,7 @@ class ImageMessage(Message):
406
418
  return None
407
419
 
408
420
  def api_token_fingerprint(self):
421
+ """Return a stable fingerprint for cached image token estimates."""
409
422
  import hashlib
410
423
  import json
411
424
 
@@ -421,6 +434,7 @@ class ImageMessage(Message):
421
434
  return hashlib.sha256(text.encode("utf-8")).hexdigest()
422
435
 
423
436
  def compute_api_token_count(self, model=None):
437
+ """Estimate text-structure and visual-token cost for the image message."""
424
438
  size = self.image_size()
425
439
  text = (
426
440
  "The following image has been made available in context for visual analysis:\n"
@@ -0,0 +1 @@
1
+ __version__ = "0.1.74"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.72
3
+ Version: 0.1.74
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.72"
7
+ version = "0.1.74"
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.72"