codex-agent-framework 0.1.77__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.77/codex_agent_framework.egg-info → codex_agent_framework-0.1.78}/PKG-INFO +1 -1
  2. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/content/system.py +1 -0
  3. codex_agent_framework-0.1.78/codex_agent/version.py +1 -0
  4. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  5. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/pyproject.toml +1 -1
  6. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_response.py +46 -0
  7. codex_agent_framework-0.1.77/codex_agent/version.py +0 -1
  8. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/CHANGELOG.md +0 -0
  9. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/LICENSE +0 -0
  10. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/MANIFEST.in +0 -0
  11. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/README.md +0 -0
  12. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/__init__.py +0 -0
  13. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/__main__.py +0 -0
  14. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/agent.py +0 -0
  15. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/agent_runtime.py +0 -0
  16. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/ai.py +0 -0
  17. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/browser.py +0 -0
  18. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_commands.py +0 -0
  19. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/__init__.py +0 -0
  20. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  21. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  22. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  23. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  24. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  25. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  26. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/content/vision.py +0 -0
  27. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  28. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  29. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  30. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  31. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  32. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  33. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  34. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/files/tools.py +0 -0
  35. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  36. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  37. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  38. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  39. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  40. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  41. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  42. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  43. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  44. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  45. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  46. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  47. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  48. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  49. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  50. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  51. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  52. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  53. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  54. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  55. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  56. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  57. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  58. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  59. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/builtin_plugins/web_search/__init__.py +0 -0
  60. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/cli/__init__.py +0 -0
  61. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/cli/headless.py +0 -0
  62. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/cli/main.py +0 -0
  63. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/cli/output.py +0 -0
  64. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/cli/root.py +0 -0
  65. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/cli/runner.py +0 -0
  66. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/client.py +0 -0
  67. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/command.py +0 -0
  68. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/config.py +0 -0
  69. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/context.py +0 -0
  70. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/desktop.py +0 -0
  71. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/event.py +0 -0
  72. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/get_text/__init__.py +0 -0
  73. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/get_text/default_gitignore +0 -0
  74. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/get_text/get_text.py +0 -0
  75. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/get_text/simpler_get_text.py +0 -0
  76. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/hooks.py +0 -0
  77. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/image.py +0 -0
  78. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/latex.py +0 -0
  79. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/mainloop.py +0 -0
  80. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/message.py +0 -0
  81. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/plugin.py +0 -0
  82. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/prompts/compaction_prompt.txt +0 -0
  83. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/prompts/system_prompt.txt +0 -0
  84. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/provider.py +0 -0
  85. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/runtime.py +0 -0
  86. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/scheduler.py +0 -0
  87. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  88. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/server/__init__.py +0 -0
  89. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/server/app.py +0 -0
  90. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/server/core.py +0 -0
  91. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/service.py +0 -0
  92. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/sessions.py +0 -0
  93. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/status.py +0 -0
  94. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/stream.py +0 -0
  95. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/stream_utils.py +0 -0
  96. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/token_counter.py +0 -0
  97. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tool.py +0 -0
  98. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tray.py +0 -0
  99. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/__init__.py +0 -0
  100. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/app.py +0 -0
  101. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/chat.py +0 -0
  102. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/lifecycle.py +0 -0
  103. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/log.py +0 -0
  104. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/perf.py +0 -0
  105. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/state.py +0 -0
  106. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/status_bar.py +0 -0
  107. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/stream_debug.py +0 -0
  108. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/style.py +0 -0
  109. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/transcript.py +0 -0
  110. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/tui/widgets.py +0 -0
  111. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/utils.py +0 -0
  112. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent/worker.py +0 -0
  113. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  114. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  115. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  116. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/requires.txt +0 -0
  117. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/codex_agent_framework.egg-info/top_level.txt +0 -0
  118. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/dependencies.txt +0 -0
  119. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/setup.cfg +0 -0
  120. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent.py +0 -0
  121. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_audio_hooks.py +0 -0
  122. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_commands.py +0 -0
  123. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_context.py +0 -0
  124. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_desktop.py +0 -0
  125. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_environment.py +0 -0
  126. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_image_generation.py +0 -0
  127. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_observe.py +0 -0
  128. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_plugins.py +0 -0
  129. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_providers_config.py +0 -0
  130. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_realtime.py +0 -0
  131. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_runtime.py +0 -0
  132. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_sessions.py +0 -0
  133. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_subagents.py +0 -0
  134. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_tools.py +0 -0
  135. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_agent_turns.py +0 -0
  136. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_ai.py +0 -0
  137. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_browser.py +0 -0
  138. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_builtin_config.py +0 -0
  139. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_chat.py +0 -0
  140. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_cli.py +0 -0
  141. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_cli_headless.py +0 -0
  142. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_cli_root.py +0 -0
  143. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_client.py +0 -0
  144. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_events.py +0 -0
  145. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_get_text_browser.py +0 -0
  146. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_hooks.py +0 -0
  147. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_image_message.py +0 -0
  148. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_local_desktop.py +0 -0
  149. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_memory.py +0 -0
  150. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_messages.py +0 -0
  151. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_planner.py +0 -0
  152. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_scheduler.py +0 -0
  153. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_server.py +0 -0
  154. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_service.py +0 -0
  155. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_token_counter.py +0 -0
  156. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_tui.py +0 -0
  157. {codex_agent_framework-0.1.77 → codex_agent_framework-0.1.78}/tests/test_utils.py +0 -0
  158. {codex_agent_framework-0.1.77 → 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.77
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:
@@ -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.77
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.77"
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.77"