90 lines
5.6 KiB
Markdown
90 lines
5.6 KiB
Markdown
---
|
||
phase: 06-
|
||
verified: 2026-04-15T05:24:24Z
|
||
status: verified
|
||
score: 8/8 must-haves verified
|
||
overrides_applied: 0
|
||
gaps: []
|
||
---
|
||
|
||
# Phase 6: 在输入框输入@时,可引用已生成文件和已上传附件 Verification Report
|
||
|
||
**Phase Goal:** 在当前线程聊天输入框中实现 `@` 文件引用(artifacts + uploads),并通过 `additional_kwargs.files` 稳定提交且具备回归测试。
|
||
**Verified:** 2026-04-15T05:24:24Z
|
||
**Status:** verified
|
||
**Re-verification:** Yes — after 06-05 gap closure
|
||
|
||
## Goal Achievement
|
||
|
||
### Observable Truths
|
||
|
||
| # | Truth | Status | Evidence |
|
||
| --- | --- | --- | --- |
|
||
| 1 | 输入 `@` 时仅展示当前线程候选并支持连续过滤(ATREF-01) | ✓ VERIFIED | `input-box.tsx` 基于 `thread.values.artifacts` + `useUploadedFiles(threadId)` 聚合候选,`findMentionToken` + `mentionQuery` 做过滤。 |
|
||
| 2 | 选中后展示可删除 chip,而非纯文本 | ✓ VERIFIED | `input-box.tsx` 渲染 `reference-chip`,并支持按钮删除与空输入 `Backspace` 删除最后一项。 |
|
||
| 3 | 同名场景显示“文件名+类型+路径尾段”,且上限 10(ATREF-02) | ✓ VERIFIED | `MAX_REFERENCES_PER_MESSAGE = 10`;候选与预览均显示 `filename + typeLabel + pathTail`;超过上限提示“单条消息最多引用 10 个文件”。 |
|
||
| 4 | 引用通过 `additional_kwargs.files` 提交,不新增并行主结构 | ✓ VERIFIED | `hooks.ts` 提交链路写入 `additional_kwargs: { files: filesForSubmit }`。 |
|
||
| 5 | 引用提交带来源元信息且兼容既有渲染链路(ATREF-03) | ✓ VERIFIED | `FileInMessage` 保留 `ref_kind/ref_source` 可选字段,消息渲染链路保持兼容。 |
|
||
| 6 | 失效引用软剔除并继续发送文本(ATREF-03) | ✓ VERIFIED | `buildFilesForSubmit` 丢弃 `stale`;`hooks.ts` toast 后继续发送。 |
|
||
| 7 | 回归测试覆盖候选/chip/上限/软失败(ATREF-04) | ✓ VERIFIED | `DF-INPUT-007/008/009` 重新验证通过;008 不再永久跳过。 |
|
||
| 8 | 存在 style/logic/tests/docs 提交分组计划(ATREF-04) | ✓ VERIFIED | `06-COMMIT-GUIDE.md` 保持 `style -> logic -> tests -> docs` 分组约束。 |
|
||
|
||
**Score:** 8/8 truths verified
|
||
|
||
### Required Artifacts
|
||
|
||
| Artifact | Expected | Status | Details |
|
||
| --- | --- | --- | --- |
|
||
| `frontend/src/components/workspace/input-box.tsx` | `@` 候选、过滤、chip、键盘交互、上限 10 | ✓ VERIFIED | 使用 `DropdownMenu` 候选层,包含类型/路径去歧义显示。 |
|
||
| `frontend/src/core/threads/hooks.ts` | 统一提交 `additional_kwargs.files` | ✓ VERIFIED | `filesForSubmit` 汇总后进入提交 envelope。 |
|
||
| `frontend/src/core/threads/submit-files.ts` | uploads/references 合并与 artifact 物化 | ✓ VERIFIED | `materializeArtifactReferences` + `buildFilesForSubmit` 正常工作。 |
|
||
| `frontend/src/core/messages/utils.ts` | `FileInMessage` 扩展兼容 | ✓ VERIFIED | 字段扩展为可选,未破坏旧数据。 |
|
||
| `frontend/src/core/threads/hooks.test.ts` | 提交流程与软失败单测 | ✓ VERIFIED | 4 条测试通过。 |
|
||
| `frontend/tests/e2e/input-and-compose.spec.ts` | `@` 引用 E2E 回归 | ✓ VERIFIED | `DF-INPUT-007/008/009` 全部通过。 |
|
||
| `.planning/phases/06-/06-COMMIT-GUIDE.md` | 分组提交计划 | ✓ VERIFIED | 分组与执行顺序清晰。 |
|
||
|
||
### Key Link Verification
|
||
|
||
| From | To | Via | Status | Details |
|
||
| --- | --- | --- | --- | --- |
|
||
| `input-box.tsx` | `uploads/hooks.ts` | `useUploadedFiles(threadId)` | ✓ WIRED | 候选来源连接正常。 |
|
||
| `input-box.tsx` | `thread.values.artifacts` | thread artifacts 候选源 | ✓ WIRED | 直接读取。 |
|
||
| `input-box.tsx` | `hooks.ts` | `PromptInputMessage.references` | ✓ WIRED | `handleSubmit` 将 references 合并后提交。 |
|
||
| `hooks.ts` | `submit-files.ts` | `buildFilesForSubmit/materializeArtifactReferences` | ✓ WIRED | 提交前标准化已接入。 |
|
||
| `hooks.ts` | `additional_kwargs.files` | 提交 envelope | ✓ WIRED | 主链路输出一致。 |
|
||
| `input-box.tsx` | `dropdown-menu.tsx` | Dropdown 候选面板 | ✓ WIRED | 使用 `DropdownMenuContent/Item`。 |
|
||
|
||
### Behavioral Spot-Checks
|
||
|
||
| Behavior | Command | Result | Status |
|
||
| --- | --- | --- | --- |
|
||
| 提交构建与软失败单测 | `cd frontend && node --test src/core/threads/hooks.test.ts` | 4 passed, 0 failed | ✓ PASS |
|
||
| 类型检查 | `cd frontend && pnpm -s typecheck` | exit 0 | ✓ PASS |
|
||
| 引用回归 E2E | `cd frontend && pnpm -s test:e2e --grep "DF-INPUT-007|DF-INPUT-008|DF-INPUT-009"` | 3 passed | ✓ PASS |
|
||
|
||
### Requirements Coverage
|
||
|
||
| Requirement | Source Plan | Description | Status | Evidence |
|
||
| --- | --- | --- | --- | --- |
|
||
| ATREF-01 | 06-02, 06-05 | `@` 仅显示当前线程候选并支持过滤 | ✓ SATISFIED | 候选来源与过滤行为已验证。 |
|
||
| ATREF-02 | 06-02, 06-05 | chip 展示 + 同名去歧义(文件名+类型+路径尾段)+ 上限 10 | ✓ SATISFIED | 代码常量/文案/E2E 断言已统一为 10。 |
|
||
| ATREF-03 | 06-01, 06-05 | `additional_kwargs.files` 提交 + 元信息 + stale 软剔除 | ✓ SATISFIED | hooks + submit-files + 单测通过。 |
|
||
| ATREF-04 | 06-03, 06-05 | 单测+E2E 回归 + 提交分组计划 | ✓ SATISFIED | 关键 E2E 用例稳定通过,分组文档完整。 |
|
||
|
||
Orphaned requirements for Phase 6: None.
|
||
|
||
### Anti-Patterns Found
|
||
|
||
| File | Line | Pattern | Severity | Impact |
|
||
| --- | --- | --- | --- | --- |
|
||
| `frontend/src/components/workspace/input-box.tsx` | 745 | `TODO` connector 占位注释 | ℹ️ Info | 与 Phase 6 验证目标无阻断关系。 |
|
||
|
||
### Gaps Summary
|
||
|
||
No unresolved verification gaps in Phase 6.
|
||
|
||
---
|
||
|
||
_Verified: 2026-04-15T05:24:24Z_
|
||
_Verifier: Codex (re-verified with current workspace state)_
|