chiguyong
b4ba65b9ca
fix(gui): 修复启动报错和对话列表不正确的两个关键Bug
...
Bug1: 'async for' requires __aiter__ method, got coroutine
- EventQueue.subscribe() 在 _closed=True 时直接 return,
Python 将其视为协程而非异步生成器
- 修复: 添加不可达的 yield 语句,确保函数始终为异步生成器
Bug2: 启动时对话列表全显示"对话",无法识别之前的对话
- list_conversations() 不加载消息,_derive_conversation_title
遍历空 messages 列表导致标题全为"对话"
- 修复: list_conversations 从 SQLite 加载首条用户消息用于标题推导
Bug2b: WebSocket 不响应前端对话切换
- conv 变量只在首条消息时设置,之后忽略 conversation_id
- 修复: 每条消息都检查 conversation_id,切换时更新 conv
2026-06-18 16:26:02 +08:00
chiguyong
5b5291c7e5
fix: WebSocket task persistence three-layer defense with security hardening
...
Fix chat history empty content and task stops on refresh. Implements: result persistence on disconnect, task backgrounding via asyncio + EventQueue, frontend reconnection recovery. Security: fail-closed conversation_id ownership, asyncio.shield on CancelledError cleanup, async TaskStore shim, EventQueue subscriber limit, connection error resilience. 23 tests added.
2026-06-17 22:11:51 +08:00
chiguyong
ecf87391a5
feat: integrate SQ/EQ into portal WebSocket and CLI (Phase 4)
...
- app.py: initialize EventQueue + SubmissionQueue in app.state, close on shutdown
- portal.py: emit unified events (task.created/started/completed/failed,
turn.thinking/tool_call/tool_result/final_answer) to EQ alongside WebSocket messages
- cli/chat.py: optional --event-queue flag for event emission
- EQ is bypass-only: emit failures never affect WebSocket or CLI main flow
- WebSocket message format unchanged (backward compatible)
Tests: 650 passed, 0 failed, 4 skipped
2026-06-17 11:05:04 +08:00
chiguyong
773a62ead2
refactor: remove IntentRouter from tasks.py, delete legacy ConversationStore
...
- tasks.py: replace IntentRouter.route() with default agent fallback (REACT mode)
- app.py: remove IntentRouter import and initialization
- portal.py: delete legacy in-memory ConversationStore class (~120 lines),
SqliteConversationStore is the sole implementation now
- Remove unused SessionManager import from portal.py
Tests: 622 passed, 0 failed
2026-06-17 10:50:41 +08:00
chiguyong
200174c5c7
feat: SQLite persistence, verification loop, spec-driven execution
...
Phase 2 of architecture optimization (U5/U6/U9):
- U5: SqliteConversationStore with WAL mode + LRU cache (1000 convs)
Replaces in-memory ConversationStore in portal.py
Data survives server restarts (ref: Codex Thread persistence)
- U6: VerificationLoop with verify/verify_and_retry
Default commands: pytest + ruff check
ReActEngine integration via verification_enabled flag
New run_tests tool for LLM to invoke verification
- U9: SpecManager for plan-as-contract (ref: Qoder Quest Mode)
Plans persisted to .agentkit/specs/{spec_id}.yaml
API: GET/PUT /api/v1/specs, POST /api/v1/specs/{id}/confirm
PlanExecEngine emits spec_created event after plan generation
Also fixes: portal skill_name routing, app.py SessionManager guard,
test_telemetry CostAwareRouter removal, test_compression_config fixture
2026-06-17 10:45:20 +08:00
chiguyong
b54213b3c6
fix(review): resolve all P0/P1/P2 findings from code review
2026-06-16 09:08:03 +08:00
chiguyong
2c5e90104d
feat: message persistence, traceability and empty response auto-retry
2026-06-16 08:13:22 +08:00
chiguyong
16ac592855
feat(gateway): empty response auto-retry with fallback model chain
2026-06-16 08:07:21 +08:00
chiguyong
9caf332e9e
fix: ensure agent never returns empty result to user
2026-06-16 08:01:43 +08:00
chiguyong
c4257591d4
refactor(router): replace CostAwareRouter with SimpleRouter and prompt-based tool calling
2026-06-16 03:31:05 +08:00
chiguyong
0c63d813dc
fix: code review P0/P1 fixes — history param bug, llm dict access, WS ping
...
- Fix P0: _build_history_messages(conv.id, message_text) passed string as
limit param causing TypeError at runtime — removed erroneous second arg
- Fix P0: llm.py /llm/models used attribute access on dict (model_config.max_tokens)
causing AttributeError — changed to dict.get() access
- Fix P1: Portal WS ignored ping messages — added pong response handler
- Fix: composition.py f-string without placeholders
2026-06-15 08:30:49 +08:00
chiguyong
99fe4c99f7
fix: comprehensive code review fixes + WS test stability
2026-06-15 08:17:34 +08:00
chiguyong
94c4c8b887
feat: accumulated frontend enhancements, docs, and static assets
...
- Frontend view updates (ChatView, EvolutionView, SkillsView, etc.)
- Updated portal routes and chat store
- New frontend components (FilePreview, ToolCallCard, IconNav)
- Updated static build assets
- New test files (merged router, parallel tools, ReWOO fallback)
- Documentation and brainstorm files
- Codegraph and understand-anything artifacts
2026-06-14 16:35:01 +08:00
chiguyong
321c2333d6
fix(monitor): 对话完成后自动记录经验到监控面板
...
- portal.py: 对话完成后调用 _record_experience 记录经验到 dashboard
- portal.py: 修复 routing_result.skill → routing_result.skill_name 属性名
- 经验记录触发 experience_added 和 metrics_updated 事件广播
- metrics API 从 _experiences 内存列表计算 total_tasks/success_rate/avg_duration
2026-06-13 11:50:57 +08:00
chiguyong
905c1f6b18
fix(gui): 修复对话无skill时无法聊天、空对话列表、输入框清空、监控数据
...
- portal.py: 移除 all_skills 空检查,无 skill 时 fallback 到直接 LLM 对话
- portal.py: general 路径 agent 为 None 时也 fallback 到直接对话
- ChatView.vue: onMounted 自动创建默认对话
- ChatInput.vue: nextTick 清空输入框
- evolution_dashboard.py: usage API 从 LLMGateway.UsageTracker 读取真实数据
- DashboardOverview.vue: 活跃 agent 从 capabilities API 获取
2026-06-13 11:32:45 +08:00
chiguyong
d02a6d5200
fix(gui): 修复空对话列表、默认对话、输入框清空、监控数据
...
- portal.py: 延迟创建对话到第一条消息,避免空对话出现在历史列表
- portal.py: 添加用户消息到 ConversationStore 以支持历史注入
- ChatView.vue: onMounted 自动创建默认对话,无需手动点击新建
- ChatInput.vue: 输入框清空改用 nextTick 确保 Ant Design Vue v-model 同步
- evolution_dashboard.py: usage API 从 LLMGateway.UsageTracker 读取真实 token 数据
- DashboardOverview.vue: 活跃 agent 数从 capabilities API 获取
2026-06-13 11:11:00 +08:00
chiguyong
4c53dbaaeb
fix(gui): 修复对话上下文注入、输入框清空、对齐及工作流空状态居中
...
- portal.py: greeting/general 路径注入最近 20 条历史消息,解决对话记忆不连贯
- ChatInput.vue: 移除 disabled 提前 return,确保提交后清空输入框
- ChatInput.vue: textarea 设置 min-height: 40px,与按钮对齐
- WorkflowView.vue: 空状态 a-empty 垂直水平居中
- chat.ts: sendWsMessage 先检查 WS 状态避免重复消息
- types.ts: WsServerMessage 类型匹配后端嵌套 data 结构
- vite.config.ts: 代理添加 ws: true 支持 WebSocket
- portal.py/terminal.py: WebSocket accept 顺序修复
2026-06-13 10:48:06 +08:00
chiguyong
b6ec13cbca
debug: log tools count and names in portal before execute_stream
2026-06-11 21:44:20 +08:00
chiguyong
32c800d1e4
fix: portal routing + response speed + IME input
...
1. Portal unified routing: ws_chat now uses CostAwareRouter uniformly
(handles Layer 0/1/2), replacing direct IntentRouter calls.
Greeting/chat_mode requests skip IntentRouter LLM call entirely.
2. Response speed: greeting & simple chat now use direct LLM call
(no ReAct loop), zero-cost Layer 0 detection.
3. IME input fix: use e.isComposing (native browser property)
instead of compositionstart/end for Enter key detection.
4. Test: fix InMemoryMessageBus.request() parameter name
timeout -> timeout_seconds.
2026-06-11 21:30:25 +08:00
chiguyong
6852dfe892
fix(security,reliability): resolve all P2 findings from code review
2026-06-10 15:05:40 +08:00
chiguyong
1d1805753c
fix: resolve key P2 findings from code review
...
- Shell whitelist: use exact binary match instead of startswith
- Shell audit log: use deque(maxlen=10000) to cap memory
- Terminal history: use deque(maxlen) for O(1) eviction
- Path optimizer: cap _pending_paths at 50 entries per task_type
- Pitfall detector: only add tips to matching steps, not all
- Experience store: handle non-numeric _parse_time_window input
- Extract shared is_safe_url() to utils/security.py (DRY)
- Workflow condition evaluator: handle float() ValueError
2026-06-10 09:01:23 +08:00
chiguyong
a1deeecede
feat(phase5): implement Vue3 portal foundation with chat interface and routing (U13a)
...
- Add Portal API routes: chat, stream, capabilities, conversations, WebSocket
- Add ConversationStore for in-memory conversation management
- Add CAPABILITY_CATEGORIES mapping for 8 capability types
- Create Vue3 SPA with TypeScript, Pinia, Vue Router, Ant Design Vue
- Implement ChatView with message bubbles, input, sidebar, WebSocket support
- Add side navigation skeleton for all 8 capability sections
- Add placeholder views for workflow, knowledge, skills, terminal, etc.
- 31 backend tests passing
2026-06-10 01:06:48 +08:00