cloudagent-daemon 0.5.6__tar.gz → 0.5.7__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 (102) hide show
  1. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/CHANGELOG.md +20 -0
  2. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/PKG-INFO +1 -1
  3. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/pyproject.toml +1 -1
  4. cloudagent_daemon-0.5.7/src/cloudagent_daemon/__init__.py +1 -0
  5. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/claude_runner.py +6 -1
  6. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_claude_runner.py +27 -0
  7. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/uv.lock +1 -1
  8. cloudagent_daemon-0.5.6/src/cloudagent_daemon/__init__.py +0 -1
  9. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/.gitignore +0 -0
  10. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/LICENSE +0 -0
  11. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/README.md +0 -0
  12. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/scripts/release.sh +0 -0
  13. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/__main__.py +0 -0
  14. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/agent_download.py +0 -0
  15. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/agent_upload.py +0 -0
  16. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/agent_upload_denylist.py +0 -0
  17. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/auth_preflight.py +0 -0
  18. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/cli.py +0 -0
  19. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/config.py +0 -0
  20. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/context_fetch.py +0 -0
  21. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/delegation_report.py +0 -0
  22. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/doctor.py +0 -0
  23. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/frame_dispatch.py +0 -0
  24. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/http_outbound.py +0 -0
  25. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/injection_state.py +0 -0
  26. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/jsonl_logging.py +0 -0
  27. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/login.py +0 -0
  28. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/main_loop.py +0 -0
  29. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/mcp_bridge.py +0 -0
  30. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/metrics.py +0 -0
  31. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/metrics_server.py +0 -0
  32. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/outbound_queue.py +0 -0
  33. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/paths.py +0 -0
  34. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/protocol.py +0 -0
  35. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/qoder_credentials.py +0 -0
  36. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/readonly_bash_guard.py +0 -0
  37. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/runtime_config.py +0 -0
  38. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/runtime_detect.py +0 -0
  39. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/service.py +0 -0
  40. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/spawn_outbox.py +0 -0
  41. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/spawn_queue.py +0 -0
  42. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/sse_client.py +0 -0
  43. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/transport.py +0 -0
  44. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/unix_socket.py +0 -0
  45. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/workspace.py +0 -0
  46. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/src/cloudagent_daemon/ws_client.py +0 -0
  47. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/__init__.py +0 -0
  48. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/_fake_sse_server.py +0 -0
  49. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/conftest.py +0 -0
  50. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_e2e_deliver_to_spawn.py +0 -0
  51. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_e2e_sse.py +0 -0
  52. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_full_e2e.py +0 -0
  53. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_mcp_bridge_round_trip.py +0 -0
  54. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_one_shot_cli.py +0 -0
  55. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_spawn_mcp_bridge_e2e.py +0 -0
  56. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_sse_handshake.py +0 -0
  57. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_sse_watchdog.py +0 -0
  58. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_ws_handshake.py +0 -0
  59. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/integration/test_ws_reconnect.py +0 -0
  60. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/conftest.py +0 -0
  61. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_agent_download.py +0 -0
  62. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_agent_upload.py +0 -0
  63. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_auth_preflight.py +0 -0
  64. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_claude_runner_codex_contract.py +0 -0
  65. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_claude_runner_routing_contract.py +0 -0
  66. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_claude_runner_w3.py +0 -0
  67. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_cli_multi_profile.py +0 -0
  68. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_cli_smoke.py +0 -0
  69. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_config.py +0 -0
  70. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_context_fetch.py +0 -0
  71. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_delegation_report.py +0 -0
  72. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_doctor.py +0 -0
  73. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_frame_dispatch.py +0 -0
  74. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_http_outbound.py +0 -0
  75. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_injection_state.py +0 -0
  76. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_jsonl_logging.py +0 -0
  77. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_login.py +0 -0
  78. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_main_loop_assign.py +0 -0
  79. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_main_loop_preflight.py +0 -0
  80. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_mcp_bridge_agent_retrieval.py +0 -0
  81. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_mcp_bridge_send_message.py +0 -0
  82. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_metrics.py +0 -0
  83. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_metrics_server.py +0 -0
  84. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_multi_tool_wake.py +0 -0
  85. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_outbound_queue.py +0 -0
  86. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_outbox_stuck_watchdog.py +0 -0
  87. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_packaging_mcp_pin.py +0 -0
  88. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_paths.py +0 -0
  89. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_protocol.py +0 -0
  90. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_qoder_credentials.py +0 -0
  91. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_readonly_bash_guard.py +0 -0
  92. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_runtime_detect.py +0 -0
  93. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_service.py +0 -0
  94. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_service_multi_profile.py +0 -0
  95. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_spawn_outbox.py +0 -0
  96. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_spawn_queue.py +0 -0
  97. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_sse_active_watchdog.py +0 -0
  98. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_start_guard.py +0 -0
  99. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_status_stop.py +0 -0
  100. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_workspace.py +0 -0
  101. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_workspace_root_task113.py +0 -0
  102. {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.5.7}/tests/unit/test_ws_client_insecure.py +0 -0
