cloudagent-daemon 0.5.6__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.
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/.gitignore +0 -5
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/CHANGELOG.md +45 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/PKG-INFO +2 -2
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/README.md +1 -1
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/pyproject.toml +1 -1
- cloudagent_daemon-0.6.0/src/cloudagent_daemon/__init__.py +1 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/agent_upload.py +8 -7
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/claude_runner.py +346 -399
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/main_loop.py +5 -1
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/mcp_bridge.py +37 -281
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/runtime_detect.py +1 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/_fake_sse_server.py +17 -5
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_e2e_deliver_to_spawn.py +7 -2
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_e2e_sse.py +8 -2
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_mcp_bridge_round_trip.py +39 -151
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_spawn_mcp_bridge_e2e.py +3 -3
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_agent_upload.py +20 -6
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_claude_runner.py +271 -426
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_claude_runner_codex_contract.py +2 -33
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_claude_runner_routing_contract.py +4 -38
- cloudagent_daemon-0.6.0/tests/unit/test_mcp_bridge_tools.py +159 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/uv.lock +1 -1
- cloudagent_daemon-0.5.6/src/cloudagent_daemon/__init__.py +0 -1
- cloudagent_daemon-0.5.6/tests/unit/test_mcp_bridge_agent_retrieval.py +0 -213
- cloudagent_daemon-0.5.6/tests/unit/test_mcp_bridge_send_message.py +0 -155
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/LICENSE +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/scripts/release.sh +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/__main__.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/agent_download.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/agent_upload_denylist.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/auth_preflight.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/cli.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/config.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/context_fetch.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/delegation_report.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/doctor.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/frame_dispatch.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/http_outbound.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/injection_state.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/jsonl_logging.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/login.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/metrics.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/metrics_server.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/outbound_queue.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/paths.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/protocol.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/qoder_credentials.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/readonly_bash_guard.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/runtime_config.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/service.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/spawn_outbox.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/spawn_queue.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/sse_client.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/transport.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/unix_socket.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/workspace.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/src/cloudagent_daemon/ws_client.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/__init__.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/conftest.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_full_e2e.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_one_shot_cli.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_sse_handshake.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_sse_watchdog.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_ws_handshake.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/integration/test_ws_reconnect.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/conftest.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_agent_download.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_auth_preflight.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_claude_runner_w3.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_cli_multi_profile.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_cli_smoke.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_config.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_context_fetch.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_delegation_report.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_doctor.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_frame_dispatch.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_http_outbound.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_injection_state.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_jsonl_logging.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_login.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_main_loop_assign.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_main_loop_preflight.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_metrics.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_metrics_server.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_multi_tool_wake.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_outbound_queue.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_outbox_stuck_watchdog.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_packaging_mcp_pin.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_paths.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_protocol.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_qoder_credentials.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_readonly_bash_guard.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_runtime_detect.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_service.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_service_multi_profile.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_spawn_outbox.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_spawn_queue.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_sse_active_watchdog.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_start_guard.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_status_stop.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_workspace.py +0 -0
- {cloudagent_daemon-0.5.6 → cloudagent_daemon-0.6.0}/tests/unit/test_workspace_root_task113.py +0 -0
- {cloudagent_daemon-0.5.6 → 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,51 @@ 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
|
+
|
|
32
|
+
## [0.5.7] — 2026-08-30
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
- A periodic (timer) wake no longer publishes its throwaway session as the
|
|
36
|
+
global lane. 0.5.6 closed `set_last_session_id` but not `write_last_spawn`,
|
|
37
|
+
which rewrites `last-spawn.json` wholesale — and `last_session_id()` reads
|
|
38
|
+
that file's `session_id` back as the global lane. A patrol therefore still
|
|
39
|
+
left its thread there, and the next wake without a conversation resumed it:
|
|
40
|
+
the same bleed 0.5.6 set out to remove, one door further along. Caught on a
|
|
41
|
+
live host, not in review — after upgrading, the tick correctly dropped
|
|
42
|
+
`--resume` and left the room's lane alone, but `last-spawn.json` still moved.
|
|
43
|
+
|
|
44
|
+
### Notes
|
|
45
|
+
- `read_analyze` already carried the owner's value through this call for the
|
|
46
|
+
same reason; periodic wakes now share that path. The spawn record still
|
|
47
|
+
captures the tick's rc/stderr, so operators lose no diagnostics.
|
|
48
|
+
- Anyone who ran 0.5.6 should check `.meta/last-spawn.json`: if its
|
|
49
|
+
`session_id` points at a patrol session, setting it to `null` makes the next
|
|
50
|
+
conversation-less wake start clean.
|
|
51
|
+
|
|
7
52
|
## [0.5.6] — 2026-08-30
|
|
8
53
|
|
|
9
54
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: cloudagent-daemon
|
|
3
|
-
Version: 0.
|
|
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
|
-
`
|
|
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
|
-
`
|
|
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.
|
|
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}
|
|
199
|
+
f"已上传「{name}」,并已在频道贴出附件消息:{download_path}"
|
|
199
200
|
),
|
|
200
201
|
},
|
|
201
202
|
}
|