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
21 changes: 20 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ members = [
"src/apps/cli",
"src/apps/desktop",
"src/apps/server",
"src/apps/relay-server",
]

exclude = [
Expand Down Expand Up @@ -63,7 +64,7 @@ reqwest = { version = "0.12", default-features = false, features = ["rustls-tls-

# Debug Log HTTP Server
axum = { version = "0.7", features = ["json", "ws"] }
tower-http = { version = "0.6", features = ["cors"] }
tower-http = { version = "0.6", features = ["cors", "fs"] }

# File system
glob = "0.3"
Expand Down Expand Up @@ -111,6 +112,24 @@ win32job = "2.0"
fluent-bundle = "0.15"
unic-langid = "0.9"

# Encryption (Remote Connect E2E)
x25519-dalek = { version = "2.0", features = ["static_secrets"] }
aes-gcm = "0.10"
sha2 = "0.10"
rand = "0.8"

# Device/Network info (Remote Connect)
mac_address = "1.1"
local-ip-address = "0.6"
hostname = "0.4"

# QR code generation
qrcode = "0.14"
image = { version = "0.25", default-features = false, features = ["png"] }

# WebSocket client
tokio-tungstenite = { version = "0.21", features = ["native-tls"] }

[profile.dev]
incremental = true

Expand Down
10 changes: 10 additions & 0 deletions package-lock.json

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

10 changes: 6 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,16 @@
"prebuild:web": "npm run copy-assets --silent && npm run generate-all --silent",
"build": "cd src/web-ui && vite build",
"build:web": "cd src/web-ui && vite build",
"build:mobile-web": "cd src/mobile-web && npm install --silent && npm run build",
"preview": "cd src/web-ui && vite preview",
"desktop:dev": "node scripts/dev.cjs desktop",
"desktop:dev:raw": "cd src/apps/desktop && npm exec -- tauri dev",
"desktop:build": "cd src/apps/desktop && npm exec -- tauri build",
"desktop:build": "npm run build:web && npm run build:mobile-web && cd src/apps/desktop && npm exec -- tauri build",
"desktop:build:fast": "cd src/apps/desktop && npm exec -- tauri build --debug --no-bundle",
"desktop:build:release-fast": "cd src/apps/desktop && npm exec -- tauri build --no-bundle -- --profile release-fast",
"desktop:build:exe": "cd src/apps/desktop && npm exec -- tauri build --no-bundle",
"desktop:build:nsis": "cd src/apps/desktop && npm exec -- tauri build --bundles nsis",
"desktop:build:x86_64": "cd src/apps/desktop && npm exec -- tauri build --target x86_64-apple-darwin",
"desktop:build:exe": "npm run build:web && npm run build:mobile-web && cd src/apps/desktop && npm exec -- tauri build --no-bundle",
"desktop:build:nsis": "npm run build:web && npm run build:mobile-web && cd src/apps/desktop && npm exec -- tauri build --bundles nsis",
"desktop:build:x86_64": "npm run build:web && npm run build:mobile-web && cd src/apps/desktop && npm exec -- tauri build --target x86_64-apple-darwin",
"installer:build": "npm --prefix BitFun-Installer run installer:build",
"installer:build:fast": "npm --prefix BitFun-Installer run installer:build:fast",
"installer:build:only": "npm --prefix BitFun-Installer run installer:build:only",
Expand Down Expand Up @@ -90,6 +91,7 @@
"partial-json": "^0.1.7",
"path-browserify": "^1.0.1",
"prismjs": "^1.30.0",
"qrcode.react": "^4.2.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-i18next": "^16.5.3",
Expand Down
34 changes: 29 additions & 5 deletions scripts/dev.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,11 @@ async function main() {

printHeader(`BitFun ${modeLabel} Development`);
printBlank();


const totalSteps = mode === 'desktop' ? 4 : 3;

// Step 1: Copy resources
printStep(1, 3, 'Copy resources');
printStep(1, totalSteps, 'Copy resources');
const copyResult = runSilent('npm run copy-monaco --silent');
if (copyResult.ok) {
printSuccess('Monaco Editor resources ready');
Expand All @@ -137,7 +139,7 @@ async function main() {
}

// Step 2: Generate version info
printStep(2, 3, 'Generate version info');
printStep(2, totalSteps, 'Generate version info');
const versionResult = runInherit('node scripts/generate-version.cjs');
if (!versionResult.ok) {
printError('Generate version info failed');
Expand All @@ -152,8 +154,30 @@ async function main() {

const prepTime = ((Date.now() - startTime) / 1000).toFixed(1);

// Step 3: Start dev server
printStep(3, 3, 'Start dev server');
// Step 3: Build mobile-web (desktop only)
if (mode === 'desktop') {
printStep(3, 4, 'Build mobile-web');
const mobileWebDir = path.join(ROOT_DIR, 'src/mobile-web');
const mobileWebResult = runSilent('npm install --silent', mobileWebDir);
if (!mobileWebResult.ok) {
printError('mobile-web npm install failed');
const output = tailOutput(mobileWebResult.stderr || mobileWebResult.stdout);
if (output) printError(output);
process.exit(1);
}
const buildResult = runInherit('npm run build', mobileWebDir);
if (!buildResult.ok) {
printError('mobile-web build failed');
if (buildResult.error && buildResult.error.message) {
printError(buildResult.error.message);
}
process.exit(1);
}
printSuccess('mobile-web build complete');
}

// Final step: Start dev server
printStep(totalSteps, totalSteps, 'Start dev server');
printInfo(`Prep took ${prepTime}s`);

printComplete('Initialization complete');
Expand Down
1 change: 1 addition & 0 deletions src/apps/cli/src/agent/core_adapter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ impl Agent for CoreAgentAdapter {
message.clone(),
None,
self.agent_type.clone(),
false,
).await?;

let mut accumulated_text = String::new();
Expand Down
2 changes: 2 additions & 0 deletions src/apps/desktop/src/api/agentic_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ pub async fn create_session(
max_turns: c.max_turns.unwrap_or(200),
enable_context_compression: c.enable_context_compression.unwrap_or(true),
compression_threshold: c.compression_threshold.unwrap_or(0.8),
workspace_path: None,
})
.unwrap_or_default();

Expand Down Expand Up @@ -184,6 +185,7 @@ pub async fn start_dialog_turn(
request.user_input,
request.turn_id,
request.agent_type,
false,
)
.await
.map_err(|e| format!("Failed to start dialog turn: {}", e))?;
Expand Down
1 change: 1 addition & 0 deletions src/apps/desktop/src/api/app_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ impl AppState {
};

let workspace_service = Arc::new(workspace::WorkspaceService::new().await?);
workspace::set_global_workspace_service(workspace_service.clone());
let filesystem_service = Arc::new(filesystem::FileSystemServiceFactory::create_default());

ai_rules::initialize_global_ai_rules_service()
Expand Down
8 changes: 5 additions & 3 deletions src/apps/desktop/src/api/conversation_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,16 @@ pub async fn get_conversation_sessions(
) -> Result<Vec<SessionMetadata>, String> {
let workspace_path = PathBuf::from(&request.workspace_path);

let manager = ConversationPersistenceManager::new(path_manager.inner().clone(), workspace_path)
let manager = ConversationPersistenceManager::new(path_manager.inner().clone(), workspace_path.clone())
.await
.map_err(|e| format!("Failed to create persistence manager: {}", e))?;

manager
let sessions = manager
.get_session_list()
.await
.map_err(|e| format!("Failed to get session list: {}", e))
.map_err(|e| format!("Failed to get session list: {}", e))?;

Ok(sessions)
}

#[tauri::command]
Expand Down
1 change: 1 addition & 0 deletions src/apps/desktop/src/api/image_analysis_api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ pub async fn send_enhanced_message(
enhanced_message.clone(),
Some(request.dialog_turn_id.clone()),
request.agent_type.clone(),
false,
)
.await
.map_err(|e| format!("Failed to send enhanced message: {}", e))?;
Expand Down
1 change: 1 addition & 0 deletions src/apps/desktop/src/api/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,6 @@ pub mod subagent_api;
pub mod system_api;
pub mod terminal_api;
pub mod tool_api;
pub mod remote_connect_api;

pub use app_state::{AppState, AppStatistics, HealthStatus};
Loading