codex-agent-framework 0.1.76__tar.gz → 0.1.78__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.76/codex_agent_framework.egg-info → codex_agent_framework-0.1.78}/PKG-INFO +1 -1
  2. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/content/system.py +1 -0
  3. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/cli/headless.py +5 -0
  4. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/cli/root.py +6 -0
  5. codex_agent_framework-0.1.78/codex_agent/version.py +1 -0
  6. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  7. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/pyproject.toml +1 -1
  8. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_response.py +46 -0
  9. codex_agent_framework-0.1.76/codex_agent/version.py +0 -1
  10. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/CHANGELOG.md +0 -0
  11. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/LICENSE +0 -0
  12. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/MANIFEST.in +0 -0
  13. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/README.md +0 -0
  14. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/__init__.py +0 -0
  15. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/__main__.py +0 -0
  16. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/agent.py +0 -0
  17. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/agent_runtime.py +0 -0
  18. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/ai.py +0 -0
  19. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/browser.py +0 -0
  20. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_commands.py +0 -0
  21. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/__init__.py +0 -0
  22. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  23. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  24. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  25. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  26. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  27. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  28. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/content/vision.py +0 -0
  29. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  30. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  31. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  32. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  33. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  34. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  35. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  36. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/files/tools.py +0 -0
  37. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  38. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  39. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  40. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  41. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  42. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  43. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  44. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  45. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  46. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  47. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  48. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  49. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  50. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  51. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  52. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  53. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  54. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  55. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  56. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  57. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  58. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  59. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  60. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  61. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/web_search/__init__.py +0 -0
  62. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/cli/__init__.py +0 -0
  63. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/cli/main.py +0 -0
  64. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/cli/output.py +0 -0
  65. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/cli/runner.py +0 -0
  66. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/client.py +0 -0
  67. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/command.py +0 -0
  68. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/config.py +0 -0
  69. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/context.py +0 -0
  70. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/desktop.py +0 -0
  71. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/event.py +0 -0
  72. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/get_text/__init__.py +0 -0
  73. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/get_text/default_gitignore +0 -0
  74. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/get_text/get_text.py +0 -0
  75. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/get_text/simpler_get_text.py +0 -0
  76. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/hooks.py +0 -0
  77. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/image.py +0 -0
  78. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/latex.py +0 -0
  79. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/mainloop.py +0 -0
  80. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/message.py +0 -0
  81. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/plugin.py +0 -0
  82. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/prompts/compaction_prompt.txt +0 -0
  83. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/prompts/system_prompt.txt +0 -0
  84. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/provider.py +0 -0
  85. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/runtime.py +0 -0
  86. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/scheduler.py +0 -0
  87. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  88. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/server/__init__.py +0 -0
  89. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/server/app.py +0 -0
  90. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/server/core.py +0 -0
  91. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/service.py +0 -0
  92. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/sessions.py +0 -0
  93. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/status.py +0 -0
  94. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/stream.py +0 -0
  95. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/stream_utils.py +0 -0
  96. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/token_counter.py +0 -0
  97. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tool.py +0 -0
  98. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tray.py +0 -0
  99. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/__init__.py +0 -0
  100. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/app.py +0 -0
  101. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/chat.py +0 -0
  102. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/lifecycle.py +0 -0
  103. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/log.py +0 -0
  104. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/perf.py +0 -0
  105. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/state.py +0 -0
  106. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/status_bar.py +0 -0
  107. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/stream_debug.py +0 -0
  108. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/style.py +0 -0
  109. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/transcript.py +0 -0
  110. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/tui/widgets.py +0 -0
  111. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/utils.py +0 -0
  112. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent/worker.py +0 -0
  113. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  114. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  115. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  116. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/requires.txt +0 -0
  117. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/top_level.txt +0 -0
  118. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/dependencies.txt +0 -0
  119. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/setup.cfg +0 -0
  120. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent.py +0 -0
  121. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_audio_hooks.py +0 -0
  122. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_commands.py +0 -0
  123. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_context.py +0 -0
  124. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_desktop.py +0 -0
  125. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_environment.py +0 -0
  126. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_image_generation.py +0 -0
  127. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_observe.py +0 -0
  128. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_plugins.py +0 -0
  129. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_providers_config.py +0 -0
  130. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_realtime.py +0 -0
  131. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_runtime.py +0 -0
  132. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_sessions.py +0 -0
  133. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_subagents.py +0 -0
  134. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_tools.py +0 -0
  135. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_agent_turns.py +0 -0
  136. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_ai.py +0 -0
  137. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_browser.py +0 -0
  138. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_builtin_config.py +0 -0
  139. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_chat.py +0 -0
  140. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_cli.py +0 -0
  141. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_cli_headless.py +0 -0
  142. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_cli_root.py +0 -0
  143. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_client.py +0 -0
  144. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_events.py +0 -0
  145. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_get_text_browser.py +0 -0
  146. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_hooks.py +0 -0
  147. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_image_message.py +0 -0
  148. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_local_desktop.py +0 -0
  149. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_memory.py +0 -0
  150. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_messages.py +0 -0
  151. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_planner.py +0 -0
  152. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_scheduler.py +0 -0
  153. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_server.py +0 -0
  154. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_service.py +0 -0
  155. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_token_counter.py +0 -0
  156. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_tui.py +0 -0
  157. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/tests/test_utils.py +0 -0
  158. {codex_agent_framework-0.1.76 → codex_agent_framework-0.1.78}/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.76
3
+ Version: 0.1.78
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -55,6 +55,7 @@ def close_tui():
55
55
 
56
56
 
57
57
  def open_silently(target: str) -> bool:
58
+ """Open a target best-effort while detaching noisy desktop output."""
58
59
  if os.name == "posix":
59
60
  opener = "open" if sys.platform == "darwin" else "xdg-open"
60
61
  try:
@@ -48,6 +48,7 @@ def read_prompt(args, extra_args):
48
48
 
49
49
 
50
50
  def with_runner(args, callback):
51
+ """Start the selected runner, invoke a callback, and stop it if needed."""
51
52
  runner = runner_from_args(args).start()
52
53
  try:
53
54
  return callback(runner)
@@ -57,12 +58,14 @@ def with_runner(args, callback):
57
58
 
58
59
 
59
60
  def run_status(args, extra_args=None):
61
+ """Fetch and print agent runtime status."""
60
62
  payload = with_runner(args, lambda runner: runner.get_status())
61
63
  output_payload(payload, fmt=output_format(args), text_formatter=key_value_text)
62
64
  return payload
63
65
 
64
66
 
65
67
  def run_tools(args, extra_args=None):
68
+ """Fetch and print registered tool names or metadata."""
66
69
  payload = with_runner(args, lambda runner: runner.tools())
67
70
 
68
71
  def format_tools(data):
@@ -94,6 +97,7 @@ def parse_config_set_args(extra_args):
94
97
 
95
98
 
96
99
  def run_config(args, extra_args=None):
100
+ """Run `config get` or `config set` through the selected runner."""
97
101
  extra_args = list(extra_args or [])
98
102
  command = extra_args[0] if extra_args else "get"
99
103
  if command == "get":
@@ -149,6 +153,7 @@ def run_sessions(args, extra_args=None):
149
153
 
150
154
 
151
155
  def run_interrupt(args, extra_args=None):
156
+ """Ask the active runtime to interrupt the current turn."""
152
157
  reason = " ".join(extra_args or []).strip() or "cli"
153
158
  payload = with_runner(args, lambda runner: runner.interrupt(reason=reason))
154
159
  output_payload(payload, fmt=output_format(args), text_formatter=key_value_text)
@@ -53,6 +53,7 @@ def build_root_parser():
53
53
 
54
54
 
55
55
  def print_root_help():
56
+ """Print help for the public root CLI parser."""
56
57
  build_root_parser().print_help()
57
58
 
58
59
 
@@ -97,6 +98,7 @@ def _detached_start(name, args):
97
98
 
98
99
 
99
100
  def start_service(name, args):
101
+ """Start a supported service in foreground or detached mode."""
100
102
  parsed, extra = _parse_connection_args(args)
101
103
  if extra:
102
104
  raise SystemExit(f"unrecognized arguments: {' '.join(extra)}")
@@ -120,18 +122,21 @@ def start_service(name, args):
120
122
 
121
123
 
