Skip to content

refactor: unify storage repo abstraction layer (panel/service repos bypass StorageContainer) #191

@nmhjklnm

Description

@nmhjklnm

问题描述

当前 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.pySQLitePanelTaskRepo
  • backend/web/services/cron_job_service.pySQLiteCronJobRepo
  • backend/web/services/monitor_service.pySQLiteSandboxMonitorRepo(×8 处)
  • backend/web/services/resource_service.pySQLiteSandboxMonitorRepo + upsert_lease_resource_snapshot
  • core/agents/registry.pySQLiteAgentRegistryRepo
  • core/tools/task/service.pySQLiteToolTaskRepo
  • sandbox/sync/state.pySQLiteSyncFileRepo

临时解决方案(当前已合并)

新增 backend/web/core/storage_factory.py,提供按 LEON_STORAGE_STRATEGY 选择 provider 的工厂函数。各 service 改为调用工厂函数,Supabase 实现已对应补全。

这是有意为之的技术债,功能可用,但架构不一致。

正确解法(Approach A)

  1. storage/contracts.py 补全 Protocol:PanelTaskRepo, CronJobRepo, AgentRegistryRepo, ToolTaskRepo, SyncFileRepo, SandboxMonitorRepo, ResourceSnapshotRepo
  2. storage/container.py 扩展 StorageContainer 加入上述 repos 的 strategy wiring
  3. backend/web/core/lifespan.py 注入到 app.state
  4. 服务层 改为接受 repo 参数,由 router 从 request.app.state 传入
  5. 删除 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/

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions