codex-agent-framework 0.1.79__tar.gz → 0.1.81__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.79 → codex_agent_framework-0.1.81}/CHANGELOG.md +14 -0
  2. {codex_agent_framework-0.1.79/codex_agent_framework.egg-info → codex_agent_framework-0.1.81}/PKG-INFO +1 -1
  3. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_commands.py +14 -2
  4. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/client.py +12 -0
  5. codex_agent_framework-0.1.81/codex_agent/version.py +1 -0
  6. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  7. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/pyproject.toml +1 -1
  8. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_commands.py +4 -2
  9. codex_agent_framework-0.1.79/codex_agent/version.py +0 -1
  10. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/LICENSE +0 -0
  11. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/MANIFEST.in +0 -0
  12. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/README.md +0 -0
  13. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/__init__.py +0 -0
  14. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/__main__.py +0 -0
  15. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/agent.py +0 -0
  16. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/agent_runtime.py +0 -0
  17. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/ai.py +0 -0
  18. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/browser.py +0 -0
  19. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/__init__.py +0 -0
  20. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  21. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  22. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  23. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  24. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  25. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  26. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/content/system.py +0 -0
  27. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/content/vision.py +0 -0
  28. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  29. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  30. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  31. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  32. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  33. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  34. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  35. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/files/tools.py +0 -0
  36. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  37. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  38. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  39. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  40. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  41. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  42. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  43. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  44. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  45. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  46. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  47. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  48. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  49. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  50. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  51. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  52. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  53. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  54. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  55. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  56. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  57. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  58. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  59. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  60. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/builtin_plugins/web_search/__init__.py +0 -0
  61. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/cli/__init__.py +0 -0
  62. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/cli/headless.py +0 -0
  63. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/cli/main.py +0 -0
  64. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/cli/output.py +0 -0
  65. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/cli/root.py +0 -0
  66. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/cli/runner.py +0 -0
  67. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/command.py +0 -0
  68. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/config.py +0 -0
  69. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/context.py +0 -0
  70. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/desktop.py +0 -0
  71. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/event.py +0 -0
  72. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/get_text/__init__.py +0 -0
  73. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/get_text/default_gitignore +0 -0
  74. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/get_text/get_text.py +0 -0
  75. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/get_text/simpler_get_text.py +0 -0
  76. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/hooks.py +0 -0
  77. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/image.py +0 -0
  78. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/latex.py +0 -0
  79. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/mainloop.py +0 -0
  80. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/message.py +0 -0
  81. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/plugin.py +0 -0
  82. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/prompts/compaction_prompt.txt +0 -0
  83. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/prompts/system_prompt.txt +0 -0
  84. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/provider.py +0 -0
  85. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/runtime.py +0 -0
  86. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/scheduler.py +0 -0
  87. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  88. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/server/__init__.py +0 -0
  89. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/server/app.py +0 -0
  90. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/server/core.py +0 -0
  91. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/service.py +0 -0
  92. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/sessions.py +0 -0
  93. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/status.py +0 -0
  94. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/stream.py +0 -0
  95. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/stream_utils.py +0 -0
  96. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/token_counter.py +0 -0
  97. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tool.py +0 -0
  98. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tray.py +0 -0
  99. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/__init__.py +0 -0
  100. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/app.py +0 -0
  101. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/chat.py +0 -0
  102. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/lifecycle.py +0 -0
  103. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/log.py +0 -0
  104. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/perf.py +0 -0
  105. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/state.py +0 -0
  106. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/status_bar.py +0 -0
  107. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/stream_debug.py +0 -0
  108. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/style.py +0 -0
  109. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/transcript.py +0 -0
  110. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/tui/widgets.py +0 -0
  111. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/utils.py +0 -0
  112. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent/worker.py +0 -0
  113. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  114. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  115. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  116. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent_framework.egg-info/requires.txt +0 -0
  117. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/codex_agent_framework.egg-info/top_level.txt +0 -0
  118. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/dependencies.txt +0 -0
  119. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/setup.cfg +0 -0
  120. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent.py +0 -0
  121. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_audio_hooks.py +0 -0
  122. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_context.py +0 -0
  123. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_desktop.py +0 -0
  124. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_environment.py +0 -0
  125. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_image_generation.py +0 -0
  126. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_observe.py +0 -0
  127. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_plugins.py +0 -0
  128. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_providers_config.py +0 -0
  129. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_realtime.py +0 -0
  130. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_response.py +0 -0
  131. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_runtime.py +0 -0
  132. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_sessions.py +0 -0
  133. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_subagents.py +0 -0
  134. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_tools.py +0 -0
  135. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_agent_turns.py +0 -0
  136. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_ai.py +0 -0
  137. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_browser.py +0 -0
  138. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_builtin_config.py +0 -0
  139. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_chat.py +0 -0
  140. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_cli.py +0 -0
  141. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_cli_headless.py +0 -0
  142. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_cli_root.py +0 -0
  143. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_client.py +0 -0
  144. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_events.py +0 -0
  145. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_get_text_browser.py +0 -0
  146. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_hooks.py +0 -0
  147. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_image_message.py +0 -0
  148. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_local_desktop.py +0 -0
  149. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_memory.py +0 -0
  150. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_messages.py +0 -0
  151. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_planner.py +0 -0
  152. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_scheduler.py +0 -0
  153. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_server.py +0 -0
  154. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_service.py +0 -0
  155. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_token_counter.py +0 -0
  156. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_tui.py +0 -0
  157. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_utils.py +0 -0
  158. {codex_agent_framework-0.1.79 → codex_agent_framework-0.1.81}/tests/test_worker.py +0 -0
