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:
parent
95f1f8208f
commit
ef0183de7f
8 changed files with 1566 additions and 61 deletions
|
|
@ -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 ───────────────────────────────────────────────────────────
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue