codex-agent-framework 0.1.78__tar.gz → 0.1.80__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.78 → codex_agent_framework-0.1.80}/CHANGELOG.md +7 -0
  2. {codex_agent_framework-0.1.78/codex_agent_framework.egg-info → codex_agent_framework-0.1.80}/PKG-INFO +1 -1
  3. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/content/vision.py +9 -0
  4. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/root.py +1 -0
  5. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/client.py +12 -0
  6. codex_agent_framework-0.1.80/codex_agent/version.py +1 -0
  7. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  8. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/pyproject.toml +1 -1
  9. codex_agent_framework-0.1.78/codex_agent/version.py +0 -1
  10. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/LICENSE +0 -0
  11. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/MANIFEST.in +0 -0
  12. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/README.md +0 -0
  13. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/__init__.py +0 -0
  14. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/__main__.py +0 -0
  15. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/agent.py +0 -0
  16. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/agent_runtime.py +0 -0
  17. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/ai.py +0 -0
  18. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/browser.py +0 -0
  19. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_commands.py +0 -0
  20. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/__init__.py +0 -0
  21. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  22. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  23. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  24. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  25. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  26. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  27. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/content/system.py +0 -0
  28. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  29. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  30. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  31. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  32. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  33. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  34. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  35. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/files/tools.py +0 -0
  36. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  37. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  38. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  39. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  40. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  41. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  42. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  43. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  44. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  45. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  46. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  47. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  48. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  49. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  50. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  51. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  52. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  53. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  54. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  55. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  56. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  57. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  58. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  59. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  60. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/builtin_plugins/web_search/__init__.py +0 -0
  61. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/__init__.py +0 -0
  62. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/headless.py +0 -0
  63. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/main.py +0 -0
  64. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/output.py +0 -0
  65. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/cli/runner.py +0 -0
  66. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/command.py +0 -0
  67. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/config.py +0 -0
  68. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/context.py +0 -0
  69. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/desktop.py +0 -0
  70. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/event.py +0 -0
  71. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/__init__.py +0 -0
  72. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/default_gitignore +0 -0
  73. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/get_text.py +0 -0
  74. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/get_text/simpler_get_text.py +0 -0
  75. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/hooks.py +0 -0
  76. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/image.py +0 -0
  77. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/latex.py +0 -0
  78. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/mainloop.py +0 -0
  79. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/message.py +0 -0
  80. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/plugin.py +0 -0
  81. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/prompts/compaction_prompt.txt +0 -0
  82. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/prompts/system_prompt.txt +0 -0
  83. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/provider.py +0 -0
  84. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/runtime.py +0 -0
  85. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/scheduler.py +0 -0
  86. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  87. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/server/__init__.py +0 -0
  88. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/server/app.py +0 -0
  89. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/server/core.py +0 -0
  90. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/service.py +0 -0
  91. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/sessions.py +0 -0
  92. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/status.py +0 -0
  93. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/stream.py +0 -0
  94. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/stream_utils.py +0 -0
  95. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/token_counter.py +0 -0
  96. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tool.py +0 -0
  97. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tray.py +0 -0
  98. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/__init__.py +0 -0
  99. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/app.py +0 -0
  100. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/chat.py +0 -0
  101. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/lifecycle.py +0 -0
  102. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/log.py +0 -0
  103. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/perf.py +0 -0
  104. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/state.py +0 -0
  105. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/status_bar.py +0 -0
  106. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/stream_debug.py +0 -0
  107. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/style.py +0 -0
  108. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/transcript.py +0 -0
  109. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/tui/widgets.py +0 -0
  110. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/utils.py +0 -0
  111. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent/worker.py +0 -0
  112. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  113. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  114. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  115. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/requires.txt +0 -0
  116. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/codex_agent_framework.egg-info/top_level.txt +0 -0
  117. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/dependencies.txt +0 -0
  118. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/setup.cfg +0 -0
  119. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent.py +0 -0
  120. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_audio_hooks.py +0 -0
  121. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_commands.py +0 -0
  122. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_context.py +0 -0
  123. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_desktop.py +0 -0
  124. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_environment.py +0 -0
  125. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_image_generation.py +0 -0
  126. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_observe.py +0 -0
  127. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_plugins.py +0 -0
  128. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_providers_config.py +0 -0
  129. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_realtime.py +0 -0
  130. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_response.py +0 -0
  131. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_runtime.py +0 -0
  132. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_sessions.py +0 -0
  133. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_subagents.py +0 -0
  134. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_tools.py +0 -0
  135. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_agent_turns.py +0 -0
  136. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_ai.py +0 -0
  137. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_browser.py +0 -0
  138. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_builtin_config.py +0 -0
  139. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_chat.py +0 -0
  140. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_cli.py +0 -0
  141. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_cli_headless.py +0 -0
  142. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_cli_root.py +0 -0
  143. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_client.py +0 -0
  144. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_events.py +0 -0
  145. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_get_text_browser.py +0 -0
  146. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_hooks.py +0 -0
  147. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_image_message.py +0 -0
  148. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_local_desktop.py +0 -0
  149. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_memory.py +0 -0
  150. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_messages.py +0 -0
  151. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_planner.py +0 -0
  152. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_scheduler.py +0 -0
  153. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_server.py +0 -0
  154. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_service.py +0 -0
  155. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_token_counter.py +0 -0
  156. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_tui.py +0 -0
  157. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_utils.py +0 -0
  158. {codex_agent_framework-0.1.78 → codex_agent_framework-0.1.80}/tests/test_worker.py +0 -0
