-
Notifications
You must be signed in to change notification settings - Fork 14
refactor: unify storage repo abstraction layer (panel/service repos bypass StorageContainer) #191
Copy link
Copy link
Open
Description
问题描述
当前 storage 层存在两套并行模式:
模式 A — 已有抽象层(核心 repos)
contracts.py(Protocol 定义)
↓
StorageContainer(统一工厂,strategy='sqlite'|'supabase')
↓
lifespan.py 注入 → app.state.member_repo / thread_repo / ...
↓
Router 通过 request.app.state 取用
已覆盖:LeaseRepo, TerminalRepo, MemberRepo, ThreadRepo, ChatRepo, ContactRepo 等核心 repos。
模式 B — 直接实例化(panel/service repos)
# task_service.py
def _repo():
return SQLitePanelTaskRepo(db_path=DB_PATH) # 直接 new,绕过抽象涉及文件:
backend/web/services/task_service.py→SQLitePanelTaskRepobackend/web/services/cron_job_service.py→SQLiteCronJobRepobackend/web/services/monitor_service.py→SQLiteSandboxMonitorRepo(×8 处)backend/web/services/resource_service.py→SQLiteSandboxMonitorRepo+upsert_lease_resource_snapshotcore/agents/registry.py→SQLiteAgentRegistryRepocore/tools/task/service.py→SQLiteToolTaskReposandbox/sync/state.py→SQLiteSyncFileRepo
临时解决方案(当前已合并)
新增 backend/web/core/storage_factory.py,提供按 LEON_STORAGE_STRATEGY 选择 provider 的工厂函数。各 service 改为调用工厂函数,Supabase 实现已对应补全。
这是有意为之的技术债,功能可用,但架构不一致。
正确解法(Approach A)
storage/contracts.py补全 Protocol:PanelTaskRepo,CronJobRepo,AgentRegistryRepo,ToolTaskRepo,SyncFileRepo,SandboxMonitorRepo,ResourceSnapshotRepostorage/container.py扩展StorageContainer加入上述 repos 的 strategy wiringbackend/web/core/lifespan.py注入到app.state- 服务层 改为接受 repo 参数,由 router 从
request.app.state传入 - 删除
backend/web/core/storage_factory.py
验收标准
- 所有 service 不再直接 import
storage.providers.sqlite.* -
LEON_STORAGE_STRATEGY=supabase时所有 repo 均走 Supabase -
storage_factory.py已删除 -
contracts.py覆盖全量 repo Protocol
参考
现有模式 A:storage/container.py, storage/contracts.py
临时补丁:backend/web/core/storage_factory.py
Supabase 实现:storage/providers/supabase/
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels