codex-agent-framework 0.1.57__tar.gz → 0.1.58__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 (155) hide show
  1. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/CHANGELOG.md +8 -0
  2. {codex_agent_framework-0.1.57/codex_agent_framework.egg-info → codex_agent_framework-0.1.58}/PKG-INFO +1 -1
  3. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/server/core.py +7 -4
  4. codex_agent_framework-0.1.58/codex_agent/version.py +1 -0
  5. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58/codex_agent_framework.egg-info}/PKG-INFO +1 -1
  6. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/pyproject.toml +1 -1
  7. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_server.py +21 -9
  8. codex_agent_framework-0.1.57/codex_agent/version.py +0 -1
  9. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/LICENSE +0 -0
  10. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/MANIFEST.in +0 -0
  11. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/README.md +0 -0
  12. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/__init__.py +0 -0
  13. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/__main__.py +0 -0
  14. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/agent.py +0 -0
  15. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/agent_runtime.py +0 -0
  16. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/ai.py +0 -0
  17. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/browser.py +0 -0
  18. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_commands.py +0 -0
  19. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/__init__.py +0 -0
  20. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/bash/__init__.py +0 -0
  21. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/bash/requirements.txt +0 -0
  22. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/browser/__init__.py +0 -0
  23. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/browser/requirements.txt +0 -0
  24. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/content/__init__.py +0 -0
  25. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/content/requirements.txt +0 -0
  26. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/content/system.py +0 -0
  27. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/content/vision.py +0 -0
  28. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/context/__init__.py +0 -0
  29. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/desktop/__init__.py +0 -0
  30. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/desktop/requirements.txt +0 -0
  31. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/environment/__init__.py +0 -0
  32. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/environment/requirements.txt +0 -0
  33. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/files/__init__.py +0 -0
  34. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/files/requirements.txt +0 -0
  35. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/files/tools.py +0 -0
  36. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/image_generation/__init__.py +0 -0
  37. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/image_generation/image_generation_system_prompt.txt +0 -0
  38. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/image_generation/requirements.txt +0 -0
  39. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/interface/__init__.py +0 -0
  40. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/interface/requirements.txt +0 -0
  41. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/memory/__init__.py +0 -0
  42. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/memory/requirements.txt +0 -0
  43. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/planner/__init__.py +0 -0
  44. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/planner/requirements.txt +0 -0
  45. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/python/__init__.py +0 -0
  46. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/python/requirements.txt +0 -0
  47. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/realtime/__init__.py +0 -0
  48. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/realtime/audio.py +0 -0
  49. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/realtime/bridge.py +0 -0
  50. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/realtime/manager.py +0 -0
  51. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/realtime/requirements.txt +0 -0
  52. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/realtime/session.py +0 -0
  53. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/scheduler/__init__.py +0 -0
  54. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/scheduler/requirements.txt +0 -0
  55. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/subagents/__init__.py +0 -0
  56. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/subagents/profiles/explorer.json +0 -0
  57. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/subagents/requirements.txt +0 -0
  58. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/tts/__init__.py +0 -0
  59. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/tts/requirements.txt +0 -0
  60. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/builtin_plugins/web_search/__init__.py +0 -0
  61. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/cli/__init__.py +0 -0
  62. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/cli/headless.py +0 -0
  63. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/cli/main.py +0 -0
  64. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/cli/output.py +0 -0
  65. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/cli/root.py +0 -0
  66. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/cli/runner.py +0 -0
  67. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/client.py +0 -0
  68. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/command.py +0 -0
  69. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/config.py +0 -0
  70. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/context.py +0 -0
  71. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/desktop.py +0 -0
  72. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/event.py +0 -0
  73. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/get_text/__init__.py +0 -0
  74. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/get_text/default_gitignore +0 -0
  75. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/get_text/get_text.py +0 -0
  76. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/get_text/simpler_get_text.py +0 -0
  77. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/hooks.py +0 -0
  78. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/image.py +0 -0
  79. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/latex.py +0 -0
  80. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/mainloop.py +0 -0
  81. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/message.py +0 -0
  82. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/plugin.py +0 -0
  83. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/prompts/system_prompt.txt +0 -0
  84. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/provider.py +0 -0
  85. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/runtime.py +0 -0
  86. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/scheduler.py +0 -0
  87. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/scripts/install-system-dependencies.sh +0 -0
  88. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/server/__init__.py +0 -0
  89. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/server/app.py +0 -0
  90. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/service.py +0 -0
  91. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/sessions.py +0 -0
  92. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/status.py +0 -0
  93. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/stream.py +0 -0
  94. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/stream_utils.py +0 -0
  95. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tool.py +0 -0
  96. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tray.py +0 -0
  97. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/__init__.py +0 -0
  98. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/app.py +0 -0
  99. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/chat.py +0 -0
  100. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/lifecycle.py +0 -0
  101. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/log.py +0 -0
  102. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/perf.py +0 -0
  103. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/state.py +0 -0
  104. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/status_bar.py +0 -0
  105. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/stream_debug.py +0 -0
  106. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/style.py +0 -0
  107. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/transcript.py +0 -0
  108. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/tui/widgets.py +0 -0
  109. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/utils.py +0 -0
  110. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent/worker.py +0 -0
  111. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent_framework.egg-info/SOURCES.txt +0 -0
  112. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent_framework.egg-info/dependency_links.txt +0 -0
  113. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent_framework.egg-info/entry_points.txt +0 -0
  114. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent_framework.egg-info/requires.txt +0 -0
  115. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/codex_agent_framework.egg-info/top_level.txt +0 -0
  116. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/dependencies.txt +0 -0
  117. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/setup.cfg +0 -0
  118. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent.py +0 -0
  119. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_audio_hooks.py +0 -0
  120. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_commands.py +0 -0
  121. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_context.py +0 -0
  122. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_desktop.py +0 -0
  123. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_environment.py +0 -0
  124. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_image_generation.py +0 -0
  125. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_observe.py +0 -0
  126. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_plugins.py +0 -0
  127. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_providers_config.py +0 -0
  128. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_realtime.py +0 -0
  129. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_response.py +0 -0
  130. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_runtime.py +0 -0
  131. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_sessions.py +0 -0
  132. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_subagents.py +0 -0
  133. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_tools.py +0 -0
  134. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_agent_turns.py +0 -0
  135. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_ai.py +0 -0
  136. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_browser.py +0 -0
  137. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_builtin_config.py +0 -0
  138. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_chat.py +0 -0
  139. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_cli.py +0 -0
  140. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_cli_headless.py +0 -0
  141. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_cli_root.py +0 -0
  142. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_client.py +0 -0
  143. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_events.py +0 -0
  144. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_get_text_browser.py +0 -0
  145. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_hooks.py +0 -0
  146. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_image_message.py +0 -0
  147. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_local_desktop.py +0 -0
  148. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_memory.py +0 -0
  149. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_messages.py +0 -0
  150. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_planner.py +0 -0
  151. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_scheduler.py +0 -0
  152. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_service.py +0 -0
  153. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_tui.py +0 -0
  154. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_utils.py +0 -0
  155. {codex_agent_framework-0.1.57 → codex_agent_framework-0.1.58}/tests/test_worker.py +0 -0
