From 521624261d8543d7302b216b6a9f6bf69cb1ac6a Mon Sep 17 00:00:00 2001 From: richblack Date: Sat, 16 May 2026 14:04:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(cypher-executor):=20trigger=5Fworkflow=20pa?= =?UTF-8?q?used=20=E4=B8=8D=E7=AE=97=E5=A4=B1=E6=95=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit watcher 實測 8/8 raw 跑通後發現 wait=true 把 wiki_synthesis paused (claude_api 等 callback resume 的正常狀態)回報成 success:false,造成 watcher 看起來「5/8 失敗」實際是「正在背景跑」。 改成: - isPaused 偵測「workflow paused at node X」error 字串 - isPaused → success:true, status:'paused_awaiting_resume' - 完整完成 → status:'completed' - 真失敗 → status:'failed' Co-Authored-By: Claude Opus 4.7 --- cypher-executor/src/lib/component-loader.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cypher-executor/src/lib/component-loader.ts b/cypher-executor/src/lib/component-loader.ts index 3ad8595..960e8e8 100644 --- a/cypher-executor/src/lib/component-loader.ts +++ b/cypher-executor/src/lib/component-loader.ts @@ -211,7 +211,15 @@ function makeTriggerWorkflowRunner(env: Bindings): ComponentRunner { if (wait) { const r = await executeWebhookGraph(env, record.graph, triggerContext, workflowName, apiKey); - return { success: r.success, triggered_workflow: workflowName, sub_result: r }; + // paused 是預期狀態(claude_api 等待外部 callback resume),不算失敗 + // executeWebhookGraph 內部把 ExecutionError + "paused at node X" 包成 success:false + 含 error 字串 + const isPaused = !r.success && typeof r.error === 'string' && /workflow paused/i.test(r.error); + return { + success: r.success || isPaused, + triggered_workflow: workflowName, + status: r.success ? 'completed' : (isPaused ? 'paused_awaiting_resume' : 'failed'), + sub_result: r, + }; } else { // fire-and-forget — 不 await,但因為沒拿到 ctx.waitUntil,這裡 promise 可能被 cancel // 目前不啟用,留 wait=true 為預設。未來想要 fire-and-forget 需 plumb ExecutionContext