@@ -4,6 +4,13 @@ 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.80] - 2026-05-18
8
+ ### Changed
9
+ - Document `AgentClient` event-stream, SSE parsing, sequence resume, URL, and HTTP request helper contracts with concise docstrings.
10
+
11
+ ### Tests
12
+ - Validate the client documentation pass with targeted client tests plus the full offline CI suite (618 passed).
13
+
7
14
  ## [0.1.60] - 2026-05-18
8
15
  ### Fixed
9
16
  - Count compacted summary messages with observed compaction `usage.output_tokens` instead of `usage.input_tokens`, so future context estimates reflect the size of the produced summary rather than the size of the compacted input.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.78
3
+ Version: 0.1.80
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -96,6 +96,7 @@ def observe(sources):
96
96
 
97
97
 
98
98
  def normalize_observe_source(source):
99
+ """Normalize legacy string sources and mapping sources to observe objects."""
99
100
  if isinstance(source, str):
100
101
  target = "url" if source.startswith(("http://", "https://")) else "path"
101
102
  key = "url" if target == "url" else "path"
@@ -106,6 +107,7 @@ def normalize_observe_source(source):
106
107
 
107
108
 
108
109
  def observe_source(source):
110
+ """Dispatch one normalized observe source to the matching capture helper."""
109
111
  item = normalize_observe_source(source)
110
112
  if not item:
111
113
  return "failed: source must be an object."
@@ -123,6 +125,7 @@ def observe_source(source):
123
125
 
124
126
 
125
127
  def resolve_agent_path(path):
128
+ """Resolve paths relative to the active agent when one is available."""
126
129
  try:
127
130
  return get_agent().resolve_path(path)
128
131
  except RuntimeError:
@@ -130,6 +133,7 @@ def resolve_agent_path(path):
130
133
 
131
134
 
132
135
  def observe_path(item):
136
+ """Validate a local image path observe source."""
133
137
  path = item.get("path") or item.get("source")
134
138
  if not isinstance(path, str) or not path:
135
139
  return "failed: path target requires a non-empty 'path'."
@@ -138,6 +142,7 @@ def observe_path(item):
138
142
 
139
143
 
140
144
  def observe_url(item):
145
+ """Observe a URL as an image, falling back to a page screenshot."""
141
146
  url = item.get("url") or item.get("source")
142
147
  if not isinstance(url, str) or not url:
143
148
  return "failed: url target requires a non-empty 'url'."
@@ -161,6 +166,7 @@ def observe_url(item):
161
166
 
162
167
 
163
168
  def observe_screen(item):
169
+ """Capture and validate a screenshot of the local screen."""
164
170
  output_path = item.get("output_path")
165
171
  if output_path:
166
172
  output_path = resolve_agent_path(output_path)
@@ -172,6 +178,7 @@ def observe_screen(item):
172
178
 
173
179
 
174
180
  def observe_window(item):
181
+ """Capture and validate a screenshot of a local desktop window."""
175
182
  window_id = item.get("window_id") or item.get("id")
176
183
  output_path = item.get("output_path")
177
184
  if output_path:
@@ -184,6 +191,7 @@ def observe_window(item):
184
191
 
185
192
 
186
193
  def validated_image(path, image_name=None, original_source=None, url_fallback=False):
194
+ """Return an ImageMessage or a readable failure string for invalid input."""
187
195
  image = ImageMessage(content=path, image_name=image_name, turns_left=3)
188
196
  if not image.is_valid():
189
197
  label = "URL fallback screenshot" if url_fallback else "image source"
@@ -192,6 +200,7 @@ def validated_image(path, image_name=None, original_source=None, url_fallback=Fa
192
200
 
193
201
 
194
202
  def screenshot_page_url(url, item=None):
203
+ """Capture a webpage screenshot using caller options or a runtime path."""
195
204
  item = item or {}
196
205
  path = item.get("output_path")
197
206
  if path:
@@ -22,6 +22,7 @@ ROOT_COMMANDS = {
22
22
 
23
23
 
24
24
  def build_root_parser():
25
+ """Build the public root CLI parser and command dispatcher options."""
25
26
  import argparse
26
27
 
27
28
  parser = argparse.ArgumentParser(
@@ -276,6 +276,7 @@ class AgentClient:
276
276
  self._event_stop.wait(0.1)
277
277
 
278
278
  def event_error_payload(self, exc):
279
+ """Build a local client error event from an event-stream exception."""
279
280
  payload = modict(type="client_event_error", error=str(exc), source="event_stream")
280
281
  if isinstance(exc, requests.HTTPError) and exc.response is not None:
281
282
  payload.status_code = exc.response.status_code
@@ -289,11 +290,13 @@ class AgentClient:
289
290
  return payload
290
291
 
291
292
  def is_event_idle_timeout(self, exc):
293
+ """Return whether an event-stream exception is an idle read timeout."""
292
294
  if isinstance(exc, (requests.exceptions.ReadTimeout, requests.exceptions.Timeout)):
293
295
  return True
294
296
  return "read timed out" in str(exc).lower()
295
297
 
296
298
  def iter_sse(self, lines):
299
+ """Yield parsed SSE payloads from decoded or byte line chunks."""
297
300
  event = None
298
301
  data_lines = []
299
302
  event_id = None
@@ -339,6 +342,7 @@ class AgentClient:
339
342
  yield payload
340
343
 
341
344
  def remember_event_sequence(self, event):
345
+ """Track the highest numeric event sequence seen for replay resume."""
342
346
  sequence = event.get("sequence") if isinstance(event, dict) else None
343
347
  if sequence is None:
344
348
  return
@@ -348,17 +352,22 @@ class AgentClient:
348
352
  return
349
353
  if self._last_event_sequence is None or sequence > self._last_event_sequence:
350
354
  self._last_event_sequence = sequence
355
+
351
356
  def events_url(self):
357
+ """Build the SSE endpoint URL with replay and compaction parameters."""
352
358
  params = {"client_pid": int(self.client_pid)}
353
359
  if self.compact_events:
354
360
  params["compact"] = 1
355
361
  if self._last_event_sequence is not None:
356
362
  params["after_sequence"] = int(self._last_event_sequence)
357
363
  return self.url(f"/events?{urlencode(params)}")
364
+
358
365
  def url(self, path):
366
+ """Return an absolute server URL for an API path."""
359
367
  return self.base_url + path
360
368
 
361
369
  def request(self, method, path, **kwargs):
370
+ """Send an HTTP request and decode its JSON response as a modict."""
362
371
  kwargs.setdefault("timeout", self.timeout)
363
372
  response = requests.request(method, self.url(path), **kwargs)
364
373
  response.raise_for_status()
@@ -367,12 +376,15 @@ class AgentClient:
367
376
  return modict(response.json())
368
377
 
369
378
  def get(self, path):
379
+ """Send a GET request to a server API path."""
370
380
  return self.request("GET", path)
371
381
 
372
382
  def post(self, path, payload=None):
383
+ """Send a JSON POST request to a server API path."""
373
384
  return self.request("POST", path, json=payload or {})
374
385
 
375
386
  def delete(self, path):
387
+ """Send a DELETE request to a server API path."""
376
388
  return self.request("DELETE", path)
377
389
 
378
390
  def health(self):
@@ -0,0 +1 @@
1
+ __version__ = "0.1.80"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.78
3
+ Version: 0.1.80
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.78"
7
+ version = "0.1.80"
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.78"