Skip to content
Draft
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
38 changes: 38 additions & 0 deletions src-tauri/src/core/system/commands.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3590,6 +3590,27 @@ pub fn open_agent_terminal(
Ok(())
}

/// Open a URL in the user's default browser (cross-platform).
fn open_web_url(url: &str) -> Result<(), String> {
use std::process::Command;

let result = if cfg!(target_os = "windows") {
Command::new("cmd")
.args(["/C", "start", "", url])
.status()
} else if cfg!(target_os = "macos") {
Command::new("open").arg(url).status()
} else {
Command::new("xdg-open").arg(url).status()
};

match result {
Ok(status) if status.success() => Ok(()),
Ok(_) => Err(format!("Failed to open {}", url)),
Err(e) => Err(format!("Failed to open {}: {}", url, e)),
}
}

/// Launch a GUI editor for the "IDEs & Editors" integrations (VS Code,
/// JetBrains, Xcode).
///
Expand Down Expand Up @@ -3641,6 +3662,23 @@ pub fn launch_editor(editor_id: String) -> Result<(), String> {
// Xcode is macOS-only and ships no general-purpose launcher binary
// (`xed` needs a file argument), so we open the app directly.
"xcode" => (&[], Some("Xcode")),
// Self-hosted web UIs — open the default local URL in the browser.
"onyx" => {
open_web_url("http://localhost:3000")?;
log::info!("Opened Onyx at http://localhost:3000");
return Ok(());
}
"n8n" => {
for cli in &["n8n"] {
if try_spawn(cli, &["start"]) {
log::info!("Launched n8n via '{} start'", cli);
return Ok(());
}
}
open_web_url("http://localhost:5678")?;
log::info!("Opened n8n UI at http://localhost:5678");
return Ok(());
}
other => return Err(format!("Unknown editor: {}", other)),
};

Expand Down
74 changes: 59 additions & 15 deletions web-app/src/constants/integrations.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,18 @@
export type IntegrationKind = 'coding' | 'assistant' | 'editor'
export type IntegrationKind =
| 'coding'
| 'assistant'
| 'editor'
| 'chat'
| 'automation'
| 'notebook'

/** Integrations that use copy-settings + launch + manual steps (no config file). */
export const MANUAL_SETUP_KINDS: IntegrationKind[] = [
'editor',
'chat',
'automation',
'notebook',
]

/**
* Ordered manual-setup instructions shown inside an editor card. These mirror
Expand Down Expand Up @@ -121,20 +135,6 @@ export const INTEGRATION_AGENTS: IntegrationAgent[] = [
requiresModel: true,
endpointWithPrefix: true,
},
{
id: 'zed',
name: 'Zed',
description: 'High-performance code editor with a built-in AI agent.',
kind: 'coding',
detectBin: 'zed',
docsUrl: 'https://zed.dev/docs/ai/llm-providers',
installable: true,
configurable: true,
requiresModel: true,
// Zed's native Atomic Chat provider expects the OpenAI-compatible base URL
// with the `/v1` prefix (matches its built-in default).
endpointWithPrefix: true,
},
{
id: 'mimo',
name: 'MiMo Code',
Expand Down Expand Up @@ -285,4 +285,48 @@ export const INTEGRATION_AGENTS: IntegrationAgent[] = [
],
},
},
{
id: 'onyx',
name: 'Onyx',
description:
'Self-hostable chat UI with RAG, agents, connectors, and deep research.',
kind: 'chat',
detectBin: 'docker',
docsUrl: 'https://docs.onyx.app/deployment/quickstart',
installable: false,
configurable: false,
requiresModel: false,
endpointWithPrefix: true,
editor: {
launchId: 'onyx',
steps: [
'Deploy Onyx (see Docs) and sign in to your instance.',
'During setup, add an OpenAI-compatible LLM provider.',
'Paste the copied Base URL and API key (use host.docker.internal instead of 127.0.0.1 if Onyx runs in Docker).',
'Select your Atomic Chat model and send a test message.',
],
},
},
{
id: 'n8n',
name: 'n8n',
description:
'Workflow automation with AI nodes powered by your local models.',
kind: 'automation',
detectBin: 'n8n',
docsUrl: 'https://docs.n8n.io/integrations/builtin/credentials/ollama/',
installable: false,
configurable: false,
requiresModel: false,
endpointWithPrefix: false,
editor: {
launchId: 'n8n',
steps: [
'Open n8n → Credentials → Add credential → Ollama (or OpenAI with a custom base URL).',
'Set Base URL to the copied value (use host.docker.internal if n8n runs in Docker).',
'Save and test the connection.',
'Add an Ollama / OpenAI chat node to a workflow and pick your Atomic Chat model.',
],
},
},
]
11 changes: 7 additions & 4 deletions web-app/src/locales/en/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@
"assistantsDesc": "AI assistants that help with everyday tasks.",
"editors": "Editors",
"editorsDesc": "Code editors that let you chat and code with your local models.",
"chatRag": "Chat & RAG",
"chatRagDesc": "Chat interfaces and retrieval-augmented generation platforms.",
"automation": "Automation",
"automationDesc": "Workflow automation platforms with AI integration.",
"notebooks": "Notebooks",
"notebooksDesc": "Interactive notebooks with AI chat and code completion.",
"copySettings": "Copy settings",
"manualSetup": "Manual setup",
"serverNotRunningHint": "Start the local server above first so {{name}} can reach your models.",
Expand All @@ -18,8 +24,7 @@
"setCustomPath": "Set binary path",
"customPathSet": "Binary path set",
"savePath": "Save",
"customPathPlaceholder": "/path/to/binary",
"customPathPlaceholderWindows": "C:\\path\\to\\binary.exe",
"customPathPlaceholder": "/path/to/binary or C:\\path\\to\\binary.exe",
"customPathHint": "Point at the agent's executable if it's installed in a non-standard location that auto-detection misses. This only affects the Installed status here.",
"install": "Install",
"installing": "Installing...",
Expand All @@ -44,10 +49,8 @@
"installSuccess": "{{name}} installed",
"installSuccessDesc": "{{name}} was installed successfully.",
"installFailed": "Failed to install {{name}}",
"installFailedNetworkDesc": "The installer couldn't reach the network. If you're behind a region block, set an HTTP/HTTPS proxy in Settings → HTTPS Proxy and try again. Note: SOCKS proxies often don't work for npm/PowerShell-based installers.",
"configured": "{{name}} configured",
"configuredDesc": "{{name}} now points at your local server — opening a terminal.",
"configuredDescEditor": "{{name}} now points at your local server — opening the editor.",
"configureFailed": "Failed to configure {{name}}",
"terminalFailed": "Couldn't open a terminal for {{name}}",
"settingsCopied": "Connection settings copied",
Expand Down
Loading