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"`
+
+
+
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: ""