125 lines
5.9 KiB
Markdown
125 lines
5.9 KiB
Markdown
|
|
# AI Control Orchestration Panel Plan
|
||
|
|
|
||
|
|
## Goal
|
||
|
|
Add a minimal viable right-side `JARVIS CONTROL` panel to the chat page that visualizes real-time agent orchestration from existing stream progress events while keeping the main conversation as the primary reading surface.
|
||
|
|
|
||
|
|
## Scope
|
||
|
|
- Frontend-only V1
|
||
|
|
- Reuse existing stream payload fields: `stage`, `agent`, `tool_name`, `step`, `steps`
|
||
|
|
- No persistence into conversation history
|
||
|
|
- Auto-open on send, auto-close shortly after success or error
|
||
|
|
|
||
|
|
## Recommended implementation
|
||
|
|
|
||
|
|
### 1. Add a dedicated orchestration panel component
|
||
|
|
Create a presentational component, e.g. `frontend/src/components/chat/OrchestrationPanel.vue`, responsible only for rendering:
|
||
|
|
- Header: `JARVIS CONTROL`, current phase, status chip (`ACTIVE`, `COMPLETE`, `ERROR`)
|
||
|
|
- Vertical agent bus:
|
||
|
|
- `JARVIS`
|
||
|
|
- `planner`
|
||
|
|
- `executor`
|
||
|
|
- `analyst`
|
||
|
|
- `librarian`
|
||
|
|
- Recent event feed limited to the latest 3-5 items
|
||
|
|
|
||
|
|
Keep rendering logic out of `index.vue` as much as possible so the page stays manageable.
|
||
|
|
|
||
|
|
### 2. Expand transient chat-view state in `useChatView.ts`
|
||
|
|
Replace the single `thinkingState`-only UX with a richer transient orchestration session owned by the composable. Suggested state shape:
|
||
|
|
- `thinkingState`: preserve current raw progress snapshot for compatibility
|
||
|
|
- `orchestrationPanelVisible: boolean`
|
||
|
|
- `orchestrationStatus: 'idle' | 'active' | 'complete' | 'error'`
|
||
|
|
- `activeAgent: string | null`
|
||
|
|
- `visitedAgents: string[]`
|
||
|
|
- `eventFeed: Array<{ id: string; label: string; kind: 'info' | 'tool' | 'success' | 'error' }>`
|
||
|
|
- `panelPhaseLabel: string`
|
||
|
|
- `closeTimer` handle for delayed auto-close
|
||
|
|
|
||
|
|
This state should be reset at the start of each `sendMessage()` call and never written into the conversation store.
|
||
|
|
|
||
|
|
### 3. Map existing stream events into panel state
|
||
|
|
Inside `conversationApi.chatStream(...).onProgress`:
|
||
|
|
- Open the panel on the first progress event if not already visible
|
||
|
|
- Update `thinkingState` as today
|
||
|
|
- Derive a display phase from `payload.stage`
|
||
|
|
- Set `activeAgent` from `payload.agent`
|
||
|
|
- Add `payload.agent` to `visitedAgents` if new
|
||
|
|
- Push short event-feed items using priority:
|
||
|
|
1. `payload.step`
|
||
|
|
2. `payload.tool_name` -> `调用工具 · {tool}`
|
||
|
|
3. `payload.label`
|
||
|
|
- If `payload.steps` exists, only surface the first meaningful item as an event instead of dumping the whole list into the panel
|
||
|
|
- Trim event feed to latest 5 entries
|
||
|
|
|
||
|
|
### 4. Change completion behavior
|
||
|
|
Current code clears `thinkingState` immediately after stream completion or error. For the new experience:
|
||
|
|
- On success:
|
||
|
|
- set panel status to `complete`
|
||
|
|
- add a final event like `响应已生成`
|
||
|
|
- append assistant message to store as today
|
||
|
|
- keep panel visible for ~1000-1500ms, then hide and reset transient panel state
|
||
|
|
- On error:
|
||
|
|
- set panel status to `error`
|
||
|
|
- add error event using the error message
|
||
|
|
- keep panel visible slightly longer (e.g. ~1600ms), then hide and reset
|
||
|
|
|
||
|
|
This preserves the cinematic finish while keeping the panel ephemeral.
|
||
|
|
|
||
|
|
### 5. Update page layout in `src/pages/chat/index.vue`
|
||
|
|
Restructure the main chat area so the central chat surface and right-side orchestration panel can coexist:
|
||
|
|
- Keep existing left session sidebar unchanged
|
||
|
|
- Wrap the current chat section and new panel in a horizontal content shell
|
||
|
|
- Mount `<OrchestrationPanel ... />` to the right of the message/input area
|
||
|
|
- Only show the panel when `orchestrationPanelVisible` is true
|
||
|
|
- Keep the inline thinking bubble minimal or remove most of its detail once the side panel is active, so the UI does not duplicate orchestration information in two places
|
||
|
|
|
||
|
|
### 6. Styling direction
|
||
|
|
V1 styling should match the approved “AI control center” concept:
|
||
|
|
- narrow right panel (`~340px`)
|
||
|
|
- dark glass background, subtle cyan edge glow
|
||
|
|
- vertical bus with one large `JARVIS` node and four smaller agent nodes
|
||
|
|
- active node: bright border + pulse
|
||
|
|
- visited node: low residual glow
|
||
|
|
- event feed: compact short system phrases
|
||
|
|
- entrance/exit: slide + fade
|
||
|
|
|
||
|
|
## File-level change plan
|
||
|
|
|
||
|
|
### `frontend/src/pages/chat/composables/useChatView.ts`
|
||
|
|
- Add orchestration session state and reset helpers
|
||
|
|
- Add progress-to-panel mapping helper
|
||
|
|
- Add delayed close helper
|
||
|
|
- Preserve existing send/stream logic while extending transient UI state
|
||
|
|
|
||
|
|
### `frontend/src/pages/chat/index.vue`
|
||
|
|
- Import panel component
|
||
|
|
- Bind panel props from `useChatView()`
|
||
|
|
- Adjust layout to support central chat + right panel
|
||
|
|
- Reduce duplication between inline thinking bubble and right-side orchestration UI
|
||
|
|
|
||
|
|
### `frontend/src/components/chat/OrchestrationPanel.vue`
|
||
|
|
- New component for header, agent bus, event feed, and status visualization
|
||
|
|
|
||
|
|
## Suggested event text mapping
|
||
|
|
- `thinking` -> `请求接入`, `语义解析中`
|
||
|
|
- `planning` -> `任务拆解中`, `生成执行路径`
|
||
|
|
- `tool` + tool name -> `调用工具 · {tool_name}`
|
||
|
|
- `responding` -> `正在汇总响应`
|
||
|
|
- success -> `响应已生成`
|
||
|
|
- error -> `任务执行中断`
|
||
|
|
|
||
|
|
## Risks and mitigations
|
||
|
|
- **Duplicate cognition with inline thinking bubble**: keep the bubble lightweight once panel exists
|
||
|
|
- **Too many events**: cap the feed to 5 and dedupe consecutive identical labels
|
||
|
|
- **Panel state leaking across conversation switches**: reset on `newConversation()` and `selectConversation()` when appropriate
|
||
|
|
- **Abrupt close**: use short delayed close timers and clear any existing timer before starting a new request
|
||
|
|
|
||
|
|
## Verification checklist
|
||
|
|
1. Send a message and confirm the right panel slides in before the final assistant bubble appears.
|
||
|
|
2. Confirm active agent highlighting changes as stream progress changes.
|
||
|
|
3. Confirm event feed shows short orchestration phrases, not raw backend payload dumps.
|
||
|
|
4. Confirm the panel auto-closes shortly after success.
|
||
|
|
5. Confirm the panel shows error state briefly, then closes on failure.
|
||
|
|
6. Confirm switching conversations or starting a new one does not preserve the previous request's orchestration state.
|
||
|
|
7. Confirm the main chat remains the dominant reading surface and the panel does not push message content into unreadable widths.
|