cloudagent-daemon 0.5.7__tar.gz → 0.6.0__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 (103) hide show
  1. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/.gitignore +0 -5
  2. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/CHANGELOG.md +25 -0
  3. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/PKG-INFO +2 -2
  4. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/README.md +1 -1
  5. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/pyproject.toml +1 -1
  6. cloudagent_daemon-0.6.0/src/cloudagent_daemon/__init__.py +1 -0
  7. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/agent_upload.py +8 -7
  8. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/claude_runner.py +340 -398
  9. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/main_loop.py +5 -1
  10. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/mcp_bridge.py +37 -281
  11. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/runtime_detect.py +1 -0
  12. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/_fake_sse_server.py +17 -5
  13. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_e2e_deliver_to_spawn.py +7 -2
  14. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_e2e_sse.py +8 -2
  15. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_mcp_bridge_round_trip.py +39 -151
  16. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_spawn_mcp_bridge_e2e.py +3 -3
  17. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_agent_upload.py +20 -6
  18. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_claude_runner.py +244 -426
  19. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_claude_runner_codex_contract.py +2 -33
  20. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_claude_runner_routing_contract.py +4 -38
  21. cloudagent_daemon-0.6.0/tests/unit/test_mcp_bridge_tools.py +159 -0
  22. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/uv.lock +1 -1
  23. cloudagent_daemon-0.5.7/src/cloudagent_daemon/__init__.py +0 -1
  24. cloudagent_daemon-0.5.7/tests/unit/test_mcp_bridge_agent_retrieval.py +0 -213
  25. cloudagent_daemon-0.5.7/tests/unit/test_mcp_bridge_send_message.py +0 -155
  26. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/LICENSE +0 -0
  27. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/scripts/release.sh +0 -0
  28. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/__main__.py +0 -0
  29. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/agent_download.py +0 -0
  30. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/agent_upload_denylist.py +0 -0
  31. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/auth_preflight.py +0 -0
  32. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/cli.py +0 -0
  33. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/config.py +0 -0
  34. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/context_fetch.py +0 -0
  35. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/delegation_report.py +0 -0
  36. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/doctor.py +0 -0
  37. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/frame_dispatch.py +0 -0
  38. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/http_outbound.py +0 -0
  39. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/injection_state.py +0 -0
  40. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/jsonl_logging.py +0 -0
  41. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/login.py +0 -0
  42. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/metrics.py +0 -0
  43. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/metrics_server.py +0 -0
  44. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/outbound_queue.py +0 -0
  45. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/paths.py +0 -0
  46. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/protocol.py +0 -0
  47. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/qoder_credentials.py +0 -0
  48. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/readonly_bash_guard.py +0 -0
  49. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/runtime_config.py +0 -0
  50. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/service.py +0 -0
  51. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/spawn_outbox.py +0 -0
  52. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/spawn_queue.py +0 -0
  53. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/sse_client.py +0 -0
  54. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/transport.py +0 -0
  55. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/unix_socket.py +0 -0
  56. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/workspace.py +0 -0
  57. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/ws_client.py +0 -0
  58. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/__init__.py +0 -0
  59. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/conftest.py +0 -0
  60. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_full_e2e.py +0 -0
  61. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_one_shot_cli.py +0 -0
  62. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_sse_handshake.py +0 -0
  63. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_sse_watchdog.py +0 -0
  64. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_ws_handshake.py +0 -0
  65. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/integration/test_ws_reconnect.py +0 -0
  66. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/conftest.py +0 -0
  67. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_agent_download.py +0 -0
  68. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_auth_preflight.py +0 -0
  69. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_claude_runner_w3.py +0 -0
  70. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_cli_multi_profile.py +0 -0
  71. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_cli_smoke.py +0 -0
  72. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_config.py +0 -0
  73. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_context_fetch.py +0 -0
  74. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_delegation_report.py +0 -0
  75. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_doctor.py +0 -0
  76. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_frame_dispatch.py +0 -0
  77. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_http_outbound.py +0 -0
  78. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_injection_state.py +0 -0
  79. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_jsonl_logging.py +0 -0
  80. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_login.py +0 -0
  81. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_main_loop_assign.py +0 -0
  82. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_main_loop_preflight.py +0 -0
  83. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_metrics.py +0 -0
  84. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_metrics_server.py +0 -0
  85. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_multi_tool_wake.py +0 -0
  86. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_outbound_queue.py +0 -0
  87. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_outbox_stuck_watchdog.py +0 -0
  88. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_packaging_mcp_pin.py +0 -0
  89. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_paths.py +0 -0
  90. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_protocol.py +0 -0
  91. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_qoder_credentials.py +0 -0
  92. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_readonly_bash_guard.py +0 -0
  93. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_runtime_detect.py +0 -0
  94. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_service.py +0 -0
  95. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_service_multi_profile.py +0 -0
  96. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_spawn_outbox.py +0 -0
  97. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_spawn_queue.py +0 -0
  98. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_sse_active_watchdog.py +0 -0
  99. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_start_guard.py +0 -0
  100. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_status_stop.py +0 -0
  101. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_workspace.py +0 -0
  102. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_workspace_root_task113.py +0 -0
  103. {cloudagent_daemon-0.5.7 → cloudagent_daemon-0.6.0}/tests/unit/test_ws_client_insecure.py +0 -0
