feat(orchestrator): file-based orchestrator request watcher (§14.3)

- domain: OrchestratorRequest/Command parse-don't-validate + OrchestratorRequestProcessed event
- application: OrchestratorService dispatching spawn/stop/update_agent_context
- infrastructure: request watcher over .ideai/requests/, writes .response.json
- app-tauri: relay OrchestratorRequestProcessed to the frontend DTO

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-07 11:12:04 +02:00
parent 9736c42424
commit 480e7c7bbe
14 changed files with 1908 additions and 3 deletions

View File

@ -91,6 +91,16 @@ pub enum DomainEventDto {
/// Project id.
project_id: String,
},
/// An orchestrator request was processed on behalf of a requester agent.
#[serde(rename_all = "camelCase")]
OrchestratorRequestProcessed {
/// Id of the requesting (orchestrator) agent.
requester_id: String,
/// The action that was processed.
action: String,
/// Whether IdeA handled it successfully.
ok: bool,
},
/// Raw PTY output (normally routed to a per-session channel, not here).
#[serde(rename_all = "camelCase")]
PtyOutput {
@ -147,6 +157,15 @@ impl From<&DomainEvent> for DomainEventDto {
DomainEvent::GitStateChanged { project_id } => Self::GitStateChanged {
project_id: project_id.to_string(),
},
DomainEvent::OrchestratorRequestProcessed {
requester_id,
action,
ok,
} => Self::OrchestratorRequestProcessed {
requester_id: requester_id.clone(),
action: action.clone(),
ok: *ok,
},
DomainEvent::PtyOutput { session_id, bytes } => Self::PtyOutput {
session_id: session_id.to_string(),
bytes: bytes.clone(),