jxxghp
4955b7b9ea
fix: harden backend isolation and execution safety
2026-10-16 09:11:28 +08:00
InfinityPacer
9181ad2b65
feat(community): serve community medals from the Wiki registry behind remote switches
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-15 22:28:58 +08:00
jxxghp
ea60ed0fd6
feat(community): recognize GitHub contributions and honor levels
2026-10-15 12:11:36 +08:00
jxxghp
72c8bff312
feat(music): preserve local covers and fall back after online scraping fails
2026-10-14 23:15: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
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
jxxghp
28e1cb3a2f
refactor: move site collector releases and sources to independent repository
2026-10-11 14:12:52 +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
63e30e453b
ci: preserve manual release summaries and raw changelog
2026-10-10 08:37:30 +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
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
e21d68496f
fix(torrents): use incremental cache for M-Team by default
...
Refs #6878
2026-10-04 10:46:49 +08:00
jxxghp
823423b2c9
fix(download): refresh expired signed torrent links
...
Refs #6878
2026-10-04 10:27:28 +08:00
jxxghp
754da97d97
fix(music): apply simplified metadata to manual transfers
...
Normalize album details and final music template fields while preserving local edition evidence, multi-artist credits and source objects. Refs #6870 .
2026-10-04 08:47:15 +08:00
jxxghp
bdbc801e83
fix(agent): steer active channel conversations into new replies
2026-10-02 09:12:21 +08:00
jxxghp
d85e8a2470
ci(docker): remove image scans and scan-driven runtime patches
2026-10-01 23:09:46 +08:00
jxxghp
1f79f4b558
Merge pull request #6844 from cwd0204/refactor/download-batch-phases
2026-09-30 22:25:12 +08:00
freeman
9eae3b9b83
refactor(download): split batch matching into explicit phases
2026-09-30 21:50:47 +08:00
freeman
ed0460fc8b
fix(smb): keep remote snapshots complete and recoverable
2026-09-30 21:19:41 +08:00
jxxghp
f803e6cc5c
feat(agent): add persistent Python read-only orchestration
2026-09-30 20:16:53 +08:00
jxxghp
fcd4cd1725
feat(agent): align execution guardrails with Hermes
2026-09-30 18:51:03 +08:00
jxxghp
864ac1892e
feat(agent): align background learning with Hermes
2026-09-30 17:45:39 +08:00
jxxghp
47d51c3630
feat(agent): align history recall with Hermes SQLite FTS5
2026-09-30 16:28:39 +08:00
InfinityPacer
4847813ca7
feat(sdk): expose Feishu event long connection to plugins
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-30 15:39:30 +08:00
InfinityPacer
4bd7e3dc04
perf(webpush): send Web Push with http-ece and py-vapid instead of pywebpush
...
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-09-30 13:20:00 +08:00
jxxghp
72fcd8413a
fix(music): verify artist aliases and preserve ambiguous identities
2026-09-30 11:42:23 +08:00
jxxghp
ee9fbf2264
feat(smb): mount multiple shares in one storage service
2026-09-30 11:27:24 +08:00
jxxghp
3a5486ae0d
feat(music): add bounded source fallback and verified album matching
2026-09-30 10:50:09 +08:00
jxxghp
61e9ef7d8e
fix(transfer): organize remote downloads on the SMB server
2026-09-30 10:36:56 +08:00
jxxghp
7e43ea9676
ci: replace line budgets with structural complexity gates
2026-09-30 07:36:53 +08:00
jxxghp
4a2ef75706
fix(music): retry transient recognition before freezing file operations
2026-09-30 06:36:04 +08:00
jxxghp
54591ac50e
feat(music): bound recognition requests and make lookup caches recoverable
2026-09-30 05:15:14 +08:00
jxxghp
ee3fe99d55
feat(music): organize trusted audio tags without online recognition
2026-09-30 01:57:05 +08:00
freeman
542f893123
fix(plugins): 启动时自愈被旧版本实现遮蔽的插件安装包根 ( #6718 )
2026-09-17 15:57:48 +08:00
jxxghp
0afc5e2349
fix(architecture): 同步模块迁移门禁引用
2026-09-16 07:01:10 +08:00
jxxghp
b99b4fe2c3
chore(architecture): 同步模块路径与质量门禁
2026-09-16 00:12:16 +08:00
Aqr-K
61aa3cd649
refactor(sdk): 插件契约基类迁入 SDK 并由 Compat 承接旧包根符号 ( #6701 )
2026-09-15 07:01:00 +08:00
Aqr-K
6ea1cc9433
fix(plugin): 插件降级重装时拒绝迁移树不认识的库 revision ( #6681 )
2026-09-14 07:01:32 +08:00
Aqr-K
d44480d739
Merge pull request #6666 from Aqr-K/feat/plugin-instance-target-enablement
...
feat(plugin): 插件实例默认调用目标与启停,未指定实例时不再兜底取第一个
2026-09-13 16:37:27 +08:00
Aqr-K
3d594ecee3
refactor(plugin): 插件配置改走独立通道,SystemConfig 不再按键值分支
...
插件配置此前借用 systemconfig 的 plugin.<实例ID> 单键,为了换表又在
SystemConfigOper 的 set/delete/load_snapshot 里按该前缀开分支。这是反向依赖:
一个对所有键一视同仁的通用键值存储被迫知道「插件」这个概念,读写路径依键值而
异,「这个键落在哪张表」只有读代码才说得清;规范方法按值加特例,也让此后任何新
键都要先确认自己会不会被拦截。
本次把插件配置整条链拆出,形状与本分支日志等级那条链一致:
- SystemConfigOper 整体回退到官方实现,与 f70d7c141 逐字节相同,对所有键一视同仁。
- 配置端口改按实例 ID 寻址:PluginStorage 新增 read_config / write_config /
async_write_config / delete_config,PluginConfigStore 去掉 key_prefix 与 _key,
不再有任何字符串键经过;plugin_exists 存在性规则、空键过滤与 force 语义不变。
- PluginInstanceOper 补齐读取与异步写入原语 get_config_data /
async_save_config_data,同步与异步共用同一份落库决策,避免两条路径对「值未变化
不写」和「建行用哪个源插件」各自分叉。
- _PluginBase 的 get_config / update_config 直连 PluginInstanceOper,方法名、签名、
返回与 docstring 不变;self.systemconfig 保留,插件读 SystemConfigKey 枚举值仍
然合法,插件公开面没有扩大。
插件直接用 SystemConfig 存取自身配置不予支持。它本就不是封装过的插件配置通道,
为它设计兼容或加守卫拦截,等于再把「插件」塞回通用存储里——那正是本次要拆掉的东
西。拆开后 plugin.<ID> 只是一个与插件无关的普通 systemconfig 键:迁移已经把旧的
plugin.* 行搬进插件实例表,读它拿到 None,写它会新增一条谁也不读的 systemconfig
记录,插件配置通道既不读也不写它,两边不会再有任何交叉。
代价是读取从内存快照变成一次按实例 ID 的主键查询。调用点都不在热路径上:宿主侧
只有插件启动/重载、配置表单接口与分身创建三处,插件侧 get_config() 惯例在
init_plugin 里取一次。写入侧没有变化,本来就是一次事务。
回归防线:新增用例断言 SystemConfigOper 对 plugin. 前缀没有任何特殊行为——写进去
就是一行普通 systemconfig 记录,读出来就是刚写的值,不会被路由到插件实例表。
兼容层零改动,三个 alembic 迁移一行未改。
2026-09-13 01:41:57 -04:00
Aqr-K
4dbb8b8204
feat(plugin): 插件配置与实例描述符迁入独立表
...
插件配置此前寄存在 systemconfig 的 plugin.<实例ID> 单键下,实例描述符则整份挤在
PluginInstances 这一个 JSON 键里,两者都不成立:
- plugin.<ID> 是裸字符串 key,而仓库规则本身禁止用裸字符串做 SystemConfig key,
只允许先定义 SystemConfigKey 枚举项;插件 ID 由用户安装决定,永远枚举不出常量。
条目数随安装量增长,混在系统设置表里会把主程序自己的设置项淹掉。
- 那个键存的其实是实例 ID,表里没有任何一列说得出它属于哪个插件,想列出某个插件
的全部实例配置只能靠字符串前缀去猜。
- 实例描述符整份读出再整份写回,改一个分身要重写全部分身。
改为 plugininstance 一实例一行:instance_id 与 source_plugin_id 构成身份,本体与
分身由两者是否相等派生而不设模式列——模式列会是这个等式的冗余副本,两者一旦失步
同一行就会在不同读取口被判成不同角色。展示信息与业务参数同存一行,属于同一个
生命周期,分表只会让建分身、删分身退化成两张表之间的协调问题。
读写路由落在 SystemConfigOper.get/set/delete,而不是在各个调用方各改一处:第三方
插件可能直接用 self.systemconfig.get("plugin.xxx") 读写自己的配置,只改
PluginConfigStore 与 _PluginBase.get_config/update_config 必然漏掉它们。路由只做
前缀识别,插入、更新与空本体行回收都委托 PluginInstanceOper,不在配置层重抄一遍。
PluginInstances 旧键迁移后不删,留作回滚依据,并以
SystemConfigKey.PluginInstancesImported 标志防止重复导入;判据不能是「表当前为空」,
否则用户把分身全部删光后,下次启动会把它们整批导回来。
迁移链:b2d4f6a8c1e3 -> 281965691a20(3.0.34 建表并搬描述符)
-> c4e1a7b9d2f6(3.0.35 加 config_data 并搬 plugin.* 配置)。
依赖基线与启动模块数随两个新模块重算,架构文档与数据库技能表目录同步登记新表。
2026-09-12 17:39:36 -04:00
jxxghp
66d288ffc2
feat(agent): isolate terminal task ownership
2026-09-11 03:12:16 +08:00
jxxghp
20d1aa2b49
feat(agent): align terminal shell and input control semantics
2026-09-10 11:00:24 +08:00
jxxghp
21e154d6d2
feat(agent): deliver browser screenshots as model-visible images
2026-09-10 02:17:01 +08:00