diff --git a/Cargo.toml b/Cargo.toml index a94707f..bc966dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["sunbeam-sdk", "sunbeam"] +members = ["sunbeam-sdk", "sunbeam", "sunbeam-proto"] resolver = "3" diff --git a/sunbeam-proto/Cargo.toml b/sunbeam-proto/Cargo.toml new file mode 100644 index 0000000..68f03d7 --- /dev/null +++ b/sunbeam-proto/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "sunbeam-proto" +version = "0.1.0" +edition = "2024" +description = "Shared protobuf definitions for Sunbeam gRPC services" + +[dependencies] +tonic = "0.13" +prost = "0.13" + +[build-dependencies] +tonic-build = "0.13" diff --git a/sunbeam-proto/build.rs b/sunbeam-proto/build.rs new file mode 100644 index 0000000..457a429 --- /dev/null +++ b/sunbeam-proto/build.rs @@ -0,0 +1,4 @@ +fn main() -> Result<(), Box> { + tonic_build::compile_protos("proto/code.proto")?; + Ok(()) +} diff --git a/sunbeam-proto/proto/code.proto b/sunbeam-proto/proto/code.proto new file mode 100644 index 0000000..a15cfd2 --- /dev/null +++ b/sunbeam-proto/proto/code.proto @@ -0,0 +1,121 @@ +syntax = "proto3"; +package sunbeam.code.v1; + +// Sol's coding agent service. Bidirectional streaming between +// the `sunbeam code` TUI client and Sol's server-side agent loop. +service CodeAgent { + rpc Session(stream ClientMessage) returns (stream ServerMessage); +} + +// ── Client → Sol ─────────────────────────────────────────────── + +message ClientMessage { + oneof payload { + StartSession start = 1; + UserInput input = 2; + ToolResult tool_result = 3; + ToolApproval approval = 4; + EndSession end = 5; + } +} + +message StartSession { + string project_path = 1; + string prompt_md = 2; + string config_toml = 3; + string git_branch = 4; + string git_status = 5; + repeated string file_tree = 6; + string model = 7; + repeated ToolDef client_tools = 8; +} + +message UserInput { + string text = 1; +} + +message ToolResult { + string call_id = 1; + string result = 2; + bool is_error = 3; +} + +message ToolApproval { + string call_id = 1; + bool approved = 2; +} + +message EndSession {} + +// ── Sol → Client ─────────────────────────────────────────────── + +message ServerMessage { + oneof payload { + SessionReady ready = 1; + TextDelta delta = 2; + TextDone done = 3; + ToolCall tool_call = 4; + ApprovalNeeded approval = 5; + Status status = 6; + SessionEnd end = 7; + Error error = 8; + } +} + +message SessionReady { + string session_id = 1; + string room_id = 2; + string model = 3; +} + +message TextDelta { + string text = 1; +} + +message TextDone { + string full_text = 1; + uint32 input_tokens = 2; + uint32 output_tokens = 3; +} + +message ToolCall { + string call_id = 1; + string name = 2; + string args_json = 3; + bool is_local = 4; + bool needs_approval = 5; +} + +message ApprovalNeeded { + string call_id = 1; + string name = 2; + string args_json = 3; + string summary = 4; +} + +message Status { + string message = 1; + StatusKind kind = 2; +} + +enum StatusKind { + INFO = 0; + TOOL_RUNNING = 1; + TOOL_DONE = 2; + THINKING = 3; +} + +message SessionEnd { + string summary = 1; +} + +message Error { + string message = 1; + bool fatal = 2; +} + +message ToolDef { + string name = 1; + string description = 2; + string schema_json = 3; +} diff --git a/sunbeam-proto/src/lib.rs b/sunbeam-proto/src/lib.rs new file mode 100644 index 0000000..a5f9e99 --- /dev/null +++ b/sunbeam-proto/src/lib.rs @@ -0,0 +1,3 @@ +pub mod sunbeam_code_v1 { + tonic::include_proto!("sunbeam.code.v1"); +}