diff --git a/.planning/phases/06-/06-04-PLAN.md b/.planning/phases/06-/06-04-PLAN.md new file mode 100644 index 00000000..ef892364 --- /dev/null +++ b/.planning/phases/06-/06-04-PLAN.md @@ -0,0 +1,94 @@ +--- +phase: 06- +plan: 04 +type: execute +wave: 4 +depends_on: + - 06-01 + - 06-02 + - 06-03 +gap_closure: true +files_modified: + - frontend/src/components/workspace/input-box.tsx + - frontend/src/components/ai-elements/prompt-input.tsx + - frontend/src/core/threads/submit-files.ts + - frontend/src/core/threads/hooks.ts + - frontend/src/core/threads/hooks.test.ts + - frontend/tests/e2e/input-and-compose.spec.ts + - .planning/phases/06-/06-UAT.md +autonomous: true +requirements: + - ATREF-01 + - ATREF-02 + - ATREF-03 + - ATREF-04 +--- + + +关闭 06-UAT 中的 4 个缺口:候选位置、引用展示形态、上限与输入态保持、artifact 引用上下文可用性与任意输入位置 @ 触发。 + + + +@.planning/phases/06-/06-UAT.md +@frontend/src/components/workspace/input-box.tsx +@frontend/src/components/ai-elements/prompt-input.tsx +@frontend/src/core/threads/submit-files.ts +@frontend/src/core/threads/hooks.ts +@frontend/src/core/threads/hooks.test.ts +@frontend/tests/e2e/input-and-compose.spec.ts + + + + + + Task 1: 修正 @ 候选定位与触发策略 + + - 让候选列表始终紧贴输入区上方渲染(相对 textarea 锚点)。 + - 在输入中的任意位置输入 `@` 都可触发候选,不再要求输入框空白态。 + - 选择候选后保持 input 展开与焦点,不自动收起输入态。 + + + - `@` 在任意输入位置触发候选; + - 候选面板位置紧贴输入区上边缘; + - 点击候选后输入区保持可继续输入。 + + + + + Task 2: 重构引用展示与数量约束 + + - 将引用图片/文件预览渲染到 textarea 区域内,不再显示在 input 上方独立层。 + - 不复用 `Tag` 组件,改为专用引用预览 UI。 + - 引用上限改为 6,并同步提示文案与测试断言。 + + + - 引用元素显示在 textarea 区域内; + - 代码中不再用 `Tag` 渲染引用; + - 第 7 个引用被阻止并提示“最多 6 个”。 + + + + + Task 3: 对齐 artifact 引用上下文提交契约 + + - 调整 `additional_kwargs.files` 中 artifact 引用结构,使其与后端“可作为上下文文件”的识别契约一致。 + - 保持 upload 行为不回退,并补充单测覆盖 artifact/upload 两类上下文可用性差异。 + + + - artifact 引用在后续上下文中可用; + - upload 路径行为保持通过; + - hooks 单测覆盖并通过。 + + + + + + +- `cd frontend && node --test src/core/threads/hooks.test.ts` +- `cd frontend && pnpm -s typecheck` +- `cd frontend && pnpm -s test:e2e --grep "DF-INPUT-007|DF-INPUT-008"` + + + +After completion, create `.planning/phases/06-/06-04-SUMMARY.md` + diff --git a/.planning/phases/06-/06-UAT.md b/.planning/phases/06-/06-UAT.md index 1ff39ec8..0cf23c7e 100644 --- a/.planning/phases/06-/06-UAT.md +++ b/.planning/phases/06-/06-UAT.md @@ -1,5 +1,5 @@ --- -status: complete +status: diagnosed phase: 06- source: - 06-01-SUMMARY.md @@ -62,26 +62,55 @@ blocked: 0 reason: "User reported: 出现的候选列表,应该在紧贴在input的上方" severity: cosmetic test: 1 - artifacts: [] - missing: [] + root_cause: "候选面板使用 `DropdownMenuContent` 默认定位,且未绑定输入框锚点/上边缘约束,导致面板位置与输入区视觉预期不一致。" + artifacts: + - path: "frontend/src/components/workspace/input-box.tsx" + issue: "mention dropdown positioned by generic menu behavior, not explicitly anchored above textarea" + missing: + - "将候选列表定位策略改为紧贴输入区上方(含滚动与窗口边界处理)" + debug_session: "" - truth: "选择候选后,输入区显示可删除 chip;重复选择同一文件不会重复新增;可通过删除按钮或 Backspace 移除最后一个 chip。" status: failed reason: "User reported: 我希望引用的图片出现在textarea中而不是在input上方,而且不要复用tag组件" severity: major test: 2 - artifacts: [] - missing: [] + root_cause: "当前引用展示放在输入区外层绝对定位容器,并复用了 `Tag` 组件;未实现 textarea 内联引用预览组件。" + artifacts: + - path: "frontend/src/components/workspace/input-box.tsx" + issue: "references rendered in absolute `bottom-full` area using `Tag`" + - path: "frontend/src/components/ui/tag.tsx" + issue: "component reused for mention chips against UX requirement" + missing: + - "实现 textarea 内联引用卡片/图片缩略块" + - "替换 Tag 复用,使用专用引用 UI 组件" + debug_session: "" - truth: "单条消息最多只能添加 10 个引用;尝试添加第 11 个时出现错误提示且不会新增。" status: failed reason: "User reported: 限制为6个。且点击后端列表的时候不要收起input" severity: major test: 3 - artifacts: [] - missing: [] + root_cause: "上限常量硬编码为 10;同时选择候选后调用 `setMentionOpen(false)` 并存在外部点击收起逻辑,导致输入态被打断。" + artifacts: + - path: "frontend/src/components/workspace/input-box.tsx" + issue: "`MAX_REFERENCES_PER_MESSAGE = 10` and mention selection closes dropdown/input focus" + missing: + - "上限从 10 改为 6 并同步提示文案" + - "选择候选后保持输入框展开与焦点,不自动收起" + debug_session: "" - truth: "发送包含引用的消息后,消息成功进入对话流;引用对应的文件信息在后续上下文中可用。" status: failed reason: "User reported: 文件信息在上下文中不可用。当前系统未被当作上下文的传参是 artifact mention(包含 ref_kind/ref_source),上传文件会被当作上下文传参;且在输入中的任何时候输入@都应出现候选列表,不应仅在输入框为空时出现。" severity: major test: 5 - artifacts: [] - missing: [] + root_cause: "artifact 引用仅以前端构造的 `additional_kwargs.files` 元数据提交,缺少后端可解析的上下文绑定信号;另外 `@` 触发依赖当前 token 解析,未覆盖“任意输入位置”策略。" + artifacts: + - path: "frontend/src/core/threads/submit-files.ts" + issue: "references appended as metadata only; no backend-compatible context discriminator beyond ref_source" + - path: "frontend/src/core/threads/hooks.ts" + issue: "submit envelope does not include explicit artifact-context contract for backend resolution" + - path: "frontend/src/components/workspace/input-box.tsx" + issue: "mention trigger tied to `findMentionToken` result and closes when token not matched" + missing: + - "补充 artifact 引用的后端可消费上下文字段(与 uploads 对齐)" + - "确保任意输入位置输入 `@` 都可触发候选" + debug_session: ""