Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
86a24a9
feat(38-01): create platform session module
Jan 16, 2026
3084aea
feat(38-01): wire session loading into agent startup
Jan 16, 2026
5807c28
feat(39-01): create platform API client module
Jan 16, 2026
e7c8890
feat(40-01): create platform listing and selection tools
Jan 16, 2026
a4fc0ee
feat(40-01): register platform tools with agent
Jan 16, 2026
ebb937b
feat(41-01): add provider connection check to API client
Jan 16, 2026
489f31f
feat(41-01): create provider connection tools
Jan 16, 2026
f259889
feat(41-01): register provider connection tools
Jan 16, 2026
078f7fa
feat(42-01): add deployment types and API methods
Jan 16, 2026
cf404d0
feat(42-01): create deployment tools
Jan 16, 2026
1e0204c
feat(42-01): register deployment tools with agent
Jan 16, 2026
29ce71c
feat(43-01): add log types and API method
Jan 16, 2026
1cdcc0c
feat(43-01): create GetServiceLogsTool
Jan 16, 2026
bb229bf
feat(44-01): add Project and Org command definitions
Jan 17, 2026
f9e6dc8
fix(api): unwrap GenericResponse wrapper in platform API client
Jan 17, 2026
8624db9
feat(44-01): implement Project and Org command handlers
Jan 17, 2026
7173d00
feat(44-01): wire up Project and Org commands in main.rs
Jan 17, 2026
d2a8f31
feat(45-01): add platform context to welcome banner
Jan 17, 2026
b5dc91e
feat(45-01): add platform context to input prompt
Jan 17, 2026
d530f42
feat(46-01): add retry logic for transient API failures
Jan 17, 2026
29f9709
feat(46-01): add actionable suggestions to API errors
Jan 17, 2026
84a8b32
feat(46-01): add API connection health check
Jan 17, 2026
a62179d
feat(platform): add cluster and registry API methods
Jan 17, 2026
db24985
feat(analyzer): add dockerfile discovery for deployment wizard
Jan 17, 2026
e5d9df2
feat(56-01): add CLI wizard deployment config types
Jan 17, 2026
f73892d
feat(57-01): create wizard module structure
Jan 17, 2026
68cc401
feat(57-01): implement provider status aggregation
Jan 17, 2026
9f09735
feat(57-01): implement provider selection prompt
Jan 17, 2026
92cbf1a
feat(57-02): implement target selection step
Jan 17, 2026
aab62e6
feat(57-02): implement cluster selection step
Jan 17, 2026
2eb0c40
feat(57-02): implement registry selection step
Jan 17, 2026
a703626
feat(57-03): service configuration form
Jan 17, 2026
66034e1
feat(57-03): wizard orchestration
Jan 17, 2026
1ac4a38
feat(57-03): CLI deploy wizard command integration
Jan 17, 2026
a987f11
feat(58-01): add registry provisioning types and API methods
Jan 17, 2026
ae05433
feat(58-01): create registry provisioning wizard step
Jan 17, 2026
a4770d0
feat(58-01): integrate registry provisioning into wizard orchestrator
Jan 17, 2026
471f066
fix: detect provider connection from cloud credentials, not resources
Jan 17, 2026
d603674
feat(59-01): create AnalyzeProjectTool for deployment discovery
Jan 17, 2026
436af6d
feat(59-01): create ListDeploymentCapabilitiesTool and register tools
Jan 17, 2026
867bb4d
feat(59-02): add create_deployment_config API method
Jan 17, 2026
c9441af
feat(59-02): create CreateDeploymentConfigTool for agent
Jan 17, 2026
58618c1
feat(59-02): create ProvisionRegistryTool and register tools
Jan 17, 2026
472323e
feat(60-01): create AnalyzeCodebaseTool for comprehensive analysis
Jan 17, 2026
5a78ce3
feat(60-01): register AnalyzeCodebaseTool in platform module
Jan 17, 2026
222a05f
feat(60-01): cross-reference analyze_codebase in analyze_project next…
Jan 17, 2026
3f52578
feat(61-01): add Scaleway, Cyso providers and is_available method
Jan 17, 2026
77f0fb5
feat(61-01): show Coming Soon for unavailable providers in wizard
Jan 17, 2026
b46e40d
feat(61-01): add is_available to list_deployment_capabilities tool
Jan 17, 2026
5844ac1
refactor(62-01): fix clippy never_loop warnings in wizard orchestrator
Jan 17, 2026
0816750
fix(62-01): make deploy wizard the default when no subcommand provided
Jan 17, 2026
9e0ad9a
feat(62.1-01): add Environment type and API methods
Jan 17, 2026
41ec59b
feat(62.1-01): add environment fields to PlatformSession
Jan 17, 2026
af55afc
feat(62.1-02): add EnvCommand to CLI with list and select
Jan 17, 2026
5d43fb1
feat(62.1-02): add deploy new-env command with wizard
Jan 17, 2026
b9a0bc5
fix(62.1-02): correct environment API endpoint and field names
Jan 17, 2026
46bf1b5
fix(62.1-02): correct ArtifactRegistry cloudProvider field name
Jan 17, 2026
67097e3
feat(62.2-01): add Dockerfile selection wizard step
Jan 17, 2026
e577f27
feat(62.2-01): integrate Dockerfile selection into wizard
Jan 17, 2026
cae8a4b
feat(11-01): add GitHub integration API types and methods
Jan 18, 2026
aaab4a4
fix(api): correct deployment config API response parsing
Jan 18, 2026
79e8e89
feat(wizard): add smart repository connection to deploy flow
Jan 18, 2026
9c3ed85
fix(api): correct trigger deployment response parsing
Jan 18, 2026
7a89311
feat(11.1-01): fix CloudRunnerConfig to use provider-nested structure
Jan 18, 2026
a1d21e6
fix: dockerfile path relative to build context + add deploy status co…
Jan 18, 2026
6ebdc70
chore(wizard): add debug logging for deployment trigger
Jan 18, 2026
5d283f1
fix(wizard): use full dockerfile path for Docker build
Jan 18, 2026
3cb8698
fix(wizard): use build_context + filename for dockerfile path
Jan 18, 2026
d132944
debug: add verbose logging for deployment config request
Jan 18, 2026
fa3906a
feat(11.3-01): add PortSource enum for source-based port tracking
Jan 19, 2026
5956f81
feat(11.3-01): add health endpoint detection
Jan 19, 2026
0f853e0
feat(11.3-01): add infrastructure presence detection
Jan 19, 2026
62f95a9
feat(11.3-02): add deployment recommendation engine
Jan 19, 2026
97b44a9
feat(11.3-03): add DeployServiceTool for conversational deployment
Jan 19, 2026
9aa1777
fix(deploy): add duplicate detection and environment display to Deplo…
Jan 19, 2026
6cba4de
fix(api): wrap get_optional responses in GenericResponse
Jan 19, 2026
b8c09b8
fix(api): use working endpoint for check_provider_connection
Jan 19, 2026
1d2cd6d
fix(agent): register ListDeploymentCapabilitiesTool in agent
Jan 19, 2026
7b15b5d
fix(agent): register CreateDeploymentConfigTool and DeployServiceTool
Jan 19, 2026
9a9c48f
fix(deploy-status): check actual service readiness for Cloud Runner
Jan 19, 2026
9d88bed
fix(prompt): reduce agent narration of internal reasoning
Jan 19, 2026
b12a688
fix(deploy): correct dockerfile path derivation for subdirectory depl…
Jan 19, 2026
c49a566
fix(deploy): match manual wizard dockerfile/context path handling
Jan 20, 2026
ee85366
fix(deploy): use paths relative to analyzed dir, not project root
Jan 20, 2026
14f9573
fix(11.3-01): derive dockerfile paths relative to repo root for Cloud…
Jan 20, 2026
8fc54e1
fix(11.3-01): detect correct repository from local git remote
Jan 20, 2026
7cf24ef
fix(11.3-01): prevent agent from polling deployment status in infinit…
Jan 20, 2026
1b451fa
fix(11.3-01): add is_public parameter with safe default (false)
Jan 20, 2026
7d6c701
fix(11.3-01): enforce human-in-the-loop for deployment changes
Jan 20, 2026
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
48 changes: 48 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ colored = "3"
crossterm = "0.29" # Terminal raw mode for interactive input
inquire = "0.9" # Interactive terminal prompts with autocomplete
rustyline = "17" # Readline-style input with completions
webbrowser = "1" # Open URLs in default browser
prettytable = "0.10"
term_size = "0.3"

