Approval-gated action interrupted before its result is saved can never be retried
メンテナーはふだん 2 日以内に返信
@DerekChia がすでに取り組んでいます。
2026年10月10日 から。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 68/100
調査の方向性
Start with the action receipt and the claimAction/finishAction flow around the mcp_actions table and the POST /api/conversations/thread/connection-actions endpoint. Also trace the approval action card’s polling and retry controls, using the 60-second ConnectionService timeout as the stale-run threshold. Done means an interrupted result-less run can be reclaimed only by its original approval, fresh claims still receive 409, saved results remain protected, and the UI exposes a successful retry.
索引モデルが issue の本文から書いたものです。
説明
Problem
If the server stops between claiming an approval-gated MCP action (claimAction) and saving its result (finishAction), that (threadId, toolCallId) is bricked: every retry returns 409 This action is already running. forever, because mcp_actions rows have no expiry and there is no code path that clears a result-less running row.
Worse, the owner has no way to retry from the UI: the action card polls the receipt every 2s, sees status: running, shows "Running / This action is still running on the server.", and hides the Approve buttons while running is true. The card sits on "Running" forever with no affordance.
Reproduction
- Start OpenDots (local
npm run dev, Node v22.23.1) with a Dot that has an MCP connection with a gated (non-read-only) tool. - Have the Dot call the gated tool so the owner gets an approval card.
- Approve it, and kill the server process after the claim INSERT but before the result UPDATE lands (equivalently:
INSERT INTO mcp_actions(threadId,toolCallId,connectionId,tool,status,result,createdAt,approvalId) VALUES('thread','tc1','c','tool','running',NULL,<now>,'<approvalId>');). - Restart the server and open the conversation.
- The card shows "Running" forever; approving/refreshing never completes.
POST /api/conversations/thread/connection-actionswith the same approval returns409 {"error":"This action is already running."}on every attempt, until the approval itself expires an hour later.
Expected: after the in-flight run is demonstrably gone, the receipt should surface the interruption and the same approval should be able to run the stored request again (the request is already bound to its exact connection/tool/arguments, and only that approval may reclaim it).
Actual: misleading "already running" 409 with no self-healing and no owner retry path.
Notes
- MCP tool calls are bounded to 60s (
ConnectionServicetimeout), so a result-less claim older than a few minutes cannot belong to a live run. - The fix must preserve the double-claim guard: a fresh
runningrow must still 409 (double click / retried request must not execute twice), a saved result must still be returned only to its own approval, and a different approval must never steal the claim.
- 主要言語
- TypeScript
- スター
- 4.8k
- フォーク
- 690
- 平均マージ
- 2日 7時間
- マージ済み PR(30日)
- 51
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
CopilotKit/OpenDots のほかの issue
-
Page conversation panel overflows horizontally対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
CopilotKit/OpenDots#69 ·
メンテナーはふだん 2 日以内に返信
-
Long page titles are clipped in the page editor対応中かも @charan-rathore が 11 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
CopilotKit/OpenDots#68 ·
メンテナーはふだん 2 日以内に返信
-
Composio follow-up: bound startup cancellation and forward Compose API key対応中かも @Twil3akine が今日担当しました。 オープン
難易度 3/5 1〜2日 初心者へのやさしさ 25/100
CopilotKit/OpenDots#152 ·
メンテナーはふだん 2 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
CopilotKit/OpenDots#151 ·
メンテナーはふだん 2 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 8/100
CopilotKit/OpenDots#149 ·
メンテナーはふだん 2 日以内に返信
CopilotKit/OpenDots の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
xdjs/MusicNerdWeb#1532 ·
メンテナーはふだん 1 日以内に返信
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
sebastian-software/ardo#352 ·
メンテナーはふだん 1 日以内に返信
-
@react95/core good first issue
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
メンテナーはふだん 3 日以内に返信
-
@shikijs/stream: `ShikiStreamTokenizer.clone()` shares its `tokensStable` array with the original対応中かも @xyrolle が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 6 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
メンテナーはふだん 1 日以内に返信