Files
XuJiacheng 282f7268ed feat: 重构项目心跳数据结构并实现项目列表API
- 新增统一项目列表Redis键和迁移工具
- 实现GET /api/projects端点获取项目列表
- 实现POST /api/projects/migrate端点支持数据迁移
- 更新前端ProjectSelector组件使用真实项目数据
- 扩展projectStore状态管理
- 更新相关文档和OpenSpec规范
- 添加测试用例验证新功能
2026-01-13 19:45:05 +08:00

1.6 KiB
Raw Permalink Blame History

Context

命令下发从 Redis 队列模式迁移为 HTTP API 调用模式。

约束:

  • 输入约定来自 UI用户输入一行文本按空格拆分。
  • 需要通过 targetProjectName 将命令路由到目标项目的 baseUrl

Goals / Non-Goals

  • Goals

    • 控制台通过后端统一出站调用目标项目 API避免浏览器跨域/鉴权差异)
    • 统一请求格式,便于目标项目实现与观测
    • 明确失败行为(目标项目不可达/超时/非 2xx
  • Non-Goals

    • 不定义目标项目内部如何执行命令
    • 不在本次变更中引入鉴权体系(如需后续可另开 change

Decision: baseUrl mapping via env JSON

改为由目标项目的 Redis 心跳模块提供 apiBaseUrl

Heartbeat key

  • Redis key: ${projectName}_项目心跳
  • Redis type: STRING
  • Value: JSON string

示例:

{
  "apiBaseUrl": "http://127.0.0.1:4001",
  "lastActiveAt": 1760000000000
}

Liveness rule

  • 目标项目应每 3 秒刷新一次 lastActiveAt(毫秒时间戳)
  • 若后端检测到 now - lastActiveAt > 10_000,则视为离线并拒绝下发

Decision: request shape

  • UI 输入:<apiName> <arg1> <arg2> ...
  • 后端对目标项目调用:默认 POST ${baseUrl}/${apiName}
  • bodyJSON
{
  "commandId": "cmd-...",
  "timestamp": "ISO-8601",
  "source": "BLS Project Console",
  "apiName": "reload",
  "args": ["a", "b"],
  "argsText": "a b"
}

Timeouts / retries

  • 单次请求设置合理超时(例如 5s
  • 默认不重试(避免重复执行产生副作用);如需重试需目标项目提供幂等语义。