Expand Down
116 changes: 110 additions & 6 deletions src/agent/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,14 @@ pub async fn run_interactive(

session.print_banner();

// Display platform context if a project is selected
if session.platform_session.is_project_selected() {
println!(
"{}",
format!("Platform context: {}", session.platform_session.display_context()).dimmed()
);
}

// NOTE: Terminal layout with ANSI scroll regions is disabled for now.
// The scroll region approach conflicts with the existing input/output flow.
// TODO: Implement proper scroll region support that integrates with the input handler.
Expand Down Expand Up @@ -577,7 +585,23 @@ pub async fn run_interactive(
.tool(PrometheusConnectTool::new(bg_manager.clone()))
// RAG retrieval tools for compressed tool outputs
.tool(RetrieveOutputTool::new())
.tool(ListOutputsTool::new());
.tool(ListOutputsTool::new())
// Platform tools for project management
.tool(ListOrganizationsTool::new())
.tool(ListProjectsTool::new())
.tool(SelectProjectTool::new())
.tool(CurrentContextTool::new())
.tool(OpenProviderSettingsTool::new())
.tool(CheckProviderConnectionTool::new())
.tool(ListDeploymentCapabilitiesTool::new())
// Deployment tools for service management
.tool(CreateDeploymentConfigTool::new())
.tool(DeployServiceTool::new(project_path_buf.clone()))
.tool(ListDeploymentConfigsTool::new())
.tool(TriggerDeploymentTool::new())
.tool(GetDeploymentStatusTool::new())
.tool(ListDeploymentsTool::new())
.tool(GetServiceLogsTool::new());

// Add tools based on mode
if is_planning {
Expand Down Expand Up @@ -678,7 +702,23 @@ pub async fn run_interactive(
.tool(PrometheusConnectTool::new(bg_manager.clone()))
// RAG retrieval tools for compressed tool outputs
.tool(RetrieveOutputTool::new())
.tool(ListOutputsTool::new());
.tool(ListOutputsTool::new())
// Platform tools for project management
.tool(ListOrganizationsTool::new())
.tool(ListProjectsTool::new())
.tool(SelectProjectTool::new())
.tool(CurrentContextTool::new())
.tool(OpenProviderSettingsTool::new())
.tool(CheckProviderConnectionTool::new())
.tool(ListDeploymentCapabilitiesTool::new())
// Deployment tools for service management
.tool(CreateDeploymentConfigTool::new())
.tool(DeployServiceTool::new(project_path_buf.clone()))
.tool(ListDeploymentConfigsTool::new())
.tool(TriggerDeploymentTool::new())
.tool(GetDeploymentStatusTool::new())
.tool(ListDeploymentsTool::new())
.tool(GetServiceLogsTool::new());

// Add tools based on mode
if is_planning {
Expand Down Expand Up @@ -770,7 +810,23 @@ pub async fn run_interactive(
.tool(PrometheusConnectTool::new(bg_manager.clone()))
// RAG retrieval tools for compressed tool outputs
.tool(RetrieveOutputTool::new())
.tool(ListOutputsTool::new());
.tool(ListOutputsTool::new())
// Platform tools for project management
.tool(ListOrganizationsTool::new())
.tool(ListProjectsTool::new())
.tool(SelectProjectTool::new())
.tool(CurrentContextTool::new())
.tool(OpenProviderSettingsTool::new())
.tool(CheckProviderConnectionTool::new())
.tool(ListDeploymentCapabilitiesTool::new())
// Deployment tools for service management
.tool(CreateDeploymentConfigTool::new())
.tool(DeployServiceTool::new(project_path_buf.clone()))
.tool(ListDeploymentConfigsTool::new())
.tool(TriggerDeploymentTool::new())
.tool(GetDeploymentStatusTool::new())
.tool(ListDeploymentsTool::new())
.tool(GetServiceLogsTool::new());

// Add tools based on mode
if is_planning {
Expand Down Expand Up @@ -2210,7 +2266,23 @@ pub async fn run_query(
.tool(PrometheusConnectTool::new(bg_manager.clone()))
// RAG retrieval tools for compressed tool outputs
.tool(RetrieveOutputTool::new())
.tool(ListOutputsTool::new());
.tool(ListOutputsTool::new())
// Platform tools for project management
.tool(ListOrganizationsTool::new())
.tool(ListProjectsTool::new())
.tool(SelectProjectTool::new())
.tool(CurrentContextTool::new())
.tool(OpenProviderSettingsTool::new())
.tool(CheckProviderConnectionTool::new())
.tool(ListDeploymentCapabilitiesTool::new())
// Deployment tools for service management
.tool(CreateDeploymentConfigTool::new())
.tool(DeployServiceTool::new(project_path_buf.clone()))
.tool(ListDeploymentConfigsTool::new())
.tool(TriggerDeploymentTool::new())
.tool(GetDeploymentStatusTool::new())
.tool(ListDeploymentsTool::new())
.tool(GetServiceLogsTool::new());

// Add generation tools if this is a generation query
if is_generation {
Expand Down Expand Up @@ -2279,7 +2351,23 @@ pub async fn run_query(
.tool(PrometheusConnectTool::new(bg_manager.clone()))
// RAG retrieval tools for compressed tool outputs
.tool(RetrieveOutputTool::new())
.tool(ListOutputsTool::new());
.tool(ListOutputsTool::new())
// Platform tools for project management
.tool(ListOrganizationsTool::new())
.tool(ListProjectsTool::new())
.tool(SelectProjectTool::new())
.tool(CurrentContextTool::new())
.tool(OpenProviderSettingsTool::new())
.tool(CheckProviderConnectionTool::new())
.tool(ListDeploymentCapabilitiesTool::new())
// Deployment tools for service management
.tool(CreateDeploymentConfigTool::new())
.tool(DeployServiceTool::new(project_path_buf.clone()))
.tool(ListDeploymentConfigsTool::new())
.tool(TriggerDeploymentTool::new())
.tool(GetDeploymentStatusTool::new())
.tool(ListDeploymentsTool::new())
.tool(GetServiceLogsTool::new());

// Add generation tools if this is a generation query
if is_generation {
Expand Down Expand Up @@ -2337,7 +2425,23 @@ pub async fn run_query(
.tool(PrometheusConnectTool::new(bg_manager.clone()))
// RAG retrieval tools for compressed tool outputs
.tool(RetrieveOutputTool::new())
.tool(ListOutputsTool::new());
.tool(ListOutputsTool::new())
// Platform tools for project management
.tool(ListOrganizationsTool::new())
.tool(ListProjectsTool::new())
.tool(SelectProjectTool::new())
.tool(CurrentContextTool::new())
.tool(OpenProviderSettingsTool::new())
.tool(CheckProviderConnectionTool::new())
.tool(ListDeploymentCapabilitiesTool::new())
// Deployment tools for service management
.tool(CreateDeploymentConfigTool::new())
.tool(DeployServiceTool::new(project_path_buf.clone()))
.tool(ListDeploymentConfigsTool::new())
.tool(TriggerDeploymentTool::new())
.tool(GetDeploymentStatusTool::new())
.tool(ListDeploymentsTool::new())
.tool(GetServiceLogsTool::new());

// Add generation tools if this is a generation query
if is_generation {
Expand Down
4 changes: 3 additions & 1 deletion src/agent/prompts/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,9 @@ Just identify → explain → fix → proceed.
/// Thinking guidelines - prevent "oops" and self-doubt patterns
const THINKING_GUIDELINES: &str = r#"
<thinking_guidelines>
- Plan briefly (2-3 sentences), then execute
- Do NOT narrate what you're about to do (e.g., "I'll call X tool" or "The user wants Y so I'll Z")
- Just take action directly without announcing it
- Plan internally, execute externally - users see results, not reasoning
- Do NOT second-guess yourself with phrases like "oops", "I should have", or "I made a mistake"
- If you made an error, fix it without self-deprecation - just fix it
- Show confidence in your actions
Expand Down
30 changes: 29 additions & 1 deletion src/agent/session/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ pub use providers::{get_available_models, get_configured_providers, prompt_api_k

use crate::agent::commands::TokenUsage;
use crate::agent::{AgentResult, ProviderType};
use crate::platform::PlatformSession;
use colored::Colorize;
use std::io;
use std::path::Path;
Expand All @@ -35,6 +36,8 @@ pub struct ChatSession {
pub plan_mode: PlanMode,
/// Session loaded via /resume command, to be processed by main loop
pub pending_resume: Option<crate::agent::persistence::ConversationRecord>,
/// Platform session state (selected project/org context)
pub platform_session: PlatformSession,
}

impl ChatSession {
Expand All @@ -45,6 +48,9 @@ impl ChatSession {
ProviderType::Bedrock => "global.anthropic.claude-sonnet-4-20250514-v1:0".to_string(),
};

// Load platform session from disk (returns default if not exists)
let platform_session = PlatformSession::load().unwrap_or_default();

Self {
provider,
model: model.unwrap_or(default_model),
Expand All @@ -53,6 +59,18 @@ impl ChatSession {
token_usage: TokenUsage::new(),
plan_mode: PlanMode::default(),
pending_resume: None,
platform_session,
}
}

/// Update the platform session and save to disk
pub fn update_platform_session(&mut self, session: PlatformSession) {
self.platform_session = session;
if let Err(e) = self.platform_session.save() {
eprintln!(
"{}",
format!("Warning: Failed to save platform session: {}", e).yellow()
);
}
}

Expand Down Expand Up @@ -242,8 +260,18 @@ impl ChatSession {
pub fn read_input(&self) -> io::Result<crate::agent::ui::input::InputResult> {
use crate::agent::ui::input::read_input_with_file_picker;

// Build prompt with platform context if project is selected
let prompt = if self.platform_session.is_project_selected() {
format!(
"{} >",
self.platform_session.display_context()
)
} else {
">".to_string()
};

Ok(read_input_with_file_picker(
">",
&prompt,
&self.project_path,
self.plan_mode.is_planning(),
))
Expand Down
33 changes: 33 additions & 0 deletions src/agent/session/ui.rs
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,39 @@ pub fn print_banner(session: &ChatSession) {
);
println!(" {}", "Your AI-powered code analysis assistant".dimmed());

// Show platform context (selected project/organization)
if session.platform_session.is_project_selected() {
println!(
" {} {}: {}/{}",
"📦",
"Project".white(),
session
.platform_session
.org_name
.as_deref()
.unwrap_or("?")
.cyan(),
session
.platform_session
.project_name
.as_deref()
.unwrap_or("?")
.cyan()
);
} else {
println!(
" {} {} {}",
"📦",
"Project:".white(),
"(none selected)".dimmed()
);
println!(
" {} {}",
"→".cyan(),
"sync-ctl org list".dimmed()
);
}

// Check for incomplete plans and show a hint
let incomplete_plans = find_incomplete_plans(&session.project_path);
if !incomplete_plans.is_empty() {
Expand Down
Loading
Loading