Commit Graph

481 Commits

Author SHA1 Message Date
jxxghp
72c8bff312 feat(music): preserve local covers and fall back after online scraping fails 2026-10-14 23:15:41 +08:00
jxxghp
13a58be2a6 feat(notifications): render structured results by channel capabilities 2026-10-14 08:05:41 +08:00
jxxghp
b82bbcb420 fix(webhook)!: guard unknown movie paths in transfer history
Recover Jellyfin deletion paths from webhook payloads or bounded server-scoped caches. Avoid querying deleted items and preserve TV season/series lookup behavior.

BREAKING CHANGE: Movie and unspecified-type history queries without a destination now return no records unless match_all_versions=True is explicitly requested.

Refs #6988
2026-10-13 23:48:10 +08:00
jxxghp
48cffca3a1 feat(transfer): aggregate successful notifications by batch (#6981) 2026-10-13 17:21:17 +08:00
jxxghp
98bd038623 fix(music): reconcile album completion and prevent duplicate downloads
Recover complete release coverage from successful local transfers and audio tags/CUE before subscription searches. Keep release-group and album boundaries, and reject completed torrent hashes before downloader submission.
2026-10-13 17:05:57 +08:00
jxxghp
86c7fccfd5 feat(subscribe): persist business activity with scoped details 2026-10-12 23:43:01 +08:00
jxxghp
99ef7e508b fix(indexer): support custom seeding and Unit3D bonus pages 2026-10-12 08:36:19 +08:00
jxxghp
bd1e6eb899 fix(agent): separate public API queries from bound user operations 2026-10-12 07:30:35 +08:00
jxxghp
7a853577d8 fix(subscribe): preserve original execution log content 2026-10-12 06:58:01 +08:00
jxxghp
391f55df40 feat(subscribe): add isolated execution logs with authorized streaming (#6963) 2026-10-11 22:18:37 +08:00
InfinityPacer
b174d3caf8 fix(testing): register runtime configuration in shared plugin bootstrap
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 20:56:48 +08:00
jxxghp
01301b887a fix(plugin): accept underscore IDs in instance validation (#6962) 2026-10-11 13:59:38 +08:00
jxxghp
e8d63f215c docs(architecture): sync workflow type debt low watermark 2026-10-11 07:45:25 +08:00
InfinityPacer
25aaf3a32b feat(plugin): add agent pet extension contract
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 04:08:15 +08:00
jxxghp
dd90883c5d fix(torrent): respect tracker rate limits and quota cooldowns
Recognize explicit JSON rate limits before torrent parsing and short retries. Preserve per-call quota errors through download preparation so subscription cooldowns cover the tracker window.

Refs #6950
2026-10-10 23:34:35 +08:00
InfinityPacer
3faa49fd7a fix(workflow): keep torrent contexts usable across persistence and filtering
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 18:44:19 +08:00
jxxghp
2b415cc1b9 fix(cli): unwrap MCP REST tool responses 2026-10-10 17:00:56 +08:00
jxxghp
b663825fe7 fix(plugin): recover dependencies without disabled constraints
Keep enabled host and clone sources in dependency recovery. Fall back to per-plugin requests while retaining ready and recovered manifest constraints, preserving original sources and cancellation ownership.

Refs #6943
2026-10-10 12:20:13 +08:00
jxxghp
d7db4cfc0b fix(plugin): serialize package swaps with imports (#6939) 2026-10-10 07:42:37 +08:00
jxxghp
9924e5e7ff fix(workflow): satisfy architecture gates for issue 6931 2026-10-09 23:58:33 +08:00
freeman
f3ad81b39e style: apply safe ruff auto-fixes and exempt startup late imports
Run `ruff check app tests scripts --fix` with the configured rule set
(E4/E7/E9/F/I): import sorting (I001), f-strings without placeholders
(F541), lambda/variable/unused-import cleanups that ruff marks safe.
Nine files whose only ruff debt sits next to pre-existing pylint
import-resolution errors (lazy exports, sys.path script imports) or
whose "unused" imports are reached through attribute access by tests are
left untouched so the changed-file pylint gate and the benchmark tests
stay green; their diagnostics remain in the baseline.

app/startup/lifecycle/__init__.py and app/main.py import business
modules after cache composition, import-path and stdio setup on purpose
(the source comments document the contract), so declare E402
per-file-ignores for them instead of adding per-line noqa.

Ruff ratchet watermark drops from 498 to 100; sync the baseline fixture
and the optimization checklist figure.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 13:29:09 +08:00
jxxghp
1c1db41222 Merge pull request #6926 from cwd0204/test/optional-downloader-stubs 2026-10-09 13:05:13 +08:00
freeman
2165475dd0 fix(security): throttle password login after repeated failures
The access-token endpoint accepted unlimited password attempts; the
only existing rate limiters are single-instance helpers for outbound
site requests. Add app/application/security/throttle.py, an in-memory
LoginThrottle keyed by (client address, normalized username) that locks
for 30s after five consecutive failures and doubles the lockout up to
15 minutes. The endpoint answers 429 with Retry-After while locked,
counts only real credential failures (an MFA challenge after a correct
password does not count), and clears the record on success.

X-Forwarded-For is deliberately not trusted because there is no
trusted-proxy setting; behind the bundled nginx all requests share one
address, so the key degrades to per-username throttling, which is the
dimension brute-force protection needs. Sync the dependency snapshot
and architecture metrics for the new module.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 12:01:04 +08:00
freeman
88641d4a7a test: stub optional downloader modules only when they are missing
test_chain_rate_limit.py and test_system_notification_dispatch.py
installed a bare qbittorrentapi/transmission_rpc/psutil ModuleType into
sys.modules at import time with sys.modules.setdefault. When either file
is collected before a test that imports the real package in the same
shard (for example tests/test_downloader_add_failure_message.py and its
TorrentDictionary import), the placeholder wins and collection fails
with "cannot import name ... (unknown location)". Any change to the test
file set reshuffles the six CI shards and can surface this.

Use app.testing.bootstrap.ensure_optional_stub, which keeps the real
module when it is installed, and convert both unittest.TestCase files to
pytest-native functions as the testing guide requires when touching a
TestCase file. Record the resulting lower Ruff watermark.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-09 11:58:51 +08:00
jxxghp
35d5cac84f fix(subscribe): validate TMDB conversion and sync architecture facts 2026-10-08 21:22:17 +08:00
jxxghp
70811b551e feat(music): optionally simplify written lyrics 2026-10-08 18:40:16 +08:00
jxxghp
6758633e01 docs(architecture): sync metrics for Milkie adapter 2026-10-08 17:56:07 +08:00
jxxghp
32d37fa8b4 feat(music): preserve per-task CUE recognition policy 2026-10-08 08:51:01 +08:00
ChantXu64
e5e2558585 feat(search): 订阅补全逐页搜索、断点续搜与资源页手动分页 (#6907) 2026-10-07 14:40:55 +08:00
jxxghp
6c9ebd01f3 fix(agent): close owned LLM clients with their lifecycle
Refs #6901
2026-10-07 09:18:40 +08:00
jxxghp
fb652c74f4 fix(music): 支持关闭 CUE 识别整理分轨音频 2026-10-05 17:15:14 +08:00
jxxghp
fa5fa33db1 fix(lyrics): normalize LRCLIB music metadata 2026-10-05 13:10:10 +08:00
LIN student
3bdf09dc6f fix(site): 非超级管理员读取订阅站点和域名详情时不返回认证字段
/site/rss 与 /site/domain/{site_url} 只依赖 verify_token,直接返回完整的
Site 模型,其中包含 cookie、apikey、token、rss。同模块的 /site/agent 已经
对非超级管理员剔除这些字段,/site/ 列表也要求 manage 权限,两个接口与之
不一致。

前端订阅编辑和工作流「获取种子」动作只用到站点的 id、name、is_active,
因此非超级管理员改为复用 _project_agent_site(include_secrets=False) 投影,
超级管理员保持原有完整字段。

read_rss_sites 的返回标注由 List[dict] 改为实际的 Site 或投影字典,site.py
的 mypy 债务减少 2(return-value、type-arg 各 1),已固化低水位并同步文档
指标。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 19:01:22 +08:00
jxxghp
c8869d4b89 fix(api): classify notification image transport route 2026-10-04 16:33:11 +08:00
jxxghp
03a285a2a6 fix(wechat): proxy douban notification images 2026-10-04 16:19:58 +08:00
jxxghp
3f206171e7 fix(feishu): apply image referer and proxy policy
Refs #6879
2026-10-04 12:23:08 +08:00
jxxghp
823423b2c9 fix(download): refresh expired signed torrent links
Refs #6878
2026-10-04 10:27:28 +08:00
jxxghp
fcf12a1e2f docs(architecture): sync music normalization dependency count 2026-10-04 09:04:09 +08:00
Cat
2a31b51687 fix(transfer): 整理规划的业务拒绝不再按系统错误告警 (#6868) 2026-10-03 23:03:15 +08:00
jxxghp
afa6a42a55 docs(architecture): sync mypy debt metric 2026-10-03 09:03:56 +08:00
jxxghp
118e2ef933 fix(notification): align scoped recipient routing 2026-10-03 01:00:21 +08:00
jxxghp
b33053e10f Merge remote-tracking branch 'origin/v3' into codex/optimize-pr-6849
# Conflicts:
#	docs/architecture-overview.md
#	docs/refactor/optimization-checklist.md
#	tests/fixtures/architecture/dependency-baseline.json
2026-10-02 22:06:27 +08:00
jxxghp
da932158bb docs: sync system version query type debt metrics 2026-10-02 14:11:26 +08:00
jxxghp
bdbc801e83 fix(agent): steer active channel conversations into new replies 2026-10-02 09:12:21 +08:00
jxxghp
6d6dc1991b docs(architecture): refresh dependency metrics 2026-10-01 17:51:19 +08:00
jxxghp
c7e6f02e3e chore(architecture): sync egress policy metrics 2026-10-01 17:38:41 +08:00
ranzhigg
fb8f283123 docs(architecture): sync transfer queue baseline 2026-10-01 13:00:46 +08:00
jxxghp
5741d3c56d docs(architecture): sync mypy debt metric 2026-10-01 12:52:44 +08:00
ranzhigg
0c9d8c9208 Merge upstream v3 into transfer queue PR 2026-10-01 12:51:06 +08:00
ranzhigg
56cf6fefe0 perf(transfer): bound queue snapshots for batch imports 2026-10-01 12:45:31 +08:00