@@ -4,6 +4,26 @@ All notable changes to the local daemon. Format follows
4
4
  [Keep a Changelog](https://keepachangelog.com/); versions are
5
5
  [PEP 440](https://peps.python.org/pep-0440/). Release with `scripts/release.sh`.
6
6
 
7
+ ## [0.5.7] — 2026-08-30
8
+
9
+ ### Fixed
10
+ - A periodic (timer) wake no longer publishes its throwaway session as the
11
+ global lane. 0.5.6 closed `set_last_session_id` but not `write_last_spawn`,
12
+ which rewrites `last-spawn.json` wholesale — and `last_session_id()` reads
13
+ that file's `session_id` back as the global lane. A patrol therefore still
14
+ left its thread there, and the next wake without a conversation resumed it:
15
+ the same bleed 0.5.6 set out to remove, one door further along. Caught on a
16
+ live host, not in review — after upgrading, the tick correctly dropped
17
+ `--resume` and left the room's lane alone, but `last-spawn.json` still moved.
18
+
19
+ ### Notes
20
+ - `read_analyze` already carried the owner's value through this call for the
21
+ same reason; periodic wakes now share that path. The spawn record still
22
+ captures the tick's rc/stderr, so operators lose no diagnostics.
23
+ - Anyone who ran 0.5.6 should check `.meta/last-spawn.json`: if its
24
+ `session_id` points at a patrol session, setting it to `null` makes the next
25
+ conversation-less wake start clean.
26
+
7
27
  ## [0.5.6] — 2026-08-30
8
28
 
9
29
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cloudagent-daemon
3
- Version: 0.5.6
3
+ Version: 0.5.7
4
4
  Summary: Local daemon for cloudagent — bridges Claude Code, Codex, and Qoder CLI agents to the cloudagent backend.
5
5
  Project-URL: Homepage, https://cloudagent.chat
6
6
  Project-URL: Repository, https://codeup.aliyun.com/69bd0a4d29ad98af4065ce71/cloudagent
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "cloudagent-daemon"
7
- version = "0.5.6"
7
+ version = "0.5.7"
8
8
  description = "Local daemon for cloudagent — bridges Claude Code, Codex, and Qoder CLI agents to the cloudagent backend."
9
9
  authors = [{name = "chaoyin", email = "tudoucyx@gmail.com"}]
10
10
  readme = "README.md"
@@ -0,0 +1 @@
1
+ __version__ = "0.5.7"
@@ -995,8 +995,13 @@ The daemon discards stdout — only the mcp tool call reaches the channel.
995
995
  # 的读取源(下次 resume 依据)。read_analyze 若把自己的 thread 写进去就会
996
996
  # 渗进 owner 的 full 会话,故这里保留 owner 轨原有 session_id(仍记录本次
997
997
  # 的 exit_code/stderr 供调试),read_analyze 的 thread 不落任何持久轨。
998
+ # A periodic wake is throwaway for the SAME reason: it resumed nothing,
999
+ # so recording its thread here would publish it as the global lane and
1000
+ # the next wake without a conversation would resume the patrol.
998
1001
  spawn_record_session = (
999
- ws.last_session_id() if is_read_analyze else captured_session
1002
+ ws.last_session_id()
1003
+ if (is_read_analyze or is_periodic)
1004
+ else captured_session
1000
1005
  )
1001
1006
  ws.write_last_spawn(rc, spawn_record_session, stderr_tail)
1002
1007
 
@@ -3930,6 +3930,33 @@ async def test_periodic_wake_leaves_the_rooms_lane_untouched(
3930
3930
  assert agent_ws.set_calls == [] # nor did the global lane move
3931
3931
 
3932
3932
 
3933
+ async def test_periodic_wake_does_not_publish_itself_as_the_global_lane(
3934
+ stateful_fake_claude, tmp_path
3935
+ ):
3936
+ """B — the global lane has TWO writers; a patrol may use neither.
3937
+
3938
+ ``set_last_session_id`` is the obvious one, but ``write_last_spawn``
3939
+ rewrites last-spawn.json wholesale — and ``last_session_id()`` reads its
3940
+ ``session_id`` back as the global lane. Blocking only the first still let
3941
+ a patrol publish its throwaway thread, so the next wake with no
3942
+ conversation resumed it. read_analyze already carried the owner's value
3943
+ through here for exactly this reason; a periodic wake now does too.
3944
+ """
3945
+ mcp_cfg = tmp_path / "mcp.json"; mcp_cfg.write_text("{}")
3946
+ agent_ws = FakeAgentWorkspace(mcp_path=mcp_cfg, last_session="owner_thread")
3947
+ runner = _build_runner(
3948
+ stateful_fake_claude([_claude_ok("patrol_thread")]),
3949
+ FakeWorkspace(agent_ws),
3950
+ FakeOutbound(),
3951
+ )
3952
+
3953
+ await runner.run_one("agent-A", _reminder_payload(conversation_id="conv_room"))
3954
+
3955
+ assert agent_ws.write_last_spawn_calls, "the spawn record is still written"
3956
+ recorded_session = agent_ws.write_last_spawn_calls[-1][1]
3957
+ assert recorded_session == "owner_thread" # NOT patrol_thread
3958
+
3959
+
3933
3960
  async def test_ordinary_wake_in_that_room_still_resumes_and_records(
3934
3961
  stateful_fake_claude, tmp_path
3935
3962
  ):
@@ -122,7 +122,7 @@ wheels = [
122
122
 
123
123
  [[package]]
124
124
  name = "cloudagent-daemon"
125
- version = "0.5.6"
125
+ version = "0.5.7"
126
126
  source = { editable = "." }
127
127
  dependencies = [
128
128
  { name = "h2" },
@@ -1 +0,0 @@
1
- __version__ = "0.5.6"