@@ -4,6 +4,20 @@ 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.81] - 2026-05-18
8
+ ### Changed
9
+ - Document the remaining built-in slash commands and make `/help` show concise command summaries from their docstrings.
10
+
11
+ ### Tests
12
+ - Validate the command help pass with targeted command tests plus the full offline CI suite (618 passed).
13
+
14
+ ## [0.1.80] - 2026-05-18
15
+ ### Changed
16
+ - Document `AgentClient` event-stream, SSE parsing, sequence resume, URL, and HTTP request helper contracts with concise docstrings.
17
+
18
+ ### Tests
19
+ - Validate the client documentation pass with targeted client tests plus the full offline CI suite (618 passed).
20
+
7
21
  ## [0.1.60] - 2026-05-18
8
22
  ### Fixed
9
23
  - 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.79
3
+ Version: 0.1.81
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -27,16 +27,25 @@ def format_config_output(value, prefix=""):
27
27
  return "\n".join(_format_lines(value, prefix=prefix)) if isinstance(value, dict) else repr(value)
28
28
 
29
29
 
30
+ def _command_summary(func):
31
+ doc = (getattr(func, "__doc__", None) or "").strip()
32
+ return doc.splitlines()[0].strip() if doc else ""
33
+
34
+
30
35
  @command
31
36
  def help():
32
37
  """List slash commands currently registered on the active agent."""
33
38
  agent = get_agent()
34
- names = ", ".join(f"/{name}" for name in sorted(agent.commands))
35
- return f"Available commands: {names}"
39
+ lines = ["Available commands:"]
40
+ for name in sorted(agent.commands):
41
+ summary = _command_summary(agent.commands[name])
42
+ lines.append(f"/{name} - {summary}" if summary else f"/{name}")
43
+ return "\n".join(lines)
36
44
 
37
45
 
38
46
  @command
39
47
  def compact(max_compacted_turns=None):
48
+ """Compact the current session history, optionally limiting compacted turns."""
40
49
  agent = get_agent()
41
50
  max_compacted_turns = None if max_compacted_turns in (None, "", "all") else int(max_compacted_turns)
42
51
  message = agent.compact_session(
@@ -83,6 +92,7 @@ def _format_session_list(agent):
83
92
 
84
93
  @command
85
94
  def session(action=None, *parts):
95
+ """List, create, rename, or switch persisted chat sessions."""
86
96
  agent = get_agent()
87
97
  if action is None:
88
98
  return _format_session_list(agent)
@@ -120,6 +130,7 @@ def session(action=None, *parts):
120
130
 
121
131
  @command
122
132
  def config(path=None, value=None, *extra, **values):
133
+ """Show, update, or save runtime configuration values."""
123
134
  agent = get_agent()
124
135
  manager = agent.config_manager
125
136
 
@@ -193,6 +204,7 @@ def verbosity(value=None):
193
204
 
194
205
  @command
195
206
  def voice(value=None):
207
+ """Show or update TTS voice settings through the TTS plugin."""
196
208
  agent = get_agent()
197
209
  if "tts" not in agent.plugins:
198
210
  agent.load_builtin_plugin("tts")
@@ -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.81"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.79
3
+ Version: 0.1.81
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.79"
7
+ version = "0.1.81"
8
8
  description = "A lightweight event-driven Codex agent runtime."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -126,8 +126,10 @@ def test_agent_loads_builtin_commands():
126
126
  agent = Agent(session="new")
127
127
 
128
128
  assert {"help", "compact", "config", "model", "reasoning", "verbosity", "voice"}.issubset(agent.commands)
129
- assert "/help" in agent_result(agent, "/help")
130
- assert "/compact" in agent_result(agent, "/help")
129
+ output = agent_result(agent, "/help")
130
+ assert "/help - List slash commands" in output
131
+ assert "/compact - Compact the current session history" in output
132
+ assert "/voice - Show or update TTS voice settings" in output
131
133
 
132
134
 
133
135
  def test_builtin_model_config_commands_update_and_persist(tmp_path, monkeypatch):
@@ -1 +0,0 @@
1
- __version__ = "0.1.79"