feat(arcrun): http_request body_json + error heuristic; mira feed fire-and-forget

http_request 零件擴展(registry/components/http_request):
- 加 body_json 物件欄位(內部 JSON.stringify),yaml 端不用手組 JSON 字串
- 新增 JSON 回應的 error 欄位偵測 → 若 body 含 `{"error":"..."}` 則零件回 success=false
  解 cascade bug:mira_feed_watcher 用 http_request trigger wiki_synthesis,
  原本 4xx response 也被當 success,ON_SUCCESS 鏈會誤觸發
  根因架構債:host fn 沒回 HTTP status code(arcrun.md 列為 P1 follow-up)

landing 河道 feed (landing/app/mira/feed/page.tsx):
- 加回 triggerWikiSynthesis fire-and-forget 對 cypher.arcrun.dev/webhooks/named/
  wiki_synthesis/trigger 公開觸發 endpoint(arcrun-native,非 mira-specific route)
- 不走 watcher 是因為 cypher-executor 自己 fetch 自己 workers.dev URL = CF 1042
  self-fetch 擋

watcher 仍存在當 cron backup,但目前因 self-fetch 1042 不會真正觸發下游
wiki_synthesis(arcrun.md 列為 P1 follow-up)。
This commit is contained in:
2026-05-14 16:06:46 +08:00
parent 8ab6f8a66b
commit bc6360ccfc
3 changed files with 65 additions and 8 deletions
+27 -2
View File
@@ -158,6 +158,29 @@ export default function MiraPage() {
// ─── AI 回覆觸發器(fire-and-forget)──────────────────────
async function triggerWikiSynthesis(opts: { apiKey: string; rawBlockId: string }) {
// 觸發 arcrun wiki_synthesis workflowarcrun-native public trigger endpoint
// 不等結果(workflow 60-90s 含 2 次 claude_api pause/resume
try {
const res = await fetch(`${API_BASE}/webhooks/named/wiki_synthesis/trigger`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Arcrun-API-Key': opts.apiKey,
},
body: JSON.stringify({ api_key: opts.apiKey, raw_block_id: opts.rawBlockId }),
});
if (!res.ok) {
console.warn('[wiki_synthesis trigger] non-ok:', res.status);
return;
}
const data = await res.json().catch(() => ({}));
console.log('[wiki_synthesis trigger] response:', data);
} catch (e) {
console.warn('[wiki_synthesis trigger] error:', e);
}
}
async function triggerAiReply(opts: {
apiKey: string;
postContent: string;
@@ -272,8 +295,10 @@ function PostComposer({
parentBlockId: postBlockId,
pageName,
});
// 7B.3hwiki_synthesis 由 arcrun cron-triggered workflow `mira_feed_watcher`
// 自動處理(每分鐘掃未處理 raw block),不需前端觸發。
// 7B.3hfire-and-forget 觸發 wiki_synthesisbrowser → cypher.arcrun.devarcrun-native
// 不走 watcher 是因為 cypher-executor 自己 fetch 自己 workers.dev URL 被 CF 1042 擋
// watcher 仍作為 cron-driven backup(漏掉的 raws 5 分鐘後補跑),但需先解 self-fetch 問題
void triggerWikiSynthesis({ apiKey: me.api_key, rawBlockId: postBlockId });
onAiTriggered(pageName);
// 給 D1 GROUP BY 查詢看到新資料的時間