@@ -43,8 +43,6 @@ node_modules/
43
43
  .claude/
44
44
  CLAUDE.md
45
45
  # Exception: 子项目的 CLAUDE.md 是跨人共享的项目定位/原则文档(含 BFF 共用纪律等),入库
46
- !one-company-fe/CLAUDE.md
47
- !one-company-desktop/CLAUDE.md
48
46
 
49
47
  # Git worktrees (local-only, isolated feature branches)
50
48
  .worktrees/
@@ -54,9 +52,7 @@ CLAUDE.md
54
52
 
55
53
  # Local agent scratch output (UI checker screenshots, design data dumps, etc.)
56
54
  .r2c/
57
- one-company-fe/deploy
58
55
  # tests/regression 是本地回归测试工作目录(test-cases / fixtures / runs / scripts)
59
- one-company-fe/tests/regression/
60
56
  # Local DB dumps / migration backups — never commit (may contain secrets)
61
57
  backups/
62
58
 
@@ -91,7 +87,6 @@ package-lock.json
91
87
  .playwright-mcp/
92
88
  tests/taoguang/
93
89
  # fr live sanity 临时 Playwright 脚本 (Alex review 时 drop, 本地用)
94
- one-company-fe/fr-sanity*.js
95
90
 
96
91
  # M7 设计 demo 的解压产物(源在 Opc.zip,解压即得)
97
92
  company/m7/refactors/Opc_extracted/
@@ -4,6 +4,31 @@ 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.6.0] — 2026-10-17
8
+
9
+ ### Removed
10
+ - The OPC-era MCP tools the backend no longer serves: `send_message`,
11
+ `list_messages`, `room_post`, `delegate_to_staff`, `close_task`,
12
+ `set_company_status`, `platform_list_integrations`, `platform_login` and
13
+ the task-room retrieval tools (`search_task_context`,
14
+ `read_task_room_context`, `resolve_task_ref`, `list_related_delegations`).
15
+ Every call to them already failed with an unknown-tool error.
16
+ - The `send_message` / `room_post` reply fallback and the `wake_aborted`
17
+ system reply for non-channel wakes. The backend only sends channel wakes,
18
+ which keep their `platform_send` fallback and failure notice.
19
+
20
+ ### Changed
21
+ - The system prompt and stdin footer teach only the channel (`platform_*`)
22
+ tools. Agents were previously told to call `list_messages` first on every
23
+ wake, which now fails.
24
+ - `request_user_approval` is offered to every agent, no longer only to chiefs.
25
+ - `upload_file` requires `conversation_id`; uploads always land in a channel.
26
+
27
+ ### Fixed
28
+ - `--claude-binary` / `CLOUDAGENT_DAEMON_CLAUDE_BINARY` is honoured again.
29
+ Since codex runtime support, a `claude` found by runtime detection silently
30
+ took precedence; the default (`claude`) still uses the detected install.
31
+
7
32
  ## [0.5.7] — 2026-08-30
