internal/workflow:directLastActivity 排除跨 issue 引用事件(#34)

同步 agents #34/#38/#40 三個停滯判定修補到 Go 端:

- Source 介面新增 IssueTimeline(GET /repos/{o}/{r}/issues/{n}/timeline,分頁),
  giteaapi.go 與 cmd/xcheck 同步實作
- 新增 directLastActivity:updated_at 晚於全部已知直接活動時拉 timeline 核對,
  排除 comment_ref/issue_ref 引用事件後取最晚;全為引用事件回退已知直接活動
  最晚時刻(agents #40);timeline 失敗保守沿用 updated_at
- considerIssue/considerPull 對自身 updated_at、childActivity 對子項 updated_at
  (含子項 created_at 入已知活動)套用同一排除邏輯(agents #38)
- 回歸測試:子項 updated_at 被引用刷新(TestRunStalledChildXrefRefresh)、
  timeline 全引用事件回退與拉取失敗保守路徑(TestRunStalledTimelineAllXrefFallback)
- 修正 workflow_test.go:timelines 須在 ScanStalled 呼叫前設定

驗證:go build/vet/test 全綠;xcheck 對真實 API 掃描,
stalled 輸出與 gitea.py(agents @ 78769ec)位元組一致(5833 bytes)。
This commit is contained in:
ceo
2026-09-12 15:10:31 +08:00
parent a2baf55fce
commit e4212b9c90
6 changed files with 262 additions and 20 deletions
+13
View File
@@ -150,6 +150,19 @@ func (a *APIClient) TryGetIssue(owner, repo string, number int64) (Issue, bool,
return issue, true, nil
}
// IssueTimeline 回傳 issue 的 timeline 事件(Source 面向;對應 gitea.py
// _direct_last_activity 拉取的 repos/{o}/{r}/issues/{n}/timeline)。
// 分頁由 ListAll 處理(與 gitea.py api_get_list 的 limit=50 逐頁一致)。
func (a *APIClient) IssueTimeline(owner, repo string, number int64) ([]TimelineEvent, error) {
var events []TimelineEvent
path := "/repos/" + url.PathEscape(owner) + "/" + url.PathEscape(repo) +
"/issues/" + strconv.FormatInt(number, 10) + "/timeline"
if err := a.Client.ListAll(context.Background(), path, gitea.ListOptions{}, &events); err != nil {
return nil, err
}
return events, nil
}
// MyOrganizations 委派 ListOrgs(Source 面向)。
func (a *APIClient) MyOrganizations() ([]string, error) { return a.ListOrgs() }