feat(aia): Protocol Agent streaming + editable state panel + protocol generation plan

Day 2 Development (2026-01-24):

Backend Enhancements:
- Implement SSE streaming in ProtocolAgentController using createStreamingService
- Add data condensation via LLM in ProtocolOrchestrator.handleProtocolSync
- Support stage editing without resetting progress
- Add explicit JSON output format for each stage in system prompt
- Create independent seed script for Protocol Agent (seed-protocol-agent.ts)

Frontend Improvements:
- Integrate useAIStream hook for typewriter effect in ChatArea
- Add MarkdownContent component for basic Markdown rendering
- Implement StageEditModal for editing stage data (scientific question, PICO, etc.)
- Add edit button to StageCard (visible on hover)
- Fix routing paths from /aia to /ai-qa
- Enhance CSS with full-screen layout and Markdown styles

New Documentation:
- One-click protocol generation development plan (v1.1)
- Editor selection evaluation (Novel vs BlockNote vs Tiptap)
- Novel fork strategy for AI-native editing

Technical Decisions:
- Choose Novel (Fork) as protocol editor for AI-first design
- Two-stage progressive generation: summary in chat, full protocol in editor
- 10-day development plan for protocol generation feature

Code Stats:
- Backend: 3 files modified, 1 new file
- Frontend: 9 files modified, 2 new files
- Docs: 3 new files

Status: Streaming and editable features working, protocol generation pending
This commit is contained in:
2026-01-24 23:06:33 +08:00
parent 596f2dfc02
commit 4d7d97ca19
18 changed files with 2708 additions and 192 deletions

View File

@@ -2,9 +2,9 @@
* AIA - AI Intelligent Assistant 模块入口
*
* 路由管理:
* - /aia -> Hub: 智能体大厅12个模块展示
* - /aia/chat -> Chat: 沉浸式对话工作台原12个智能体
* - /aia/protocol-agent/:conversationId? -> Protocol Agent全流程方案制定
* - /ai-qa -> Hub: 智能体大厅12个模块展示
* - /ai-qa/chat -> Chat: 沉浸式对话工作台原12个智能体
* - /ai-qa/protocol-agent/:conversationId? -> Protocol Agent全流程方案制定
*/
import React, { useState } from 'react';
@@ -40,12 +40,12 @@ const AIAHub: React.FC = () => {
if (agent.isProtocolAgent) {
// Protocol Agent跳转专属页面
console.log('[AIAHub] Navigating to /aia/protocol-agent');
navigate('/aia/protocol-agent');
console.log('[AIAHub] Navigating to /ai-qa/protocol-agent');
navigate('/ai-qa/protocol-agent');
} else {
// 传统智能体:跳转对话页面
console.log('[AIAHub] Navigating to /aia/chat');
navigate('/aia/chat', { state: { agent, initialQuery: agent.initialQuery } });
console.log('[AIAHub] Navigating to /ai-qa/chat');
navigate('/ai-qa/chat', { state: { agent, initialQuery: agent.initialQuery } });
}
};
@@ -61,11 +61,11 @@ const AIAChat: React.FC = () => {
const state = location.state as { agent: AgentConfig; initialQuery?: string } | null;
const handleBack = () => {
navigate('/aia');
navigate('/ai-qa');
};
if (!state?.agent) {
navigate('/aia');
navigate('/ai-qa');
return null;
}