Skip to content

Feature Epic: /serve + /serve-mcp 本地可编排入口(HTTP 注入 + MCP 对外) #35

@ARCJ137442

Description

@ARCJ137442

背景

当前 CLI/TUI 已具备 app-servermcp-server 能力,但缺少面向日常使用的会话内入口:

  • 缺少 /serve 一键把“本地 HTTP 请求 -> 当前会话输入注入”打通;
  • 缺少 /serve-mcp 一键对外暴露会话能力;
  • 用户需要手动切换命令与协议层,集成成本高。

当前结论(2026-03-09)

本项目以自用场景优先推进,不以跟随上游进度作为约束条件。
本 Epic 先落地 /serve MVP/serve-mcp 进入下一阶段单独细化与实现。

相关讨论沉淀:

阶段 1:/serve MVP(已锁定规格)

1) Slash 命令

  • /serve start [port]
  • /serve stop
  • /serve status
  • /serve(无参数:展示状态 + 用法)

行为:

  • 默认绑定 127.0.0.1
  • 指定端口冲突时自动回退可用端口;
  • start/stop/status 在任务运行中可用;
  • TUI 退出时 HTTP 服务自动停止(与 TUI 同进程强绑定)。

2) HTTP API(MVP)

  • POST /v1/input
    • JSON body: { "text": string, "mode": "normal" | "queue" | "steer" }
    • mode 缺省默认为 normal
    • 返回异步受理结果(含 requestId),不阻塞等待模型最终输出
  • GET /v1/health
  • GET /v1/status
    • 字段:running,boundHost,boundPort,activeThreadId,busy,queueDepth,startedAt

3) 输入语义

  • 路由到当前激活线程(同一 TUI 进程内);
  • mode=normal
    • idle:按普通用户输入提交;
    • busy:返回 409 Busy(提示改用 queue/steer);
  • mode=queue:忙闲均可,交由现有 queue 机制;
  • mode=steer:忙闲均可,交由现有 steer 机制;
  • HTTP 层不实现“覆盖旧消息”逻辑(保持 Codex 内部机制);
  • 无活动线程:409 NoActiveThread
  • 过载:429,返回 retryAfterMs + queueDepth

4) 安全边界(MVP)

  • 仅 localhost(127.0.0.1);
  • 不引入 token 鉴权;
  • 在 TUI 明确展示安全提示。

实施拆分(执行清单)

  • A. Slash 命令解析、状态输出、错误文案与 snapshot
  • B. Serve runtime(状态持有、启停、幂等、退出自动停服)
  • C. HTTP handlers(/v1/input/v1/health/v1/status
  • D. 错误模型与背压(400/409/429/500)
  • E. 与现有 queue/steer/active-thread 机制对齐
  • F. 测试(单测、handler 测试、集成场景、snapshot)

建议顺序:B -> C -> D -> E -> A -> F

阶段 2:/serve-mcp(后续)

后续单独 issue/子任务推进,重点包括:

  • 对外协议面(stdio/tcp)与能力边界;
  • thread 生命周期与多客户端策略;
  • tool surface(含 thread 可读能力)与权限确认流;
  • 与现有本地 app-server/mcp-server 能力边界对齐(以本仓库实现为准)。

验收标准(阶段 1)

  • /serve 可稳定接收本机 HTTP 并注入当前会话输入;
  • busy / no-thread / overload 错误码与提示符合已锁定语义;
  • TUI 中可观察服务状态、端口、基本请求状态;
  • stop/restart 可恢复,退出自动清理资源。

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions