问题描述
当前 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 → SQLitePanelTaskRepo
backend/web/services/cron_job_service.py → SQLiteCronJobRepo
backend/web/services/monitor_service.py → SQLiteSandboxMonitorRepo(×8 处)
backend/web/services/resource_service.py → SQLiteSandboxMonitorRepo + upsert_lease_resource_snapshot
core/agents/registry.py → SQLiteAgentRegistryRepo
core/tools/task/service.py → SQLiteToolTaskRepo
sandbox/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, ResourceSnapshotRepo
storage/container.py 扩展 StorageContainer 加入上述 repos 的 strategy wiring
backend/web/core/lifespan.py 注入到 app.state
- 服务层 改为接受 repo 参数,由 router 从
request.app.state 传入
- 删除
backend/web/core/storage_factory.py
验收标准
参考
现有模式 A:storage/container.py, storage/contracts.py
临时补丁:backend/web/core/storage_factory.py
Supabase 实现:storage/providers/supabase/
问题描述
当前 storage 层存在两套并行模式:
模式 A — 已有抽象层(核心 repos)
已覆盖:
LeaseRepo,TerminalRepo,MemberRepo,ThreadRepo,ChatRepo,ContactRepo等核心 repos。模式 B — 直接实例化(panel/service repos)
涉及文件:
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.staterequest.app.state传入backend/web/core/storage_factory.py验收标准
storage.providers.sqlite.*LEON_STORAGE_STRATEGY=supabase时所有 repo 均走 Supabasestorage_factory.py已删除contracts.py覆盖全量 repo Protocol参考
现有模式 A:
storage/container.py,storage/contracts.py临时补丁:
backend/web/core/storage_factory.pySupabase 实现:
storage/providers/supabase/