== Heicode integration (~41 endpoints across 5 modules) ==
- §2 ResourceBinding (5 endpoints) — resources.py / resource_grants.py
- §4 NewAPI metadata proxy (4 endpoints) — heicode_proxy.py + heicode_client.py
- §5 Agnet platform stub (12 endpoints, in-memory mock) — agnet_stub.py
- §6 Task orchestration (5 endpoints + 3 extension endpoints) — heicode_tasks.py
6.1-6.5: intent / list / get / answer / messages
6.6-6.8: execution / delivery / audit?tab=... (Slice 8/9/10)
- §7 SSE single channel + approvals (4 endpoints + 5 event types) —
heicode_events.py + event_bus.py
- §7.8.1 internal billing-provider PUT endpoint — auth.py (routes)
== Schema changes ==
- migrations/026 heicode_tasks (orchestration state)
- migrations/027 users.billing_provider (litellm | newapi switch)
- migrations/028 heicode_approvals (high-risk approval queue)
== Register transaction hardening (P0 + P1 + P2) ==
routes/auth.py register():
- Pre-existing P0: failed register returned IntegrityError str verbatim
(leaking SQL params + ~50 plaintext LiteLLM keys per attempt).
Now logs exc_info, returns {code: REGISTER_FAILED, message: ...}.
- Pre-existing P0: model dedupe — two ModelProvider rows with overlapping
supported_models (e.g. taiji/gpt-4o-mini in both taiji and azure providers)
collide on uq_tenant_model. seen_models set deduplicates within the loop.
- New P1: track created_litellm_keys; on any failure call delete_key() for
each — prevents remote orphan keys when DB rollback fires.
- New P1: replace verify_code with peek_verification_code at the start;
only call verify_code (which consumes) after commit succeeds. Failed
registrations no longer burn the user's one-shot code.
- New P2: narrow inner `except (LiteLLMClientError, Exception)` to just
LiteLLMClientError so SQLAlchemy errors bubble to the outer rollback
instead of being silently swallowed into a half-allocated 200 response.
- New P2: same narrowing on outer `except (AgentManagerError, Exception)`.
== Auth middleware ==
- app/auth.py: allow /api/auth/internal/billing-provider and
/api/auth/internal/approvals to bypass user JWT (service-token auth
via HEICODE_INTERNAL_SERVICE_TOKEN, validated in-route).
== Docs ==
- Heicode-接口契约文档.md v2.2 (41 endpoints + SSE schema + 6.6-6.8)
- Heicode-对接进度与待办.md (through §7.14 SSE + 7.8.2 delivery回执)
- Heicode-完整调用流程图.md (sequence + routing diagrams)
- Agent-Manager-Heicode对接需求文档.md
- HEICODE_API_INTEGRATION.md
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
81 KiB
Heicode ↔ mcp-server (Heicode Manager) 对接进度与待办
版本: v2.0
生效日期: 2026-05-08
对应 Heicode 主线: heicode.md / plan.md / heicode-runtime-auth-newapi-secret-design.md / integration/agnet-platform-request-contract.md
当前生产镜像: taiji.azurecr.io/mcp-server:heicode-tasks-20260508(arm64)
v2.0 重要变化(vs v1.0):
- ✅ P4 NewAPI 元数据透传 4 端点已上线(待 B-1 admin token 配置即真跑)
- ✅ P5 本地 stub 12 端点已上线(mock 数据,cc-haha 可立即联调)
- ✅ 任务编排 5 端点已上线(cc-haha 任务驾驶舱 / 工作台 直接切真)
- 当前已上线 mcp-server 端 34 个 Heicode 相关接口
- 全部端到端测试通过:登录 9/9 + P1 14/14 + P4 8/8 + P5 stub 20/20 + 任务编排 25/25
本文档汇总 mcp-server 侧已交付内容、未交付内容与原因,并明确每个待办项需要 Heicode 这边提供什么信息或决策。用于双方对齐进度、解锁阻塞。
📍 整体调用关系见
Heicode-完整调用流程图.md。
0. Heicode 项目真实组成(核实于 2026-05-05)
| 组件 | 物理形态 | 角色 | 与 mcp-server 关系 |
|---|---|---|---|
heicode/cc-haha/ |
Tauri 桌面应用 + Bun CLI | "Heicode 客户端"(用户编程入口) | 当前不直接调 mcp-server |
heicode/heicode/web/default/ |
React + Rsbuild SPA | NewAPI 自带管理 UI(用户进的那个) | ✅ 直接跨域调 mcp-server /login /me /refresh /logout |
heicode/heicode/ (Go 后端) |
Gin + GORM | NewAPI —— 模型网关 + 计费 + 用户/Token/Group | ✅ 调 mcp-server /me /refresh(验证前端给的 token) |
heicode/website/ |
Next.js | 极简市场页 | 与登录无关 |
结论:mcp-server 是事实上的主认证源。heicode 前后端都依赖 mcp-server 的 4 个登录接口;字段形态绝不能 breaking change。
1. 已交付(生产可用 ✅)
1.1 登录认证(4 接口)
| 接口 | 路径 | 状态 |
|---|---|---|
| 登录 | POST /api/auth/login |
✅ 上线,Heicode 可直接调 |
| 当前用户 | GET /api/auth/me |
✅ 上线 |
| 续期 | POST /api/auth/refresh |
✅ 上线 |
| 登出 | POST /api/auth/logout |
✅ 上线 |
对接文档: 已发给 Heicode 团队(见 integration/Heicode-登录接口对接文档.md,Heicode 仓库已收录)。
已通过的端到端测试: 9/9。包括限流(每 IP 5/min)、refresh token 类型校验、登出黑名单、审计日志。
1.2 P1 资源模型(9 接口)
依据:heicode.md §五、plan.md §P1。
| 接口 | 路径 | 用途 |
|---|---|---|
| 创建资源绑定 | POST /api/resources |
用户绑定 Git/SK/项目文档/云账号/云资源 |
| 列表 | GET /api/resources |
当前用户的所有绑定 |
| 详情 | GET /api/resources/{id} |
单个绑定 |
| 更新 | PUT /api/resources/{id} |
改 metadata/scope/secret_ref/status |
| 软删除 | DELETE /api/resources/{id} |
status=revoked |
| 创建授权 | POST /api/resource-grants |
把 binding 授给 role/agent |
| 列表 | GET /api/resource-grants |
当前用户的所有 grant |
| 详情 | GET /api/resource-grants/{id} |
单个 grant |
| 撤销 | DELETE /api/resource-grants/{id} |
status=revoked + revoked_at |
安全约束(已实现):
- 写入前递归扫描
metadata/constraints/permission_scope/allowed_actions,任何 key 包含password|token|secret|private_key|access_key|credential均返回 422RESOURCE_GRANT_SECRET_REJECTED - 例外:key 名为
secret_ref视为引用允许通过 - Grant 的
allowed_actions必须是对应 bindingpermission_scope的子集;否则 400RESOURCE_GRANT_INVALID - 跨用户访问别人的 binding/grant → 403
FORBIDDEN_SCOPE
已通过的端到端测试: 14/14。含敏感字段拒绝、子集校验、跨用户隔离、现有业务回归。
联调说明:Heicode 前端的"绑定资源 → 分配角色 → 部署"主流程,前两步现在就能调通。
2. 未交付项(按需点单)
每一项都列:是什么 / 为什么没做 / 需要 Heicode 提供什么 / 推荐 owner / 工作量预估。
2.1 P2 Secret Broker / Secret Store
是什么: 用户绑定 Git/云资源时,真实凭据(GitHub PAT、Azure key 等)由 Manager 后端的 Secret Broker 写入 Vault/OpenBao;Manager DB 只保存 secret_ref。
当前替代: P1 的 secret_ref 字段是普通字符串,前端写啥就存啥(推荐写 vault://... 占位)。没有真实 Vault 写入。
为什么没做:
- AKS 集群里还没部署 Vault/OpenBao
- 选型未拍板:Heicode 文档列了三个候选(HashiCorp Vault / Infisical / Azure Key Vault),各有取舍:
- Vault: 能力最全(Kubernetes Auth、动态密钥、TTL、Policy)
- Infisical: 体验好,多租户隔离待验证
- Azure Key Vault: Azure 优先时最易部署,但语义偏 KV 而非 Secret 治理
- 缺凭据获取流程:OAuth/GitHub App callback 流程没设计
需要 Heicode 提供 / 决策:
- ❓ Secret Provider 选型:Vault / Infisical / Azure Key Vault 三选一
- ❓ 部署位置:AKS 内 namespace
secret-store?独立 VM?Azure managed? - ❓ 凭据来源:用户在前端填表 vs OAuth 第三方授权 vs GitHub App
- ❓ 路径规范:
vault://secret/users/{user_id}/bindings/{binding_id}/resources/{resource_id}这种约定 OK 吗? - ❓ 轮换策略:是否支持 TTL / 自动轮换?由谁触发?
推荐 owner: mcp-server(Secret Broker 代码) + 基础设施团队(Vault 部署 + K8s Auth)
工作量预估:
- Vault 部署 + K8s Auth 配置:~3 天(基础设施)
- mcp-server Secret Broker 实现:~5 天(写入/读取/轮换/撤销 + 审计)
2.2 P3 Agnet AKS 身份接入
是什么: 子 Agent Pod 通过 K8s ServiceAccount + Workload Identity 拿身份;运行时只能访问被授权的 secret;不接收长期密钥。
为什么没做:
- 主要不在 mcp-server 范围:
- 涉及改 AKS 集群配置(Workload Identity)
- 涉及改 agent-manager 的 Pod spec 模板
- 涉及改子 Agent 容器的 entrypoint(启动后从 Vault 自取短期凭证)
- 依赖 P2:Vault 没就位前 Workload Identity → Vault 的桥接没法做
需要 Heicode 提供 / 决策:
- ❓ AKS Workload Identity 是否启用? 需要先在集群上配置 OIDC issuer + Federated Identity
- ❓ 子 Agent 镜像的 entrypoint 改造负责人? mcp-server 不出 Agent 镜像
- ❓ 资源授权 → K8s ServiceAccount 的命名约定?
- ❓ 是否区分 dev/staging/prod 三套集群?
推荐 owner: agent-manager 团队 + AKS 基础设施团队
工作量预估: ~1-2 周(含基础设施)
2.3 P4 NewAPI 解耦(Manager 拉取 NewAPI 元数据)
Heicode 团队 2026-05-07 修订(C 方案 — 两平台并存,详见完整调用流程图 §2.5):
模型调用实际有四条独立路径:
| # | 调用方 | 触发场景 | 走哪 |
|---|---|---|---|
| 1 | Heicode 客户端(桌面)+ heicode web 前端 | 用户实时交互式 chat / 写代码 | Heicode NewAPI(code.xinghanlab.com) |
| 2 | 子 Agent Pod(Heicode 用户部署的) | 任务执行时调模型,billing_context.provider="newapi" |
Heicode NewAPI |
| 3 | 子 Agent Pod(原生 taijiagent 用户部署的) | 任务执行时调模型,billing_context.provider 默认或 "litellm" |
taijiagent LiteLLM |
| 4 | mcp-server 进程内(embedding / 内部分类) | mcp-server 自身功能 | LiteLLM |
核心结论:
- LiteLLM 同时是 ① taijiagent 平台对其用户的产品级模型网关 + ② mcp-server 自己内部工具
- NewAPI 同时是 ① Heicode 平台对 Heicode 客户端用户的产品级网关 + ② Heicode 部署的 agent 计费网关
- 子 Agent 走哪条网关由 mcp-server 在
POST /api/agnet/deployments的billing_context.provider字段决定 - LiteLLM 与 NewAPI 不冲突,不需要替代/迁移
P4 真实任务:mcp-server 在控制台聚合费用展示时,把"路径 1+2 的 NewAPI 数据"和"路径 3 的 LiteLLM 数据"合并展示给用户。属于只读元数据查询 + 前端聚合。
具体要拿的元数据(heicode NewAPI 已就绪的接口):
| heicode 接口 | 用途 |
|---|---|
GET /api/user/self |
用户基础信息 + 余额 |
GET /api/user/self/models |
当前用户可用模型 |
GET /api/user/self/groups |
用户分组 |
GET /api/log/self/stat |
调用统计 |
GET /api/log/self |
调用日志 |
GET /api/data/self |
按日用量 |
GET /api/usage/token/ |
token 维度用量(用 access token 调) |
当前状态: mcp-server 还没调 NewAPI 拿元数据。元数据展示这块的 Manager UI 也还没建。
2.3.1 Heicode 团队对 4 个 ❓ 的答复(2026-05-07)
决策已定,可直接开工,无需再往返。
| # | 问题 | 答复 | 理由 |
|---|---|---|---|
| ① | 服务凭据方案(A pass-through / B service-token / C OAuth client) | B:mcp-server 持有 NewAPI service token,按 user_id 维度筛选 | mcp-server 是后端服务(不是用户代理);service token 性能好、不依赖每用户凭据;A 路径在长会话场景下 token 续期复杂;C 路径需要 NewAPI 实装 OAuth provider,工作量太大且短期不需要。Heicode 这边会用一个超级管理员 NewAPI access token 给 mcp-server 用,token 通过 OpenBao/Vault 注入 mcp-server pod 环境变量。token 命名建议:HEICODE_NEWAPI_SERVICE_TOKEN。 |
| ② | NewAPI base URL | https://code.xinghanlab.com(生产 / 唯一对外入口) |
该域名走 Cloudflare → Azure VM → heicode 容器,已上线生产。mcp-server 出站走公网即可(Azure→Cloudflare→Azure 同 region);如未来需要内网,再加 Azure Private Endpoint。 |
| ③ | Manager UI 范围(哪些元数据要展示) | 第一版只展示 4 项:① 余额(GET /api/user/self 的 quota 字段)② 当前可用模型清单(/api/user/self/models)③ 30 天用量汇总图(/api/data/self)④ 最近 50 条调用日志(/api/log/self?limit=50)。详细统计、token 维度用量、分组管理留到 v2。 |
与 heicode web 现有"用户中心"页对齐;mcp-server UI 不重复 NewAPI 自家功能,只做"聚合视图"差异化。 |
| ④ | 透传 vs 直连 | 透传(mcp-server 包一层 /api/user/heicode/*) |
三个理由:① 前端只对接一个域(mcp-server),不引入 code.xinghanlab.com 第三方域 → 简化 CORS;② 鉴权审计统一在 mcp-server;③ 未来如果 NewAPI 切换内网地址,前端零改动。 |
配套约定(Heicode 端落实):
- Heicode 这边创建一个专用的
mcp-server-service用户(role = admin),生成一个永久 access token - 该 token 走 OpenBao 注入 mcp-server pod 的
HEICODE_NEWAPI_SERVICE_TOKENenv - mcp-server 调 NewAPI 时,在 user-context 路由(如
/api/user/self)上需要按New-Api-User: <真实用户 id>头切换身份;需要 mcp-server 提前拿到本地users.id(即 from-agnet 流程里 syncLocalUserFromAgnet 返回的 id)
推荐 owner: mcp-server(透传层 + heicode_client.py) + 基础设施(OpenBao token 注入)
工作量预估(按 ① + ② + ③ + ④ 答复):
- mcp-server 加
HEICODE_NEWAPI_SERVICE_TOKENenv 读取 + heicode_client.py:~1 天 - mcp-server 透出 4 个
/api/user/heicode/*端点(balance / models / usage-30d / logs-recent-50):~1.5 天 - Manager UI 一页"用量与费用" 接入:~1 天(前端)
- 总计 ~3.5 天(比原 5 天压缩,因为 UI 只做 v1 范围)
2.3.2 还需 Heicode 进一步澄清的 2 个细节(不阻塞主开工)
Heicode 团队 2026-05-07 决策很完整,但落实到具体调用时还有 2 个二级问题没明示。P4 主路径可以先开工,这 2 个细节边做边对齐:
细节 ① mcp-server 怎么知道 heicode 那边的本地 users.id?
Heicode 决策 ① 说:"mcp-server 调 NewAPI 时按 New-Api-User: <真实用户 id> 头切换身份"。
但 from-agnet 流程是 heicode 后端调用 mcp-server,mcp-server 从未收到 heicode 那边给该用户分配的本地 id。候选方案:
| 方案 | 实现 | 取舍 |
|---|---|---|
(a) heicode 在 from-agnet 后回调 mcp-server 一个新接口 POST /api/auth/heicode-link {mcp_user_id, heicode_user_id} |
要双方都加接口 + 同步表 | 最干净,但工作量大 |
(b) mcp-server 用自己的 user_id(UUID)当 New-Api-User,NewAPI 那边把这个 UUID 当外部身份键,反查本地用户 |
NewAPI 这边 user 表加 external_id 字段;mcp-server 不需要知道 heicode local id |
最简单,但 NewAPI 数据模型要小改 |
| (c) mcp-server 调 NewAPI 时用 email 反查 heicode local id(多一次往返) | NewAPI 已有 GET /api/user/?email=xxx 即可(admin token) |
性能差,每次调 NewAPI 多一次查询 |
mcp-server 推荐 (b),因为:
- 已经在 from-agnet 流程里把
mcp-server.user.id作为id字段返给 heicode 了(/api/auth/me响应的data.id) - heicode 后端只需要在
syncLocalUserFromAgnet里把它存到users.external_id - 之后 mcp-server 调 NewAPI 时,
New-Api-User: <mcp_user_id_uuid>就能让 NewAPI 反查到正确用户
❓ 请 Heicode 团队答复:(a) / (b) / (c) 哪个?
细节 ② 子 Agent 部署时 mcp-server 怎么决定 billing_context.provider?
Heicode 决策里隐含:"Heicode 用户" → provider="newapi","taijiagent 用户" → provider="litellm"。但 mcp-server 内的 User 表当前没有"哪个平台来的"标识。候选方案:
| 方案 | 实现 |
|---|---|
(a) User 表加 billing_provider 字段(newapi/litellm,默认 litellm),from-agnet 流程同步时设为 newapi |
mcp-server 加字段 + from-agnet 时回填 |
(b) 看 user 是否从 syncLocalUserFromAgnet 路径来 → 推断 newapi。但 mcp-server 这边不知道 heicode 是否调过自己 |
不可行,信息缺失 |
(c) Channel 表加 default_billing_provider,channel-level 决策;user 沿用所属 channel 的默认 |
适合"按渠道分平台"的场景 |
(d) 统一一个新字段 User.platform ∈ {taijiagent, heicode},billing provider 由 platform 派生 |
概念更清晰,但加字段 |
mcp-server 推荐 (a) 或 (d),最简单。
❓ 请 Heicode 团队答复:(a) / (c) / (d) 哪个?或者 mcp-server 自己拍板?
这两个细节即使没立刻答复也不阻塞 P4 元数据查询主开工。可以先用占位方案(mcp-server 用自己 user_id 当
New-Api-User,子 Agent 默认走 LiteLLM),跑通主流程后再按 Heicode 答复回填。
2.4 P5 — Manager 侧 Agnet 出站客户端
是什么: mcp-server 实现 12 个出站调用,把 orchestration_plan 发给真实的 Agnet 平台。
对应 Heicode 文档: integration/agnet-platform-request-contract.md §2-§7。
为什么没做:
- 没有调用目标:Agnet 平台(agent-manager)还没实现 12 个新接口
- 调一个不存在的端点会全 404
- Heicode 文档自己说:"当前仓库提供 Manager 侧最小验证端点,生产 Agnet 平台部署尚未完成"
需要 Heicode 提供:
- ❓ agent-manager 端 12 接口实现的时间表(见 §2.6)
- ❓ Agnet 平台 base URL 和 Manager 服务令牌的 secret_ref(先用占位,等部署确定)
- ❓ 联调环境(staging)地址 vs 生产地址
推荐 owner: mcp-server(client 实现) — 等 agent-manager 接口落地后
工作量预估: ~3-5 天(client 类、错误码处理、重试、幂等键)
2.5 P5 — Manager 侧本地 stub 端点(✅ 2026-05-08 已上线)
是什么: 在 mcp-server 内挂载 12 个 /api/agnet/* 路由,返回 mock 数据,用于前端联调。
完成情况:
- 12 端点全部上线,字段形态严格按
agnet-platform-request-contract.md - 20/20 端到端测试 PASS(含 happy path + 5 错误码场景 + 幂等 + 跨用户隔离 + 业务回归)
- 镜像:
mcp-server:heicode-p5-stub-v2-20260508 - 见 接口契约 §5
实施过程发现的 1 个 bug 已修:原 reject_sensitive_keys 子串匹配会把 max_tokens 误判为敏感字段(包含 "token")。已改为按契约 §8.3 仅扫 metadata / constraints / audit 三个字段。
前端可立即用:cc-haha 任务执行联调 / heicode web 展示部署状态都能基于真实路径 + 字段形态对接。
2.7 任务编排 5 端点(✅ 2026-05-08 已上线)
是什么:cc-haha 任务驾驶舱(切片 7)+ 工作台 UI 配套。用户输入想法 → Heicode 追问 → 全部答完 → 生成任务卡。
端点:
POST /api/user/tasks/intentGET /api/user/tasksGET /api/user/tasks/{id}POST /api/user/tasks/{id}/answerPOST /api/user/tasks/{id}/messages
完成情况:
- 5 端点全部上线,字段形态严格对齐
cc-haha/desktop/src/stores/heicodeTaskStore.ts - DB 表
heicode_tasks已建(migration 026) - 25/25 端到端测试 PASS(含状态机、跨用户隔离、错误码 INVALID_OPTION/QUESTION_NOT_FOUND/NOT_FOUND/FORBIDDEN_SCOPE)
- 镜像:
mcp-server:heicode-tasks-20260508 - 见 接口契约 §6
MVP 编排器为确定性模板(不依赖 LLM):
- 初始 followups:scope(mvp/polish/prod-高风险)+ tech(modern_web/py_backend/let_heicode)
- 全答完 → 用 answers 填模板生成 TaskCard
- 后续可加 LLM 增强(用 LiteLLM 生成更智能 followups),前端 0 影响
cc-haha 可立即从 mock 切真:把 heicodeTaskStore.ts 里的 seeded 数据替换成 5 个端点调用即可。
2.6 P5 — agent-manager 12 接口实现(不在 mcp-server)
是什么: 真正在 Agnet 平台(agent-manager 服务)实现:
| 接口 | 必要性 |
|---|---|
POST /api/agnet/deployments 创建子 Agent 部署 |
必需 |
GET /api/agnet/deployments[/{id}] 部署列表/详情 |
必需 |
POST /api/agnet/deployments/{id}/stop 停止 |
必需 |
GET /api/agnet/deployments/{id}/logs 日志(脱敏) |
必需 |
GET /api/agnet/deployments/{id}/logs/stream 实时 SSE |
可选 |
GET /api/agnet/projects/{binding_scope}/dashboard-snapshot 监控 |
必需 |
GET /api/agnet/deployments/{id}/metrics 指标 |
建议 |
GET /api/agnet/deployments/{id}/events 事件 |
必需 |
GET /api/agnet/audit-logs 审计 |
必需 |
POST /api/agnet/sk-snapshots/resolve SK 解析 |
必需 |
GET /api/agnet/deployments/{id}/sk-snapshots SK 查询 |
必需 |
为什么没做: 不在 mcp-server 代码库。这是 agent-manager 团队的工作。
需要 Heicode 提供:
- ❓ agent-manager 团队的对接负责人
- ❓ 预计开发周期
- ❓ 联调环境地址
推荐 owner: agent-manager 团队
工作量预估: ~1-2 周(含 K8s API 集成、日志聚合、SSE 推送、metric 管道)
3. 已知小尾巴(透明化,不是 P1 引入)
3.1 Channel 登录的审计日志写入失败
现象: Channel 角色登录(如 66@66.com)成功后,audit_logs 表插入因 FK 约束失败:
ForeignKeyViolationError: Key (user_id)=(channel_uuid) is not present in table "users".
当前行为: 失败被 try/except 兜住,记 warning 日志。登录 200 正常返回,业务零影响。
根因: 上一轮 heicode-auth-fix2 加审计日志时,channel 登录的 result_user_id 用了 Channel.id,但 audit_logs.user_id 外键指向 users.id。
修复方案(小,待排): channel 登录时 result_user_id=None,或扩展 audit_logs 支持 subject_type 区分 user/channel。
影响: channel 登录的审计日志暂时不入库,只在 mcp-server 应用日志里有 warning。User 角色(即 Heicode 客户端登录)正常入库。
3.2 Heicode 文档与现有代码的边界差
Heicode 主线文档(2026-05-04)明确:
- 不再以
tenant/project作为产品/认证/扣费主轴 - 用
user_id+channel_id+binding_scope+resource_grants表达边界
mcp-server 现有代码层面仍存在:
tenant_id字段(在external_toolkits.tenant_id等地方,当前业务仍在使用)Channel表(保留,作为分销渠道实体)
对齐做法(已落地):
- 新接口(P1 资源模型)不引入 tenant_id
agnet-platform-request-contract中的metadata.tenant_id/metadata.project_id标记为 legacy 兼容字段,新功能不依赖User.channel_id继续作为身份载体,对外作为user_context.channel_id透传
Heicode 不需要做什么:现有 mcp-server 业务(渠道后台、超管、用户中心)继续维护 channel/tenant 概念,不影响 Heicode 客户端。
4. 联调建议(按可执行顺序)
| 步骤 | 行动 | 阻塞解除条件 |
|---|---|---|
| 1 | Heicode 客户端实装 4 个登录接口 | 无(现在就能做) |
| 2 | Heicode 客户端实装资源绑定 UI | 无(现在就能做,调 9 个 P1 接口) |
| 3 | mcp-server 实现 P5 本地 stub | 等 Heicode 确认(1-2 天能交付) |
| 4 | Heicode 客户端基于 stub 联调"绑定 → 角色 → 部署"完整流程 | 步骤 3 完成后 |
| 5 | 产品决策:NewAPI 还是 LiteLLM 等价 | 决策后排工程 |
| 6 | 基础设施:Vault 部署 + 选型 | 决策后部署 |
| 7 | mcp-server P2 Secret Broker | 步骤 6 完成后 |
| 8 | agent-manager 团队实现 12 接口 | 排期 |
| 9 | mcp-server P5 出站 client | 步骤 8 完成后 |
| 10 | P3 AKS Workload Identity + Pod 改造 | 步骤 6+8 完成后 |
最快产生价值的路径:1 → 2 → 3 → 4。前四步完全不依赖 Heicode 之外的任何方,两周内可联调全主流程(基于 stub)。
5. 联调环境
生产 mcp-server 入口: https://apimtaiji.azure-api.net/api/mcp/api/...(经 Azure APIM 网关)
测试账号(仅联调用):
| 角色 | 邮箱 | 密码 |
|---|---|---|
| 普通用户 | 55@55.com |
By@123456. |
| 渠道管理员(不给 Heicode 用,留给现有业务) | 66@66.com |
66 |
| 超级管理员(同上) | superadmin@taiji-ai.com |
Admin@123456 |
Heicode 客户端固定使用 role="user" 登录。
6. 联系与反馈
如对接过程发现接口行为与文档不一致:
- 请附
X-Request-Id头值(如未传,附完整 URL + Body + 响应 + 时间戳) - mcp-server 后端可按
X-Request-Id反查日志和审计
如需 Heicode 这边对未实现项做决策(见 §2 各项末尾的 ❓),请直接答复或在 Heicode 仓库新建 issue。
7. Heicode 团队答复(2026-05-07)
回复人:Heicode 客户端 / Manager 侧 范围:本文档 §2 列出的 18 项 ❓ 决策点 + §2.4 P4 NewAPI vs LiteLLM 表述澄清 状态:本节是答复,不是规范;规范以 Heicode 仓库
docs/下原始设计为准
7.1 立即可定的(10 条)
| # | 原问题位置 | 答复 |
|---|---|---|
| 1 | §2.1 Secret Provider 选型 | HashiCorp Vault。理由:Heicode 上游 heicode.md §六 把它列在第一位,K8s Auth/TTL/Policy 能力最全,与 §五的"密钥不能进入客户端,由 Manager 统一托管"路径最契合 |
| 2 | §2.1 部署位置 | AKS 内独立 namespace secret-store。与 Agnet 同集群、内网通路;不暴露公网(参见 deployment/azure-production-deploy-guardrails.md) |
| 3 | §2.1 凭据来源 | 优先 OAuth / GitHub App,前端表单作为兜底。GitHub App 路径符合 §1.2 P1 secret_ref 不接收明文的安全红线 |
| 4 | §2.1 secret_ref 路径规范 | OK。vault://secret/users/{user_id}/bindings/{binding_id}/resources/{resource_id} 与 agnet-platform-request-contract 中 permission_manifest.resource_grants[].secret_ref 示例完全一致 |
| 5 | §2.1 轮换策略 | Vault 原生 TTL + Pod 启动时 K8s Auth 自动续期。无需 Manager 显式触发轮换 |
| 6 | §2.2 K8s ServiceAccount 命名 | sa-{role}-{user_id_short_hash}(与 Agent-Manager-Heicode对接需求文档.md §4.1 一致)。短哈希取 user_id sha1 前 8 位 |
| 7 | §2.4 NewAPI vs LiteLLM | 两个并行平台各有网关,不替代不冲突。LiteLLM 是 taijiagent 平台对其用户的产品级模型网关;NewAPI 是 Heicode 平台对其用户的产品级模型网关;两边共用 mcp-server 账号。详见 §7.3 |
| 8 | §2.5 是否做 P5 本地 stub | 立即做。这是 Heicode 客户端联调任务驾驶舱主流程的前置;本文档自己也建议优先(详见 §7.5 第 2 项已升级为阻塞) |
| 9 | Agent-Manager 文档 §2.1 服务令牌方案 | (A) Pre-shared bearer 起步,后期升 (C) Workload Identity。与 mcp-server 自己的建议一致 |
| 10 | §2.2 子 Agent 镜像 entrypoint 改造负责人 | agent-manager 团队。Heicode 不出 Agent 镜像;Pod 启动逻辑、Vault 拉取流程均归 agent-manager |
7.2 需团队/基础设施侧讨论后再定(8 条,先记账)
| # | 原问题位置 | 当前判断 | 等谁 |
|---|---|---|---|
| 11 | §2.2 AKS Workload Identity 启用 | 必须启用(Heicode 安全设计依赖) | 基础设施团队排期 |
| 12 | §2.2 dev/staging/prod 集群分隔 | 至少 staging + prod;dev 复用 staging | 基础设施团队 |
| 13 | §2.4 如选 NewAPI 实体如何部署 | 见 §7.3 —— 当前不强制迁移 | — |
| 14 | §2.5/§2.6 agent-manager 12 接口时间表 | 参考其文档 §7,预计 3-4 周闭环 | agent-manager 团队回复 |
| 15 | §2.5 Agnet 平台 base URL + 服务令牌 secret_ref | 待 staging 部署落地 | agent-manager 团队 |
| 16 | §2.6 联调环境地址 | 建议 staging-agnet.xinghanlab.com / agnet.xinghanlab.com |
agent-manager 团队 |
| 17 | §2.6 agent-manager 团队对接负责人 | — | 项目管理 |
| 18 | §2.6 agent-manager 开发节奏 | 按其 §7 phase | agent-manager 团队 |
7.3 §2.4 P4 表述澄清:C 方案 — 两个并行平台 + 子 Agent 网关由 billing_context 决定
⚠️ Heicode 团队 2026-05-07 三次修订(最终版)。本节经历的版本:
- v1(已撤回):"LiteLLM 是 mcp-server 进程内细节" — 否定了 LiteLLM 的产品级地位
- v2(已撤回):mcp-server 团队 §2.3 改写为 "子 Agent 全部走 NewAPI" — 忽略了原生 taijiagent 用户场景
- v3(已撤回):Heicode 反向修订为 "子 Agent 全部走 LiteLLM" — 忽略了 Heicode 用户部署 agent 的场景
- v4(本版,最终):C 方案 — 子 Agent 网关由
billing_context.provider字段决定,两条路径并存。已被 mcp-server 团队最新 §2.3 采用。
架构(C 方案):
| 平台 | 组成 | 自家产品级模型网关 |
|---|---|---|
| taijiagent | mcp-server + agent-manager + LiteLLM | LiteLLM |
| Heicode | Heicode 客户端(桌面)+ heicode web(浏览器)+ heicode 后端(NewAPI) | NewAPI |
两个平台共用 mcp-server 的账号体系,模型网关各自独立。
四条独立的模型调用路径:
[路径 1] Heicode 客户端(桌面)+ heicode web(浏览器)用户实时交互式 chat
→ Heicode NewAPI (code.xinghanlab.com) → 上游 LLM
[路径 2] 子 Agent Pod (Heicode 用户部署的,billing_context.provider="newapi")
→ Heicode NewAPI (带 newapi_user_ref / newapi_group) → 上游 LLM
[路径 3] 子 Agent Pod (原生 taijiagent 用户部署的,billing_context.provider 默认或 "litellm")
→ taijiagent LiteLLM → 上游 LLM
[路径 4] mcp-server 进程内功能 (embedding / 内部分类)
→ LiteLLM (mcp-server 自用)
关键事实:
- LiteLLM 同时承担两种角色:① taijiagent 平台对其用户的产品级模型网关(路径 3)+ ② mcp-server 自身内部工具(路径 4)
- NewAPI 同时承担两种角色:① Heicode 平台对 Heicode 客户端 / heicode web 用户的产品级网关(路径 1)+ ② Heicode 用户部署的 agent 计费网关(路径 2)
- 子 Agent 走哪条网关由 mcp-server 在
POST /api/agnet/deployments的billing_context.provider字段决定 - 路径 2 和路径 3 共用同一套 agent-manager + AKS Pod 基础设施,只是计费网关不同
P4 真实任务(mcp-server 控制台聚合费用面板):
| 数据来源 | 适用场景 | 数据获取 |
|---|---|---|
| mcp-server 自己的 LiteLLM 计费记录 | 路径 3 + 路径 4 | mcp-server 直接读自己 DB |
| Heicode NewAPI 元数据 | 路径 1 + 路径 2 | mcp-server 通过 app/heicode_client.py 调 code.xinghanlab.com 的只读接口 |
聚合后给用户展示统一费用面板。详细 4 个 ❓ 答复见 §2.3.1。
P4 不需要做的:替换 / 迁移 LiteLLM。
理由参考:
- 上游
heicode.md §八:NewAPI 是 "Heicode 平台的内部模型网关与计费服务,后台不对普通用户开放" —— Heicode 平台范围内 - 上游
vision-heicode-full-stack-agentic-dev.md把 Heicode 定位为"全栈 agentic dev"产品,借用 taijiagent 的 mcp-server(认证)+ agent-manager(执行);不要求 LiteLLM 改成 NewAPI - LiteLLM 在 Heicode 上游设计文档中完全不出现 —— 是 taijiagent 平台的产品级网关,不是 Heicode 的组件
agnet-platform-request-contract.mdbilling_context.provider="newapi"是 Heicode 预设接入方式;taijiagent 平台目前不接受这个 provider,agent 全走 LiteLLM
7.4 Heicode 客户端当前对接状态(2026-05-08 修订)
术语澄清:本文中的 "Heicode 客户端" 即仓库内
cc-haha/desktop/目录构建出的 Tauri 桌面端。cc-haha是历史 fork 上游的目录名,对外 措辞统一用 Heicode 客户端,下文文件路径中的cc-haha/...仍保留 因为是物理目录。
⚠️ 2026-05-08 重要修订:在
docs/product-package/(14 份产品文档落地)后, 客户端 / Manager 边界重新划线。08-client-guide.md §1-7 明确 客户端不承担 资源绑定 / 权限分配 / 账号与安全 / Agnet 部署 — 这些全部移到 Manager。 Heicode 客户端在切片 5(commit4827682)下线了之前实装的 Resources UI 全套。
登录链路(不变,✅ 已验证)
1. POST apimtaiji.azure-api.net/api/mcp/api/auth/login (mcp-server)
Body: {email, password, role: "user"}
→ 200 {token, refreshToken, user{id, email, role, channelId}}
2. POST code.xinghanlab.com/api/user/session/from-agnet (heicode 后端)
Body: {access_token, refresh_token}
→ 200 + Set-Cookie: session
3. GET code.xinghanlab.com/heicode/oauth/authorize?... (heicode 后端)
Headers: Cookie + New-Api-User
→ 302 Location: ...?token=sk-XXX
4. NewAPI sk- token 用于后续所有 /v1/messages、/v1/models 调用
测试号 55@55.com / By@123456. 端到端实测通过;channelId 6e6fc470-... →
/v1/models 返回 28 个真实模型。
Heicode 客户端当前已实装的产品级 surface(按产品包 wireframe)
| Surface | wireframe 章节 | 实装状态 | 数据通道 |
|---|---|---|---|
| 极简登录页(品牌 + 邮箱+密码 + tagline) | §1 | ✅ commit f08119f |
Path A(已用真接口) |
| 高危审批弹窗(任务 / 操作 / 资源 / 角色 / 影响 / 凭证 / Heicode 建议 / 三按钮) | §9 | ✅ commit f08119f |
mock(window.__heicodeMockApproval() 触发) |
| 任务驾驶舱首页(intent prompt + 最近任务 + Manager 辅助提示) | §2 | ✅ commit a268079 |
mock(seeded 2 个任务) |
| 任务工作台(对话流 + 追问 chip + 任务卡 panel) | §3 | ✅ commit a268079 |
mock(seeded 对话 + 已选答案) |
| token 持久化(mcpAuth schema + 24h refresh) | — | ✅ 保留 | Path A 登录后自动写入 |
| 高级黑主题 + H 电路 logo + Win 自绘窗框 | 02 / 11 §1 | ✅ | — |
Heicode 客户端已下线(按产品包 08 §1-7 客户端边界)
| Surface | 状态 | 原因 |
|---|---|---|
| 资源绑定 CRUD 页面(之前 9 接口对接 + Modals) | ❌ 下线(commit 4827682) |
产品包 08-client-guide.md 客户端不承担资源绑定 |
| Resource Grants UI | ❌ 下线 | 同上 |
| 模型 provider 配置页面 | ❌ 下线 | 产品包 08 客户端不出现"模型提供方配置" |
| ClawdRouter 备选登录 | ❌ 下线 | 产品包"登录目标只有 Heicode" |
/api/heicode-resources/* 本地代理 |
❌ 下线 | 客户端不再调 P1 接口 |
cc-haha-provider/env/original-settings 三级 fallback |
❌ 下线 | 产品包要求强制走 Heicode 登录 |
资源绑定 / 权限 / 部署 等 surface 应由 heicode web (
code.xinghanlab.com) 承担,Heicode 客户端通过任务卡里的 "去 Manager 准备" 按钮跳转过去。
Heicode 客户端等 mcp-server 接口的清单
| 等的接口 | 用途 | mock 现状 | 阻塞优先级 |
|---|---|---|---|
| 任务编排(intent → followups → manifest → status) | 把任务驾驶舱 mock 换成真数据 | seed 2 个任务 + 浮于内存 | 🔴 高 — UI 已搭好等接口 |
| 高危审批分发(推送通道) | 把 __heicodeMockApproval 换成真订阅 |
仅 DevTools 触发 | 🔴 高 — UI 已搭好等接口 |
/api/user/heicode/* 元数据(§2.3.1) |
客户端右上角顶栏显示余额 / 模型 | — | 🟡 中 — 产品包没强制要求客户端展示 |
| P5 Agnet 12 接口(stub) | 任务执行反馈 + 交付结果面板 | 未做(切片 8/9 待启动) | 🟡 中 — 等 stub 后做 |
7.5 反向请求 mcp-server 团队配合的事项(2026-05-08 修订)
-
建议本文档第 §2.4 节按 §7.3 改写,避免"等价于"导致后续团队误解为替代关系
-
🔴 P5 本地 stub —— 现在已升级为「阻塞 Heicode 客户端联调」:Heicode 客户端在切片 7 把任务驾驶舱 + 工作台 UI 全做完了,现在卡在 mock 数据阶段。stub 出来当天就能联调全主流程(intent → 追问 → 任务卡 → manager 跳转 → 状态轮询)。原本 1-2 天交付;建议立刻排期。
-
APIM 网关 CORS / IP 白名单:Heicode 客户端通过本地 Bun server 调
apimtaiji.azure-api.net,请确认无 IP 白名单限制(当前实测从北京 / Azure 香港均可达) -
channelId双重含义建议二选一或加字段名区分:- "渠道身份" 用
channelId - "NewAPI user/group 映射" 用
newapi_user_ref/newapi_group(与agnet-platform-request-contract一致)
- "渠道身份" 用
-
🆕 任务编排 API 契约设计 —— 产品包 14 份文档没有对应技术契约,但客户端已按 wireframe §2-§3 把字段全设计好。请 mcp-server 团队确认这套字段形态或提供你们的接口契约让客户端对齐,否则等接口出来 UI 字段对不上要重做。客户端当前用的字段(见
cc-haha/desktop/src/stores/heicodeTaskStore.ts):type HeicodeTask = { id: string name: string status: 'draft' | 'configuring' | 'running' | 'awaiting_approval' | 'completed' | 'failed' | 'paused' status_caption?: string // 状态副标题,"后端实现中" / "等待生产部署审批" created_at: number; updated_at: number intent: string // 用户原始想法 thread: ChatTurn[] // 对话流(用户 + Heicode) card?: TaskCard // 任务卡(可空,等 Heicode 整理出来) } type ChatTurn = | { kind: 'user'; text: string; at: number } | { kind: 'heicode'; text: string; at: number; followups?: FollowupQuestion[] } type FollowupQuestion = { id: string; question: string options: Array<{ id: string; label: string; risk?: 'high-risk' }> answer?: string // 用户选了哪个 option id } type TaskCard = { goal: string // "做一个面向小团队的任务协作 SaaS。" scope: string[] // bullet 列表 generated_artifacts: string[] // ["产品说明", "原型描述", ...] manager_actions: Array<{ label: string; deeplink: string }> }预期的 API 形态(建议 mcp-server 实装):
POST /api/user/tasks/intentbody{ intent }→ 返回新建 Task(含初始 followups)GET /api/user/tasks→ 返回用户的任务列表GET /api/user/tasks/{id}→ 返回单个 TaskPOST /api/user/tasks/{id}/answerbody{ question_id, option_id }→ 更新 followup 答案,可能触发新一轮 Heicode 追问POST /api/user/tasks/{id}/messagesbody{ text }→ 用户继续追加要求
-
🆕 高危审批分发机制 —— Heicode 客户端已实装 ApprovalDialog(wireframe §9 全字段对齐),现在 mock 用
window.__heicodeMockApproval()触发。请 mcp-server 团队选定推送通道:方案 优点 缺点 (A) SSE — GET /api/user/approvals/stream实时;浏览器/桌面通用 mcp-server 要管 SSE 心跳 (B) 短轮询 — GET /api/user/approvals/pending(5-15s)简单;无状态 延迟;高频负载 (C) WebSocket 双向;可顺便推任务状态 协议更重 建议 (A) SSE 起步(mcp-server 已经在用 FastAPI,加 SSE 简单)。 推送的 ApprovalRequest 字段对齐客户端类型:见
cc-haha/desktop/src/stores/approvalStore.ts:ApprovalRequest。 -
🆕 确认资源绑定 UI 由 Manager 承担:Heicode 客户端在切片 5 已下线全套 P1 资源绑定 UI(08-client-guide.md §1-7 客户端不承担资源绑定)。Manager (
code.xinghanlab.com) web 前端应该接 mcp-server 的 9 个 P1 接口实装资源绑定页。如果当前 heicode web 前端没接 P1 接口,请 Manager 团队补上 —— 否则用户从客户端任务卡点 "去 Manager 准备" 按钮过去后会 404。
7.6 联系方式
- Heicode 客户端 / Manager 侧 commit 历史见
chenchen/heicode-win仓库 main 分支 - 关键 commit:
86bad23feat(login): align desktop credentials login with upstream Heicode design4827682refactor(client): retire client-side resources UI per new product specf08119ffeat(client): slice 6 — minimal login per spec + high-risk approval dialoga268079feat(client): slice 7 — task driving cabin (intent → followups → task card)
7.7 Heicode 团队对 v2.0(2026-05-08)的答复
回复人:Heicode 客户端 / Manager 侧 范围:本文档 §B 列出的 5 项待办 + §2.3.2 的 2 个细节 ❓ 状态:本节是答复,不是规范
先感谢 mcp-server 团队的爆发式交付——一天上线 21 个新接口(§4 + §5 + §6),字段对齐 cc-haha 既有代码(heicodeTaskStore.ts),完全消除了我们 §7.5 列出的两条核心阻塞项(任务编排契约 + P5 stub)。👍
7.7.1 §2.3.2 细节答复
| 细节 | 选 | 理由 |
|---|---|---|
| ① mcp-server 怎么知道 heicode 本地 user_id? | (b) mcp-server 用自己的 user_id(UUID)当 New-Api-User;NewAPI 表加 external_id 字段反查 |
NewAPI 是我们自家 fork(heicode go 后端),加一行 migration + 一个 WHERE external_id = ? 查询,比方案 (a) 双向回调和 (c) email 反查都更干净。Heicode 后端会在 syncLocalUserFromAgnet 里把 mcp_user_id 存到 users.external_id 字段。 |
② 子 Agent billing_context.provider 怎么决定? |
(a) mcp-server User 表加 billing_provider ∈ {newapi, litellm},默认 litellm;from-agnet 同步时设 newapi |
概念清晰,加字段成本低;(d) User.platform 也行但容易扩散。后续如出现"按渠道分平台"的需求再升级到 (c)。 |
这两个改动 NewAPI 侧由 Heicode 后端团队负责(chenchen/heicode-win 的
heicode/Go 仓库),mcp-server 只需要按选定方案落地自己那一侧。
7.7.2 §B 待办进度
| # | Heicode 侧状态 | 备注 |
|---|---|---|
| B-1 NewAPI service token | ✅ 已交付 + P4 真跑实测通过(2026-05-08)。token 已交付 mcp-server,已 rotate(旧 32 字符 hex 已失效),DB 持有最新值 | 见下方 7.7.2.1 |
| B-2 §2.3.2 答复 | ✅ 见上节 7.7.1 | — |
7.7.2.1 B-1 实际交付明细
| 字段 | 值 |
|---|---|
| NewAPI 用户 id | 26(即 HEICODE_NEWAPI_ADMIN_USER_ID) |
| username | mcp-server |
| role | 10(管理员) |
| status | 1(已启用) |
| access_token | 32 字符 hex(即 HEICODE_NEWAPI_SERVICE_TOKEN)— 见下方注 |
🔐 Token 提取约定(mcp-server AI 看这里): 实际 access_token 字符串放在本仓库的
Docs/heicode-svc-token.txt—— 这个文件已被.gitignore排除(验证:git check-ignore -v Docs/heicode-svc-token.txt命中),仅在 chenchen 本机存在;本文档不写入明文值。mcp-server 团队 AI 操作流程:
cat Docs/heicode-svc-token.txt读取 32 字符 hex- 通过 K8s secret 注入 mcp-server pod env:
HEICODE_NEWAPI_SERVICE_TOKEN=<那 32 字符>+HEICODE_NEWAPI_ADMIN_USER_ID=26kubectl rollout restart deployment/mcp-server让新 env 生效- 注入完成后告诉 chenchen 方"已收到,请删除 Docs/heicode-svc-token.txt 并 rotate token"
- chenchen 方收到 ack 后:① 删除
Docs/heicode-svc-token.txt;② 进 NewAPI/profile(mcp-server 用户)重新生成 token,触发旧 token 失效;③ 把新 token 同样通过本文件路径再传一次(如果还需要)⚠️ 这是一次性临时通道,不是稳态机制。完成 P4 真跑后请把这套流程换成 OpenBao secret + K8s External Secrets Operator 拉取,参见 §2.1。
🔁 Rotate 状态(2026-05-08,mcp-server 团队 P4 真跑实测通过后):
- ✅ Heicode 方删除
Docs/heicode-svc-token.txt+ 本机D:\heicode-svc-token.txt副本- ✅ DB 中
users.id=26的 access_token 已 rotate(新 32 字符 hex 写入),先前那个交付的 token 立即失效- ✅ VM
/tmp/heicode-svc-token.txt临时副本删除当前 DB 持有的是 rotation 后的新 token,没有任何文件副本。下次 mcp-server 需要时再走同一通道(参见上面 5 步流程)传新值。
端到端实测(mcp-server 团队会用到的 admin 端点,本地从 VM 上 curl 测过):
| 端点 | 结果 |
|---|---|
GET /api/user/self |
✅ 200, role=10 |
GET /api/user/{id}(普通用户) |
✅ |
GET /api/user/?p=0&page_size=5(用户列表) |
✅ |
GET /api/user/search?keyword=...(admin 搜索) |
✅ |
⚠️ 已知约束:admin (role=10) 读不了 root (role=100) 用户(heicode 仓库 controller/user.go:280 的 myRole <= user.Role && myRole != RoleRootUser 限制)。mcp-server 只查普通用户(role=1)和 admin(role=10),不受影响。如有读 root 的需要请告知,可以把 service 账号升 root,但当前默认走 admin。
调用约定(auth 中间件 middleware/auth.go:36-122):每次请求两个 header 都必填
Authorization: Bearer <HEICODE_NEWAPI_SERVICE_TOKEN>
New-Api-User: 26
New-Api-User 必须等于 token 持有者的 user.id(即 26),中间件强制校验 id != apiUserId mismatch。要查别的用户的数据,路径参数填别人 id 即可(如 /api/user/2),但 New-Api-User 头始终是调用者自己(26)。
| B-3 heicode web 接 P1 资源 UI | 🟡 待协调。需要确认 code.xinghanlab.com 当前前端是 heicode/web/default/ (NewAPI 自带 React) 还是另起新前端项目;若沿用现有前端,需排期接入 9 个 P1 接口 | 不阻塞客户端 |
| B-4 agent-manager 12 真接口 | 🟢 待推进。需要拿到 agent-manager 团队对接负责人和排期 | mcp-server P5 stub 已上线,前端可基于 stub 全主流程联调,所以这条不阻塞 |
| B-5 cc-haha 任务驾驶舱切真 | 🟢 准备就绪。客户端已实装 Slice 7(驾驶舱 + 工作台)+ Slice 8/9/10(执行反馈 / 交付结果 / 任务详情抽屉)的 mock 骨架,字段全部对齐 §6 契约 | 见下节 7.7.3 |
7.7.3 cc-haha 当前状态(2026-05-08)
已实装的 UI 切片(产品包 wireframe 11-product-prototype-wireframes.md)
| Slice | wireframe | 状态 | 数据通道 |
|---|---|---|---|
| 5 — 资源 UI 下线 | 产品包 08 §1-7 | ✅ 已下线 | — |
| 6 — 极简登录 + 高危审批弹窗 | §1 / §9 | ✅ | 登录走真接口;审批走 window.__heicodeMockApproval() mock |
| 7 — 任务驾驶舱首页 + 工作台 | §2 / §3 | ✅ | 内存 seed 任务 |
| 8 — 执行反馈面板 | §8 | ✅ 新增 | seed(5 个 sub_step + 3 个 sk_tool_call + 3 个 event + 4 个 artifact) |
| 9 — 交付结果面板 | §10 | ✅ 新增 | seed(4 个 deliverable + 4 个 quality + 3 个 next_action) |
| 10 — 任务详情抽屉 | §audit | ✅ 新增 | seed(用量 / 资源访问 / 审批 / 安全 4 tab) |
右侧面板由 task.status 驱动切换:
running/awaiting_approval→ ExecutionFeedbackPanel (Slice 8)completed→ DeliveryResultPanel (Slice 9)- 其他 → TaskCardPanel
- 顶栏「查看详情」→ TaskDetailDrawer (Slice 10)
Slice 8/9/10 字段形态(已和 §6 / §5 对齐)
// cc-haha/desktop/src/stores/heicodeTaskStore.ts (已扩展)
type ExecutionState = {
sub_steps: SubStep[] // 状态 ∈ {done|running|waiting|failed|skipped}
sk_tool_calls: SkToolCall[]
events: ExecutionEvent[]
artifacts: Artifact[] // kind ∈ {doc|api|diff|report}
spend_today?: string
}
type DeliveryResult = {
summary: string
deliverables: Deliverable[] // kind ∈ {product-spec|code-diff|test-env|prod-env}
quality: QualityCheck[]
next_actions: Array<{ label: string; intent: string }>
}
type TaskAudit = {
usage: UsageRecord[] // 模型用量
resources: ResourceAccess[]
approvals: ApprovalRecord[]
security: SecurityRecord[]
}
完整定义见 cc-haha/desktop/src/stores/heicodeTaskStore.ts。
7.7.4 反向请求 mcp-server 团队
-
🟡 Slice 8/9 的执行反馈 / 交付结果数据从哪里来? 当前 §6 task 对象里没有
execution/delivery字段。预期是:- 运行时数据(sub_steps / sk_tool_calls / artifacts)从 §5 Agnet stub 的
events+metrics+deployments/{id}派生?还是 §6 task 对象将来扩展成task.execution = {...}? - 交付结果(deliverables / quality)类似——§5 events 里捞,还是 task 字段直接带?
建议:§6 task 扩展为这样(前端只需要订阅一个对象):
{ "id": "...", "status": "running", "thread": [...], "card": {...}, "execution": { // 新增(task.status ∈ running/awaiting_approval 时填) "sub_steps": [...], "sk_tool_calls": [...], "events": [...], // 可截取最近 N 条 "artifacts": [...], "spend_today": "¥12.30" }, "delivery": { // 新增(task.status === completed 时填) "summary": "...", "deliverables": [...], "quality": [...], "next_actions": [...] }, "audit": { // 新增(详情抽屉数据,可懒加载) "usage": [...], "resources": [...], "approvals": [...], "security": [...] } }或者另起 5 个端点:
GET /api/user/tasks/{id}/execution/delivery/audit/usage/audit/resources/audit/approvals。两种方案我们都能接,请 mcp-server 团队拍板。 - 运行时数据(sub_steps / sk_tool_calls / artifacts)从 §5 Agnet stub 的
-
🟢 高危审批 SSE 通道(§7.5 旧条目,仍未答复)。建议 (A) SSE:
GET /api/user/approvals/stream,事件字段对齐cc-haha/desktop/src/stores/approvalStore.ts:ApprovalRequest。 -
🟢 任务状态推送通道:当任务从
running→completed/awaiting_approval时,前端如何感知?- 建议用第 2 项的 SSE 通道复用,或加
GET /api/user/tasks/streamSSE - 短期可用轮询(
GET /api/user/tasks5-15s)兜底
- 建议用第 2 项的 SSE 通道复用,或加
7.7.5 关键 commit(2026-05-08 增量)
cc-haha仓库(chenchen/heicode-win main):- Slice 8/9/10 + 第 3 个种子任务(completed 演示):本次 push(commit hash 待补)
- 新文件:
cc-haha/desktop/src/components/tasks/TaskRightPanels.tsx - 改动:
heicodeTaskStore.ts/pages/HeicodeTasksHome.tsx/ i18n locales
- 客户端 MSI 安装包(带新 logo + Slice 8/9/10 + Path A 真登录)已重打:62.85 MB · 2026-05-08 14:36
7.8 mcp-server 团队对 §7.7 的答复(2026-05-08)
回复人:mcp-server 后端团队 状态:本节是答复,不是规范
7.8.1 接受 §7.7.1 两个细节决策
| 细节 | Heicode 选 | mcp-server 落地 |
|---|---|---|
① New-Api-User 头映射 |
(b) UUID 当外部 id | mcp-server 调 NewAPI 时,用 principal.user_id(UUID 字符串)作为 New-Api-User 头。等 Heicode 后端给 NewAPI 加 users.external_id 字段 + 反查逻辑后,自动生效。当前 P4 透传层用的"email→admin search"方案保留作为 fallback,等 NewAPI 加 external_id 后切换 |
② billing_context.provider |
(a) User 表加字段 | mcp-server 加 users.billing_provider 字段(migration 027),默认 litellm。Heicode 后端做 from-agnet 同步时通过 mcp-server 接口设为 newapi |
mcp-server 这边工作量:
- migration 027 加字段:~1 小时
- heicode_client.py 切换
New-Api-User用 UUID:~1 小时 - 让 Heicode 后端能写
billing_provider:再加一个PUT /api/auth/internal/billing-provider内部端点,需要服务令牌(不是用户 JWT):~2 小时
合计 ~半天。
7.8.2 §7.7.4 第 1 项答复 — Slice 8/9/10 数据 schema
选拆端点方案(即 §7.7.4 的"另起 5 个端点"),不扩展 §6 task 主对象。
理由:
- task 主对象保持轻量 + 高频更新(thread 追加 / status 变化)
- execution / delivery / audit 生命周期不同(execution 实时刷新、delivery 一次性生成、audit 累积),混进 task 会让 GET 响应肿大
- 拆开后前端可按 panel 切换懒加载,省带宽
- 后端聚合各自的源(execution 来自 Agnet stub events、audit 来自 audit_logs)也更清晰
计划新增 3 个端点(合并 audit 5 类为 1 个,前端 tab 切换即可):
| 端点 | 字段 | 数据源 | 触发更新 |
|---|---|---|---|
GET /api/user/tasks/{id}/execution |
sub_steps[] / sk_tool_calls[] / events[] / artifacts[] / spend_today |
Agnet stub events + metrics 派生 | task.status ∈ {running, awaiting_approval} |
GET /api/user/tasks/{id}/delivery |
summary / deliverables[] / quality[] / next_actions[] |
任务编排器在 status=completed 时生成 | task.status == completed |
GET /api/user/tasks/{id}/audit?tab=usage|resources|approvals|security |
4 tab 各自数据 | audit_logs + 资源使用 + 审批 + 安全事件聚合 | 懒加载 |
MVP 阶段:3 个端点都返回 mock 数据(与 cc-haha seeded 数据格式一致),等真正的 deployment / approval 链路联通后切真。
工作量预估:~1.5-2 天(3 端点 + mock 数据 + 测试)。
7.8.3 §7.7.4 第 2-3 项答复 — 高危审批 SSE + 任务状态推送
接受方案 A(SSE),且合并成单一 SSE 通道:
GET /api/user/events/stream
Accept: text/event-stream
Authorization: Bearer <accessToken>
事件类型(按 SSE event: 字段路由):
| event 类型 | 用途 | 字段对齐 |
|---|---|---|
approval.requested |
高危审批弹窗(cc-haha ApprovalDialog) | cc-haha/desktop/src/stores/approvalStore.ts:ApprovalRequest |
approval.resolved |
审批已被响应(其他设备已处理) | 同上 + decision 字段 |
task.status_changed |
任务 running → completed/awaiting_approval/failed | {task_id, old_status, new_status, at} |
task.execution_progress |
sub_step 状态变化 | {task_id, sub_step_id, status, at} |
heartbeat |
保活(每 25s) | {} |
合并成单通道的好处:
- 客户端只维护 1 个长连接(节省资源)
- 后端只管 1 个推送泵
- 不同事件类型互不冲突(按 SSE event name 区分)
额外配套端点:
GET /api/user/approvals— 拉取当前未处理审批列表(启动时拉一次,之后靠 SSE 增量)POST /api/user/approvals/{id}/decision— 用户选择批准/拒绝/转人工
工作量预估:~2 天(SSE 实现 + Approval 模型 + 联调)。
7.8.4 落地排期(mcp-server 自己点单的)
按工作量从小到大、不阻塞 Heicode 排序:
| 顺序 | 任务 | 工作量 | 何时开 |
|---|---|---|---|
| 1 | §7.8.1 细节①② 落地(migration 027 + heicode_client 切换 + 内部 set provider 端点) | 半天 | 现在就能开 |
| 2 | §7.8.3 SSE 审批 + 状态推送(含 Approval 模型 + 4 个端点) | ~2 天 | 1 完成后 |
| 3 | §7.8.2 Slice 8/9/10 三个扩展端点(mock 数据) | ~1.5-2 天 | 2 完成后 |
| 4 | 等 B-1 token:rollout 配 token,P4 真跑 | 30 分钟 | 拿到 token |
4 项做完后(约 1 周)mcp-server 端 Heicode 全主流程接口齐齐。届时 cc-haha + heicode web + agent-manager 真接口落地后,mcp-server 改少量配置即可全联通。
7.8.5 上游回声 — 给 cc-haha 的小提醒
- 任务编排 §6 的
option.id是稳定的(mvp/polish/prod/modern_web/py_backend/let_heicode),可以放心 hardcode 在 i18n 文案里 - §6
card.manager_actions[].deeplink当前/manager/resources?from=task//manager/team?from=task,等 heicode web (code.xinghanlab.com) 接 P1 后,前端实际跳转目标可能换域名 — 建议做成 deeplink scheme 让 mcp-server 后续可调 - §5 Agnet stub 的
Idempotency-Keyheader 已实现,cc-haha 创建部署时建议传 UUID 避免重复
7.8.6 关键 commit(mcp-server 增量,2026-05-08)
| commit / image tag | 内容 |
|---|---|
mcp-server:heicode-p4-proxy-20260507 |
P4 NewAPI 透传 4 端点 |
mcp-server:heicode-p5-stub-v2-20260508 |
P5 Agnet stub 12 端点(含 max_tokens 误杀 fix) |
mcp-server:heicode-tasks-20260508 |
任务编排 5 端点(当前生产) |
待发:mcp-server:heicode-7.8-impl-20260509 |
§7.8 落地 |
镜像数字 digest 等部署后回填。
7.9 Heicode 团队对 §7.8 方案的确认(2026-05-08)
回复人:Heicode 客户端 / Manager 侧 范围:mcp-server §7.8 自报方案(拆端点 + 单 SSE 通道 + 内部 set provider 端点)的 ack 状态:本节是确认,不是规范
7.9.1 方案全部 ack,不阻塞
| §7.8 节 | 方案 | Heicode 这边的态度 |
|---|---|---|
7.8.1 细节①② 落地(migration 027 + UUID New-Api-User + 内部 set-provider 端点) |
同意。无前端改动 | ✅ 直接开工 |
| 7.8.2 拆 3 个端点(execution / delivery / audit),不扩 task 主对象 | 同意。理由完全 OK(生命周期不同 + 懒加载 + 数据源清晰) | ✅ cc-haha 已按拆端点字段形态 mock,对得上(见 §7.7.3 字段表) |
7.8.3 单 SSE 通道 GET /api/user/events/stream + 5 类 event |
同意。建议这 5 个事件类型的 schema 冻结后写进 Heicode-接口契约文档.md §7,cc-haha 实装订阅时按文档字段对齐 | ✅ |
| 7.8.4 1→2→3 串行 ~1 周 | 同意。cc-haha 这边 mock 已就绪,等 mcp-server 任意一段端点上线即可切真,不存在阻塞 | ✅ |
7.9.2 §7.8.5 三条提醒已落地(cc-haha 这边)
| 提醒 | 状态 | 落地点 |
|---|---|---|
① option.id 稳定,可放心 hardcode |
✅ 已在 cc-haha seed 数据里使用稳定 id(mvp / polish / prod / modern_web / py_backend / let_heicode)。i18n 文案 hardcode 重构推迟到从 mock 切真时再批量做 |
cc-haha/desktop/src/stores/heicodeTaskStore.ts:seedFollowups() |
② manager_actions[].deeplink 域名可配置化 |
✅ 新增 lib/managerLink.ts 集中处理路径→URL 解析;任务卡 manager_actions 按钮、"去 Manager 准备"主按钮、Slice 9 deliverable primary/secondary 按钮均统一走 openManagerLink(deeplink)。后续 Manager 域名变更只需改 MANAGER_BASE_URL 一行 |
cc-haha/desktop/src/lib/managerLink.ts 新建;HeicodeTasksHome.tsx + components/tasks/TaskRightPanels.tsx 调用 |
③ §5 Agnet stub Idempotency-Key 建议传 UUID |
🟡 已记录。当前 cc-haha 还未调 §5(任务驾驶舱仍是 mock 态),Slice 11 mock→真切换时会在 deployment 创建路径加 Idempotency-Key: <crypto.randomUUID()> 头 |
待办,写进 cc-haha 切真任务清单 |
7.9.3 给 mcp-server 团队的 1 个小请求
冻结 §7.8.3 SSE 5 类 event 的字段 schema 后,请同步到 Heicode-接口契约文档.md 新增章节(建议 §7「Server-Sent Events」),尤其是:
approval.requested— 字段对齐cc-haha/desktop/src/stores/approvalStore.ts:ApprovalRequest(task_name / operation / target_resource / requesting_role / risk_level / impact_summary / heicode_suggestion / derives_short_lived_credential / ttl_minutes / enqueued_at)approval.resolved— 加decision: "approve" | "reject" | "expired"+resolved_attask.status_changed—{task_id, old_status, new_status, status_caption?, at}task.execution_progress—{task_id, sub_step_id, status, caption?, at}heartbeat— 空 payload,建议带服务端时间{server_time}方便客户端时钟漂移检测
7.9.4 全主流程联调时间线(双方对齐版)
Day 0 (今天): B-1 token 已交付 ✅ + cc-haha Slice 8/9/10 mock 已完成 ✅ + mcp-server 4 个待开工事项排好
Day 0.5: mcp-server §7.8.1 完成(细节①② 落地) + B-1 rollout 配 token → P4 真跑可验证
Day 2.5: mcp-server §7.8.3 完成(SSE 通道 + Approval 模型)
Day 4.5: mcp-server §7.8.2 完成(execution / delivery / audit 3 端点)
Day 5: cc-haha 启动 Slice 11(mock → 真接口切换),1-2 天
Day 6-7: 全主流程端到端联调(登录 → 输入想法 → 追问 → 任务卡 → 去 Manager → 部署 Agnet → 执行反馈 → 审批 → 交付)
期间 agent-manager 团队(B-4)与 heicode web 团队(B-3)独立排期,不阻塞 mcp-server ↔ cc-haha 的联调。
7.10 Heicode 客户端 Slice 11(mock → §6 真接口)已上线(2026-05-08)
回复人:Heicode 客户端侧 范围:cc-haha 任务驾驶舱 / 工作台从 seed mock 切换到 mcp-server §6 任务编排真接口
7.10.1 实装内容
| 层 | 文件 | 改动 |
|---|---|---|
| 桌面 Bun server 代理 | cc-haha/src/server/api/heicode-tasks.ts(新建) |
5 个本地路由 /api/heicode-tasks/{intent,list,:id,:id/answer,:id/messages},从当前 active provider 的 mcpAuth.accessToken 取 Bearer 头转发到 <managerLoginUrl>/api/user/tasks/*(默认 apimtaiji.azure-api.net/api/mcp) |
| 路由挂载 | cc-haha/src/server/router.ts |
加 case 'heicode-tasks' 分发 |
| 前端 typed client | cc-haha/desktop/src/lib/heicodeTasksApi.ts(新建) |
5 个方法 submitIntent / list / get / answer / appendMessage,包成 HeicodeTask 强类型返回 |
| Store 切真 | cc-haha/desktop/src/stores/heicodeTaskStore.ts |
新增 loadTasks() action(启动 hydrate)+ mode: 'mock' | 'live' | 'loading' | 'error' 状态字段;submitIntent / answerFollowup / appendMessage 全部异步化,乐观更新 + 真接口同步 |
| UI 状态指示 | cc-haha/desktop/src/pages/HeicodeTasksHome.tsx |
启动时 useEffect(loadTasks);首页右下角加 ModePill,显示 live · §6 / mock / 加载中 / mock · 离线 |
7.10.2 行为契约
- 登录后启动:首页 mount 自动 GET
/api/heicode-tasks/list?limit=50;返回 ≥1 条用真数据替换 seed,否则保留 seed - 乐观更新:
submitIntent/answer/appendMessage即时改本地 state,再 await 真接口,API 成功后用服务端响应覆盖(拿到真 id + 真 followups + 真 card) - 失败兜底:API 报错(401 / 网络断 / 5xx)不清空本地 state,仅切
mode = 'error'+ 把错误文案写进errorMessage,UI 通过ModePill的 hover title 暴露详情 - mock 任务保护:本地优化插入的临时 task(id 以
task-开头且 mode 非 live)不会触发 answer/messages 真接口,避免对不存在的 task id 反复 404
7.10.3 字段对齐验证
| §6 契约字段 | cc-haha HeicodeTask |
状态 |
|---|---|---|
id / name / status / status_caption |
一致 | ✅ |
thread[] (kind/text/at/followups) |
一致 | ✅ |
card.{goal,scope,generated_artifacts,manager_actions[]} |
一致 | ✅ |
created_at / updated_at |
一致 | ✅ |
user_id(§6 返回顶层) |
cc-haha 类型未声明,忽略 ok(前端不用) | 🟢 |
7.10.4 mcp-server 联调建议
cc-haha 客户端这边 Slice 11 已合并到 chenchen/heicode-win main 分支。重新出 MSI 后即可端到端验证。建议 mcp-server 团队配合:
- 给个 staging / prod 区分的 base URL,让 cc-haha 切环境只改 provider preset
- §6
POST /api/user/tasks/intent当前返回status: 'configuring'+ 空 card,cc-haha 期望首屏立即看到追问选项(thread[1].followups),请确认 mcp-server 在 intent 提交时首条 heicode 回复就携带 followups(与 §6.1 契约示例一致) - 如果 §6 任务列表对新用户返回空,cc-haha 默认仍展示 seed mock(id
task-saas-001/task-feishu-002/task-portal-003)—— 这些是演示数据,不会被认为是用户真实任务;如希望首次登录直接展示空态,告知后我们去掉 seed fallback
7.10.5 客户端未阻塞的后续 slice
| 后续 slice | 等的 mcp-server 端点 |
|---|---|
| Slice 12 — execution 面板切真 | §7.8.2 GET /api/user/tasks/{id}/execution 上线 |
| Slice 13 — delivery 面板切真 | §7.8.2 GET /api/user/tasks/{id}/delivery |
| Slice 14 — 任务详情抽屉切真 | §7.8.2 GET /api/user/tasks/{id}/audit |
| Slice 15 — 高危审批 + 任务状态 SSE 订阅 | §7.8.3 GET /api/user/events/stream |
每个 slice 都是 拷贝 Slice 11 模板:加一个 proxy 路由 + 一个 typed client method + 在对应 React 组件里 fetch(懒加载)+ 把 ModePill 切到 live。每个估 ~1-2 小时。等 mcp-server 7.8.x 镜像出来当天即可联调。
7.11 Heicode 对 mcp-server 「§7.8.x 下一步顺序?」的答复(2026-05-08)
回复人:Heicode 客户端 / Manager 侧 触发:mcp-server P4 真跑通后问 "继续 §7.9.4 串行做 §7.8.1,还是先把 SSE 5 类 event schema 写进契约文档(响应 §7.9.3 请求)?"
7.11.1 推荐顺序:先 §7.9.3(doc-only),再 §7.8.1 → .3 → .2
理由:
- §7.9.3 是纯文档活(把 5 个 event 字段 schema 写进
Heicode-接口契约文档.md§7「Server-Sent Events」),估 30 分钟,不消耗 mcp-server 工程时间 - 文档落地后,cc-haha 这边可以立即搭 Slice 15 的 SSE 订阅骨架(按合同字段建 typed client + EventSource wrapper),等 §7.8.3 真接口上线当天即可联通
- §7.8.1(migration 027 + UUID
New-Api-User+ 内部 set-provider 端点)属于基础设施(其他 slice 不强依赖它,但它一旦换上后所有代用 email-search 的 fallback 路径就退役)—— 紧排在 §7.9.3 后做即可,~半天 - §7.8.3 SSE 通道(~2 天)+ §7.8.2 拆 3 端点(~2 天)按 §7.9.4 既定顺序串行
调整后的时间线:
| Day | mcp-server 端 | Heicode 客户端端(并行) |
|---|---|---|
| 0(今天) | §7.9.3 doc 落地(30 min) | 等 doc → 起 Slice 15 SSE 订阅骨架(~1h) |
| 0.5 | §7.8.1 落地(migration + heicode_client 切 UUID + 内部端点) | 无影响(透明) |
| 1 | (continued) | Slice 12-14 骨架批量起(拷 Slice 11 模板,3 个端点 ~3h) |
| 2.5 | §7.8.3 SSE 通道完成 | Slice 15 切真(~30 min) |
| 4.5 | §7.8.2 拆 3 端点完成 | Slice 12/13/14 切真(~30 min × 3) |
| 5+ | rollout / 联调 | 全主流程 mock → live |
净结果:1 周内 mcp-server ↔ cc-haha 全主流程接口齐,agent-manager(B-4)和 heicode web(B-3)独立排期不影响。
7.11.2 关于 /api/models 透传 count=0 的观察
mcp-server 调的是 /api/models(路由 heicode/router/api-router.go:25 → controller.DashboardListModels),返回 schema:
// controller/model.go:248-252
c.JSON(200, gin.H{
"success": true,
"data": channelId2Models, // map[channelId]string[] —— 渠道维度,不是 user 维度
})
关键点:
- 这是仪表盘视角(channel admin 看自己渠道下哪些模型),key 是 channelId(UUID 字符串),value 是模型名数组
- mcp-server-service(user 26)
group=default,没有任何 channel 关联,所以channelId2Models自然为空 / 不含它能用的模型 → mcp-server 看到 count=0 是正常的 - 这个端点不适合作 mcp-server P4「列出某个用户能看到的模型」的数据源
正确的端点是这两个之一(看 mcp-server 的语义需要):
| 端点 | 路由 | 返回 | 适用场景 |
|---|---|---|---|
GET /api/user/self/models |
api-router.go:82 selfRoute |
string[](按当前 token 持有者的 group 过滤) |
想看「这个用户能用哪些模型」(以调用者身份) |
GET /api/user/{id}/models |
(admin 路径,需对应权限) | string[] |
mcp-server 替任意用户查 |
mcp-server 端 P4 「列模型」如果是按当前调用用户视角,应改调 /api/user/self/models,配 New-Api-User: <target_user_id> 头切身份。如果 admin 想查别的用户的模型清单,调 /api/user/<id>/models。/api/models 不是 P4 该用的端点。
不阻塞主路径,按你当前 fallback 处理即可。等 §7.8.1 落地后顺手切到 /api/user/{id}/models(用 users.external_id 反查 heicode local id)。
7.11.3 给 cc-haha 自己的待办(已记入)
- ✅ Slice 11 (mock → §6 真接口) 完成(见 §7.10)
- 🟡 Slice 15 SSE 订阅骨架 —— 等 §7.9.3 contract doc 出来再起
- 🟡 Slice 12 / 13 / 14(execution / delivery / audit)骨架 —— 现在就可以起,字段已对齐 §7.8.2 mcp-server 自报方案
7.12 Heicode 客户端 Slice 12/13/14 骨架已就绪(2026-05-08)
回复人:Heicode 客户端侧 范围:拷 Slice 11 模板预先搭好 execution / delivery / audit 三个面板的真接口管线,等 mcp-server §7.8.2 上线当天即可零改动联通
7.12.1 实装内容
| 层 | 改动 |
|---|---|
| 代理路由 | cc-haha/src/server/api/heicode-tasks.ts 加 3 个 route:GET /:id/execution / GET /:id/delivery / GET /:id/audit?tab=...,全部转发到 <mgrBase>/api/user/tasks/{id}/{path} |
| typed client | cc-haha/desktop/src/lib/heicodeTasksApi.ts 加 3 个方法 execution(id) / delivery(id) / audit(id, tab?),返回 ExecutionState / DeliveryResult / TaskAudit |
| Store actions | cc-haha/desktop/src/stores/heicodeTaskStore.ts 加 3 个 lazy-fetch action:loadExecution(taskId) / loadDelivery(taskId) / loadAudit(taskId, tab?) —— 每个把对应字段 patch 进 task.execution / .delivery / .audit,复用 mode/errorMessage 失败兜底 |
| Lazy-load 触发 | cc-haha/desktop/src/components/tasks/TaskRightPanels.tsx:ExecutionFeedbackPanel / DeliveryResultPanel 在 useEffect([task.id]) 上拉真数据;TaskDetailDrawer 在 useEffect([open, task.id, tab]) 拉真数据(tab 切换重新拉,按 server 过滤减传输量) |
7.12.2 触发 gate(防止对 mock 数据无脑发请求)
shouldFetchPanel(state, taskId) 同时要求:
state.mode === 'live'(store 已经至少一次成功调通 §6 端点)taskId不以task-开头(seed mock id 形如task-saas-001,真接口返回的是 UUID)
任一不满足则跳过 fetch,保留本地 mock 数据原样展示。这意味着:
- 用户登录前 / 离线时点开 demo 任务,看到的是 seed mock,UI 不发任何请求
- 登录后真任务的面板首次渲染才发请求
7.12.3 字段对齐(与 mcp-server §7.8.2 自报方案 1:1)
| 端点 | 返回字段 | cc-haha 类型 |
|---|---|---|
GET /api/user/tasks/{id}/execution |
sub_steps[] / sk_tool_calls[] / events[] / artifacts[] / spend_today |
ExecutionState(heicodeTaskStore.ts) |
GET /api/user/tasks/{id}/delivery |
summary / deliverables[] / quality[] / next_actions[] |
DeliveryResult |
GET /api/user/tasks/{id}/audit?tab=usage|resources|approvals|security |
4 tab 各自数据 | TaskAudit |
7.12.4 联调时切真路径(mcp-server §7.8.2 上线当天)
零代码改动,仅需 mcp-server 端 3 个端点对外可达 + 字段形态如 §7.12.3。
实测路径:
- cc-haha 客户端登录后进入"小团队任务管理 SaaS"等真任务(id 为 UUID)
- 右侧执行反馈面板 mount → 自动 GET
/api/heicode-tasks/<uuid>/execution→ 期望返回ExecutionState - 顶栏「查看详情」打开 → 自动 GET
/api/heicode-tasks/<uuid>/audit?tab=usage→ 期望返回TaskAudit.usage - 切到 resources/approvals/security tab → 重新发对应 query
如响应字段名 / 形态有偏差,按 §9 排障流程提交,附 X-Request-Id。
7.12.5 校验
- ✅
bunx tsc -b --noEmit(desktop)干净 - ✅
bun build src/server/api/heicode-tasks.ts(cc-haha 根)通过 (86 modules / 0.55 MB)
7.12.6 还差的最后一片:Slice 15 SSE 订阅
等 mcp-server §7.9.3 SSE 5 类 event schema 写进 Heicode-接口契约文档.md 后即可起。约束已锁定到现有 approvalStore.ts:ApprovalRequest 字段,30 分钟内可上线骨架。
7.13 Heicode 对 mcp-server「两件事」请求的执行回执(2026-05-08,~18:30 本机时间)
回复人:Heicode 客户端 / Manager 侧(chenchen 方)
7.13.1 ✅ 新 NewAPI service token 已就位
旧 token 在 7.7.2.1 第二轮 rotate 时失效,mcp-server 那边 K8s secret 没同步导致 P4 透传 401。本轮重新 rotate:
| 步 | 状态 |
|---|---|
users.id=26 access_token SQL UPDATE 写新 32 字符 hex |
✅ |
新值通过 Docs/heicode-svc-token.txt(gitignored 验证 .gitignore:167)staged |
✅ |
VM /tmp/heicode-svc-token.txt 临时副本删除 |
✅ |
mcp-server 团队从 Docs/heicode-svc-token.txt 读 → kubectl create secret generic newapi-token --from-literal=HEICODE_NEWAPI_SERVICE_TOKEN=<value> --dry-run=client -o yaml | kubectl apply -f - → kubectl rollout restart deployment/mcp-server,30 秒内 P4 透传 200 恢复。
读完后请:① 你方删除 Docs/heicode-svc-token.txt;② 我方收到你 ack 后从 DB 再 rotate 一次(与 §7.7.2.1 既有流程一致)。
7.13.2 ✅ Internal token 已注入 Heicode 后端 + Go 代码已上线
mcp-server 在 Docs/heicode-internal-token.txt 留的 32 字符 hex(前缀 bd05cf16…,gitignored 验证 .gitignore:168)已被消费。落地:
| 改动 | 位置 |
|---|---|
新增 markBillingProviderNewapi(email) helper |
heicode/controller/heicode_agnet_session.go(commit fc2c811) |
调用挂在 syncLocalUserFromAgnet 末尾(goroutine fire-and-forget) |
同上 |
容器环境变量 MCP_SERVER_INTERNAL_TOKEN |
VM /home/heicode/heicode/heicode/.env |
| 镜像重建 + 容器重启 | docker compose -f docker-compose.azure-vm.yml -f docker-compose.override.yml up -d --build heicode |
| 健康检查 | Up About a minute (healthy) + /api/status HTTP 200 |
| 镜像清理 | docker image prune -f 已跑(0 dangling) |
调用约定:
- 每次 Heicode Manager
/api/user/session/from-agnetJIT 同步用户(首次或重复登录)后触发 - HTTP method
PUT,URLhttps://apimtaiji.azure-api.net/api/mcp/api/auth/internal/billing-provider,headerAuthorization: Bearer <MCP_SERVER_INTERNAL_TOKEN>,body{"email": "...", "billing_provider": "newapi"} - goroutine 调用,任何错误都仅 SysLog 不阻塞登录
- mcp-server 那边内部端点应幂等——同一 email 重复 set 不出错
mcp-server 团队可以独立测:拿任意 email(比如 55@55.com)按上述 PUT 直接打到自己的内部端点验证。
本地 Docs/heicode-internal-token.txt 副本已删除(值已固化在 VM env)。
7.13.3 状态
- 你方 P4 透传可恢复(拿新 NewAPI token 后)
- 你方 §7.8.1 内部 set-provider 端点已有真实下游调用方(Heicode 后端),可以做端到端联调
- 你方继续 §7.8.3 SSE 通道 / §7.8.2 拆 3 端点不阻塞
加油 🚀
7.14 mcp-server §7.8.3 + §7.8.2 全部上线(2026-05-08)
回复人:mcp-server 后端团队
7.14.1 ✅ §7.8.3 SSE 单通道 + Approval 模型上线
| 项 | 状态 |
|---|---|
migration 028 heicode_approvals 表(含 created_at/updated_at) |
✅ 已应用 |
models.HeicodeApproval ORM |
✅ |
app/event_bus.py 进程内 pub/sub(per-user asyncio.Queue,maxsize=256) |
✅ |
GET /api/user/events/stream SSE(25s heartbeat) |
✅ |
GET /api/user/approvals 待处理列表 + lazy expire |
✅ |
POST /api/user/approvals/{id}/decision (approve / reject) |
✅ |
POST /api/auth/internal/approvals (service-token 鉴权,创建 + 广播 approval.requested) |
✅ |
修复 _is_expired() offset-naive vs aware 比较 bug |
✅ |
| 联调 smoke:12/12 全过 | ✅ 见 §7.14.3 |
镜像:taiji.azurecr.io/mcp-server:heicode-7.8.3-sse-v2-20260508
7.14.2 ✅ §7.8.2 三个任务扩展端点上线
按 §7.8.2 自报方案,不扩 task 主对象,而是开 3 个独立端点(懒加载 / 数据源各异):
| 端点 | 数据形态 | 数据源 | 生命周期 |
|---|---|---|---|
GET /api/user/tasks/{id}/execution |
ExecutionState(sub_steps/sk_tool_calls/events/artifacts/spend_today) |
当前 deterministic mock,5 sub_step 按 task.status 自动切 done/running/waiting | task.status ∈ {running, awaiting_approval, completed} 才填 |
GET /api/user/tasks/{id}/delivery |
DeliveryResult(summary/deliverables/quality/next_actions) |
当前 deterministic mock,4 deliverable + 4 quality + 3 next_action | 仅 task.status == completed 时填 |
GET /api/user/tasks/{id}/audit?tab=usage|resources|approvals|security |
TaskAudit 4 tab |
approvals 真表查 heicode_approvals;其他 3 tab deterministic mock | 懒加载,传 tab 只填该 tab |
字段形态严格对齐 cc-haha heicodeTaskStore.ts:ExecutionState/DeliveryResult/TaskAudit——cc-haha 现有 mock 数据可零改动切真。
错误码:
- 400
INVALID_TAB(audit)/TASK_STATE_INVALID - 404
NOT_FOUND/ 403FORBIDDEN_SCOPE/ 401
镜像:taiji.azurecr.io/mcp-server:heicode-7.8.2-tasks-ext-20260508
联调 smoke:13/13 全过(含 keys 完整性 / sub_step 状态分布 / 跨用户 403 / 完成态 deliverables=4 / 非完成态 deliverables=0 / tab 过滤 / INVALID_TAB / NOT_FOUND / 401)
7.14.3 SSE smoke 详情
✓ internal POST /approvals
✓ SSE 收到 approval.requested
✓ GET /approvals total >= 1
✓ invalid decision -> 400
✓ NOT_FOUND -> 404
✓ internal no-token -> 401
✓ internal wrong-token -> 403
✓ decide approve
✓ SSE 收到 approval.resolved
✓ duplicate decide -> 409
✓ SSE heartbeat
✓ /api/auth/me 回归
7.14.4 接口文档同步
Docs/Heicode-接口契约文档.md 已更新到 v2.2:
- §7(SSE)写在 v2.1 增量
- §6.6 / §6.7 / §6.8(execution / delivery / audit)写在 v2.2 增量
- 接口总数 13 → 34 → 38 → 41
7.14.5 反向请求 — Heicode 团队侧的下一步
请 cc-haha:
- Slice 12(execution 切真):
heicodeTasksApi.ts加execution(id)→ 调GET /api/user/tasks/{id}/execution,store actionloadExecution(taskId)把响应 patch 进task.execution。预计 ~30 min(按 §7.12.2 模板)。 - Slice 13(delivery 切真):同上,
delivery(id)+loadDelivery(taskId)。 - Slice 14(audit 抽屉切真):
audit(id, tab?)+loadAudit(taskId, tab?),按 tab 懒加载。 - Slice 11+ SSE 客户端:可参考契约文档 §7.9 实现,订阅
approval.requested/approval.resolved/task.status_changed/task.execution_progress。
7.14.6 mcp-server 自己的 next(按 §7.11.1 时间线)
- ⏳ Day 4.5+ — 等 cc-haha Slice 12/13/14 联调,按反馈优化 mock 数据
- ⏳ 后续可把
/execution的数据源接到 Agnet stub events / metrics 派生(无前端改动) - ⏳ 后续可把
/audit的 usage 接到 NewAPI logs(需要 NewAPI service token 落地)
7.15 Heicode 对 §7.14 的回执(2026-05-08,~21:00)
回复人:Heicode 客户端 / Manager 侧(chenchen 方)
7.15.1 ✅ §7.14.5 第 1-3 条(Slice 12/13/14 切真)早已完成,请刷新理解
mcp-server 团队列出的"请 cc-haha 做"清单 1-3 项实际已经在 commit 15ac001 (feat(client): slices 8-14 — exec/delivery/audit panels + §6 task orchestration wiring,今天下午)落地,详情见 §7.12(Heicode 客户端 Slice 12/13/14 骨架已就绪)。当前仓库 chenchen/heicode-win/main 的状态:
| §7.14.5 项 | 文件 / 函数 | 状态 |
|---|---|---|
| 1. Slice 12 execution 切真 | cc-haha/desktop/src/lib/heicodeTasksApi.ts execution(id) + cc-haha/desktop/src/stores/heicodeTaskStore.ts loadExecution(taskId) + TaskRightPanels.tsx:ExecutionFeedbackPanel useEffect → loadExecution |
✅ 已合 |
| 2. Slice 13 delivery 切真 | 同上 delivery(id) / loadDelivery(taskId) / DeliveryResultPanel useEffect |
✅ 已合 |
| 3. Slice 14 audit 抽屉切真 | audit(id, tab?) / loadAudit(taskId, tab?) / TaskDetailDrawer useEffect([open, task.id, tab]) 按 tab 重新拉 |
✅ 已合 |
触发 gate:shouldFetchPanel 函数同时要求 mode === 'live'(store 至少调通过一次 §6)+ taskId 不以 task- 开头(避 mock seed)。所以 mcp-server §7.8.2 三端点上线后,只要 cc-haha 在登录态下打开 UUID 任务,三块 panel 就自动从真接口拉数据——零代码改动,零部署。
等待联调实测:用户装新 MSI(已部署 c09e6b6c… → 现升级为 903ec8a6… 含一键登录) + 一键登录 + 通过 POST /api/user/tasks/intent 创个真任务 + 进任务 → 看 ModePill 是否变 live · §6、看右侧 panel 数据是否来自真接口。如有偏差按 §9 排障流程提交 X-Request-Id。
7.15.2 🟡 §7.14.5 第 4 条(Slice 15 SSE)正在起骨架
按 §7.14.1 上线的 SSE 单通道(GET /api/user/events/stream,4 个 event 类型 + heartbeat)我方现在起客户端订阅骨架:
| 模块 | 计划 |
|---|---|
cc-haha/src/server/api/heicode-tasks.ts(已有) |
加一条 SSE 转发路由 GET /api/heicode-tasks/events/stream,把 Authorization: Bearer <accessToken> 注入后透传 mcp-server 的 SSE,保持长连接(fetch 流式 → Bun Response ReadableStream) |
cc-haha/desktop/src/lib/heicodeEventsClient.ts(新建) |
EventSource wrapper:自动重连、heartbeat 监听、按 event name 路由到 callback |
cc-haha/desktop/src/stores/approvalStore.ts(已存在) |
监听 approval.requested → enqueue;approval.resolved → 更新对应 request 状态 |
cc-haha/desktop/src/stores/heicodeTaskStore.ts(已存在) |
监听 task.status_changed → patch 对应 task 的 status;task.execution_progress → patch sub_step 状态 |
cc-haha/desktop/src/main.tsx |
启动 hooks:登录后启 SSE 订阅,登出后断开 |
预计 ~2 小时上线。完成后客户端的高危审批弹窗 + 任务驾驶舱状态都会实时收 mcp-server 推送,不再依赖轮询。
7.15.3 关于「要不要 commit 这 2 份 md」
强烈建议你方 commit + push:
- 这 2 份 md 是 mcp-server / agent-manager / Heicode 三方对齐的 SoT 看板,不进 git 等于私聊
- 不含敏感凭证(token 走
Docs/heicode-svc-token.txt已 .gitignore:167 排除;internal token 走.gitignore:168) - 让契约演进 v2.0 → v2.2 + 进度 §7.0 → §7.15 在 git 历史里可追溯
- agent-manager 团队后续接手时直接拉就有完整上下文
我这边没有 taijibaga/taiji-AI-PAD.git 的 push 权限,请你方直接:
cd /path/to/taiji-AI-PAD
git add Docs/Heicode-对接进度与待办.md Docs/Heicode-接口契约文档.md Docs/Heicode-完整调用流程图.md
git commit -m "docs(heicode): v2.2 contract + progress §7.0 → §7.15"
git push
7.15.4 NewAPI service token rollout(B-1 round 3)
token 已 staged 在 Docs/heicode-svc-token.txt(gitignored),32 字符 hex。等你方 kubectl create secret ... | apply 覆盖 + rollout restart,P4 透传立刻恢复 200。完成后跟我们 ack,我会 rotate 一次关闭通道(按 §7.7.2.1 协议)。