完成 Muse Studio React SPA 基座和六个用户端功能域,接入 MSW Mock、Tiptap 写作台、知识库资料管理、智能体槽位预检绑定、市场授权安装和个人中心用量权益视图。
6.6 KiB
muse-studio 智能体、市场、个人中心实现留痕
任务背景
继续执行 docs/superpowers/plans/2026-05-24-P2-muse-studio.md 的 P2 用户端搭建任务。接手时,muse-studio 已经完成脚手架、基础设施、写作台、作品工作区和知识库工作台;本次重点补齐剩余三个用户端功能域:
- 智能体工作台
- 创作市场
- 个人中心
同时修复当前代码基线的 TypeScript / ESLint 阻断,补齐对应 Hook 测试和页面冒烟验证。
已完成内容
1. 智能体工作台
新增智能体功能域:
src/features/agent/hooks/useAgents.tssrc/features/agent/components/AgentList.tsxsrc/features/agent/components/AgentCreateForm.tsxsrc/features/agent/components/SlotBindingPanel.tsxsrc/features/agent/hooks/useAgents.test.tsxsrc/pages/AgentPage.tsx
实现能力:
- 查询系统默认与用户自建智能体列表。
- 创建用户自建配置型智能体。
- 在沙盒上下文中试用智能体,结果只进入预览,不写作品事实。
- 查询作品开放智能体槽位。
- 执行槽位预检,再消费预检凭证绑定槽位,避免直接写槽位事实。
- 保护节点只读展示,不允许前端发起替换。
对应 Mock API 在 src/api/mocks/handlers/ai.ts 中补齐:
GET /app-api/muse/agentsPOST /app-api/muse/agentsPOST /app-api/muse/agents/:agentId/testGET /app-api/muse/works/:workId/agent-slotsPOST /app-api/muse/works/:workId/agent-slots/:slotKey/prechecksPOST /app-api/muse/works/:workId/agent-slots/:slotKey/bind
2. 创作市场
新增市场功能域:
src/features/market/hooks/useMarket.tssrc/features/market/components/MarketBrowse.tsxsrc/features/market/hooks/useMarket.test.tsxsrc/pages/MarketPage.tsx
实现能力:
- 按作品、智能体、知识库三类资产筛选市场列表。
- 支持关键词搜索。
- 展示分类摘要。
- 获取市场资产授权。
- 安装已授权的智能体或知识库到账户可用资产列表。
- 明确区分“授权获取”和“安装”,不暗示自动绑定作品或写入作品事实。
对应 Mock API 在 src/api/mocks/handlers/market.ts 中补齐:
GET /app-api/muse/marketplace/assetsGET /app-api/muse/marketplace/categoriesGET /app-api/muse/marketplace/assets/:assetIdPOST /app-api/muse/marketplace/assets/:assetId/purchasePOST /app-api/muse/marketplace/assets/:assetId/install
3. 个人中心
新增个人中心功能域:
src/features/account/hooks/useAccount.tssrc/features/account/components/PersonalCenter.tsxsrc/features/account/components/UsageStats.tsxsrc/features/account/hooks/useAccount.test.tsxsrc/pages/AccountPage.tsx
实现能力:
- 展示账户资料、账号状态、邮箱和手机号验证状态。
- 支持保存昵称和公开署名。
- 展示账户级 Token 用量、待归属数量、计量异常数量。
- 展示权益、配额和资源使用进度。
- 展示用量归属分布。
对应 Mock API 在 src/api/mocks/handlers/account.ts 中补齐:
GET /app-api/muse/profilePATCH /app-api/muse/profileGET /app-api/muse/account/entitlementsGET /app-api/muse/account/usage
关键工程实践与避坑
1. 以当前 OpenAPI 为准,不沿用旧计划里的简化路径
P2 计划中的部分路径仍是早期简化版,例如:
/agents/:agentId/slots/market/assets/account/profile
当前真实 OpenAPI 已经演进为:
/app-api/muse/agents/app-api/muse/works/{workId}/agent-slots/app-api/muse/marketplace/assets/app-api/muse/profile/app-api/muse/account/usage/app-api/muse/account/entitlements
后续继续 P2 或 P3 时,应优先以 docs/api-contracts/generated/typescript/*、muse-studio/src/types/* 和当前产品规格为准,不直接照抄旧 plan 路径。
2. exactOptionalPropertyTypes 下不能显式传 undefined
新增测试和 Mock 时多次遇到该问题:
- 可选字段如果值可能是
undefined,不要写进对象字面量。 - 需要先构造基础对象,再按条件追加字段。
- 测试中如果字段必填,应先用
if (!slot) throw new Error(...)做显式收窄,再传slot.revision。
典型写法:
const dto: AgentCreateDTO = { name: name.trim() };
if (trimmedDescription) {
dto.description = trimmedDescription;
}
3. React 新 lint 规则更严格
之前 MuseEditor 中使用 useCallback(debounce(...)) 会触发 React Hooks 静态规则。已调整为 useMemo(() => debounce(...), deps)。
组件文件中导出非组件函数也会触发 Fast Refresh 规则,因此将知识库类型守卫移到:
src/features/knowledge/utils/typeGuards.ts
4. 市场和智能体必须保持 owner 边界
市场获取授权不等于安装,安装不等于作品绑定。智能体槽位绑定必须先预检,再绑定:
- 调用
prechecks获取短期agentSlotPrecheckId。 - 调用
bind消费该凭证。 - Mock 中会校验槽位 revision,避免直接跳过预检写入槽位。
这符合产品规格中“市场不拥有最终业务事实,目标 owner 空间最终确认”的边界。
验证记录
本次收口执行过以下验证:
pnpm exec tsc -b --pretty false
pnpm exec vitest run
pnpm lint
pnpm build
结果:
- TypeScript 编译通过。
- Vitest:7 个测试文件、23 个测试全部通过。
- ESLint:退出码 0;仅
public/mockServiceWorker.js生成文件存在 unused eslint-disable warning。 - Vite build 通过;存在 chunk > 500KB 提示,后续可做路由级 code splitting。
还启动过开发服务器:
pnpm dev --host 127.0.0.1
并使用 Playwright + 本机 Chrome 冒烟访问:
http://127.0.0.1:5173/agentshttp://127.0.0.1:5173/markethttp://127.0.0.1:5173/account
截图检查结论:
- 页面非空。
- 主要标题、列表、卡片、用量和权益面板可见。
- 未发现明显文字重叠、空白页或加载失败状态。
后续建议
- 如果继续 P2,可补 Playwright E2E 用例,覆盖作品创建、写作台 AI 生成、智能体试用、市场授权安装、个人资料保存。
- 当前构建包提示超过 500KB,后续可以按路由拆分
AgentPage、MarketPage、AccountPage等功能域。 public/mockServiceWorker.js的 lint warning 来自生成文件,可通过 ESLint ignore 或生成文件豁免处理,不建议手改生成文件。- P2 plan 清单仍未同步真实完成状态,后续可以单独更新计划文档,明确 Feature 3 实际已演进为“知识库列表 + 资料管理”形态,而不是旧版“实体/草稿/图谱”。