Files
Arcrun/registry/examples/km-wiki-ingest/drainer/README.md
T
kbdb-cc c6bd0d7899 fix(drainer): 同帳號 worker-to-worker 改走 Service Bindings(修 CF 1042)
Production bug(本地 miniflare 未抓到、真端點才爆):部署後 drainer 對同帳號
arcrun-code/arcrun-kbdb/kbdb-graph-plugin 做 fetch("https://*.leo21c.workers.dev")
→ CF 1042(同帳號 worker 互打限制),被 error handler 包成 "not valid JSON"。

修法=比照 cypher-executor(wrangler.toml [[services]] 綁零件):
- wrangler.toml 加 [[services]] SVC_CODE→arcrun-code / SVC_KBDB→arcrun-kbdb /
  SVC_GRAPH→kbdb-graph-plugin;移除 CODE_WORKER_URL/KBDB_URL/GRAPH_URL vars。
- index.ts:所有 code/kbdb/graph 呼叫改 env.SVC_X.fetch()(svc() 輔助);Gitea
  (git.uncle6.me,非 CF)維持 plain fetch。

驗收(強制對部署後真端點、禁 miniflare):POST /drain?batch=2 回真 JSON、notes 3 卡
冪等全 skip、無 1042;游標前進+回捲;加測試卡→真端點 /webhook 只寫該 delta(entry
create 進 live KBDB)→三模式 curl 命中(含 Arcrun#11 修後語意 owner+type 過濾生效)→
測試卡清除。deploy version 95562b3e。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HJiLCRUU2o3aSpPEzVCt2o
2026-07-06 10:51:42 +00:00

74 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# arcrun-km-wiki-drainer —— km_wiki_ingest_drain 的無人值守 runtime
`workflow.yaml` 是宣告式 spec;**本 Worker 是它可真部署、有游標/觸發的執行體**。
復用已 live 的零件與服務,**不改 cypher-executor**
```
Gitea 抓卡 md → arcrun-code 零件(sandbox inline JS 解析)→ /entries 冪等 upsertembed:true
→ graph /triplets/ingestserver 側 per-source 冪等)
```
- Live`https://arcrun-km-wiki-drainer.leo21c.workers.dev`
- 解析 JS`src/usercode.ts`(由 `workflow.yaml``parse_card.code` 抽出,單一真相源 `lib/card-to-envelope.mjs`)。
## 兩觸發模式(共用同一 `processCard` 核心)
| 模式 | 觸發 | 行為 |
|---|---|---|
| **Phase 0 cron drain** | cron tick(見「開自走」)| `drainBatch(BATCH_SIZE)`Gitea tree 列卡 → 游標之後取一小批 → 逐卡 `processCard` → 進游標(到底**回捲**重掃)。壓 CF subrequest 下、撐得住 5,083 檔(每 tick 小批)。 |
| **穩態 webhook** | Gitea push webhook → `POST /webhook` | 只處理本次 commit 動到的 `system-dev/wiki/cards/**.md`delta),不重掃全庫。**Gitea→Cloudflare,非 GitHub Actions(不觸 D20**。 |
**冪等**:未改卡的 entry`page_name`+`content_hash`)與 triplet`source.uri`+`content_hash`)皆 skip;只有新/改卡真寫。游標存 KBDB 一個 `ingest_cursor` entry(走 API、零建表)。
## HTTP 路由
| 方法 | 路徑 | 用途 |
|---|---|---|
| GET | `/` | 健康 |
| GET | `/cursor` | 看游標狀態 |
| POST | `/drain?batch=N` | 手動觸發一批 drain= 一個 cron tick;驗收/補跑用) |
| POST | `/webhook` | Gitea push webhook 入口(delta |
| POST | `/cursor/reset` | 游標歸零(重新全 drain) |
## ⚠️ 非-auto(預設)
`wrangler.toml``[triggers] crons` **預設註解掉**——不自走排程、不無人值守亂寫。
drain 以 `POST /drain` 手動觸發(與 cron `scheduled` handler 同核心)。
要開自走 Phase 0 backfillleo 過閘後取消 `wrangler.toml` 那兩行註解再 deploy。
## 部署(wrangler 直推 leo21c,禁 acr update
```bash
cd registry/examples/km-wiki-ingest/drainer
npm install
npx wrangler deploy
# ★ 必須:設 Gitea 讀取權(Leo/notes 為 private repo)——此步需 leo 在互動模式跑(secret 寫入)
printf '%s' "$GITEA_TOKEN" | npx wrangler secret put GITEA_TOKEN
# 選填:webhook 簽章驗證
# printf '%s' "$WEBHOOK_SECRET" | npx wrangler secret put GITEA_WEBHOOK_SECRET
```
## Gitea webhook 設定(穩態 delta
`Leo/notes` → Settings → Webhooks → Add Webhook → Gitea
- Target URL`https://arcrun-km-wiki-drainer.leo21c.workers.dev/webhook`
- HTTP MethodPOSTContent-Type`application/json`
- TriggerPush events(可只限 `main`
- Secret:若設,同步 `GITEA_WEBHOOK_SECRET` secret(本 Worker 驗 `X-Gitea-Signature` HMAC-SHA256
- Gitea 的 ping event → Worker 回 `{ok:true,pong:true}`(測連通)
## config
- **vars**`REPO=Leo/notes REF=main OWNER=leo CARDS_ROOT=system-dev/wiki/cards GRAPH_KEY=leo BATCH_SIZE=2`
- **Service Bindings`[[services]]`**`SVC_CODE→arcrun-code``SVC_KBDB→arcrun-kbdb``SVC_GRAPH→kbdb-graph-plugin`
⚠️ 同帳號 worker-to-worker **必須走 Service Binding**`env.SVC_X.fetch()`)——直接 `fetch("https://arcrun-*.leo21c.workers.dev")`
會撞 **CF 1042**(同帳號 worker 互打限制)。Gitea`git.uncle6.me`,非 CF)才用 plain `fetch`
註:`wrangler dev` 本地 miniflare **不強制** 1042,故本地測會假綠 → 一律對部署後真端點驗收。
## 規模備註(5,083 檔)
- 列卡走 Gitea `git/trees?recursive=true`(一次全樹);若 `truncated`,回應標記 `truncated:true`
屆時換 tree 分頁列法(現況 notes 卡數小、不截斷)。
- 每 tick 只 `BATCH_SIZE` 張,游標續傳;到底回捲 → 全庫變更靠冪等於下一輪捕捉;
即時變更走 webhook。