This commit is contained in:
2026-07-30 08:42:55 +08:00
parent 48b7391365
commit 1867649527
19 changed files with 1877 additions and 486 deletions

View File

@ -5,17 +5,21 @@
## 已实现
- 单会话聊天、SQLite 持久化与首轮 AI 主题标题
- 首屏由 Server Component 直接读取 SQLite客户端 hydration 前即可显示工作台
- 标题编辑、会话重置(重置后标题清空)
- DeepSeek V4 Flash 流式回答
- Skill 多选、拖拽排序、标签移除与 `/` 快速提示
- 每轮由 AI 独立判断实际使用哪些已选 Skill
- 勾选集合绑定当前需求生命周期,直到需求完成或明确放弃
- 每轮由 AI 独立判断实际使用哪些已勾选 Skill
- 候选 Skill 与实际使用 Skill 的差异化高亮反馈
- 回答中止;中止作为本轮终态处理,并清空本轮 Skill
- Skill 编辑自动递增版本;进行中的需求固定使用开始时的完整快照
- 回答中止采用 SQLite 原子终态;只结束 Run不清空需求的 Skill
- SSE 事件持久化、序号去重与断线续传
- Skill 新建、AI 对话编辑、删除与列表自动刷新
- 五节点严格顺序:触发条件、输入参数、执行步骤、输出格式、约束与测试
- 已完成节点可回改,未解锁节点不可跳过
- 右侧节点内容完全只读,只能通过 AI 对话修改
- AI 先在聊天中展示待写入提案,用户确认后才更新节点
- 所有节点完成后才允许保存
- AI JSON 输出经过严格结构校验、纠错重试和服务端二次约束
- 无 API Key 时自动进入可操作的本地演示模式
@ -59,12 +63,26 @@ SQLite 默认写入 `data/skillloom.db`,包含:
- `conversations` / `messages`
- `chat_runs` / `chat_run_events`
`skills.version` 记录可编辑版本;`messages.skill_snapshots_json` 保存每轮
审计快照;`conversations.task_state`
`retained_skill_snapshots` 保存进行中需求的生命周期和固定版本。
主聊天采用“两步式 Run”
1. `POST /api/chat` 幂等创建回答任务。
2. `GET /api/chat/runs/:id/stream?after=:seq` 订阅 SSE。
每个事件先写入 SQLite 并获得单调递增的 `seq`,浏览器断线后携带最后序号重连,因此不会重复拼接 token。显式中止使用独立接口不会把普通网络断开误判为用户中止
每个事件先写入 SQLite 并获得单调递增的 `seq`,浏览器断线后携带最后序号重连,因此不会重复拼接 token。显式中止使用独立接口并在同一事务中写入可见内容、用量、Skill 保留状态、终态事件和 Run 状态,避免停止请求与后台流式写入相互覆盖
Skill 有三组彼此独立的状态:
1. 用户勾选集合:当前需求允许使用哪些 Skill
2. 当轮使用集合:路由器从勾选集合中实际选择的子集;
3. 需求状态:`active``awaiting_input``offer_pending`
`complete``abandoned`
只有 `complete``abandoned` 会清空勾选集合。回答失败、中止或服务重启
只结束本次 Run需求和已固定的 Skill 快照仍保留。
结构化 AI 输出经过四层保护:
@ -88,7 +106,9 @@ npm run test:acceptance
- 删除 Skill 与列表刷新
- 聊天选择和实际调用 Skill
- 返回是否调用及具体 Skill
- 中止作为终态
- 多选 Skill 的需求级保留与单轮子集路由
- Skill 编辑版本递增与跨轮快照固定
- 中止内容、事件与需求状态的原子终态
- 首轮 AI 主题标题、标题编辑与会话重置
- SSE 断线重连、事件去重和继续生成