Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
372 changes: 158 additions & 214 deletions orbitdock-server/crates/connector-claude/src/lib.rs

Large diffs are not rendered by default.

37 changes: 17 additions & 20 deletions orbitdock-server/crates/connector-claude/src/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,21 @@ use serde_json::Value;

use crate::ClaudeConnector;

/// Configuration for spawning a Claude CLI session.
///
/// Groups the CLI spawn parameters used by both `ClaudeSession::new`
/// and `ClaudeConnector::new` to avoid long argument lists.
pub struct ClaudeSessionConfig<'a> {
pub cwd: &'a str,
pub model: Option<&'a str>,
pub resume_id: Option<&'a ProviderSessionId>,
pub permission_mode: Option<&'a str>,
pub allowed_tools: &'a [String],
pub disallowed_tools: &'a [String],
pub effort: Option<&'a str>,
pub allow_bypass_permissions: bool,
}

#[derive(Debug)]
pub enum ClaudeAllowToolApprovalScope {
Once,
Expand Down Expand Up @@ -243,29 +258,11 @@ impl ClaudeSession {
/// Create a new Claude session by spawning a CLI subprocess.
/// If `resume_id` is provided, the CLI will resume that session.
/// Accepts `ProviderSessionId` to prevent accidentally passing an OrbitDock ID.
#[allow(clippy::too_many_arguments)]
pub async fn new(
session_id: String,
cwd: &str,
model: Option<&str>,
resume_id: Option<&ProviderSessionId>,
permission_mode: Option<&str>,
allowed_tools: &[String],
disallowed_tools: &[String],
effort: Option<&str>,
allow_bypass_permissions: bool,
config: ClaudeSessionConfig<'_>,
) -> Result<Self, ConnectorError> {
let connector = ClaudeConnector::new(
cwd,
model,
resume_id.map(|id| id.as_str()),
permission_mode,
allowed_tools,
disallowed_tools,
effort,
allow_bypass_permissions,
)
.await?;
let connector = ClaudeConnector::new(&config).await?;
Ok(Self {
session_id,
connector,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ use crate::runtime::session_registry::SessionRegistry;
// Re-export so existing server code doesn't break
pub use orbitdock_connector_claude::session::{
should_remove_shadow_runtime_session, ClaudeAction, ClaudeAllowToolApproval,
ClaudeAllowToolApprovalScope, ClaudeDenyToolApproval, ClaudeSession,
ClaudeAllowToolApprovalScope, ClaudeDenyToolApproval, ClaudeSession, ClaudeSessionConfig,
ClaudeToolApprovalResponse,
};

Expand Down
20 changes: 11 additions & 9 deletions orbitdock-server/crates/server/src/runtime/session_activation.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use orbitdock_protocol::{
SessionListItem, SessionStatus, StateChanges, WorkStatus,
};

use crate::connectors::claude_session::ClaudeSession;
use crate::connectors::claude_session::{ClaudeSession, ClaudeSessionConfig};
use crate::connectors::codex_session::CodexSession;
use crate::infrastructure::persistence::{load_session_by_id, PersistCommand};
use crate::runtime::codex_config::{resolve_codex_settings, CodexConfigSelection};
Expand Down Expand Up @@ -440,14 +440,16 @@ async fn start_lazy_claude_connector(
let connector_task = tokio::spawn(async move {
ClaudeSession::new(
sid,
&project,
model.as_deref(),
provider_id.as_ref(),
None,
&[],
&[],
None,
false,
ClaudeSessionConfig {
cwd: &project,
model: model.as_deref(),
resume_id: provider_id.as_ref(),
permission_mode: None,
allowed_tools: &[],
disallowed_tools: &[],
effort: None,
allow_bypass_permissions: false,
},
)
.await
});
Expand Down
20 changes: 11 additions & 9 deletions orbitdock-server/crates/server/src/runtime/session_direct_start.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::time::Duration;

use tracing::{info, warn};

use crate::connectors::claude_session::{ClaudeAction, ClaudeSession};
use crate::connectors::claude_session::{ClaudeAction, ClaudeSession, ClaudeSessionConfig};
use crate::connectors::codex_session::CodexSession;
use crate::domain::sessions::session::SessionHandle;
use crate::infrastructure::persistence::PersistCommand;
Expand Down Expand Up @@ -150,14 +150,16 @@ pub(crate) async fn start_direct_claude_session(
let session_id = session_id.to_string();
let claude_session = ClaudeSession::new(
session_id.clone(),
cwd,
model,
None,
permission_mode,
allowed_tools,
disallowed_tools,
effort,
allow_bypass_permissions,
ClaudeSessionConfig {
cwd,
model,
resume_id: None,
permission_mode,
allowed_tools,
disallowed_tools,
effort,
allow_bypass_permissions,
},
)
.await
.map_err(|error| error.to_string())?;
Expand Down
20 changes: 11 additions & 9 deletions orbitdock-server/crates/server/src/runtime/session_fork_runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use orbitdock_protocol::{
ClaudeIntegrationMode, CodexIntegrationMode, Provider, SessionState, SessionSummary,
};

use crate::connectors::claude_session::ClaudeSession;
use crate::connectors::claude_session::{ClaudeSession, ClaudeSessionConfig};
use crate::connectors::codex_session::CodexSession;
use crate::domain::sessions::session::{SessionConfigPatch, SessionHandle};
use crate::infrastructure::persistence::{load_messages_from_transcript_path, PersistCommand};
Expand Down Expand Up @@ -53,14 +53,16 @@ pub(crate) async fn start_claude_fork_session(

let claude_session = ClaudeSession::new(
new_session_id.clone(),
effective_cwd,
effective_model,
None,
permission_mode,
allowed_tools,
disallowed_tools,
None,
false,
ClaudeSessionConfig {
cwd: effective_cwd,
model: effective_model,
resume_id: None,
permission_mode,
allowed_tools,
disallowed_tools,
effort: None,
allow_bypass_permissions: false,
},
)
.await
.map_err(|error| error.to_string())?;
Expand Down
20 changes: 11 additions & 9 deletions orbitdock-server/crates/server/src/runtime/session_resume.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use orbitdock_protocol::{
SessionListItem, SessionSummary,
};

use crate::connectors::claude_session::ClaudeSession;
use crate::connectors::claude_session::{ClaudeSession, ClaudeSessionConfig};
use crate::connectors::codex_session::CodexSession;
use crate::infrastructure::persistence::{load_session_permission_mode, PersistCommand};
use crate::runtime::codex_config::{resolve_codex_settings, CodexConfigSelection};
Expand Down Expand Up @@ -167,14 +167,16 @@ async fn spawn_claude_resume(state: &Arc<SessionRegistry>, params: ClaudeResumeP
let connector_task = tokio::spawn(async move {
ClaudeSession::new(
sid.clone(),
&project,
model.as_deref(),
Some(&resume_id),
permission_mode.as_deref(),
&[],
&[],
None,
allow_bypass_permissions,
ClaudeSessionConfig {
cwd: &project,
model: model.as_deref(),
resume_id: Some(&resume_id),
permission_mode: permission_mode.as_deref(),
allowed_tools: &[],
disallowed_tools: &[],
effort: None,
allow_bypass_permissions,
},
)
.await
});
Expand Down
20 changes: 11 additions & 9 deletions orbitdock-server/crates/server/src/runtime/session_takeover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use orbitdock_protocol::{
ClaudeIntegrationMode, CodexIntegrationMode, Provider, ServerMessage, SessionListItem,
};

use crate::connectors::claude_session::ClaudeSession;
use crate::connectors::claude_session::{ClaudeSession, ClaudeSessionConfig};
use crate::connectors::codex_session::CodexSession;
use crate::domain::sessions::session::{SessionConfigPatch, SessionHandle};
use crate::infrastructure::persistence::{
Expand Down Expand Up @@ -480,14 +480,16 @@ async fn complete_claude_takeover(
let connector_task = tokio::spawn(async move {
ClaudeSession::new(
task_session_id.clone(),
&project,
model.as_deref(),
takeover_sdk_id_for_spawn.as_ref(),
permission_mode.as_deref(),
&allowed_tools,
&disallowed_tools,
None,
false,
ClaudeSessionConfig {
cwd: &project,
model: model.as_deref(),
resume_id: takeover_sdk_id_for_spawn.as_ref(),
permission_mode: permission_mode.as_deref(),
allowed_tools: &allowed_tools,
disallowed_tools: &disallowed_tools,
effort: None,
allow_bypass_permissions: false,
},
)
.await
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ use orbitdock_protocol::{
SessionListItem, SessionStatus, StateChanges, WorkStatus,
};

use crate::connectors::claude_session::ClaudeSession;
use crate::connectors::claude_session::{ClaudeSession, ClaudeSessionConfig};
use crate::connectors::codex_session::CodexSession;
use crate::domain::sessions::session::SessionConfigPatch;
use crate::infrastructure::persistence::{
Expand Down Expand Up @@ -209,14 +209,16 @@ pub(crate) async fn handle(
let connector_task = tokio::spawn(async move {
ClaudeSession::new(
sid.clone(),
&project,
m.as_deref(),
Some(&resume_id),
pm.as_deref(),
&[], // allowed_tools
&[], // disallowed_tools
None, // effort
false, // allow_bypass_permissions
ClaudeSessionConfig {
cwd: &project,
model: m.as_deref(),
resume_id: Some(&resume_id),
permission_mode: pm.as_deref(),
allowed_tools: &[],
disallowed_tools: &[],
effort: None,
allow_bypass_permissions: false,
},
)
.await
});
Expand Down Expand Up @@ -842,14 +844,16 @@ pub(crate) async fn handle(
let connector_task = tokio::spawn(async move {
ClaudeSession::new(
sid.clone(),
&project,
m.as_deref(),
takeover_sdk_id_for_spawn.as_ref(),
pm.as_deref(),
&at,
&dt,
None, // effort
false, // allow_bypass_permissions
ClaudeSessionConfig {
cwd: &project,
model: m.as_deref(),
resume_id: takeover_sdk_id_for_spawn.as_ref(),
permission_mode: pm.as_deref(),
allowed_tools: &at,
disallowed_tools: &dt,
effort: None,
allow_bypass_permissions: false,
},
)
.await
});
Expand Down
Loading