feat: in-app Orchestrator (Phase 2) — multi-agent conductor

Brings the deterministic Han-flow conductor into BooCode: launch any read-only
flow from BooChat or BooCoder, watch each agent stream live in a Paseo-style
run pane, get an evidence-disciplined report — on local Qwen, persisted and
resumable. Read-only enforced hard via qwen --approval-mode plan (orchestrator
tasks fail closed if qwen is unavailable; never fall to write-capable native).

Backend (apps/coder): re-homed conductor defs, flow_runs/flow_steps schema,
flow-runner + dispatcher onTaskTerminal hook, restart-resume, runs routes
(launch/list/get/cancel), user-channel WS. Contracts: two flow_run_* frames.
Web: orchestrator pane kind + OrchestratorPane, Workflow button + slash flows
(BooChat/BooCoder parity), FlowLauncherDialog, "New Orchestrator" in the + and
split menus, runs history + export. Plan: openspec/changes/orchestrator.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-03 14:59:07 +00:00
parent 519b1d2ca1
commit 1937af8df9
118 changed files with 15723 additions and 27 deletions

View File

@@ -42,7 +42,9 @@ export interface InferenceFrame {
| 'messages_deleted'
| 'session_renamed'
| 'chat_renamed'
| 'error';
| 'error'
| 'flow_run_started'
| 'flow_run_step_updated';
message_id?: string;
message_ids?: string[];
chat_id?: string;
@@ -73,6 +75,15 @@ export interface InferenceFrame {
model?: string;
session_id?: string;
name?: string;
// orchestrator frames ([D-6])
run_id?: string;
flow_name?: string;
band?: 'small' | 'medium' | 'large';
steps?: Array<{ step_id: string; agent: string; kind: 'agent' | 'code'; chat_id: string; label: string }>;
step_id?: string;
status?: string;
run_status?: 'running' | 'completed' | 'failed' | 'cancelled';
report?: string;
}
export type FramePublisher = (sessionId: string, frame: InferenceFrame) => void;