Skip to content
Open
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
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ indicates that it should connect to the provided host name using SSH.

The host name takes the format
`coder-<editor>.<domain>--<username>--<workspace>`, where `<editor>` comes from
that product's URI scheme, such as `vscode`, `cursor`, or `windsurf`. The CLI is
that product's URI scheme, such as `vscode`, `cursor`, or `devin`. The CLI is

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
that product's URI scheme, such as `vscode`, `cursor`, or `devin`. The CLI is
that product's URI scheme, such as `vscode`, `cursor`, or `devin`/`windsurf`. The CLI is

invoked through SSH's `ProxyCommand` with this prefix so it can route SSH to the
right workspace. A legacy `coder-vscode` authority opened in another editor is
reopened once with that editor's prefix; legacy recent-folder entries remain
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ The Coder Remote extension connects your editor to

- **One-click workspace access** - open workspaces from the Coder dashboard or
the editor sidebar. Workspaces start automatically when opened.
- **Multi-editor support** - works with VS Code, Cursor, Windsurf, and other
VS Code forks.
- **Multi-editor support** - works with VS Code, Cursor, Devin Desktop
(formerly Windsurf), and other VS Code forks.
- **Workspace sidebar** - browse, search, and create workspaces. View agent
metadata and app statuses at a glance.
- **Coder Tasks** - create, monitor, and manage AI agent tasks directly from
Expand All @@ -34,7 +34,7 @@ The Coder Remote extension connects your editor to
> The extension builds on VS Code-provided implementations of SSH. Make sure you
> have the correct SSH extension installed for your editor
> (`ms-vscode-remote.remote-ssh`, `anysphere.remote-ssh` for Cursor, or
> `codeium.windsurf-remote-openssh` for Windsurf).
> `codeium.windsurf-remote-openssh` for Devin Desktop).

## Getting Started

Expand Down Expand Up @@ -71,7 +71,7 @@ values can depend on the specific machine or network where they were set.

The extension registers a URI handler that can open workspaces from outside
the editor, such as links on the Coder dashboard. The scheme matches the
editor (`vscode://`, `cursor://`, `windsurf://`, etc.), followed by the
editor (`vscode://`, `cursor://`, `devin://`, etc.), followed by the
extension ID and a path:

```text
Expand Down
2 changes: 1 addition & 1 deletion src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ async function doActivate(
// This is janky, but that's alright since it provides such minimal
// functionality to the extension.
//
// Cursor and VSCode are covered by ms remote, and the only other is windsurf for now
// Cursor and VSCode are covered by ms remote, and the only other is Devin Desktop for now

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// Cursor and VSCode are covered by ms remote, and the only other is Devin Desktop for now
// Cursor and VSCode are covered by ms remote, and the only other are Devin Desktop / Windsurf for now

// Means that vscodium is not supported by this for now

const remoteSshExtension = getRemoteSshExtension();
Expand Down
4 changes: 2 additions & 2 deletions src/remote/sshProcess.ts
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@ export class SshProcessMonitor implements vscode.Disposable {

/**
* Finds the Remote SSH extension's log file path.
* Tries extension-specific folder first (Cursor, Windsurf, Antigravity),
* Tries extension-specific folder first (Cursor, Devin Desktop, Antigravity),

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
* Tries extension-specific folder first (Cursor, Devin Desktop, Antigravity),
* Tries extension-specific folder first (Cursor, Devin Desktop / Windsurf, Antigravity),

* then output_logging_ fallback (MS VS Code).
*/
async function findRemoteSshLogPath(
Expand All @@ -498,7 +498,7 @@ async function findRemoteSshLogPath(
): Promise<string | undefined> {
const logsParentDir = path.dirname(codeLogDir);

// Try extension-specific folder (for VS Code clones like Cursor, Windsurf)
// Try extension-specific folder (for VS Code clones like Cursor, Devin Desktop)
try {
const extensionLogDir = path.join(logsParentDir, extensionId);
const remoteSshLog = await findSshLogInDir(extensionLogDir);
Expand Down
2 changes: 1 addition & 1 deletion src/supportBundle/remoteServerDataPath.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ function getConfiguredServerDataPath(
"serverInstallPath",
{},
);
// Windsurf and Antigravity have no install path setting; their
// Devin Desktop and Antigravity have no install path setting; their

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// Devin Desktop and Antigravity have no install path setting; their
// Devin Desktop / Windsurf and Antigravity have no install path setting; their

// servers always live in the home default.
let installPath: string | undefined;
if (extensionId === "jeanp413.open-remote-ssh") {
Expand Down
2 changes: 1 addition & 1 deletion src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export function findPort(text: string): number | null {
const lastMatch = allMatches[allMatches.length - 1];
// Each capture group corresponds to a different Remote SSH extension log format:
// [0] full match, [1] and [2] ms-vscode-remote.remote-ssh,
// [3] windsurf/open-remote-ssh/antigravity, [4] anysphere.remote-ssh
// [3] devin/open-remote-ssh/antigravity, [4] anysphere.remote-ssh

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// [3] devin/open-remote-ssh/antigravity, [4] anysphere.remote-ssh
// [3] devin/windsurf/open-remote-ssh/antigravity, [4] anysphere.remote-ssh

const portStr = lastMatch[1] || lastMatch[2] || lastMatch[3] || lastMatch[4];
if (!portStr) {
return null;
Expand Down
6 changes: 3 additions & 3 deletions test/unit/remote/remote.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,8 @@ const REMOTE_AUTHORITY =
"ssh-remote+coder-vscode.coder.example.com--testuser--test-workspace.main";
const CURSOR_REMOTE_AUTHORITY =
"ssh-remote+coder-cursor.coder.example.com--testuser--test-workspace.main";
const WINDSURF_REMOTE_AUTHORITY =
"ssh-remote+coder-windsurf.coder.example.com--testuser--test-workspace.main";
const DEVIN_REMOTE_AUTHORITY =
"ssh-remote+coder-devin.coder.example.com--testuser--test-workspace.main";
const REMOTE_SSH_EXTENSION_ID = "anysphere.remote-ssh";
const MISMATCHED_URL =
"https://cursor.example.com/private?token=sensitive-url-token";
Expand Down Expand Up @@ -277,7 +277,7 @@ describe("Remote", () => {
const { remote, ensureLoggedInWithDialog, mementoManager } = createRemote();

await expect(
remote.setup(WINDSURF_REMOTE_AUTHORITY, "none", REMOTE_SSH_EXTENSION_ID),
remote.setup(DEVIN_REMOTE_AUTHORITY, "none", REMOTE_SSH_EXTENSION_ID),
).resolves.toBeUndefined();

expect(ensureLoggedInWithDialog).not.toHaveBeenCalled();
Expand Down
2 changes: 1 addition & 1 deletion test/unit/util.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ describe("findPort", () => {
54321,
],
[
"windsurf/open-remote-ssh/antigravity",
"devin/open-remote-ssh/antigravity",
"[INFO] Connection => 9999(socks) => target",
9999,
],
Expand Down
7 changes: 3 additions & 4 deletions test/unit/util/authority.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,7 @@ import {
const env = vscode.env as typeof vscode.env & { uriScheme: string };
const CURSOR_AUTHORITY = "ssh-remote+coder-cursor.dev.coder.com--foo--bar.main";
const LEGACY_AUTHORITY = "ssh-remote+coder-vscode.dev.coder.com--foo--bar.main";
const WINDSURF_AUTHORITY =
"ssh-remote+coder-windsurf.dev.coder.com--foo--bar.main";
const DEVIN_AUTHORITY = "ssh-remote+coder-devin.dev.coder.com--foo--bar.main";

const parts = (prefix: string): AuthorityParts => ({
agent: "main",
Expand Down Expand Up @@ -82,7 +81,7 @@ describe("parseRemoteAuthority", () => {
expect(parseRemoteAuthority("ssh-remote+coder-vscode")).toBeNull();
env.uriScheme = "cursor";
expect(
parseRemoteAuthority("ssh-remote+coder-windsurf.dev.coder.com--foo"),
parseRemoteAuthority("ssh-remote+coder-devin.dev.coder.com--foo"),
).toBeNull();
});

Expand Down Expand Up @@ -223,7 +222,7 @@ describe("authority migration", () => {
authority: "ssh-remote+coder-vscode",
expected: false,
},
{ label: "foreign", authority: WINDSURF_AUTHORITY, expected: false },
{ label: "foreign", authority: DEVIN_AUTHORITY, expected: false },
{
label: "different wrapper",
authority: `dev-container+abc@${LEGACY_AUTHORITY}`,
Expand Down