@@ -4,6 +4,14 @@ 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.58] - 2026-05-17
8
+ ### Fixed
9
+ - Keep active SSE event subscribers attached even when the FastAPI request handler thread that opened the `StreamingResponse` has ended, preventing TUI streams from degrading into ping-only connections that miss real assistant/tool events.
10
+ - Stop an SSE stream promptly if its subscriber has been removed from the active subscriber registry, forcing clients to reconnect and replay instead of staying apparently healthy while receiving only `server_ping` events.
11
+
12
+ ### Tests
13
+ - Add server regressions covering registered subscribers independent of request-thread liveness and removed subscribers stopping instead of pinging forever; validate with targeted server/client/chat tests and the full offline CI suite (581 passed).
14
+
7
15
  ## [0.1.57] - 2026-05-17
8
16
  ### Fixed
9
17
  - Fix stream helper fan-out edge cases so `Tee`, `Splitter`, and `MappingStreamSplitter` readers keep their own queues and reusable mapping splitters do not redirect old readers to new streams.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.57
3
+ Version: 0.1.58
4
4
  Summary: A lightweight event-driven Codex agent runtime.
5
5
  Author: Baptiste
6
6
  License-Expression: MIT
@@ -273,9 +273,12 @@ class AgentServer:
273
273
  return False
