feat(electrobun): agent execution layer — sidecar manager + message adapters + store

- SidecarManager: spawns claude/codex/ollama runners via Bun.spawn(),
  NDJSON stdio protocol, Claude CLI auto-detection, env stripping,
  AbortController stop, Deno/Node runtime detection
- MessageAdapter: parses Claude stream-json, Codex ThreadEvent, Ollama
  chunks into common AgentMessage format
- agent-store.svelte.ts: per-project reactive session state, RPC event
  listeners for agent.message/status/cost
- AgentPane: wired to real sessions (start/stop/prompt), stop button,
  thinking/system message rendering
- ProjectCard: status dot from real agent status, cost/tokens from store
- 5 new RPC types (agent.start/stop/prompt/list + events)
This commit is contained in:
Hibryda 2026-03-22 01:03:05 +01:00
parent 95f1f8208f
commit ef0183de7f
8 changed files with 1566 additions and 61 deletions

View file

@ -146,6 +146,50 @@ export type PtyRPCRequests = {
params: { id: string };
response: { ok: boolean };
};
// ── Agent RPC ─────────────────────────────────────────────────────────────
/** Start an agent session with a given provider. */
"agent.start": {
params: {
sessionId: string;
provider: "claude" | "codex" | "ollama";
prompt: string;
cwd?: string;
model?: string;
systemPrompt?: string;
maxTurns?: number;
permissionMode?: string;
claudeConfigDir?: string;
extraEnv?: Record<string, string>;
};
response: { ok: boolean; error?: string };
};
/** Stop a running agent session. */
"agent.stop": {
params: { sessionId: string };
response: { ok: boolean; error?: string };
};
/** Send a follow-up prompt to a running agent session. */
"agent.prompt": {
params: { sessionId: string; prompt: string };
response: { ok: boolean; error?: string };
};
/** List all active agent sessions with their state. */
"agent.list": {
params: Record<string, never>;
response: {
sessions: Array<{
sessionId: string;
provider: string;
status: string;
costUsd: number;
inputTokens: number;
outputTokens: number;
startedAt: number;
}>;
};
};
};
// ── Messages (Bun → WebView, fire-and-forget) ────────────────────────────────
@ -155,6 +199,33 @@ export type PtyRPCMessages = {
"pty.output": { sessionId: string; data: string };
/** PTY session exited. */
"pty.closed": { sessionId: string; exitCode: number | null };
// ── Agent events (Bun → WebView) ─────────────────────────────────────────
/** Agent message(s) parsed from sidecar NDJSON. */
"agent.message": {
sessionId: string;
messages: Array<{
id: string;
type: string;
parentId?: string;
content: unknown;
timestamp: number;
}>;
};
/** Agent session status change. */
"agent.status": {
sessionId: string;
status: string;
error?: string;
};
/** Agent cost/token update. */
"agent.cost": {
sessionId: string;
costUsd: number;
inputTokens: number;
outputTokens: number;
};
};
// ── Combined schema ───────────────────────────────────────────────────────────