codex-agent-framework 0.1.63__tar.gz → 0.1.65__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.63/codex_agent_framework.egg-info → codex_agent_framework-0.1.65}/PKG-INFO +1 -1
  2. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/agent.py +0 -1
  3. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/ai.py +2 -0
  4. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/client.py +2 -1
  5. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/desktop.py +5 -12
  6. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/hooks.py +2 -0
  7. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/provider.py +3 -0
  8. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/stream_utils.py +8 -2
  9. codex_agent_framework-0.1.65/codex_agent/version.py +1 -0
  10. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  11. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/pyproject.toml +1 -1
  12. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_ai.py +19 -0
  13. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_client.py +14 -0
  14. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_local_desktop.py +18 -0
  15. codex_agent_framework-0.1.63/codex_agent/version.py +0 -1
  16. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/CHANGELOG.md +0 -0
  17. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/LICENSE +0 -0
  18. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/MANIFEST.in +0 -0
  19. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/README.md +0 -0
  20. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/__init__.py +0 -0
  21. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/__main__.py +0 -0
  22. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/agent_runtime.py +0 -0
  23. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/browser.py +0 -0
  24. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_commands.py +0 -0
  25. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/__init__.py +0 -0
  26. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  27. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  28. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  29. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  30. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  31. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  32. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/content/system.py +0 -0
  33. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/content/vision.py +0 -0
  34. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  35. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  36. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  37. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  38. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  39. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  40. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  41. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/files/tools.py +0 -0
  42. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  43. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  44. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  45. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  46. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  47. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  48. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  49. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  50. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  51. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  52. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  53. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  54. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  55. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  56. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  57. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  58. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  59. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  60. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  61. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  62. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  63. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  64. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  65. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  66. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/builtin_plugins/web_search/__init__.py +0 -0
  67. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/cli/__init__.py +0 -0
  68. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/cli/headless.py +0 -0
  69. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/cli/main.py +0 -0
  70. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/cli/output.py +0 -0
  71. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/cli/root.py +0 -0
  72. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/cli/runner.py +0 -0
  73. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/command.py +0 -0
  74. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/config.py +0 -0
  75. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/context.py +0 -0
  76. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/event.py +0 -0
  77. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/get_text/__init__.py +0 -0
  78. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/get_text/default_gitignore +0 -0
  79. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/get_text/get_text.py +0 -0
  80. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/get_text/simpler_get_text.py +0 -0
  81. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/image.py +0 -0
  82. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/latex.py +0 -0
  83. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/mainloop.py +0 -0
  84. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/message.py +0 -0
  85. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/plugin.py +0 -0
  86. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/prompts/compaction_prompt.txt +0 -0
  87. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/prompts/system_prompt.txt +0 -0
  88. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/runtime.py +0 -0
  89. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/scheduler.py +0 -0
  90. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  91. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/server/__init__.py +0 -0
  92. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/server/app.py +0 -0
  93. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/server/core.py +0 -0
  94. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/service.py +0 -0
  95. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/sessions.py +0 -0
  96. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/status.py +0 -0
  97. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/stream.py +0 -0
  98. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/token_counter.py +0 -0
  99. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tool.py +0 -0
  100. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tray.py +0 -0
  101. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/__init__.py +0 -0
  102. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/app.py +0 -0
  103. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/chat.py +0 -0
  104. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/lifecycle.py +0 -0
  105. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/log.py +0 -0
  106. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/perf.py +0 -0
  107. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/state.py +0 -0
  108. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/status_bar.py +0 -0
  109. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/stream_debug.py +0 -0
  110. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/style.py +0 -0
  111. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/transcript.py +0 -0
  112. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/tui/widgets.py +0 -0
  113. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/utils.py +0 -0
  114. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent/worker.py +0 -0
  115. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  116. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  117. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  118. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent_framework.egg-info/requires.txt +0 -0
  119. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/codex_agent_framework.egg-info/top_level.txt +0 -0
  120. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/dependencies.txt +0 -0
  121. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/setup.cfg +0 -0
  122. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent.py +0 -0
  123. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_audio_hooks.py +0 -0
  124. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_commands.py +0 -0
  125. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_context.py +0 -0
  126. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_desktop.py +0 -0
  127. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_environment.py +0 -0
  128. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_image_generation.py +0 -0
  129. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_observe.py +0 -0
  130. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_plugins.py +0 -0
  131. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_providers_config.py +0 -0
  132. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_realtime.py +0 -0
  133. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_response.py +0 -0
  134. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_runtime.py +0 -0
  135. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_sessions.py +0 -0
  136. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_subagents.py +0 -0
  137. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_tools.py +0 -0
  138. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_agent_turns.py +0 -0
  139. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_browser.py +0 -0
  140. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_builtin_config.py +0 -0
  141. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_chat.py +0 -0
  142. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_cli.py +0 -0
  143. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_cli_headless.py +0 -0
  144. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_cli_root.py +0 -0
  145. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_events.py +0 -0
  146. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_get_text_browser.py +0 -0
  147. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_hooks.py +0 -0
  148. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_image_message.py +0 -0
  149. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_memory.py +0 -0
  150. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_messages.py +0 -0
  151. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_planner.py +0 -0
  152. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_scheduler.py +0 -0
  153. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_server.py +0 -0
  154. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_service.py +0 -0
  155. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_token_counter.py +0 -0
  156. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_tui.py +0 -0
  157. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/tests/test_utils.py +0 -0
  158. {codex_agent_framework-0.1.63 → codex_agent_framework-0.1.65}/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.63
