11 Commits

Author SHA1 Message Date
Estrella Pan
c0f5bc703a feat(plugins): 补上 wpush-notifier 的 sha256 2026-10-26 09:32:49 +01:00
Estrella Pan
f2f7d11b79 feat(plugins): 插件市场上架 wpush-notifier 2026-10-26 09:32:02 +01:00
Estrella Pan
28a718566c feat(plugins): 补上 apprise-notifier 的 sha256 2026-10-21 21:39:50 +02:00
Estrella Pan
a8958ace9d feat(plugins): 插件市场上架 apprise-notifier 2026-10-21 21:38:57 +02:00
Estrella Pan
478d48556a feat(plugins): 补上四个登记条目的 sha256 2026-10-21 11:37:20 +02:00
Estrella Pan
fa88482372 feat(plugins): 插件市场上架 run-command、strm-writer、synology-chat-notifier、slack-notifier 2026-10-21 11:35:58 +02:00
Estrella Pan
065fed1a5c fix(plugins): manual-pick 的 sha256 改为排除 web-src 后的 zip
PR 检查用的是 base 分支的 ab_sdk,那时 pack 还没有排除 web-src,
算出的 715b… 包含了前端源码。合并后构建得到 08caa4…。
2026-10-09 16:59:38 +02:00
Estrella Pan
cc2148204f fix(plugins): manual-pick 的 sha256 改用 Linux 上打出的值
签名在 Linux runner 上进行,带前端的插件在 macOS 上构建的字节与之不同。
2026-10-09 12:45:08 +02:00
Estrella Pan
2ed46695a2 feat(plugins): 条目以 sha256 绑定审查过的 zip
PR 检查打出的 zip 的 sha256 写进条目。合并后在独立 job 中重新打包的 zip、
签名 job 汇总的 zip(含复用的旧 zip)都必须与它一致才签名,构建在 PR 与
合并后产出不同字节时发布失败,不会签下未审查的内容。条目缺少或写错 sha256
时,PR 检查在摘要中给出应填的值。
2026-10-09 12:02:02 +02:00
Estrella Pan
eb1598c21e feat(plugins): 插件市场索引与签名发布流水线
- plugins/registry/<id>.toml 指向作者仓库的固定 commit(repo、commit、path)
- scripts/plugin_registry.py:check 在 PR 上校验改动的条目、运行作者测试、
  从 web-src/ 构建前端并写审查摘要;build 在合并后增量打包(commit 未变的
  条目复用已发布的 zip)
- plugin-registry.yml:check / build 不读 secret,sign 只用 PLUGIN_SIGNING_KEY
  签名,不运行作者代码;发布到 release plugins 并删除下架的资源
- 插件目录改用独立的插件公钥 ab_plugin_pubkey.pem,与在线更新密钥分开
- catalog 条目新增 authors、permissions、has_web、repo、commit、readme
- 6 个示例插件上架;上架文档(中 / 英 / 日)、PR 模板与 CODEOWNERS
2026-10-09 10:13:30 +02:00
Estrella Pan
e6d39e5624 feat: in-app notification center and LLM provider plugin framework
Two 3.3 platform features sharing core infra (notification events, DB
migrations/wiring, config model, API registration), committed together
because they cannot be split at file granularity without broken
intermediate builds.

Notification center:
- New `inboxmessage` table (migration 16) + repo with coalescing
  (unread rows with the same dedup_key increment a count; `once` kinds
  like update_available notify per-version) and 500-row pruning.
- SystemEvent contract (kind/severity/dedup_key/payload) with new
  DownloaderUnavailable / UpdateAvailable / UpdateApplied events;
  NotificationManager.send_event persists to the inbox first, then
  broadcasts to external providers only when notification.enable.
- SSE `notification` frames driven by an in-process revision counter;
  REST endpoints for list/unread-count/read/read-all/delete/clear.
- Wire-ups: qBittorrent auth now reports last_auth_error
  (credentials|banned|unreachable) and stops retrying rejected
  credentials to avoid a WebUI IP ban; the startup wait loop aborts
  early on credential errors and emits a notification; a 24h
  update-check tick surfaces new versions; apply/rollback emit results.
- WebUI bell + unread badge + dropdown inbox (severity, coalesce count,
  relative time, deep links), SSE-driven with a 30s poll fallback.

LLM provider plugin framework + subscription auth:
- LLMParser refactored to a thin facade over a provider adapter
  contract + registry; the three built-ins (openai/anthropic/gemini)
  move to adapters with zero behaviour change (existing tests unchanged).
- base_url presets for zai/minimax/deepseek/kimi (mainland + overseas)
  reusing the OpenAI-compatible adapter, with a json_object structured-
  output fallback for providers without json_schema.
- Downloadable signed plugins: catalog + installer clone the update
  system's ed25519 verify / zip-slip-guarded extract pipeline (unsigned
  refused, catalog signed against downgrade); versioned-module-name
  loader hot-loads without restart.
- Subscription auth: `llmcredential` table (migration 17) stores OAuth
  tokens server-side only (never sent to the frontend); device-flow
  auth runs a server-side polling task keyed by an opaque handle so the
  device_code stays off the wire; AuthExpiredError trips the breaker and
  notifies. Two grey-area device-flow plugins (github-copilot,
  codex-chatgpt) under plugins/, flagged at-your-own-risk.
- WebUI: grouped provider select (built-in/preset/subscription/
  downloadable), install with risk confirmation, device-flow connect
  dialog, connected-account chip.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FAxVyRwrY7z5NotTtgnwVs
2026-07-06 09:43:45 +02:00