diff --git a/README.md b/README.md
index 10b73741a..8dbc558bc 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,79 @@
+
diff --git a/apps/emdash-desktop/src/main/core/conversations/impl/provider-env.test.ts b/apps/emdash-desktop/src/main/core/conversations/impl/provider-env.test.ts
index e83d05c69..3c60158fc 100644
--- a/apps/emdash-desktop/src/main/core/conversations/impl/provider-env.test.ts
+++ b/apps/emdash-desktop/src/main/core/conversations/impl/provider-env.test.ts
@@ -63,4 +63,29 @@ describe('resolveProviderEnv', () => {
resolveProviderEnv(undefined, { providerId: 'claude', autoApprove: true })
).toBeUndefined();
});
+
+ it('points Atlas Cloud at the Atlas OpenAI-compatible endpoint', () => {
+ expect(resolveProviderEnv(undefined, { providerId: 'atlascloud' })).toEqual({
+ OPENAI_BASE_URL: 'https://api.atlascloud.ai/v1',
+ });
+ });
+
+ it('lets the user override the Atlas Cloud base URL', () => {
+ expect(
+ resolveProviderEnv(
+ { env: { OPENAI_BASE_URL: 'https://proxy.example/v1', OPENAI_API_KEY: 'sk-test' } },
+ { providerId: 'atlascloud' }
+ )
+ ).toEqual({
+ OPENAI_BASE_URL: 'https://proxy.example/v1',
+ OPENAI_API_KEY: 'sk-test',
+ });
+ });
+
+ it('inherits opencode auto-approve permissions for Atlas Cloud (runs via opencode)', () => {
+ expect(resolveProviderEnv(undefined, { providerId: 'atlascloud', autoApprove: true })).toEqual({
+ OPENCODE_PERMISSION: '{"*":"allow"}',
+ OPENAI_BASE_URL: 'https://api.atlascloud.ai/v1',
+ });
+ });
});
diff --git a/apps/emdash-desktop/src/main/core/conversations/impl/provider-env.ts b/apps/emdash-desktop/src/main/core/conversations/impl/provider-env.ts
index d3eed2ccc..b965d494e 100644
--- a/apps/emdash-desktop/src/main/core/conversations/impl/provider-env.ts
+++ b/apps/emdash-desktop/src/main/core/conversations/impl/provider-env.ts
@@ -4,6 +4,7 @@ import type { ProviderCustomConfig } from '@shared/core/app-settings';
const ENV_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
const OPENCODE_ALLOW_ALL_PERMISSIONS = JSON.stringify({ '*': 'allow' });
const GEMINI_TRUST_WORKSPACE = 'true';
+const ATLASCLOUD_BASE_URL = 'https://api.atlascloud.ai/v1';
export function resolveProviderEnv(
providerConfig: ProviderCustomConfig | undefined,
@@ -11,10 +12,22 @@ export function resolveProviderEnv(
): Record
| undefined {
const env: Record = {};
- if (options.providerId === 'opencode' && options.autoApprove) {
+ // Atlas Cloud is the OpenCode CLI pointed at Atlas's OpenAI-compatible
+ // endpoint, so it inherits OpenCode's auto-approve permission env and gets
+ // the Atlas base URL injected. The API key is supplied by the user via this
+ // provider's `env` settings (ATLASCLOUD_API_KEY / OPENAI_API_KEY) and merged
+ // in below; OPENAI_BASE_URL is defaulted here unless the user overrode it.
+ const isOpencodeBackend =
+ options.providerId === 'opencode' || options.providerId === 'atlascloud';
+
+ if (isOpencodeBackend && options.autoApprove) {
env.OPENCODE_PERMISSION = OPENCODE_ALLOW_ALL_PERMISSIONS;
}
+ if (options.providerId === 'atlascloud' && !providerConfig?.env?.OPENAI_BASE_URL) {
+ env.OPENAI_BASE_URL = ATLASCLOUD_BASE_URL;
+ }
+
if (options.providerId === 'gemini' && options.autoApprove) {
env.GEMINI_CLI_TRUST_WORKSPACE = GEMINI_TRUST_WORKSPACE;
}
diff --git a/apps/emdash-desktop/src/renderer/lib/providers/meta.ts b/apps/emdash-desktop/src/renderer/lib/providers/meta.ts
index 27fd95cec..ddd2b1788 100644
--- a/apps/emdash-desktop/src/renderer/lib/providers/meta.ts
+++ b/apps/emdash-desktop/src/renderer/lib/providers/meta.ts
@@ -1,5 +1,6 @@
import ampcodeIcon from '@/assets/images/ampcode.svg?raw';
import antigravityIcon from '@/assets/images/antigravity.svg?raw';
+import atlascloudIcon from '@/assets/images/atlas.png';
import atlassianIcon from '@/assets/images/atlassian.png';
import augmentcodeIcon from '@/assets/images/Auggie.svg?raw';
import autohandIcon from '@/assets/images/autohand.svg?raw';
@@ -57,6 +58,7 @@ const ICONS: Record = {
'kiro.png': kiroIcon,
'letta.svg': lettaIcon,
'atlassian.png': atlassianIcon,
+ 'atlas.png': atlascloudIcon,
'cline.png': clineIcon,
'continue.png': continueIcon,
'codebuff.png': codebuffIcon,
diff --git a/apps/emdash-desktop/src/renderer/utils/agentConfig.ts b/apps/emdash-desktop/src/renderer/utils/agentConfig.ts
index f411d64ff..16c2b5092 100644
--- a/apps/emdash-desktop/src/renderer/utils/agentConfig.ts
+++ b/apps/emdash-desktop/src/renderer/utils/agentConfig.ts
@@ -1,6 +1,7 @@
import { type AgentProviderId } from '@shared/core/agents/agent-provider-registry';
import ampLogo from '../../assets/images/ampcode.svg';
import antigravityLogo from '../../assets/images/antigravity.svg';
+import atlascloudLogo from '../../assets/images/atlas.png';
import atlassianLogo from '../../assets/images/atlassian.png';
import augmentLogoSvg from '../../assets/images/Auggie.svg?raw';
import autohandLogoSvg from '../../assets/images/autohand.svg?raw';
@@ -118,4 +119,5 @@ export const agentConfig: Record = {
},
charm: { name: 'Charm', logo: charmLogo, alt: 'Charm Crush' },
rovo: { name: 'Rovo Dev', logo: atlassianLogo, alt: 'Rovo Dev' },
+ atlascloud: { name: 'Atlas Cloud', logo: atlascloudLogo, alt: 'Atlas Cloud' },
};
diff --git a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts
index cd74c2e38..b8f03c494 100644
--- a/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts
+++ b/apps/emdash-desktop/src/shared/core/agents/agent-provider-registry.ts
@@ -30,6 +30,7 @@ export const AGENT_PROVIDER_IDS = [
'pi',
'letta',
'autohand',
+ 'atlascloud',
] as const;
export type AgentProviderId = (typeof AGENT_PROVIDER_IDS)[number];
@@ -657,6 +658,29 @@ export const AGENT_PROVIDERS: AgentProviderDefinition[] = [
alt: 'Autohand Code CLI',
terminalOnly: true,
},
+ {
+ id: 'atlascloud',
+ name: 'Atlas Cloud',
+ description:
+ 'Route the OpenCode CLI through Atlas Cloud — 59 frontier models (DeepSeek-V4, Qwen3, Kimi K2, GPT-5, Gemini 2.5 Pro, Claude, Grok-4…) via a single OpenAI-compatible endpoint. Requires OpenCode; set ATLASCLOUD_API_KEY (or OPENAI_API_KEY) in this provider’s environment settings.',
+ docUrl: 'https://www.atlascloud.ai/docs',
+ // Atlas Cloud is not a standalone CLI: it reuses the OpenCode binary and
+ // simply points it at Atlas's OpenAI-compatible endpoint via env injection
+ // (see resolveProviderEnv). Reusing OpenCode's command/installCommand here
+ // would register a second, indistinguishable probe of the `opencode`
+ // binary, so it is intentionally not separately detectable.
+ detectable: false,
+ cli: 'opencode',
+ autoApproveViaEnv: true,
+ initialPromptFlag: '--prompt',
+ resumeFlag: '--session',
+ sessionIdFlag: '--session',
+ sessionIdOnResumeOnly: true,
+ resumeWithoutSessionFlag: '--continue',
+ icon: 'atlas.png',
+ alt: 'Atlas Cloud',
+ terminalOnly: true,
+ },
];
const PROVIDER_MAP = new Map(
@@ -681,7 +705,10 @@ export function isValidProviderId(value: unknown): value is AgentProviderId {
}
export function isValidProviderSessionId(providerId: string, providerSessionId: string): boolean {
- if (providerId === 'opencode') return providerSessionId.startsWith('ses');
+ // Atlas Cloud runs through the OpenCode CLI, so it shares OpenCode's session id format.
+ if (providerId === 'opencode' || providerId === 'atlascloud') {
+ return providerSessionId.startsWith('ses');
+ }
return true;
}