WeiCHEN and Cursor
28faa4932d
fix(agent): Chat Agent 全链路 P0-P5 整改
...
封堵鉴权旁路与导出 IDOR,DocGov 改服务端身份;对话层 PendingAction 接真实 docgov/taskrun;修复流式租约假死与会话级任务流;加固配置/doc_id/NULL;补齐 slog 与测试;前端 ErrorBoundary 与受控文档重试。
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 18:22:45 +08:00
WeiCHEN and Cursor
60433f2a6b
feat(web): sync workflow docs from server and persist task artifact in chat
...
Pass doc_id on task runs, merge server deliverable state by task_key,
fetch controlled document content when opening non-template docs, and
map metadata.artifact after refresh.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 16:46:53 +08:00
WeiCHEN and Cursor
8e966db056
feat(web): asset upload, task run observer, and session lineage on tasks
...
Upload binary attachments as project assets, subscribe by run_id after refresh,
and pass session_id/project_id through long-task requests.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 15:15:16 +08:00
WeiCHEN and Cursor
0c9c0928ec
feat(web): wire project list and create to server API
...
Login syncs projects from GET /api/v1/projects; create project uses POST with server-assigned id while preserving local sessions and templates.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 14:28:01 +08:00
WeiCHEN and Cursor
4473115273
fix(web): align workbench user ids with auth seed
...
Unify MOCK_USERS with backend auth (admin id=1), merge session identity on login, and migrate demo seeds/tests to id 2/3/4 for 张工/李/王.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 14:23:31 +08:00
WeiCHEN and Cursor
0fc16af9a3
fix(web): keep draft when send preflight fails
...
Return accepted/error from handleSendMessage, clear InputArea only on success, and surface thinking/streaming feedback.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 14:23:28 +08:00
WeiCHEN and Cursor
78ad01b2da
fix(web): add secure-context-safe clientTurnId helper
...
Provide RFC 4122 v4 fallback via getRandomValues for LAN HTTP pages where randomUUID is unavailable.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 14:23:25 +08:00
WeiCHEN
d084056638
feat(task): inject uploaded documents into task materials and enable LAN host access
...
- backend: add Materials field to TaskRunRequestDTO and forward to ExecuteTask
- backend: add TestTaskStream_MaterialsInjection test case in taskstream_test.go
- web: serialize materials in buildTaskRequest and add unit test
- web: improve isSameMessage identity comparison in messageIdentity.ts
- web: configure host: '0.0.0.0' in vite.config.ts for LAN collaboration access
2026-09-11 13:22:02 +08:00
WeiCHEN and Cursor
2c98839b91
refactor(web): stop persisting full message list to localStorage
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:20:13 +08:00
WeiCHEN and Cursor
29cbd5a6ad
feat(web): isolate stream runtime by session and turn
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:20:13 +08:00
WeiCHEN and Cursor
0dbfc32603
feat(web): send stable client_turn_id and resume turns after disconnect
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:20:13 +08:00
WeiCHEN and Cursor
636e2c0cb4
fix(web): guard chat window fetch races on session switch
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:17:00 +08:00
WeiCHEN and Cursor
35aafa288d
test(web): cover real temp vs server message identity
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:16:42 +08:00
WeiCHEN and Cursor
f431414e29
fix(web): merge live and history by serverId and clientTurnId
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:16:42 +08:00
WeiCHEN and Cursor
d0e0b05bc8
fix(web): disable chat stream auto-retry without idempotency
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:15:25 +08:00
WeiCHEN and Cursor
13e58814d7
feat(web): improve chat attachments, unread marks, and session UX
...
Support richer attachment payloads in input area, local read-id cache for
unread badges, and expand private-shared and chronology test coverage.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:00:34 +08:00
WeiCHEN and Cursor
79f86e2671
feat(web): align project templates with official reference skeletons
...
Replace ad-hoc markdown stubs with reference-system template baselines,
free-text device type input, and add template quality regression tests.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:00:34 +08:00
WeiCHEN and Cursor
2c58e2d17c
fix(workflow): reconcile version conflicts in review mode and UI retry
...
Auto-adopt current workflow selection version in review/demo backend
paths, and retry frontend workflow switch after refreshing project version.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-11 13:00:33 +08:00
WeiCHEN
acedc2b0ba
feat(doc-preview): 上传文档多格式在线预览 + IndexedDB 持久化恢复
...
## 新增功能
- 支持用户上传的 Word(.docx)、PDF、Excel(.xlsx/.csv)、PPT(.pptx)、
图像(png/jpg/svg/webp等)、纯文本/代码文件的在线高保真预览
- 预览与受控工作流文档严格隔离:上传文档走 FilePreviewPanel,
工作流/对话入库文档继续走 BlockRenderer,互不干扰
## 核心 Bug 修复
- 修复页面刷新后上传文件无法预览/下载的根本问题
- 根因:File 对象无法 JSON 序列化,刷新后内存引用丢失
- 方案:新增 fileStore.ts,使用 IndexedDB 持久化文件二进制内容
- App 启动时自动 restoreFileRawToDeliverables() 从 IndexedDB 恢复 fileRaw
- 上传时 saveFile() 同步写入 IndexedDB(fire-and-forget)
## 下载按钮修复
- 优先从内存 File 对象动态创建 blob URL,避免依赖已 revoke 的旧 URL
- 文件内容不可用时按钮禁用并显示 tooltip 说明
## 存储层改进
- saveDeliverables() 序列化前剔除 fileRaw(不可持久化)和 blob: URL
避免 localStorage 保存损坏的空对象
## 新增文件
- web/src/data/fileStore.ts — IndexedDB 封装(saveFile/getFile/restore)
- web/src/components/doc/preview/FilePreviewPanel.tsx — 预览面板主组件
- web/src/components/doc/preview/renderers/DocxViewer.tsx — Word 预览
- web/src/components/doc/preview/renderers/PdfViewer.tsx — PDF 预览
- web/src/components/doc/preview/renderers/ExcelViewer.tsx — Excel 预览
- web/src/components/doc/preview/renderers/PptViewer.tsx — PPT 预览
- web/src/components/doc/preview/renderers/ImageViewer.tsx — 图像预览
- web/src/components/doc/preview/renderers/TextViewer.tsx — 文本预览
- web/src/tests/file-preview.test.ts — 预览功能单元测试
2026-09-11 12:58:50 +08:00
WeiCHEN
8f08a8dbe1
fix(chat): resolve intent recognition, workflow auth, and message ordering
2026-09-11 10:34:47 +08:00
WeiCHEN
c72bcc8ab0
feat(project): implement modal-based project creation, creator-led member assignment, and exited-member read-only retention
2026-09-11 10:10:33 +08:00
WeiCHEN
af003a3bb9
refactor(dialogue): implement task dispatch notifications and consecutive assistant messages with confirmation cards
2026-09-11 09:52:11 +08:00
WeiCHEN
82d7fe1cdc
refactor(dialogue): naturalize multi-role conversations, close chat sessions with assistant response, and set URS to project shared
2026-09-11 09:42:58 +08:00
WeiCHEN
4a4f2592b8
fix(doc): resolve URS viewing and private-to-shared workflow in document pane for 10 review projects
2026-09-11 09:26:03 +08:00
WeiCHEN
f3337b7bf9
feat(chat): add URS requirement document upload dialogues with attachments and phase events for all 10 projects
2026-09-11 09:03:54 +08:00
WeiCHEN
42f5b3da19
feat(chat): mount interactive review, approval, and verification confirmation cards in multi-role dialogues
2026-09-11 08:35:27 +08:00
WeiCHEN
92572138f7
fix(frontend): align MockDocumentMeta markdown property and guard nullish input in markdownToBlockAST
2026-09-11 00:58:00 +08:00
WeiCHEN
0d3cc6a6ce
feat(review): seed 10 real medical device projects with dual workflows, multi-role dialogues and fix account-switch chat isolation
2026-09-11 00:47:23 +08:00
WeiCHEN
dc12bc5794
fix(workflow): fix 405/404/403 errors on workflow switcher by updating CORS, 5201 demo permissions and server restart
2026-09-11 00:13:06 +08:00
WeiCHEN
a51d5fcd6d
chore(release): Phase 7 全链路验收报告、测试修复与发布基线归档
2026-09-10 23:57:40 +08:00
WeiCHEN
443a09d5b4
feat(workflow): Phase 6 前端项目多工作流切换器、前置依赖横幅与文档血缘失效提醒
2026-09-10 23:56:35 +08:00
WeiCHEN
4962cefdae
feat(export): 实现单次智能体回复导出、私密文档保存与隐私防泄露全套闭环 (Phase 0 - Phase 2)
...
- Phase 0: 实现服务端回复导出策略矩阵引擎 (replyexport.EvaluatePolicy)、数据库迁移 (2026-09-11-message-export-policy.sql)、SSE done 事件挂载与能力探测 API
- Phase 1: 构建前端 ReplyDocumentIR 语法树解析与渲染管道,支持 Markdown / DOCX 文件下载及带格式富文本剪贴板复制
- Phase 2: 实现私密自由文档 (freeform_documents) 领域服务、PostgreSQL 乐观锁版本管理、ACL 隐私隔离、一键共享与右侧栏编辑联动
- 专项修复:
1. 修复后台 API 路由注册并加入双向拉取同步,确保私密保存实时进入我的私密列表
2. 实现轻量回复专属 DOCX 生成与静默下载逻辑 (downloadDocxReply)
3. 将 LaTeX 公式转为标准 MathML 矢量标记,支持粘贴到 Microsoft Word / WPS 自动识别为原生公式
2026-09-10 23:04:04 +08:00
WeiCHEN
779c6c7f04
test(chat): add session turn_intent metadata assertion and chip category navigation tests
2026-09-10 16:10:53 +08:00
WeiCHEN
2c0c6a0348
feat(category): implement recategorize backfill engine and fallback mapping (Spec §3.4-3.5 A4-A5)
2026-09-10 15:56:53 +08:00
WeiCHEN
5a83b9fa44
feat(chat): 完成分类锚点坞(CategoryDock)与双轨制未读重构 (含方案A轮次归一化与起始位置居中)
2026-09-10 15:44:05 +08:00
WeiCHEN
76dae2dc3f
fix(nav): 修复点击项目会话时因 URL hash 监听重放导致被强制回弹选中第一个项目的 bug
2026-09-10 14:33:48 +08:00
WeiCHEN
709fadcef2
feat(history): 完成 Phase P3 虚拟滚动、聊天记录导出与协同未读提醒
...
- 虚拟滚动:接入 @tanstack/react-virtual,封装 useVirtualMessages 动态测高与 overscan 预渲染,迁移 anchorNavigator 锚点定位与 SSR 兼容降级
- 聊天记录导出:基于既有 docx 与 xlsx 依赖实现 chatExporter 与 ChatExportModal,新增服务端 /api/v1/chat/export/messages 支持按条件导出
- 协同未读标记:新增 useUnreadMarks 30s 轮询与服务端 /api/v1/chat/unread 接口,日历格与工具栏支持橙色未读徽标提示
- 测试与验证:新增 chat_unread_and_export_api_test.go,前端全量 126 项单元/组件测试及生产打包 100% 通过
2026-09-10 14:25:13 +08:00
WeiCHEN
de015d694a
feat(history): 实现三模历史搜索、每日智能协同摘要与时间轴侧栏 (Phase P2)
2026-09-10 13:53:07 +08:00
WeiCHEN
ad57685665
feat(history): 实现多级历史导航、分类筛选、日历联动与消息双向引用 (Phase P1)
...
- 后端核心与 API:
- 实现 ChatCategoryStat 结构体与 ListChatCategories 统计引擎 (Postgres + In-Memory 内存降级双轨)
- 注册 GET /api/v1/chat/categories 聚合接口
- 增强 GetChatDayMessages 支持自动根据 anchor_id 逆查 day_key,实现免猜测跨日检索
- 前端锚点导航引擎:
- 实现 anchorNavigator 模块 (快路径 DOM scrollIntoView + 1.8s 发光脉冲、慢路径跨日拉取、深链 Hash 解析)
- 编写 anchorNavigator.test.ts 单元测试并 100% 通过
- 分类过滤与轻量月历:
- 实现 CategoryFilterBar 水平分类筛选栏 (8 类业务标签,暗淡/高亮模式)
- 实现 HistoryCalendar 零依赖原生悬浮月历组件 (热度点与消息数,jumpToDate 快速定位)
- 消息引用与双向追溯:
- 消息气泡悬浮“引用”入口,点击提取发言人与摘要至输入框
- 实现 QuoteChip 待发引用标签与 QuoteCard 已发引用卡片
- 引用卡片点击直连锚点定位,快慢路径自动回溯
2026-09-10 13:40:44 +08:00
WeiCHEN
2ece0ce882
feat(history): 实现超长对话历史按日归档与滑动窗口 (Phase P0)
2026-09-10 13:24:32 +08:00
WeiCHEN
747cd39e97
feat(core): update backend coordinator, docgov lease, squad workflow and web governance integration
2026-09-10 09:38:35 +08:00
WeiCHEN
d40de5fe61
fix(web): wire ALL_MOCK_DOCUMENTS and project deliverables to fix document switching
2026-09-10 09:37:53 +08:00
WeiCHEN
7feabff181
fix(web): render step_failed phase as failed strip node with retry reset
2026-09-09 20:25:07 +08:00
WeiCHEN
99e0d4a412
fix(web): distinguish recovery action styles for long-task failures
2026-09-09 18:49:36 +08:00
WeiCHEN
873e6d0a83
feat(web): drive long tasks from SSE with live phases and continue/restart recovery
2026-09-09 18:48:26 +08:00
WeiCHEN
1d81d6acf1
feat(web): add task SSE client and live phase-event mapper
2026-09-09 18:41:02 +08:00
WeiCHEN and Cursor
0c7d974ae2
fix(web): escape HTML in chat markdown rendering
...
Prevent self-XSS when chat bubbles render user/LLM markdown via
dangerouslySetInnerHTML by escaping raw HTML after math/code
extraction and sanitizing link href schemes.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-09 17:48:12 +08:00
WeiCHEN and Cursor
56fb3180c2
fix(web): scope Task 5 App.tsx to SSE wiring only
...
- Rebased App.tsx on the last clean Task-4 parent (5aa8129 ) and re-applied
only Task-5's SSE plumbing: streamAbortRef, isStreamingActive,
buildNetworkErrorInfo, runStreamAttempt, handleErrorAction,
handleStopStreaming, and the InputArea/MessageStream wiring.
- Removed the unscoped WIP that had been folded into b2cf863 (NeuroPulse
demo data/session-privacy/docgov-lease/cardActionPolicy imports that do
not exist in git, causing b2cf863 to fail to build in isolation).
- Real-backend path now appends the pending placeholder and calls
runStreamAttempt immediately; the artificial setTimeout(600) is only
used for the mock keyword-shortcut demo branches (unchanged from 5aa8129 ),
gated by precomputed predicates so it never wraps the SSE call.
- Preserved 5aa8129's mock keyword shortcuts (生成文档/驳回/修改/通过等) verbatim.
- No silent success-template fallback re-introduced.
- P1 error actions remain filtered to retry-only; auto-retry transient
attempts stay capped at 2 with 1s/2s backoff via AbortController.
- Bloated WIP App.tsx backed up to .superpowers/sdd/App.tsx.wip-backup
for later use by whichever task owns NeuroPulse/session-privacy/docgov
lease work.
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-09 17:07:44 +08:00
WeiCHEN and Cursor
b2cf8637a3
feat(web): drive chat bubbles from SSE with auto-retry and stop
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-09 16:47:52 +08:00
WeiCHEN and Cursor
5aa812943c
feat(web): render chat wait-state and structured error actions in bubbles
...
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-09-09 16:36:49 +08:00