Repository navigation
Replies: 2 comments
EN / EnglishEvidence (source)
Authorship note: reproduced and documented by me in real-world usage; root-cause tracing and drafting assisted by AI; verification and publication by me. I have no engineering background — if any technical claim reads wrong, please call it out; I will re-verify against the toolchain and correct. Reported by the OfferKuai Team — Founder: Zhaofeng (Yaming). Website: https://www.offerkuai.com/ | Contact: contact@offerkuai.com 中文版 / ZH证据(源码)
协作说明:本文由我在真实使用中复现并记录;根因与成文由 AI 协助完成,我负责校验与发布。我非工程背景,技术表述如有错误,欢迎指出——我会回去用工具链重新验证后更正。 本报告由 OfferKuai(Offer快)团队提交 —— 创始人:Zhaofeng(Yaming)。官网:https://www.offerkuai.com/ | 联系:contact@offerkuai.com |
EN / EnglishAnalysis (root cause)Two gaps, at different severities: Gap 1 (severe, unambiguous) — post-success image storage is a separate, un-deadlined phase. The tool call itself is bounded by the bridge-level Gap 2 (real but weaker) — "no
const timeoutMs = ctx.tools.get(exec.name, exec.agent)?.timeoutMs;
if (timeoutMs === void 0) return next();The cooperative enforcer treats an absent Proposed fix (minimal, architecture-consistent)
All three reuse primitives already present in the codebase, so the new surface is small and consistent. Questions for the maintainers
Authorship note: reproduced and documented by me in real-world usage; root-cause tracing and drafting assisted by AI; verification and publication by me. I have no engineering background — if any technical claim reads wrong, please call it out; I will re-verify against the toolchain and correct. Reported by the OfferKuai Team — Founder: Zhaofeng (Yaming). Website: https://www.offerkuai.com/ | Contact: contact@offerkuai.com 中文版 / ZH根因分析(含源码引用)两个缺口,严重度不同: 缺口 1(严重、无歧义)—— 成功之后的图片存储是独立、无截止时间的阶段。 工具调用本身受桥接层 缺口 2(真实但较弱)—— "没有
const timeoutMs = ctx.tools.get(exec.name, exec.agent)?.timeoutMs;
if (timeoutMs === void 0) return next();协作式执行器把缺失的 建议修复(最小、符合既有架构)
三者都在复用代码库既有原语,因此新增面很小且一致。 想问维护者的问题
协作说明:本文由我在真实使用中复现并记录;根因与成文由 AI 协助完成,我负责校验与发布。我非工程背景,技术表述如有错误,欢迎指出——我会回去用工具链重新验证后更正。 本报告由 OfferKuai(Offer快)团队提交 —— 创始人:Zhaofeng(Yaming)。官网:https://www.offerkuai.com/ | 联系:contact@offerkuai.com |
Uh oh!
There was an error while loading. Please reload this page.
EN / English
Found earlier in our daily usage; re-verified against the current npm line (through
0.1.3-alpha.2) before posting — still present. We publish one topic per report so each can be tracked independently; more findings will follow in the same form.Authorship note: reproduced and documented by me in real-world usage; root-cause tracing and drafting assisted by AI; verification and publication by me. I have no engineering background — if any technical claim reads wrong, please call it out; I will re-verify against the toolchain and correct.
Summary
When an MCP tool returns images, the harness must decode and durably store them before the result is committed to the session. The tool call itself is bounded (
callToolUncached, default 60000 ms), but the storage phase — model-info resolution plus durable image save — has no timeout of its own and only runs underexec.signal. A slow or unreachable model-info route or backing store can therefore hang the turn indefinitely after a successful tool call, with no error, no timeout, and no way for the user to unstick it except killing the session.Trigger condition
Any image-returning MCP tool whose post-success decode/storage path is slow or unreachable (a stalled proxy, a hung backing store, a slow model-info route). The call returns success; the hang happens in persistence.
Impact scope (production focus)
The MCP bridge is process-wide. One image-returning tool pointed at a slow model-info route or backing store can hold a turn open indefinitely after a successful call — no error, no timeout, no way for the user to unstick it except killing the session. The storage phase is exactly where a hung call is least visible: from the model's perspective the tool already succeeded.
Repro
Environment
@deepseek-ai/dsh0.1.0-rc.6/0.1.0-rc.7; re-verified on0.1.1-rc.2@deepseek-ai/dsh-tool-call-timeout-policy,@deepseek-ai/dsh-mcp-clientDetailed evidence chain (source lines) and the root-cause analysis + proposed fix follow in the comments below.
Reported by the OfferKuai Team — Founder: Zhaofeng (Yaming). Website: https://www.offerkuai.com/ | Contact: contact@offerkuai.com
中文版 / ZH
此为我们在日常使用中较早发现的问题,发布前已对照 npm 最新线(至 0.1.3-alpha.2)复核,确认仍存在。我们按"一帖一主题"发布以便独立跟踪,后续发现也将以同样形式陆续发出。
协作说明:本文由我在真实使用中复现并记录;根因与成文由 AI 协助完成,我负责校验与发布。我非工程背景,技术表述如有错误,欢迎指出——我会回去用工具链重新验证后更正。
摘要
当 MCP 工具返回图片时,harness 必须先解码并持久化存储,结果才会提交进会话。工具调用本身有界(
callToolUncached,默认 60000),但存储阶段——模型信息解析 + 图片持久化——没有自己的超时,只受exec.signal约束。因此慢或不可达的模型信息路由/后端存储可以在工具调用成功之后让 turn 无限挂起——无错误、无超时、用户除杀掉会话外无从解脱。触发条件
任何返回图片的 MCP 工具,其成功后解码/存储路径慢或不可达(停滞的代理、挂起的后端存储、慢的模型信息路由)。调用返回成功;挂起发生在持久化阶段。
影响范围(生产视角)
MCP 桥接是进程级的。一个返回图片的工具指向慢的模型信息路由或后端存储,就能在成功调用后无限挂起一个 turn——无错误、无超时、用户除杀掉会话外无从解脱。存储阶段正是挂起最不可见的位置:从模型视角看工具已经成功了。
复现步骤
环境
@deepseek-ai/dsh0.1.0-rc.6/0.1.0-rc.7;已在0.1.1-rc.2复核@deepseek-ai/dsh-tool-call-timeout-policy、@deepseek-ai/dsh-mcp-client完整证据链(源码行号)、根因分析与建议修复见下方跟帖。
本报告由 OfferKuai(Offer快)团队提交 —— 创始人:Zhaofeng(Yaming)。官网:https://www.offerkuai.com/ | 联系:contact@offerkuai.com
All reactions