122
124
  def stop_service(name, args=None):
125
+ """Stop a supported user service without requiring it to be active."""
123
126
  if name not in SERVICE_UNITS:
124
127
  raise SystemExit(f"usage: codex-agent stop {{{','.join(SERVICE_UNITS)}}}")
125
128
  service_controller().run("stop", SERVICE_UNITS[name], check=False)
126
129
 
127
130
 
128
131
  def restart_service(name, args=None):
132
+ """Restart a supported user service via the platform controller."""
129
133
  if name not in SERVICE_UNITS:
130
134
  raise SystemExit(f"usage: codex-agent restart {{{','.join(SERVICE_UNITS)}}}")
131
135
  service_controller().restart(SERVICE_UNITS[name], check=False)
132
136
 
133
137
 
134
138
  def open_interface(name, args):
139
+ """Ask the local server to open a supported interactive interface."""
135
140
  if name != "tui":
136
141
  raise SystemExit("usage: codex-agent open {tui}")
137
142
  parsed, extra = _parse_connection_args(args)
@@ -146,6 +151,7 @@ def open_interface(name, args):
146
151
 
147
152
 
148
153
  def close_interface(name, args):
154
+ """Ask the local server to close a supported interactive interface."""
149
155
  if name != "tui":
150
156
  raise SystemExit("usage: codex-agent close {tui}")
151
157
  parsed, extra = _parse_connection_args(args)
@@ -0,0 +1 @@
1
+ __version__ = "0.1.78"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.76
3
+ Version: 0.1.78
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.76"
7
+ version = "0.1.78"
8
8
  description = "A lightweight event-driven Codex agent runtime."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,5 +1,6 @@
1
1
  import json
2
2
  import os
3
+ import subprocess
3
4
  from types import SimpleNamespace
4
5
 
5
6
  import codex_agent.utils as utils
@@ -284,6 +285,51 @@ def test_agent_persists_server_tool_output_items_as_messages():
284
285
  assert server_message.to_response_format() == item
285
286
 
286
287
 
288
+ def test_open_silently_uses_detached_posix_opener(monkeypatch):
289
+ import codex_agent.builtin_plugins.content.system as system_tools
290
+
291
+ calls = []
292
+
293
+ def fake_popen(command, **kwargs):
294
+ calls.append((command, kwargs))
295
+
296
+ monkeypatch.setattr(system_tools.os, "name", "posix")
297
+ monkeypatch.setattr(system_tools.sys, "platform", "linux")
298
+ monkeypatch.setattr(system_tools.subprocess, "Popen", fake_popen)
299
+ monkeypatch.setattr(system_tools.webbrowser, "open", lambda target: False)
300
+
301
+ assert system_tools.open_silently("/tmp/file.txt") is True
302
+ assert calls == [([
303
+ "xdg-open",
304
+ "/tmp/file.txt",
305
+ ], {
306
+ "stdout": subprocess.DEVNULL,
307
+ "stderr": subprocess.DEVNULL,
308
+ "stdin": subprocess.DEVNULL,
309
+ "start_new_session": True,
310
+ })]
311
+
312
+
313
+ def test_open_silently_falls_back_to_webbrowser_when_posix_opener_missing(monkeypatch):
314
+ import codex_agent.builtin_plugins.content.system as system_tools
315
+
316
+ calls = []
317
+
318
+ def missing_opener(*args, **kwargs):
319
+ raise FileNotFoundError
320
+
321
+ def fake_web_open(target):
322
+ calls.append(target)
323
+ return True
324
+
325
+ monkeypatch.setattr(system_tools.os, "name", "posix")
326
+ monkeypatch.setattr(system_tools.subprocess, "Popen", missing_opener)
327
+ monkeypatch.setattr(system_tools.webbrowser, "open", fake_web_open)
328
+
329
+ assert system_tools.open_silently("https://example.com") is True
330
+ assert calls == ["https://example.com"]
331
+
332
+
287
333
  def test_open_tui_tool_bridges_to_agent_server():
288
334
  import codex_agent.builtin_plugins.content.system as system_tools
289
335
  from codex_agent.tool import reset_current_agent, set_current_agent
@@ -1 +0,0 @@
1
- __version__ = "0.1.76"