diff --git a/.gitea/workflows/agent-market-watch.yaml b/.gitea/workflows/agent-market-watch.yaml
index 93809434..3605e88d 100644
--- a/.gitea/workflows/agent-market-watch.yaml
+++ b/.gitea/workflows/agent-market-watch.yaml
@@ -496,11 +496,9 @@ jobs:
print(json.dumps(summary, ensure_ascii=False, sort_keys=True))
PY
- - name: Notify Telegram on actionable change or failure
+ - name: Summarize actionable change or failure
if: always()
env:
- TG_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }}
- OPENCLAW_TG_BOT_TOKEN: ${{ secrets.OPENCLAW_TG_BOT_TOKEN }}
TG_CHAT_ID: ${{ env.TELEGRAM_ALERT_CHAT_ID }}
JOB_STATUS: ${{ job.status }}
CANDIDATE_COUNT: ${{ steps.watch.outputs.candidate_count }}
@@ -533,22 +531,11 @@ jobs:
exit 0
fi
- TOKEN="${TG_BOT_TOKEN:-${OPENCLAW_TG_BOT_TOKEN:-}}"
- if [ -z "$TOKEN" ] || [ -z "${TG_CHAT_ID:-}" ]; then
- echo "Telegram secret missing; skip market watch notification."
- exit 0
- fi
-
python3 - <<'PY'
import os
- import urllib.parse
- import urllib.request
from datetime import datetime
- from html import escape
from zoneinfo import ZoneInfo
- token = os.environ.get("TG_BOT_TOKEN") or os.environ.get("OPENCLAW_TG_BOT_TOKEN")
- chat_id = os.environ.get("TG_CHAT_ID", "")
status = os.environ.get("JOB_STATUS", "unknown")
changed = os.environ.get("CHANGED_CANDIDATES") or "0"
queue = os.environ.get("INTEGRATION_QUEUE_COUNT") or "0"
@@ -571,31 +558,24 @@ jobs:
generated = datetime.now(ZoneInfo("Asia/Taipei")).strftime("%Y-%m-%d %H:%M")
title = "Agent Market Watch 需要複核" if status == "success" else "Agent Market Watch 執行失敗"
- message = (
- f"[{escape(title)}]\n"
- f"時間:{escape(generated)}\n"
- f"狀態:{escape(status)}\n"
- f"候選:{escape(candidates)};來源:{escape(sources)}\n"
- f"變動候選:{escape(changed)};整合佇列:{escape(queue)};來源失敗:{escape(failures)}\n\n"
- f"Review:已審 {escape(reviewed)};擋下整合 {escape(blocked)};成本批准需求 {escape(cost_approvals)};依賴批准需求 {escape(dependency_approvals)}\n\n"
- f"Discovery:unique repo {escape(discovery_repos)};需人工分類 {escape(discovery_manual)};新未分類 {escape(discovery_new)};已分類 {escape(classified_repos)};建議 watch {escape(recommended_watch_additions)}\n\n"
- f"Promotion:scorecard prescreen eligible {escape(watch_promotion_eligible)};priority upgrade approved {escape(watch_promotion_approved)};replay approved {escape(replay_candidates_approved)}\n\n"
- "政策:此 workflow 只建立市場觀察、整合審查、discovery intake/classification 訊號,不批准 SDK 安裝、付費 API、replay、shadow/canary 或 OpenClaw 取代。\n"
- f"Log:{escape(actions_url)}"
- )
- payload = urllib.parse.urlencode(
- {
- "chat_id": chat_id,
- "text": message,
- "parse_mode": "HTML",
- "disable_web_page_preview": "true",
- }
- ).encode()
- request = urllib.request.Request(
- f"https://api.telegram.org/bot{token}/sendMessage",
- data=payload,
- method="POST",
- )
- with urllib.request.urlopen(request, timeout=10) as response: # noqa: S310
- response.read()
+ lines = [
+ f"## {title}",
+ "",
+ f"- 時間:`{generated}`",
+ f"- 狀態:`{status}`",
+ f"- 候選 / 來源:`{candidates}` / `{sources}`",
+ f"- 變動候選 / 整合佇列 / 來源失敗:`{changed}` / `{queue}` / `{failures}`",
+ f"- Review:已審 `{reviewed}`;擋下整合 `{blocked}`;成本批准需求 `{cost_approvals}`;依賴批准需求 `{dependency_approvals}`",
+ f"- Discovery:unique repo `{discovery_repos}`;需人工分類 `{discovery_manual}`;新未分類 `{discovery_new}`;已分類 `{classified_repos}`;建議 watch `{recommended_watch_additions}`",
+ f"- Promotion:scorecard prescreen eligible `{watch_promotion_eligible}`;priority upgrade approved `{watch_promotion_approved}`;replay approved `{replay_candidates_approved}`",
+ "",
+ "政策:此 workflow 只建立市場觀察、整合審查、discovery intake/classification 訊號,不批准 SDK 安裝、付費 API、replay、shadow/canary 或 OpenClaw 取代。",
+ f"Log:{actions_url}",
+ ]
+ summary = "\n".join(lines) + "\n"
+ print(summary)
+ step_summary_path = os.environ.get("GITHUB_STEP_SUMMARY")
+ if step_summary_path:
+ with open(step_summary_path, "a", encoding="utf-8") as handle:
+ handle.write(summary)
PY