274
274
 
275
275
  def prune_subscribers(self):
276
- for subscriber, state in list(self.subscribers.items()):
277
- if not state.thread.is_alive():
278
- self.subscribers.pop(subscriber, None)
276
+ """Return active subscribers without pruning by request-thread liveness.
277
+
278
+ FastAPI may continue consuming a ``StreamingResponse`` after the
279
+ request handler thread that opened it is gone, so thread liveness is not
280
+ a reliable signal that an SSE subscriber is stale.
281
+ """
279
282
  return len(self.subscribers)
280
283
 
281
284
  def subscriber_count(self):
@@ -367,7 +370,7 @@ class AgentServer:
367
370
  try:
368
371
  payload = subscriber.get(timeout=0.25)
369
372
  except queue.Empty:
370
- if self.shutdown_requested.is_set():
373
+ if self.shutdown_requested.is_set() or subscriber not in self.subscribers:
371
374
  break
372
375
  payload = modict(type="server_ping")
373
376
  yield payload
@@ -0,0 +1 @@
1
+ __version__ = "0.1.58"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codex-agent-framework
3
- Version: 0.1.57
3
+ Version: 0.1.58
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.57"
7
+ version = "0.1.58"
8
8
  description = "A lightweight event-driven Codex agent runtime."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -513,22 +513,34 @@ def test_create_app_refuses_second_sse_client(monkeypatch):
513
513
  service.subscribers.clear()
514
514
 
515
515
 
516
- def test_agent_server_prunes_dead_event_subscribers():
516
+ def test_agent_server_keeps_registered_event_subscribers_independent_of_request_thread():
517
517
  agent = Agent(session="new")
518
518
  service = AgentServer(InProcessAgentRuntime(agent))
519
+ stream = service.subscribe()
520
+
521
+ assert next(stream).type == "server_subscribed"
522
+ service.prune_subscribers()
523
+ service.publish(modict(type="response_content_delta_event", delta="still attached"))
519
524
 
520
- class DeadThread:
521
- def is_alive(self):
522
- return False
525
+ assert next(stream).delta == "still attached"
526
+ stream.close()
527
+ assert len(service.subscribers) == 0
523
528
 
524
- service.subscribers[queue.Queue()] = modict(thread=DeadThread())
525
529
 
530
+ def test_agent_server_stops_stream_removed_from_subscribers():
531
+ agent = Agent(session="new")
532
+ service = AgentServer(InProcessAgentRuntime(agent))
526
533
  stream = service.subscribe()
534
+
535
+ assert next(stream).type == "server_subscribed"
536
+ service.subscribers.clear()
537
+
527
538
  try:
528
- assert next(stream).type == "server_subscribed"
529
- assert len(service.subscribers) == 1
530
- finally:
531
- stream.close()
539
+ next(stream)
540
+ except StopIteration:
541
+ pass
542
+ else:
543
+ raise AssertionError("Expected removed subscriber stream to stop instead of pinging forever")
532
544
 
533
545
 
534
546
  def test_agent_server_stop_closes_event_streams(monkeypatch):
@@ -1 +0,0 @@
1
- __version__ = "0.1.57"