8
33
 
9
34
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cloudagent-daemon
3
- Version: 0.5.7
3
+ Version: 0.6.0
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
@@ -40,7 +40,7 @@ agents can work locally with your machine's filesystem and tools.
40
40
  backend, receives a `deliver` frame per wake, spawns the agent's CLI
41
41
  (`claude` / `codex` / `qodercli`, resuming that agent's session), and the CLI
42
42
  talks back through an MCP bridge embedded in this daemon (`platform_send`,
43
- `send_message`, `download_attachment`, reminders…) before exiting.
43
+ `platform_read`, `upload_file`, reminders…) before exiting.
44
44
 
45
45
  ## Quick start (no clone) — for end users
46
46
 
@@ -8,7 +8,7 @@ agents can work locally with your machine's filesystem and tools.
8
8
  backend, receives a `deliver` frame per wake, spawns the agent's CLI
9
9
  (`claude` / `codex` / `qodercli`, resuming that agent's session), and the CLI
10
10
  talks back through an MCP bridge embedded in this daemon (`platform_send`,
11
- `send_message`, `download_attachment`, reminders…) before exiting.
11
+ `platform_read`, `upload_file`, reminders…) before exiting.
12
12
 
13
13
  ## Quick start (no clone) — for end users
14
14
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "cloudagent-daemon"
7
- version = "0.5.7"
7
+ version = "0.6.0"
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.6.0"
@@ -87,6 +87,12 @@ async def handle_upload_file(
87
87
  "upload_file: 'path' must be a non-empty path to ONE file",
88
88
  )
89
89
  raw = path.strip()
90
+ conv_ref = args.get("conversation_id")
91
+ if not isinstance(conv_ref, str) or not conv_ref.strip().startswith("conv_"):
92
+ return _err(
93
+ "INVALID_ARGS",
94
+ "upload_file: 'conversation_id' (the conv_ id from your wake) is required",
95
+ )
90
96
 
91
97
  # ONE explicit file. Expand ~, realpath (resolves symlinks so a link into a
92
98
  # denied dir is caught by its real target).
@@ -157,18 +163,14 @@ async def handle_upload_file(
157
163
  fname = os.path.basename(rp)
158
164
  mime = mimetypes.guess_type(fname)[0] or "application/octet-stream"
159
165
 
160
- # cr0624 #51 — 平台会话(频道/DM)上传:透传 conversation_id,后端改走
161
- # 平台分支(成员校验 + 自动贴附件消息)。无值 = 老 task 路径,行为不变。
162
- conv_ref = args.get("conversation_id")
163
166
  form: dict[str, str] = {
164
167
  "agent_id": agent_id,
165
168
  "session_id": session_id or "",
166
169
  "client_realpath": rp,
167
170
  "declared_size": str(size),
168
171
  "content_sha256": sha,
172
+ "conversation_id": conv_ref.strip(),
169
173
  }
170
- if isinstance(conv_ref, str) and conv_ref.strip().startswith("conv_"):
171
- form["conversation_id"] = conv_ref.strip()
172
174
 
173
175
  try:
174
176
  resp = await http.post_multipart(
@@ -187,7 +189,6 @@ async def handle_upload_file(
187
189
 
188
190
  name = resp.get("name") or fname
189
191
  download_path = resp.get("download_path")
190
- placed = "频道" if "conversation_id" in form else "协作室"
191
192
  return {
192
193
  "ok": True,
193
194
  "data": {
@@ -195,7 +196,7 @@ async def handle_upload_file(
195
196
  "filename": name,
196
197
  "download_path": download_path,
197
198
  "message": (
198
- f"已上传「{name}」,并已在{placed}贴出附件消息:{download_path}"
199
+ f"已上传「{name}」,并已在频道贴出附件消息:{download_path}"
199
200
  ),
200
201
  },
201
202
  }