3
+ Version: 0.1.65
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -7,7 +7,6 @@ from .utils import (
7
7
  upload_file_to_folder,
8
8
  )
9
9
  import os
10
- from modict import modict
11
10
  from .message import (
12
11
  DeveloperMessage,
13
12
  ServerToolResponseMessage,
@@ -603,11 +603,13 @@ class AIClient:
603
603
  return embeddings
604
604
 
605
605
  def message_embedding_content(self, msg):
606
+ """Return stripped text content suitable for embedding a message."""
606
607
  if hasattr(msg, 'content') and isinstance(msg.content, str):
607
608
  return msg.content.strip()
608
609
  raise ValueError("Message must have text content")
609
610
 
610
611
  def zero_embedding(self, dimensions=128):
612
+ """Return a zero vector with the requested embedding dimensionality."""
611
613
  return [0.0] * int(dimensions)
612
614
 
613
615
  def similarity(self, emb1, emb2):
@@ -379,7 +379,8 @@ class AgentClient:
379
379
  return self.get("/health")
380
380
 
381
381
  def context_status(self):
382
- return self.get("/status")
382
+ """Backward-compatible alias for the canonical server status endpoint."""
383
+ return self.get_status()
383
384
 
384
385
  def get_status(self):
385
386
  return self.get("/status")
@@ -175,7 +175,7 @@ class DesktopController:
175
175
  continue
176
176
  key, value = line.split("=", 1)
177
177
  key = key.lower()
178
- location[key] = _to_int(value) if key in {"x", "y", "screen", "window"} else value
178
+ location[key] = _safe_int(value) if key in {"x", "y", "screen", "window"} else value
179
179
  return location
180
180
 
181
181
  def move_mouse(self, x: int, y: int) -> None:
@@ -297,10 +297,10 @@ class DesktopController:
297
297
  id=parts[0],
298
298
  desktop=parts[1],
299
299
  pid=parts[2],
300
- x=_to_int(parts[3]),
301
- y=_to_int(parts[4]),
302
- width=_to_int(parts[5]),
303
- height=_to_int(parts[6]),
300
+ x=_safe_int(parts[3]),
301
+ y=_safe_int(parts[4]),
302
+ width=_safe_int(parts[5]),
303
+ height=_safe_int(parts[6]),
304
304
  wm_class=parts[7],
305
305
  title=title,
306
306
  backend="wmctrl",
@@ -416,13 +416,6 @@ def get_desktop_controller() -> DesktopController:
416
416
  return _desktop_controller
417
417
 
418
418
 
419
- def _to_int(value: str) -> int | None:
420
- try:
421
- return int(value)
422
- except (TypeError, ValueError):
423
- return None
424
-
425
-
426
419
  def _safe_int(value: Any) -> int | None:
427
420
  try:
428
421
  return None if value is None else int(value)
@@ -24,6 +24,8 @@ class HookContext(modict):
24
24
 
25
25
 
26
26
  class HookManager:
27
+ """Registry and dispatcher for named extension hooks."""
28
+
27
29
  def __init__(self, agent=None):
28
30
  self.agent = agent
29
31
  self.handlers = modict()
@@ -20,6 +20,7 @@ def provider(func=None, **options):
20
20
 
21
21
 
22
22
  def provider_options(func):
23
+ """Return provider decorator metadata from a function or bound method."""
23
24
  options = getattr(func, PROVIDER_MARKER, None)
24
25
  if options is not None:
25
26
  return options
@@ -27,6 +28,8 @@ def provider_options(func):
27
28
 
28
29
 
29
30
  class ProvidersManager:
31
+ """Registry for context providers contributed by the agent and plugins."""
32
+
30
33
  def __init__(self, agent):
31
34
  self.agent = agent
32
35
  self.providers = modict()
@@ -7,15 +7,18 @@ from typing import Union
7
7
  import json
8
8
 
9
9
  class END:
10
- #sentinel value for end of stream
11
- pass
10
+ """Sentinel value placed in queues to mark the end of a stream."""
12
11
 
13
12
 
14
13
  class StreamError:
14
+ """Wrapper used to propagate producer exceptions through queue readers."""
15
+
15
16
  def __init__(self, error):
16
17
  self.error = error
17
18
 
19
+
18
20
  class Task:
21
+ """Tiny thread-backed task helper used by legacy stream utilities."""
19
22
 
20
23
  def __init__(self,target=None,args=None,kwargs=None):
21
24
  self.target_task=target or self.target
@@ -34,6 +37,7 @@ class Task:
34
37
  self.thread.join()
35
38
 
36
39
  class Tee:
40
+ """Fan out one input stream into independent reader streams."""
37
41
 
38
42
  def __init__(self):
39
43
  self.queues={}
@@ -59,6 +63,7 @@ class Tee:
59
63
  return tuple(reader(queue) for queue in self.queues.values())
60
64
 
61
65
  class Splitter:
66
+ """Split a stream into true/false readers according to a predicate."""
62
67
 
63
68
  def __init__(self,condition=None):
64
69
  self.queue_true=None
@@ -91,6 +96,7 @@ class Splitter:
91
96
  return reader(self.queue_true), reader(self.queue_false)
92
97
 
93
98
  class Streamer:
99
+ """Base helper that optionally runs stream processing in a worker thread."""
94
100
 
95
101
  def __init__(self,stream_processor=None,threaded=True):
96
102
  self.queue=None
@@ -0,0 +1 @@
1
+ __version__ = "0.1.65"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.63
3
+ Version: 0.1.65
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.63"
7
+ version = "0.1.65"
8
8
  description = "A lightweight event-driven Codex agent runtime."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -181,6 +181,25 @@ def test_embed_messages_skips_empty_content_without_api_error():
181
181
  assert embeddings == [empty.embedding, blank.embedding, filled.embedding]
182
182
 
183
183
 
184
+ def test_message_embedding_content_strips_text_messages():
185
+ ai = AIClient(agent=None)
186
+
187
+ assert ai.message_embedding_content(DeveloperMessage(content=" hello ")) == "hello"
188
+
189
+
190
+ def test_message_embedding_content_rejects_non_text_content():
191
+ ai = AIClient(agent=None)
192
+
193
+ with pytest.raises(ValueError, match="text content"):
194
+ ai.message_embedding_content(SystemMessage(content=[{"type": "input_text", "text": "hello"}]))
195
+
196
+
197
+ def test_zero_embedding_returns_requested_dimension():
198
+ ai = AIClient(agent=None)
199
+
200
+ assert ai.zero_embedding(dimensions=3) == [0.0, 0.0, 0.0]
201
+
202
+
184
203
  def test_embed_message_assigns_zero_embedding_for_empty_content():
185
204
  ai = AIClient(agent=None)
186
205
  ai._codex_client = FakeCodexClient()
@@ -151,6 +151,20 @@ def test_agent_client_http_error_payload_includes_status_and_detail():
151
151
  assert payload.error == "an event client is already connected"
152
152
 
153
153
 
154
+ def test_agent_client_context_status_delegates_to_get_status(monkeypatch):
155
+ client = AgentClient(base_url="http://agent.local")
156
+ calls = []
157
+
158
+ def fake_get(path):
159
+ calls.append(path)
160
+ return {"ok": True}
161
+
162
+ monkeypatch.setattr(client, "get", fake_get)
163
+
164
+ assert client.context_status() == {"ok": True}
165
+ assert calls == ["/status"]
166
+
167
+
154
168
  def test_agent_client_submit_prompt_posts_prompt(monkeypatch):
155
169
  client = AgentClient(base_url="http://agent.local")
156
170
  calls = []
@@ -34,6 +34,24 @@ def test_desktop_controller_wmctrl_parser(monkeypatch):
34
34
  ]
35
35
 
36
36
 
37
+ def test_desktop_controller_wmctrl_parser_keeps_invalid_geometry_as_none(monkeypatch):
38
+ controller = DesktopController()
39
+
40
+ monkeypatch.setattr(controller, "_list_windows_pywinctl", lambda: [])
41
+ monkeypatch.setattr("codex_agent.desktop.shutil.which", lambda name: name == "wmctrl")
42
+
43
+ class Result:
44
+ stdout = "0x01200007 0 1234 ? nope 800 bad app.Class host Example window\n"
45
+
46
+ monkeypatch.setattr(controller, "_run", lambda command: Result())
47
+
48
+ [window] = controller.list_windows()
49
+ assert window.x is None
50
+ assert window.y is None
51
+ assert window.width == 800
52
+ assert window.height is None
53
+
54
+
37
55
  def test_desktop_controller_capture_screen_uses_mss_only(monkeypatch, tmp_path):
38
56
  controller = DesktopController()
39
57
  output = tmp_path / "screen.png"
@@ -1 +0,0 @@
1
- __version__ = "0.1.63"