|
|
@@ -28,7 +28,7 @@ use runtime::{
|
|
|
parse_oauth_callback_request_target, save_oauth_credentials, ApiClient, ApiRequest,
|
|
|
AssistantEvent, CompactionConfig, ConfigLoader, ConfigSource, ContentBlock,
|
|
|
ConversationMessage, ConversationRuntime, MessageRole, OAuthAuthorizationRequest,
|
|
|
- OAuthTokenExchangeRequest, PermissionMode, PermissionPolicy, ProjectContext, RuntimeError,
|
|
|
+ OAuthConfig, OAuthTokenExchangeRequest, PermissionMode, PermissionPolicy, ProjectContext, RuntimeError,
|
|
|
Session, TokenUsage, ToolError, ToolExecutor, UsageTracker,
|
|
|
};
|
|
|
use serde_json::json;
|
|
|
@@ -428,15 +428,26 @@ fn print_bootstrap_plan() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+fn default_oauth_config() -> OAuthConfig {
|
|
|
+ OAuthConfig {
|
|
|
+ client_id: String::from("9d1c250a-e61b-44d9-88ed-5944d1962f5e"),
|
|
|
+ authorize_url: String::from("https://platform.claude.com/oauth/authorize"),
|
|
|
+ token_url: String::from("https://platform.claude.com/v1/oauth/token"),
|
|
|
+ callback_port: None,
|
|
|
+ manual_redirect_url: None,
|
|
|
+ scopes: vec![
|
|
|
+ String::from("user:profile"),
|
|
|
+ String::from("user:inference"),
|
|
|
+ String::from("user:sessions:claude_code"),
|
|
|
+ ],
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
fn run_login() -> Result<(), Box<dyn std::error::Error>> {
|
|
|
let cwd = env::current_dir()?;
|
|
|
let config = ConfigLoader::default_for(&cwd).load()?;
|
|
|
- let oauth = config.oauth().ok_or_else(|| {
|
|
|
- io::Error::new(
|
|
|
- io::ErrorKind::NotFound,
|
|
|
- "OAuth config is missing. Add settings.oauth.clientId/authorizeUrl/tokenUrl first.",
|
|
|
- )
|
|
|
- })?;
|
|
|
+ let default_oauth = default_oauth_config();
|
|
|
+ let oauth = config.oauth().unwrap_or(&default_oauth);
|
|
|
let callback_port = oauth.callback_port.unwrap_or(DEFAULT_OAUTH_CALLBACK_PORT);
|
|
|
let redirect_uri = runtime::loopback_redirect_uri(callback_port);
|
|
|
let pkce = generate_pkce_pair()?;
|