diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 00000000000..6836901226a
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,31 @@
+# Git
+.git
+.github
+.gitignore
+.gitattributes
+
+# Node (rebuilt in Docker)
+node_modules
+
+# IDE
+.idea
+
+# Documentation
+README.md
+HOW_TO_CONTRIBUTE.md
+VOID_CODEBASE_GUIDE.md
+LICENSE*.txt
+ThirdPartyNotices.txt
+
+# CI/CD
+CodeQL.yml
+
+# Build output (rebuilt in Docker)
+out
+
+# OS
+.DS_Store
+Thumbs.db
+
+# Playwright browsers (not needed for server)
+.playwright
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 00000000000..3010d42a857
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,3 @@
+# Default code owners for all files
+* @danialsamiei
+
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000000..99b0c21cb91
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+version: 2
+updates:
+ - package-ecosystem: "npm"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 5
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ open-pull-requests-limit: 5
diff --git a/.voidrules b/.orciderules
similarity index 75%
rename from .voidrules
rename to .orciderules
index 55ab5af65de..1a70ff18d88 100644
--- a/.voidrules
+++ b/.orciderules
@@ -1,6 +1,6 @@
-This is a fork of the VSCode repo called Void.
+This is the Orcide IDE repository, a fork of VSCode.
-Most code we care about lives in src/vs/workbench/contrib/void.
+Most code we care about lives in src/vs/workbench/contrib/orcide.
You may often need to explore the full repo to find relevant parts of code.
Look for services and built-in functions that you might need to use to solve the problem.
@@ -9,7 +9,7 @@ In typescript, do NOT cast to types if not neccessary. NEVER lazily cast to 'any
Do not add or remove semicolons to any of my files. Just go with convention and make the least number of changes.
-Never modify files outside src/vs/workbench/contrib/void without consulting with the user first.
+Never modify files outside src/vs/workbench/contrib/orcide without consulting with the user first.
All types that map from a value A to B should be called bOfA. For example, if you create a hashmap that goes from toolId to toolName, it should be called toolNameOfToolId, etc.
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000000..4242b506245
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,61 @@
+# Dockerfile for ide.orcest.ai (VS Code fork) - Render.com deploy
+# Requires X11 libs for native-keymap, node-pty, etc.
+
+FROM node:20-bookworm-slim
+
+# Install build deps for native modules (native-keymap, node-pty, etc.)
+# ripgrep: @vscode/ripgrep postinstall downloads from GitHub and gets 403 in cloud builds
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ python3 \
+ make \
+ g++ \
+ pkg-config \
+ libxkbfile-dev \
+ libx11-dev \
+ libxrandr-dev \
+ libxi-dev \
+ libxtst-dev \
+ libxrender-dev \
+ libxfixes-dev \
+ libxext-dev \
+ libxkbcommon-dev \
+ libsecret-1-dev \
+ libkrb5-dev \
+ git \
+ ripgrep \
+ && rm -rf /var/lib/apt/lists/*
+
+WORKDIR /app
+
+# Copy source (postinstall needs full tree for build/, remote/, etc.)
+COPY . .
+
+# Install deps - requires X11 libs above for native-keymap, node-pty
+# Use --ignore-scripts to skip @vscode/ripgrep postinstall (403 from GitHub in cloud builds),
+# supply system ripgrep, run postinstall (with install not rebuild for subdirs), then rebuild native modules
+RUN npm i --ignore-scripts \
+ && mkdir -p node_modules/@vscode/ripgrep/bin \
+ && cp /usr/bin/rg node_modules/@vscode/ripgrep/bin/rg \
+ && VSCODE_USE_SYSTEM_RIPGREP=1 npm rebuild \
+ && mkdir -p build/node_modules/@vscode/ripgrep/bin \
+ && cp /usr/bin/rg build/node_modules/@vscode/ripgrep/bin/rg \
+ && (cd build && npm rebuild) \
+ && mkdir -p remote/node_modules/@vscode/ripgrep/bin \
+ && cp /usr/bin/rg remote/node_modules/@vscode/ripgrep/bin/rg \
+ && (cd remote && npm rebuild)
+
+# Build: React components first, then compile produces out/ (server + workbench), compile-web adds extension web bundles
+ENV NODE_OPTIONS="--max-old-space-size=4096"
+RUN npm run buildreact \
+ && npm run compile \
+ && npm run compile-web
+
+# VSCODE_DEV=1 tells the server to use the dev workbench template which loads CSS
+# dynamically via import maps. Without this, the server expects a bundled workbench.css
+# that is only produced by the full packaging pipeline (gulp vscode-web-min), not by
+# npm run compile.
+ENV VSCODE_DEV=1
+
+# Render sets PORT; use code-server (production) not code-web (test harness)
+EXPOSE 10000
+CMD ["sh", "-c", "node out/server-main.js --host 0.0.0.0 --port ${PORT:-10000} --without-connection-token --accept-server-license-terms"]
diff --git a/HOW_TO_CONTRIBUTE.md b/HOW_TO_CONTRIBUTE.md
index 443e3540acf..4b4bcab8248 100644
--- a/HOW_TO_CONTRIBUTE.md
+++ b/HOW_TO_CONTRIBUTE.md
@@ -4,15 +4,15 @@ This is the official guide on how to contribute to Void. We want to make it as e
There are a few ways to contribute:
-- 💫 Complete items on the [Roadmap](https://github.com/orgs/voideditor/projects/2).
+- 💫 Complete items on the [Roadmap](https://github.com/orgs/orcide/projects/2).
- 💡 Make suggestions in our [Discord](https://discord.gg/RSNjgaugJs).
-- 🪴 Start new Issues - see [Issues](https://github.com/voideditor/void/issues).
+- 🪴 Start new Issues - see [Issues](https://github.com/orcest-ai/Orcide/issues).
### Codebase Guide
-We [highly recommend reading this](https://github.com/voideditor/void/blob/main/VOID_CODEBASE_GUIDE.md) guide that we put together on Void's sourcecode if you'd like to add new features.
+We [highly recommend reading this](https://github.com/orcest-ai/Orcide/blob/main/VOID_CODEBASE_GUIDE.md) guide that we put together on Void's sourcecode if you'd like to add new features.
The repo is not as intimidating as it first seems if you read the guide!
@@ -56,7 +56,7 @@ First, run `npm install -g node-gyp`. Then:
Here's how to start changing Void's code. These steps cover everything from cloning Void, to opening a Developer Mode window where you can play around with your updates.
-1. `git clone https://github.com/voideditor/void` to clone the repo.
+1. `git clone https://github.com/orcest-ai/Orcide` to clone the repo.
2. `npm install` to install all dependencies.
3. Open Void or VSCode, and initialize Developer Mode (this can take ~5 min to finish, it's done when 2 of the 3 spinners turn to check marks):
- Windows: Press Ctrl+Shift+B.
@@ -85,7 +85,7 @@ If you get any errors, scroll down for common fixes.
- If you get errors like `npm error libtool: error: unrecognised option: '-static'`, when running ./scripts/code.sh, make sure you have GNU libtool instead of BSD libtool (BSD is the default in macos)
- If you get errors like `The SUID sandbox helper binary was found, but is not configured correctly` when running ./scripts/code.sh, run
`sudo chown root:root .build/electron/chrome-sandbox && sudo chmod 4755 .build/electron/chrome-sandbox` and then run `./scripts/code.sh` again.
-- If you have any other questions, feel free to [submit an issue](https://github.com/voideditor/void/issues/new). You can also refer to VSCode's complete [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute) page.
+- If you have any other questions, feel free to [submit an issue](https://github.com/orcest-ai/Orcide/issues/new). You can also refer to VSCode's complete [How to Contribute](https://github.com/microsoft/vscode/wiki/How-to-Contribute) page.
@@ -103,9 +103,9 @@ To build Void from the terminal instead of from inside VSCode, follow the steps
### Distributing
-Void's maintainers distribute Void on our website and in releases. Our build pipeline is a fork of VSCodium, and it works by running GitHub Actions which create the downloadables. The build repo with more instructions lives [here](https://github.com/voideditor/void-builder).
+Void's maintainers distribute Void on our website and in releases. Our build pipeline is a fork of VSCodium, and it works by running GitHub Actions which create the downloadables. The build repo with more instructions lives [here](https://github.com/orcest-ai/Orcide-builder).
-If you want to completely control Void's build pipeline for your own internal usage, which comes with a lot of time cost (and is typically not recommended), see our [`void-builder`](https://github.com/voideditor/void-builder) repo which builds Void and contains a few important notes about auto-updating and rebasing.
+If you want to completely control Void's build pipeline for your own internal usage, which comes with a lot of time cost (and is typically not recommended), see our [`void-builder`](https://github.com/orcest-ai/Orcide-builder) repo which builds Void and contains a few important notes about auto-updating and rebasing.
#### Building a Local Executible
diff --git a/VOID_CODEBASE_GUIDE.md b/ORCIDE_CODEBASE_GUIDE.md
similarity index 79%
rename from VOID_CODEBASE_GUIDE.md
rename to ORCIDE_CODEBASE_GUIDE.md
index 14a04686a6d..ba1704a6c97 100644
--- a/VOID_CODEBASE_GUIDE.md
+++ b/ORCIDE_CODEBASE_GUIDE.md
@@ -1,10 +1,10 @@
-# Void Codebase Guide
+# Orcide Codebase Guide
-The Void codebase is not as intimidating as it seems!
+The Orcide codebase is not as intimidating as it seems!
-Most of Void's code lives in the folder `src/vs/workbench/contrib/void/`.
+Most of Orcide's code lives in the folder `src/vs/workbench/contrib/orcide/`.
-The purpose of this document is to explain how Void's codebase works. If you want build instructions instead, see [Contributing](https://github.com/voideditor/void/blob/main/HOW_TO_CONTRIBUTE.md).
+The purpose of this document is to explain how Orcide's codebase works. If you want build instructions instead, see [Contributing](https://github.com/orcest-ai/Orcide/blob/main/HOW_TO_CONTRIBUTE.md).
@@ -14,10 +14,10 @@ The purpose of this document is to explain how Void's codebase works. If you wan
-## Void Codebase Guide
+## Orcide Codebase Guide
### VSCode Rundown
-Here's a VSCode rundown if you're just getting started with Void. You can also see Microsoft's [wiki](https://github.com/microsoft/vscode/wiki/Source-Code-Organization) for some pictures. VSCode is an Electron app. Electron runs two processes: a **main** process (for internals) and a **browser** process (browser means HTML in general, not just "web browser").
+Here's a VSCode rundown if you're just getting started with Orcide. You can also see Microsoft's [wiki](https://github.com/microsoft/vscode/wiki/Source-Code-Organization) for some pictures. VSCode is an Electron app. Electron runs two processes: a **main** process (for internals) and a **browser** process (browser means HTML in general, not just "web browser").
@@ -54,7 +54,7 @@ Here's some terminology you might want to know about when working inside VSCode:
### Internal LLM Message Pipeline
-Here's a picture of all the dependencies that are relevent between the time you first send a message through Void's sidebar, and the time a request is sent to your provider.
+Here's a picture of all the dependencies that are relevent between the time you first send a message through Orcide's sidebar, and the time a request is sent to your provider.
Sending LLM messages from the main process avoids CSP issues with local providers and lets us use node_modules more easily.
@@ -69,7 +69,7 @@ Sending LLM messages from the main process avoids CSP issues with local provider
### Apply
-Void has two types of Apply: **Fast Apply** (uses Search/Replace, see below), and **Slow Apply** (rewrites whole file).
+Orcide has two types of Apply: **Fast Apply** (uses Search/Replace, see below), and **Slow Apply** (rewrites whole file).
When you click Apply and Fast Apply is enabled, we prompt the LLM to output Search/Replace block(s) like this:
```
@@ -79,7 +79,7 @@ When you click Apply and Fast Apply is enabled, we prompt the LLM to output Sear
// replaced code goes here
>>>>>>> UPDATED
```
-This is what allows Void to quickly apply code even on 1000-line files. It's the same as asking the LLM to press Ctrl+F and enter in a search/replace query.
+This is what allows Orcide to quickly apply code even on 1000-line files. It's the same as asking the LLM to press Ctrl+F and enter in a search/replace query.
### Apply Inner Workings
@@ -97,10 +97,10 @@ How Apply works:
### Writing Files Inner Workings
-When Void wants to change your code, it just writes to a text model. This means all you need to know to write to a file is its URI - you don't have to load it, save it, etc. There are some annoying background URI/model things to think about to get this to work, but we handled them all in `voidModelService`.
+When Orcide wants to change your code, it just writes to a text model. This means all you need to know to write to a file is its URI - you don't have to load it, save it, etc. There are some annoying background URI/model things to think about to get this to work, but we handled them all in `orcideModelService`.
-### Void Settings Inner Workings
-We have a service `voidSettingsService` that stores all your Void settings (providers, models, global Void settings, etc). Imagine this as an implicit dependency for any of the core Void services:
+### Orcide Settings Inner Workings
+We have a service `orcideSettingsService` that stores all your Orcide settings (providers, models, global Orcide settings, etc). Imagine this as an implicit dependency for any of the core Orcide services:
@@ -126,13 +126,13 @@ Here's a guide to some of the terminology we're using:
### Build process
-If you want to know how our build pipeline works, see our build repo [here](https://github.com/voideditor/void-builder).
+If you want to know how our build pipeline works, see our build repo [here](https://github.com/orcest-ai/Orcide-builder).
## VSCode Codebase Guide
-For additional references, the Void team put together this list of links to get up and running with VSCode.
+For additional references, the Orcide team put together this list of links to get up and running with VSCode.
@@ -155,7 +155,7 @@ For additional references, the Void team put together this list of links to get
#### VSCode's Extension API
-Void is no longer an extension, so these links are no longer required, but they might be useful if we ever build an extension again.
+Orcide is no longer an extension, so these links are no longer required, but they might be useful if we ever build an extension again.
- [Files you need in an extension](https://code.visualstudio.com/api/get-started/extension-anatomy).
- [An extension's `package.json` schema](https://code.visualstudio.com/api/references/extension-manifest).
diff --git a/README.md b/README.md
index 63e779a40f7..5af1a9afe78 100644
--- a/README.md
+++ b/README.md
@@ -1,41 +1,70 @@
-# Welcome to Void.
+
-
+
Orcide: Cloud IDE
+
Part of the Orcest AI Ecosystem
-Void is the open-source Cursor alternative.
+
+
+
+
+
+
+Orcide is an AI-powered cloud IDE that provides intelligent code editing, autocomplete, and refactoring capabilities. It is a core component of the **Orcest AI** ecosystem, integrated with **RainyModel** (rm.orcest.ai) for intelligent LLM routing.
-Use AI agents on your codebase, checkpoint and visualize changes, and bring any model or host locally. Void sends messages directly to providers without retaining your data.
+### Orcest AI Ecosystem
-This repo contains the full sourcecode for Void. If you're new, welcome!
+| Service | Domain | Role |
+|---------|--------|------|
+| **Lamino** | llm.orcest.ai | LLM Workspace |
+| **RainyModel** | rm.orcest.ai | LLM Routing Proxy |
+| **Maestrist** | agent.orcest.ai | AI Agent Platform |
+| **Orcide** | ide.orcest.ai | Cloud IDE |
+| **Login** | login.orcest.ai | SSO Authentication |
-- 🧭 [Website](https://voideditor.com)
+## Features
-- 👋 [Discord](https://discord.gg/RSNjgaugJs)
+- **AI-Powered Code Editing**: Intelligent code suggestions and completions
+- **Chat Interface**: Built-in AI chat for code assistance
+- **Autocomplete**: Context-aware code completion powered by RainyModel
+- **Code Refactoring**: AI-assisted code improvements
+- **RainyModel Integration**: Smart LLM routing with automatic fallback (Free → Internal → Premium)
+- **SSO Authentication**: Enterprise-grade access control via login.orcest.ai
+- **VS Code Compatible**: Full VS Code extension ecosystem support
-- 🚙 [Project Board](https://github.com/orgs/voideditor/projects/2)
+## RainyModel Configuration
+Configure Orcide to use RainyModel as its AI backend:
-## Note
+1. Open Settings (Ctrl+,)
+2. Navigate to AI / LLM settings
+3. Set:
+ - **API Provider**: OpenAI-Compatible
+ - **Base URL**: `https://rm.orcest.ai/v1`
+ - **API Key**: Your RainyModel API key
+ - **Chat Model**: `rainymodel/chat`
+ - **Autocomplete Model**: `rainymodel/code`
-We've paused work on the Void IDE (this repo) to explore a few novel coding ideas. We want to focus on innovation over feature-parity. Void will continue running, but without maintenance some existing features might stop working over time. Depending on the direction of our new work, we might not resume Void as an IDE.
+## Development
-We won't be actively reviewing Issues and PRs, but we will respond to all [email](mailto:hello@voideditor.com) inquiries on building and maintaining your own version of Void while we're paused.
+```bash
+# Install dependencies
+yarn install
-## Reference
+# Build
+yarn build
-Void is a fork of the [vscode](https://github.com/microsoft/vscode) repository. For a guide to the codebase, see [VOID_CODEBASE_GUIDE](https://github.com/voideditor/void/blob/main/VOID_CODEBASE_GUIDE.md).
+# Run in development mode
+yarn watch
+```
-For a guide on how to develop your own version of Void, see [HOW_TO_CONTRIBUTE](https://github.com/voideditor/void/blob/main/HOW_TO_CONTRIBUTE.md) and [void-builder](https://github.com/voideditor/void-builder).
+## Contributing
+See [HOW_TO_CONTRIBUTE.md](HOW_TO_CONTRIBUTE.md) for contribution guidelines.
+## License
+This project is licensed under the [MIT License](LICENSE).
-## Support
-You can always reach us in our Discord server or contact us via email: hello@voideditor.com.
+Part of the [Orcest AI](https://orcest.ai) ecosystem.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 00000000000..608839cf7c7
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,27 @@
+# Security Policy
+
+## Supported Versions
+
+| Version | Supported |
+|---------|-----------|
+| Latest | Yes |
+
+## Reporting a Vulnerability
+
+If you discover a security vulnerability, please report it responsibly:
+
+1. **Do NOT** open a public GitHub issue
+2. Use [GitHub Security Advisories](https://github.com/orcest-ai/Orcide/security/advisories/new) to report privately
+3. Or email: support@orcest.ai
+
+We will acknowledge receipt within 48 hours and provide a timeline for resolution.
+
+## Security Best Practices
+
+- All secrets must be stored in environment variables, never in code
+- All services require SSO authentication via login.orcest.ai
+- API keys must be rotated regularly
+- All traffic must use HTTPS/TLS
+
+Part of the [Orcest AI](https://orcest.ai) ecosystem.
+
diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js
index 458847afac5..02b716904ee 100644
--- a/build/npm/postinstall.js
+++ b/build/npm/postinstall.js
@@ -46,7 +46,12 @@ function npmInstall(dir, opts) {
shell: true
};
- const command = process.env['npm_command'] || 'install';
+ // When parent runs "npm rebuild", npm_command=rebuild causes subdirs to run "npm rebuild"
+ // which doesn't install packages. Subdirs need "npm install" to populate node_modules.
+ const rawCommand = opts.npmCommandOverride != null
+ ? opts.npmCommandOverride
+ : (process.env['npm_command'] || 'install');
+ const command = (rawCommand === 'rebuild' ? 'install' : rawCommand);
if (process.env['VSCODE_REMOTE_DEPENDENCIES_CONTAINER_NAME'] && /^(.build\/distro\/npm\/)?remote$/.test(dir)) {
const userinfo = os.userInfo();
@@ -128,6 +133,10 @@ for (let dir of dirs) {
...process.env
},
}
+ // When set, use --ignore-scripts for build to skip @vscode/ripgrep postinstall (403 from GitHub).
+ if (process.env['VSCODE_USE_SYSTEM_RIPGREP']) {
+ opts.npmCommandOverride = 'install --ignore-scripts';
+ }
if (process.env['CC']) { opts.env['CC'] = 'gcc'; }
if (process.env['CXX']) { opts.env['CXX'] = 'g++'; }
if (process.env['CXXFLAGS']) { opts.env['CXXFLAGS'] = ''; }
@@ -145,6 +154,11 @@ for (let dir of dirs) {
...process.env
},
}
+ // When set, use --ignore-scripts for remote to skip @vscode/ripgrep postinstall (403 from GitHub).
+ // Caller must then copy system ripgrep into remote/node_modules/@vscode/ripgrep/bin and run npm rebuild in remote.
+ if (process.env['VSCODE_USE_SYSTEM_RIPGREP']) {
+ opts.npmCommandOverride = 'install --ignore-scripts';
+ }
if (process.env['VSCODE_REMOTE_CC']) {
opts.env['CC'] = process.env['VSCODE_REMOTE_CC'];
} else {
@@ -188,5 +202,8 @@ for (let dir of dirs) {
npmInstall(dir, opts);
}
-cp.execSync('git config pull.rebase merges');
-cp.execSync('git config blame.ignoreRevsFile .git-blame-ignore-revs');
+// Skip git config if not in a git repo (e.g. Docker build where .git is not copied)
+if (fs.existsSync(path.join(root, '.git'))) {
+ cp.execSync('git config pull.rebase merges');
+ cp.execSync('git config blame.ignoreRevsFile .git-blame-ignore-revs');
+}
diff --git a/extensions/open-remote-ssh/package.json b/extensions/open-remote-ssh/package.json
index 48276a7a05f..762ff56547b 100644
--- a/extensions/open-remote-ssh/package.json
+++ b/extensions/open-remote-ssh/package.json
@@ -1,7 +1,7 @@
{
"name": "open-remote-ssh",
"displayName": "Open Remote - SSH",
- "publisher": "voideditor",
+ "publisher": "orcide",
"description": "Use any remote machine with a SSH server as your development environment.",
"version": "0.0.48",
"icon": "resources/icon.png",
@@ -71,7 +71,7 @@
"type": "string",
"description": "The URL from where the vscode server will be downloaded. You can use the following variables and they will be replaced dynamically:\n- ${quality}: vscode server quality, e.g. stable or insiders\n- ${version}: vscode server version, e.g. 1.69.0\n- ${commit}: vscode server release commit\n- ${arch}: vscode server arch, e.g. x64, armhf, arm64\n- ${release}: release number",
"scope": "application",
- "default": "https://github.com/voideditor/binaries/releases/download/${version}/void-reh-${os}-${arch}-${version}.tar.gz"
+ "default": "https://github.com/orcest-ai/Orcide-binaries/releases/download/${version}/void-reh-${os}-${arch}-${version}.tar.gz"
},
"remote.SSH.remotePlatform": {
"type": "object",
diff --git a/extensions/open-remote-ssh/src/serverSetup.ts b/extensions/open-remote-ssh/src/serverSetup.ts
index 673a795746c..70891f9061c 100644
--- a/extensions/open-remote-ssh/src/serverSetup.ts
+++ b/extensions/open-remote-ssh/src/serverSetup.ts
@@ -39,7 +39,7 @@ export class ServerInstallError extends Error {
}
}
-const DEFAULT_DOWNLOAD_URL_TEMPLATE = 'https://github.com/voideditor/binaries/releases/download/${version}/void-reh-${os}-${arch}-${version}.tar.gz';
+const DEFAULT_DOWNLOAD_URL_TEMPLATE = 'https://github.com/orcest-ai/Orcide-binaries/releases/download/${version}/void-reh-${os}-${arch}-${version}.tar.gz';
export async function installCodeServer(conn: SSHConnection, serverDownloadUrlTemplate: string | undefined, extensionIds: string[], envVariables: string[], platform: string | undefined, useSocketPath: boolean, logger: Log): Promise {
let shell = 'powershell';
diff --git a/extensions/open-remote-wsl/package.json b/extensions/open-remote-wsl/package.json
index bba06d81239..4afeb8b582b 100644
--- a/extensions/open-remote-wsl/package.json
+++ b/extensions/open-remote-wsl/package.json
@@ -38,7 +38,7 @@
"type": "string",
"description": "The URL from where the vscode server will be downloaded. You can use the following variables and they will be replaced dynamically:\n- ${quality}: vscode server quality, e.g. stable or insiders\n- ${version}: vscode server version, e.g. 1.69.0\n- ${commit}: vscode server release commit\n- ${arch}: vscode server arch, e.g. x64, armhf, arm64\n- ${release}: release number",
"scope": "application",
- "default": "https://github.com/voideditor/binaries/releases/download/${version}/void-reh-${os}-${arch}-${version}.tar.gz"
+ "default": "https://github.com/orcest-ai/Orcide-binaries/releases/download/${version}/void-reh-${os}-${arch}-${version}.tar.gz"
}
}
},
diff --git a/extensions/open-remote-wsl/src/serverSetup.ts b/extensions/open-remote-wsl/src/serverSetup.ts
index 2f56862cfbb..e33a456df1c 100644
--- a/extensions/open-remote-wsl/src/serverSetup.ts
+++ b/extensions/open-remote-wsl/src/serverSetup.ts
@@ -39,7 +39,7 @@ export class ServerInstallError extends Error {
}
}
-const DEFAULT_DOWNLOAD_URL_TEMPLATE = 'https://github.com/voideditor/binaries/releases/download/${version}/void-reh-${os}-${arch}-${version}.tar.gz';
+const DEFAULT_DOWNLOAD_URL_TEMPLATE = 'https://github.com/orcest-ai/Orcide-binaries/releases/download/${version}/void-reh-${os}-${arch}-${version}.tar.gz';
export async function installCodeServer(wslManager: WSLManager, distroName: string, serverDownloadUrlTemplate: string | undefined, extensionIds: string[], envVariables: string[], logger: Log): Promise {
const scriptId = crypto.randomBytes(12).toString('hex');
diff --git a/void_icons/code.ico b/orcide_icons/code.ico
similarity index 100%
rename from void_icons/code.ico
rename to orcide_icons/code.ico
diff --git a/void_icons/cubecircled.png b/orcide_icons/cubecircled.png
similarity index 100%
rename from void_icons/cubecircled.png
rename to orcide_icons/cubecircled.png
diff --git a/void_icons/logo_cube_noshadow.png b/orcide_icons/logo_cube_noshadow.png
similarity index 100%
rename from void_icons/logo_cube_noshadow.png
rename to orcide_icons/logo_cube_noshadow.png
diff --git a/void_icons/slice_of_void.png b/orcide_icons/slice_of_void.png
similarity index 100%
rename from void_icons/slice_of_void.png
rename to orcide_icons/slice_of_void.png
diff --git a/package.json b/package.json
index e6341c0903b..2fa4ba13db8 100644
--- a/package.json
+++ b/package.json
@@ -1,17 +1,17 @@
{
- "name": "code-oss-dev",
- "version": "1.99.3",
+ "name": "orcide",
+ "version": "2.0.0",
"distro": "21c8d8ea1e46d97c5639a7cabda6c0e063cc8dd5",
"author": {
- "name": "Microsoft Corporation"
+ "name": "Orcest AI"
},
"license": "MIT",
"main": "./out/main.js",
"type": "module",
"private": true,
"scripts": {
- "buildreact": "cd ./src/vs/workbench/contrib/void/browser/react/ && node build.js && cd ../../../../../../../",
- "watchreact": "cd ./src/vs/workbench/contrib/void/browser/react/ && node build.js --watch && cd ../../../../../../../",
+ "buildreact": "cd ./src/vs/workbench/contrib/orcide/browser/react/ && node build.js && cd ../../../../../../../",
+ "watchreact": "cd ./src/vs/workbench/contrib/orcide/browser/react/ && node build.js --watch && cd ../../../../../../../",
"watchreactd": "deemon npm run watchreact",
"test": "echo Please run any of the test scripts from the scripts folder.",
"test-browser": "npx playwright install && node test/unit/browser/index.js",
@@ -263,10 +263,10 @@
},
"repository": {
"type": "git",
- "url": "https://github.com/microsoft/vscode.git"
+ "url": "https://github.com/orcest-ai/Orcide.git"
},
"bugs": {
- "url": "https://github.com/microsoft/vscode/issues"
+ "url": "https://github.com/orcest-ai/Orcide/issues"
},
"optionalDependencies": {
"windows-foreground-love": "0.5.0"
diff --git a/product.json b/product.json
index b939424b68c..1788d4824cd 100644
--- a/product.json
+++ b/product.json
@@ -1,46 +1,74 @@
{
- "nameShort": "Void",
- "nameLong": "Void",
- "voidVersion": "1.4.9",
- "voidRelease": "0044",
- "applicationName": "void",
- "dataFolderName": ".void-editor",
- "win32MutexName": "voideditor",
+ "nameShort": "Orcide",
+ "nameLong": "Orcide",
+ "orcideVersion": "2.0.0",
+ "orcideRelease": "0001",
+ "applicationName": "orcide",
+ "dataFolderName": ".orcide",
+ "win32MutexName": "orcide",
"licenseName": "MIT",
- "licenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt",
- "serverLicenseUrl": "https://github.com/voideditor/void/blob/main/LICENSE.txt",
+ "licenseUrl": "https://github.com/orcest-ai/Orcide/blob/main/LICENSE.txt",
+ "serverLicenseUrl": "https://github.com/orcest-ai/Orcide/blob/main/LICENSE.txt",
"serverGreeting": [],
"serverLicense": [],
"serverLicensePrompt": "",
- "serverApplicationName": "void-server",
- "serverDataFolderName": ".void-server",
- "tunnelApplicationName": "void-tunnel",
- "win32DirName": "Void",
- "win32NameVersion": "Void",
- "win32RegValueName": "VoidEditor",
+ "serverApplicationName": "orcide-server",
+ "serverDataFolderName": ".orcide-server",
+ "tunnelApplicationName": "orcide-tunnel",
+ "win32DirName": "Orcide",
+ "win32NameVersion": "Orcide",
+ "win32RegValueName": "Orcide",
"win32x64AppId": "{{9D394D01-1728-45A7-B997-A6C82C5452C3}",
"win32arm64AppId": "{{0668DD58-2BDE-4101-8CDA-40252DF8875D}",
"win32x64UserAppId": "{{8BED5DC1-6C55-46E6-9FE6-18F7E6F7C7F1}",
"win32arm64UserAppId": "{{F6C87466-BC82-4A8F-B0FF-18CA366BA4D8}",
- "win32AppUserModelId": "Void.Editor",
- "win32ShellNameShort": "V&oid",
- "win32TunnelServiceMutex": "void-tunnelservice",
- "win32TunnelMutex": "void-tunnel",
- "darwinBundleIdentifier": "com.voideditor.code",
- "linuxIconName": "void-editor",
+ "win32AppUserModelId": "Orcide.Editor",
+ "win32ShellNameShort": "O&rcide",
+ "win32TunnelServiceMutex": "orcide-tunnelservice",
+ "win32TunnelMutex": "orcide-tunnel",
+ "darwinBundleIdentifier": "com.orcide.code",
+ "linuxIconName": "orcide",
"licenseFileName": "LICENSE.txt",
- "reportIssueUrl": "https://github.com/voideditor/void/issues/new",
+ "reportIssueUrl": "https://github.com/orcest-ai/Orcide/issues/new",
"nodejsRepository": "https://nodejs.org",
- "urlProtocol": "void",
+ "urlProtocol": "orcide",
+ "ssoProvider": {
+ "issuer": "https://login.orcest.ai",
+ "clientId": "orcide",
+ "redirectUri": "https://ide.orcest.ai/auth/callback",
+ "scopes": ["openid", "profile", "email"],
+ "authorizationEndpoint": "https://login.orcest.ai/oauth2/authorize",
+ "tokenEndpoint": "https://login.orcest.ai/oauth2/token",
+ "userInfoEndpoint": "https://login.orcest.ai/oauth2/userinfo",
+ "jwksUri": "https://login.orcest.ai/oauth2/jwks",
+ "logoutUrl": "https://login.orcest.ai/logout"
+ },
+ "defaultApiProvider": {
+ "name": "rainymodel",
+ "endpoint": "https://rm.orcest.ai/v1",
+ "displayName": "RainyModel"
+ },
+ "orcestApis": {
+ "rainymodel": "https://rm.orcest.ai",
+ "lamino": "https://llm.orcest.ai",
+ "maestrist": "https://agent.orcest.ai",
+ "ollamafreeapi": "https://ollamafreeapi.orcest.ai"
+ },
"extensionsGallery": {
"serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery",
"itemUrl": "https://marketplace.visualstudio.com/items"
},
"builtInExtensions": [],
"linkProtectionTrustedDomains": [
- "https://voideditor.com",
- "https://voideditor.dev",
- "https://github.com/voideditor/void",
+ "https://orcest.ai",
+ "https://login.orcest.ai",
+ "https://ide.orcest.ai",
+ "https://rm.orcest.ai",
+ "https://llm.orcest.ai",
+ "https://agent.orcest.ai",
+ "https://ollamafreeapi.orcest.ai",
+ "https://orcide.dev",
+ "https://github.com/orcest-ai/Orcide",
"https://ollama.com"
]
}
diff --git a/scripts/appimage/void-url-handler.desktop b/scripts/appimage/orcide-url-handler.desktop
similarity index 60%
rename from scripts/appimage/void-url-handler.desktop
rename to scripts/appimage/orcide-url-handler.desktop
index 948a823b6a6..f694fced895 100644
--- a/scripts/appimage/void-url-handler.desktop
+++ b/scripts/appimage/orcide-url-handler.desktop
@@ -1,12 +1,12 @@
[Desktop Entry]
-Name=Void - URL Handler
+Name=Orcide - URL Handler
Comment=Open source AI code editor.
GenericName=Text Editor
-Exec=void --open-url %U
-Icon=void
+Exec=orcide --open-url %U
+Icon=orcide
Type=Application
NoDisplay=true
StartupNotify=true
Categories=Utility;TextEditor;Development;IDE;
-MimeType=x-scheme-handler/void;
-Keywords=void;
+MimeType=x-scheme-handler/orcide;
+Keywords=orcide;
diff --git a/scripts/appimage/void.desktop b/scripts/appimage/orcide.desktop
similarity index 76%
rename from scripts/appimage/void.desktop
rename to scripts/appimage/orcide.desktop
index 0ccbce43f51..36bb77d25db 100755
--- a/scripts/appimage/void.desktop
+++ b/scripts/appimage/orcide.desktop
@@ -1,15 +1,15 @@
[Desktop Entry]
-Name=Void
+Name=Orcide
Comment=Open source AI code editor.
GenericName=Text Editor
-Exec=void %F
-Icon=void
+Exec=orcide %F
+Icon=orcide
Type=Application
StartupNotify=false
-StartupWMClass=Void
+StartupWMClass=Orcide
Categories=TextEditor;Development;IDE;
-MimeType=application/x-void-workspace;
-Keywords=void;
+MimeType=application/x-orcide-workspace;
+Keywords=orcide;
Actions=new-empty-window;
[Desktop Action new-empty-window]
@@ -23,5 +23,5 @@ Name[ko]=새 빈 창
Name[ru]=Новое пустое окно
Name[zh_CN]=新建空窗口
Name[zh_TW]=開新空視窗
-Exec=void --new-window %F
-Icon=void
+Exec=orcide --new-window %F
+Icon=orcide
diff --git a/scripts/appimage/void.png b/scripts/appimage/orcide.png
similarity index 100%
rename from scripts/appimage/void.png
rename to scripts/appimage/orcide.png
diff --git a/scripts/appimage/readme.md b/scripts/appimage/readme.md
index f31301a6d9e..fb19f3b805e 100644
--- a/scripts/appimage/readme.md
+++ b/scripts/appimage/readme.md
@@ -7,13 +7,13 @@ This is a community-made AppImage creation script.
There are some reported bugs with it.
To generate an AppImage yourself, feel free to look at
-stable-linux.yml in the separate `void-builder/` repo,
+stable-linux.yml in the separate `orcide-builder/` repo,
which runs a GitHub Action that builds the AppImage you see on our website.
-# Void AppImage Creation Script
+# Orcide AppImage Creation Script
-This script automates the process of creating an AppImage for the Void Editor using Docker. It works on macOS and Linux platforms.
+This script automates the process of creating an AppImage for the Orcide Editor using Docker. It works on macOS and Linux platforms.
## Requirements
* **Docker:** The script relies on Docker to build the AppImage inside a container.
@@ -87,8 +87,8 @@ These dependencies are installed within the Docker container (Ubuntu 20.04 base)
Copy the following files to the directory where the app binary is being bundled (created during the build process):
* `create_appimage.sh`
- * `void.desktop`
- * `void.png`
+ * `orcide.desktop`
+ * `orcide.png`
4. **Run the Script:**
@@ -98,7 +98,7 @@ These dependencies are installed within the Docker container (Ubuntu 20.04 base)
5. **Result:**
- After the script completes, it will generate an AppImage named `Void-x86_64.AppImage` (or similar, depending on your architecture) in the current directory.
+ After the script completes, it will generate an AppImage named `Orcide-x86_64.AppImage` (or similar, depending on your architecture) in the current directory.
## Script Overview
@@ -109,9 +109,9 @@ These dependencies are installed within the Docker container (Ubuntu 20.04 base)
* **Dockerfile Creation:** Creates a temporary `Dockerfile.build` for the Ubuntu-based environment.
* **Docker Image Build:** Builds a Docker image and runs the build process.
* **AppImage Creation:**
- * Creates the `VoidApp.AppDir` structure.
+ * Creates the `OrcideApp.AppDir` structure.
* Copies binaries, resources, and the `.desktop` entry.
- * Copies `void.desktop` and `void.png`.
+ * Copies `orcide.desktop` and `orcide.png`.
* Strips unnecessary symbols from the binary.
* Runs `appimagetool` to generate the AppImage.
* **Cleanup:** Removes the temporary `Dockerfile.build`.
diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts
index c3d2dfe5461..177fc7481a2 100644
--- a/src/vs/code/electron-main/app.ts
+++ b/src/vs/code/electron-main/app.ts
@@ -125,14 +125,14 @@ import ErrorTelemetry from '../../platform/telemetry/electron-main/errorTelemetr
// in theory this is not allowed
// ignore the eslint errors below
-import { IMetricsService } from '../../workbench/contrib/void/common/metricsService.js';
-import { IVoidUpdateService } from '../../workbench/contrib/void/common/voidUpdateService.js';
-import { MetricsMainService } from '../../workbench/contrib/void/electron-main/metricsMainService.js';
-import { VoidMainUpdateService } from '../../workbench/contrib/void/electron-main/voidUpdateMainService.js';
-import { LLMMessageChannel } from '../../workbench/contrib/void/electron-main/sendLLMMessageChannel.js';
-import { VoidSCMService } from '../../workbench/contrib/void/electron-main/voidSCMMainService.js';
-import { IVoidSCMService } from '../../workbench/contrib/void/common/voidSCMTypes.js';
-import { MCPChannel } from '../../workbench/contrib/void/electron-main/mcpChannel.js';
+import { IMetricsService } from '../../workbench/contrib/orcide/common/metricsService.js';
+import { IOrcideUpdateService } from '../../workbench/contrib/orcide/common/orcideUpdateService.js';
+import { MetricsMainService } from '../../workbench/contrib/orcide/electron-main/metricsMainService.js';
+import { OrcideMainUpdateService } from '../../workbench/contrib/orcide/electron-main/orcideUpdateMainService.js';
+import { LLMMessageChannel } from '../../workbench/contrib/orcide/electron-main/sendLLMMessageChannel.js';
+import { OrcideSCMService } from '../../workbench/contrib/orcide/electron-main/orcideSCMMainService.js';
+import { IOrcideSCMService } from '../../workbench/contrib/orcide/common/orcideSCMTypes.js';
+import { MCPChannel } from '../../workbench/contrib/orcide/electron-main/mcpChannel.js';
/**
* The main VS Code application. There will only ever be one instance,
* even if the user starts many instances (e.g. from the command line).
@@ -1103,8 +1103,8 @@ export class CodeApplication extends Disposable {
// Void main process services (required for services with a channel for comm between browser and electron-main (node))
services.set(IMetricsService, new SyncDescriptor(MetricsMainService, undefined, false));
- services.set(IVoidUpdateService, new SyncDescriptor(VoidMainUpdateService, undefined, false));
- services.set(IVoidSCMService, new SyncDescriptor(VoidSCMService, undefined, false));
+ services.set(IOrcideUpdateService, new SyncDescriptor(OrcideMainUpdateService, undefined, false));
+ services.set(IOrcideSCMService, new SyncDescriptor(OrcideSCMService, undefined, false));
// Default Extensions Profile Init
services.set(IExtensionsProfileScannerService, new SyncDescriptor(ExtensionsProfileScannerService, undefined, true));
@@ -1238,21 +1238,21 @@ export class CodeApplication extends Disposable {
// Void - use loggerChannel as reference
const metricsChannel = ProxyChannel.fromService(accessor.get(IMetricsService), disposables);
- mainProcessElectronServer.registerChannel('void-channel-metrics', metricsChannel);
+ mainProcessElectronServer.registerChannel('orcide-channel-metrics', metricsChannel);
- const voidUpdatesChannel = ProxyChannel.fromService(accessor.get(IVoidUpdateService), disposables);
- mainProcessElectronServer.registerChannel('void-channel-update', voidUpdatesChannel);
+ const orcideUpdatesChannel = ProxyChannel.fromService(accessor.get(IOrcideUpdateService), disposables);
+ mainProcessElectronServer.registerChannel('orcide-channel-update', orcideUpdatesChannel);
const sendLLMMessageChannel = new LLMMessageChannel(accessor.get(IMetricsService));
- mainProcessElectronServer.registerChannel('void-channel-llmMessage', sendLLMMessageChannel);
+ mainProcessElectronServer.registerChannel('orcide-channel-llmMessage', sendLLMMessageChannel);
// Void added this
- const voidSCMChannel = ProxyChannel.fromService(accessor.get(IVoidSCMService), disposables);
- mainProcessElectronServer.registerChannel('void-channel-scm', voidSCMChannel);
+ const orcideSCMChannel = ProxyChannel.fromService(accessor.get(IOrcideSCMService), disposables);
+ mainProcessElectronServer.registerChannel('orcide-channel-scm', orcideSCMChannel);
// Void added this
const mcpChannel = new MCPChannel();
- mainProcessElectronServer.registerChannel('void-channel-mcp', mcpChannel);
+ mainProcessElectronServer.registerChannel('orcide-channel-mcp', mcpChannel);
// Extension Host Debug Broadcasting
const electronExtensionHostDebugBroadcastChannel = new ElectronExtensionHostDebugBroadcastChannel(accessor.get(IWindowsMainService));
diff --git a/src/vs/platform/keybinding/common/keybindingsRegistry.ts b/src/vs/platform/keybinding/common/keybindingsRegistry.ts
index e83230ae2db..825bdb4b90e 100644
--- a/src/vs/platform/keybinding/common/keybindingsRegistry.ts
+++ b/src/vs/platform/keybinding/common/keybindingsRegistry.ts
@@ -65,7 +65,7 @@ export const enum KeybindingWeight {
WorkbenchContrib = 200,
BuiltinExtension = 300,
ExternalExtension = 400,
- VoidExtension = 605, // Void - must trump any external extension
+ OrcideExtension = 605, // Orcide - must trump any external extension
}
export interface ICommandAndKeybindingRule extends IKeybindingRule {
diff --git a/src/vs/server/node/webClientServer.ts b/src/vs/server/node/webClientServer.ts
index e36113b4bfe..807854829cb 100644
--- a/src/vs/server/node/webClientServer.ts
+++ b/src/vs/server/node/webClientServer.ts
@@ -298,6 +298,9 @@ export class WebClientServer {
remoteAuthority = replacePort(remoteAuthority, forwardedPort);
}
+ const forwardedProto = getFirstHeader('x-forwarded-proto');
+ const remoteScheme: 'http' | 'https' = forwardedProto === 'https' ? 'https' : 'http';
+
function asJSON(value: unknown): string {
return JSON.stringify(value).replace(/"/g, '"');
}
@@ -338,7 +341,7 @@ export class WebClientServer {
extensionsGallery: this._webExtensionResourceUrlTemplate && this._productService.extensionsGallery ? {
...this._productService.extensionsGallery,
resourceUrlTemplate: this._webExtensionResourceUrlTemplate.with({
- scheme: 'http',
+ scheme: remoteScheme,
authority: remoteAuthority,
path: `${webExtensionRoute}/${this._webExtensionResourceUrlTemplate.authority}${this._webExtensionResourceUrlTemplate.path}`
}).toString(true)
@@ -415,10 +418,11 @@ export class WebClientServer {
const webWorkerExtensionHostIframeScriptSHA = 'sha256-2Q+j4hfT09+1+imS46J2YlkCtHWQt0/BE79PXjJ0ZJ8=';
const cspDirectives = [
+ ...(remoteScheme === 'https' ? ['upgrade-insecure-requests;'] : []),
'default-src \'self\';',
'img-src \'self\' https: data: blob:;',
'media-src \'self\';',
- `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} blob: 'nonce-1nline-m4p' ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' 'sha256-/r7rqQ+yrxt57sxLuQ6AMYcy/lUpvAIzHjIJt/OeLWU=' ${useTestResolver ? '' : `http://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html
+ `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} blob: 'nonce-1nline-m4p' ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' 'sha256-/r7rqQ+yrxt57sxLuQ6AMYcy/lUpvAIzHjIJt/OeLWU=' ${useTestResolver ? '' : `${remoteScheme}://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html
'child-src \'self\';',
`frame-src 'self' https://*.vscode-cdn.net data:;`,
'worker-src \'self\' data: blob:;',
diff --git a/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts b/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts
index 120223e43c1..3f29ee88fa9 100644
--- a/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts
+++ b/src/vs/workbench/browser/parts/editor/editorGroupWatermark.ts
@@ -25,7 +25,7 @@ import { splitRecentLabel } from '../../../../base/common/labels.js';
import { IViewsService } from '../../../services/views/common/viewsService.js';
/* eslint-disable */ // Void
-import { VOID_CTRL_K_ACTION_ID, VOID_CTRL_L_ACTION_ID } from '../../../contrib/void/browser/actionIDs.js';
+import { ORCIDE_CTRL_K_ACTION_ID, ORCIDE_CTRL_L_ACTION_ID } from '../../../contrib/orcide/browser/actionIDs.js';
import { VIEWLET_ID as REMOTE_EXPLORER_VIEWLET_ID } from '../../../contrib/remote/browser/remoteExplorer.js';
/* eslint-enable */
@@ -284,7 +284,7 @@ export class EditorGroupWatermark extends Disposable {
else {
// show them Void keybindings
- const keys = this.keybindingService.lookupKeybinding(VOID_CTRL_L_ACTION_ID);
+ const keys = this.keybindingService.lookupKeybinding(ORCIDE_CTRL_L_ACTION_ID);
const dl = append(voidIconBox, $('dl'));
const dt = append(dl, $('dt'));
dt.textContent = 'Chat'
@@ -295,7 +295,7 @@ export class EditorGroupWatermark extends Disposable {
this.currentDisposables.add(label);
- const keys2 = this.keybindingService.lookupKeybinding(VOID_CTRL_K_ACTION_ID);
+ const keys2 = this.keybindingService.lookupKeybinding(ORCIDE_CTRL_K_ACTION_ID);
const dl2 = append(voidIconBox, $('dl'));
const dt2 = append(dl2, $('dt'));
dt2.textContent = 'Quick Edit'
diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts
index 38a342c58b4..6235af85344 100644
--- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts
+++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts
@@ -27,7 +27,7 @@ import { ThemeIcon } from '../../../../base/common/themables.js';
import { IExplorerService } from './files.js';
import { Codicon } from '../../../../base/common/codicons.js';
import { Categories } from '../../../../platform/action/common/actionCommonCategories.js';
-import { VOID_OPEN_SETTINGS_ACTION_ID } from '../../void/browser/voidSettingsPane.js';
+import { ORCIDE_OPEN_SETTINGS_ACTION_ID } from '../../orcide/browser/orcideSettingsPane.js';
// Contribute Global Actions
@@ -681,7 +681,7 @@ for (const menuId of [MenuId.EmptyEditorGroupContext, MenuId.EditorTabsBarContex
MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, {
group: '0_void',
command: {
- id: VOID_OPEN_SETTINGS_ACTION_ID,
+ id: ORCIDE_OPEN_SETTINGS_ACTION_ID,
title: nls.localize({ key: 'openVoid', comment: ['&& denotes a mnemonic'] }, "&&Open Void Settings"),
},
order: 1
diff --git a/src/vs/workbench/contrib/void/browser/_dummyContrib.ts b/src/vs/workbench/contrib/orcide/browser/_dummyContrib.ts
similarity index 87%
rename from src/vs/workbench/contrib/void/browser/_dummyContrib.ts
rename to src/vs/workbench/contrib/orcide/browser/_dummyContrib.ts
index 88dbc6c1d10..2fe593117dc 100644
--- a/src/vs/workbench/contrib/void/browser/_dummyContrib.ts
+++ b/src/vs/workbench/contrib/orcide/browser/_dummyContrib.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { KeyCode, KeyMod } from '../../../../base/common/keyCodes.js';
@@ -29,11 +29,11 @@ registerAction2(class extends Action2 {
constructor() {
super({
f1: true,
- id: 'void.dummy',
+ id: 'orcide.dummy',
title: localize2('dummy', 'dummy: Init'),
keybinding: {
primary: KeyMod.CtrlCmd | KeyCode.Digit0,
- weight: KeybindingWeight.VoidExtension,
+ weight: KeybindingWeight.OrcideExtension,
}
});
}
@@ -45,7 +45,7 @@ registerAction2(class extends Action2 {
class DummyService extends Disposable implements IWorkbenchContribution, IDummyService {
- static readonly ID = 'workbench.contrib.void.dummy' // workbenchContributions need this, services do not
+ static readonly ID = 'workbench.contrib.orcide.dummy' // workbenchContributions need this, services do not
_serviceBrand: undefined;
constructor(
diff --git a/src/vs/workbench/contrib/void/browser/_markerCheckService.ts b/src/vs/workbench/contrib/orcide/browser/_markerCheckService.ts
similarity index 96%
rename from src/vs/workbench/contrib/void/browser/_markerCheckService.ts
rename to src/vs/workbench/contrib/orcide/browser/_markerCheckService.ts
index be1ca0074bf..3b3571e9fd4 100644
--- a/src/vs/workbench/contrib/void/browser/_markerCheckService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/_markerCheckService.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { Disposable } from '../../../../base/common/lifecycle.js';
diff --git a/src/vs/workbench/contrib/orcide/browser/actionIDs.ts b/src/vs/workbench/contrib/orcide/browser/actionIDs.ts
new file mode 100644
index 00000000000..367d37aa1aa
--- /dev/null
+++ b/src/vs/workbench/contrib/orcide/browser/actionIDs.ts
@@ -0,0 +1,26 @@
+// Normally you'd want to put these exports in the files that register them, but if you do that you'll get an import order error if you import them in certain cases.
+// (importing them runs the whole file to get the ID, causing an import error). I guess it's best practice to separate out IDs, pretty annoying...
+
+export const ORCIDE_CTRL_L_ACTION_ID = 'orcide.ctrlLAction'
+
+export const ORCIDE_CTRL_K_ACTION_ID = 'orcide.ctrlKAction'
+
+export const ORCIDE_ACCEPT_DIFF_ACTION_ID = 'orcide.acceptDiff'
+
+export const ORCIDE_REJECT_DIFF_ACTION_ID = 'orcide.rejectDiff'
+
+export const ORCIDE_GOTO_NEXT_DIFF_ACTION_ID = 'orcide.goToNextDiff'
+
+export const ORCIDE_GOTO_PREV_DIFF_ACTION_ID = 'orcide.goToPrevDiff'
+
+export const ORCIDE_GOTO_NEXT_URI_ACTION_ID = 'orcide.goToNextUri'
+
+export const ORCIDE_GOTO_PREV_URI_ACTION_ID = 'orcide.goToPrevUri'
+
+export const ORCIDE_ACCEPT_FILE_ACTION_ID = 'orcide.acceptFile'
+
+export const ORCIDE_REJECT_FILE_ACTION_ID = 'orcide.rejectFile'
+
+export const ORCIDE_ACCEPT_ALL_DIFFS_ACTION_ID = 'orcide.acceptAllDiffs'
+
+export const ORCIDE_REJECT_ALL_DIFFS_ACTION_ID = 'orcide.rejectAllDiffs'
diff --git a/src/vs/workbench/contrib/void/browser/aiRegexService.ts b/src/vs/workbench/contrib/orcide/browser/aiRegexService.ts
similarity index 94%
rename from src/vs/workbench/contrib/void/browser/aiRegexService.ts
rename to src/vs/workbench/contrib/orcide/browser/aiRegexService.ts
index b0d02024018..0c686acfb93 100644
--- a/src/vs/workbench/contrib/void/browser/aiRegexService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/aiRegexService.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
// 1. search(ai)
diff --git a/src/vs/workbench/contrib/void/browser/autocompleteService.ts b/src/vs/workbench/contrib/orcide/browser/autocompleteService.ts
similarity index 98%
rename from src/vs/workbench/contrib/void/browser/autocompleteService.ts
rename to src/vs/workbench/contrib/orcide/browser/autocompleteService.ts
index 22c86eb6afc..c3862bd1d33 100644
--- a/src/vs/workbench/contrib/void/browser/autocompleteService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/autocompleteService.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { Disposable } from '../../../../base/common/lifecycle.js';
@@ -18,8 +18,8 @@ import { extractCodeFromRegular } from '../common/helpers/extractCodeFromResult.
import { registerWorkbenchContribution2, WorkbenchPhase } from '../../../common/contributions.js';
import { ILLMMessageService } from '../common/sendLLMMessageService.js';
import { isWindows } from '../../../../base/common/platform.js';
-import { IVoidSettingsService } from '../common/voidSettingsService.js';
-import { FeatureName } from '../common/voidSettingsTypes.js';
+import { IOrcideSettingsService } from '../common/orcideSettingsService.js';
+import { FeatureName } from '../common/orcideSettingsTypes.js';
import { IConvertToLLMMessageService } from './convertToLLMMessageService.js';
// import { IContextGatheringService } from './contextGatheringService.js';
@@ -28,7 +28,7 @@ import { IConvertToLLMMessageService } from './convertToLLMMessageService.js';
const allLinebreakSymbols = ['\r\n', '\n']
const _ln = isWindows ? allLinebreakSymbols[0] : allLinebreakSymbols[1]
-// The extension this was called from is here - https://github.com/voideditor/void/blob/autocomplete/extensions/void/src/extension/extension.ts
+// The extension this was called from is here - https://github.com/orcest-ai/Orcide/blob/autocomplete/extensions/void/src/extension/extension.ts
/*
@@ -617,7 +617,7 @@ export const IAutocompleteService = createDecorator('Autoc
export class AutocompleteService extends Disposable implements IAutocompleteService {
- static readonly ID = 'void.autocompleteService'
+ static readonly ID = 'orcide.autocompleteService'
_serviceBrand: undefined;
@@ -893,7 +893,7 @@ export class AutocompleteService extends Disposable implements IAutocompleteServ
@ILLMMessageService private readonly _llmMessageService: ILLMMessageService,
@IEditorService private readonly _editorService: IEditorService,
@IModelService private readonly _modelService: IModelService,
- @IVoidSettingsService private readonly _settingsService: IVoidSettingsService,
+ @IOrcideSettingsService private readonly _settingsService: IOrcideSettingsService,
@IConvertToLLMMessageService private readonly _convertToLLMMessageService: IConvertToLLMMessageService
// @IContextGatheringService private readonly _contextGatheringService: IContextGatheringService,
) {
diff --git a/src/vs/workbench/contrib/void/browser/chatThreadService.ts b/src/vs/workbench/contrib/orcide/browser/chatThreadService.ts
similarity index 95%
rename from src/vs/workbench/contrib/void/browser/chatThreadService.ts
rename to src/vs/workbench/contrib/orcide/browser/chatThreadService.ts
index 30f38f10ba8..f637ce9c635 100644
--- a/src/vs/workbench/contrib/void/browser/chatThreadService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/chatThreadService.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { Disposable } from '../../../../base/common/lifecycle.js';
@@ -14,8 +14,8 @@ import { ILLMMessageService } from '../common/sendLLMMessageService.js';
import { chat_userMessageContent, isABuiltinToolName } from '../common/prompt/prompts.js';
import { AnthropicReasoning, getErrorMessage, RawToolCallObj, RawToolParamsObj } from '../common/sendLLMMessageTypes.js';
import { generateUuid } from '../../../../base/common/uuid.js';
-import { FeatureName, ModelSelection, ModelSelectionOptions } from '../common/voidSettingsTypes.js';
-import { IVoidSettingsService } from '../common/voidSettingsService.js';
+import { FeatureName, ModelSelection, ModelSelectionOptions } from '../common/orcideSettingsTypes.js';
+import { IOrcideSettingsService } from '../common/orcideSettingsService.js';
import { approvalTypeOfBuiltinToolName, BuiltinToolCallParams, ToolCallParams, ToolName, ToolResult } from '../common/toolsServiceTypes.js';
import { IToolsService } from './toolsService.js';
import { CancellationToken } from '../../../../base/common/cancellation.js';
@@ -24,10 +24,10 @@ import { ChatMessage, CheckpointEntry, CodespanLocationLink, StagingSelectionIte
import { Position } from '../../../../editor/common/core/position.js';
import { IMetricsService } from '../common/metricsService.js';
import { shorten } from '../../../../base/common/labels.js';
-import { IVoidModelService } from '../common/voidModelService.js';
+import { IOrcideModelService } from '../common/orcideModelService.js';
import { findLast, findLastIdx } from '../../../../base/common/arraysFind.js';
import { IEditCodeService } from './editCodeServiceInterface.js';
-import { VoidFileSnapshot } from '../common/editCodeServiceTypes.js';
+import { OrcideFileSnapshot } from '../common/editCodeServiceTypes.js';
import { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';
import { truncate } from '../../../../base/common/strings.js';
import { THREAD_STORAGE_KEY } from '../common/storageKeys.js';
@@ -314,10 +314,10 @@ class ChatThreadService extends Disposable implements IChatThreadService {
constructor(
@IStorageService private readonly _storageService: IStorageService,
- @IVoidModelService private readonly _voidModelService: IVoidModelService,
+ @IOrcideModelService private readonly _orcideModelService: IOrcideModelService,
@ILLMMessageService private readonly _llmMessageService: ILLMMessageService,
@IToolsService private readonly _toolsService: IToolsService,
- @IVoidSettingsService private readonly _settingsService: IVoidSettingsService,
+ @IOrcideSettingsService private readonly _settingsService: IOrcideSettingsService,
@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,
@IMetricsService private readonly _metricsService: IMetricsService,
@IEditCodeService private readonly _editCodeService: IEditCodeService,
@@ -443,11 +443,11 @@ class ChatThreadService extends Disposable implements IChatThreadService {
// set streamState
const messages = newState.allThreads[threadId]?.messages
const lastMessage = messages && messages[messages.length - 1]
- // if awaiting user but stream state doesn't indicate it (happens if restart Void)
+ // if awaiting user but stream state doesn't indicate it (happens if restart Orcide)
if (lastMessage && lastMessage.role === 'tool' && lastMessage.type === 'tool_request')
this._setStreamState(threadId, { isRunning: 'awaiting_user', })
- // if running now but stream state doesn't indicate it (happens if restart Void), cancel that last tool
+ // if running now but stream state doesn't indicate it (happens if restart Orcide), cancel that last tool
if (lastMessage && lastMessage.role === 'tool' && lastMessage.type === 'running_now') {
this._updateLatestTool(threadId, { role: 'tool', type: 'rejected', content: lastMessage.content, id: lastMessage.id, rawParams: lastMessage.rawParams, result: null, name: lastMessage.name, params: lastMessage.params, mcpServerName: lastMessage.mcpServerName })
@@ -945,11 +945,11 @@ class ChatThreadService extends Disposable implements IChatThreadService {
private _getCheckpointInfo = (checkpointMessage: ChatMessage & { role: 'checkpoint' }, fsPath: string, opts: { includeUserModifiedChanges: boolean }) => {
- const voidFileSnapshot = checkpointMessage.voidFileSnapshotOfURI ? checkpointMessage.voidFileSnapshotOfURI[fsPath] ?? null : null
- if (!opts.includeUserModifiedChanges) { return { voidFileSnapshot, } }
+ const orcideFileSnapshot = checkpointMessage.orcideFileSnapshotOfURI ? checkpointMessage.orcideFileSnapshotOfURI[fsPath] ?? null : null
+ if (!opts.includeUserModifiedChanges) { return { orcideFileSnapshot, } }
- const userModifiedVoidFileSnapshot = fsPath in checkpointMessage.userModifications.voidFileSnapshotOfURI ? checkpointMessage.userModifications.voidFileSnapshotOfURI[fsPath] ?? null : null
- return { voidFileSnapshot: userModifiedVoidFileSnapshot ?? voidFileSnapshot, }
+ const userModifiedOrcideFileSnapshot = fsPath in checkpointMessage.userModifications.orcideFileSnapshotOfURI ? checkpointMessage.userModifications.orcideFileSnapshotOfURI[fsPath] ?? null : null
+ return { orcideFileSnapshot: userModifiedOrcideFileSnapshot ?? orcideFileSnapshot, }
}
private _computeNewCheckpointInfo({ threadId }: { threadId: string }) {
@@ -959,59 +959,59 @@ class ChatThreadService extends Disposable implements IChatThreadService {
const lastCheckpointIdx = findLastIdx(thread.messages, (m) => m.role === 'checkpoint') ?? -1
if (lastCheckpointIdx === -1) return
- const voidFileSnapshotOfURI: { [fsPath: string]: VoidFileSnapshot | undefined } = {}
+ const orcideFileSnapshotOfURI: { [fsPath: string]: OrcideFileSnapshot | undefined } = {}
// add a change for all the URIs in the checkpoint history
const { lastIdxOfURI } = this._getCheckpointsBetween({ threadId, loIdx: 0, hiIdx: lastCheckpointIdx, }) ?? {}
for (const fsPath in lastIdxOfURI ?? {}) {
- const { model } = this._voidModelService.getModelFromFsPath(fsPath)
+ const { model } = this._orcideModelService.getModelFromFsPath(fsPath)
if (!model) continue
const checkpoint2 = thread.messages[lastIdxOfURI[fsPath]] || null
if (!checkpoint2) continue
if (checkpoint2.role !== 'checkpoint') continue
const res = this._getCheckpointInfo(checkpoint2, fsPath, { includeUserModifiedChanges: false })
if (!res) continue
- const { voidFileSnapshot: oldVoidFileSnapshot } = res
+ const { orcideFileSnapshot: oldOrcideFileSnapshot } = res
// if there was any change to the str or diffAreaSnapshot, update. rough approximation of equality, oldDiffAreasSnapshot === diffAreasSnapshot is not perfect
- const voidFileSnapshot = this._editCodeService.getVoidFileSnapshot(URI.file(fsPath))
- if (oldVoidFileSnapshot === voidFileSnapshot) continue
- voidFileSnapshotOfURI[fsPath] = voidFileSnapshot
+ const orcideFileSnapshot = this._editCodeService.getOrcideFileSnapshot(URI.file(fsPath))
+ if (oldOrcideFileSnapshot === orcideFileSnapshot) continue
+ orcideFileSnapshotOfURI[fsPath] = orcideFileSnapshot
}
// // add a change for all user-edited files (that aren't in the history)
// for (const fsPath of this._userModifiedFilesToCheckInCheckpoints.keys()) {
// if (fsPath in lastIdxOfURI) continue // if already visisted, don't visit again
- // const { model } = this._voidModelService.getModelFromFsPath(fsPath)
+ // const { model } = this._orcideModelService.getModelFromFsPath(fsPath)
// if (!model) continue
// currStrOfFsPath[fsPath] = model.getValue(EndOfLinePreference.LF)
// }
- return { voidFileSnapshotOfURI }
+ return { orcideFileSnapshotOfURI }
}
private _addUserCheckpoint({ threadId }: { threadId: string }) {
- const { voidFileSnapshotOfURI } = this._computeNewCheckpointInfo({ threadId }) ?? {}
+ const { orcideFileSnapshotOfURI } = this._computeNewCheckpointInfo({ threadId }) ?? {}
this._addCheckpoint(threadId, {
role: 'checkpoint',
type: 'user_edit',
- voidFileSnapshotOfURI: voidFileSnapshotOfURI ?? {},
- userModifications: { voidFileSnapshotOfURI: {}, },
+ orcideFileSnapshotOfURI: orcideFileSnapshotOfURI ?? {},
+ userModifications: { orcideFileSnapshotOfURI: {}, },
})
}
// call this right after LLM edits a file
private _addToolEditCheckpoint({ threadId, uri, }: { threadId: string, uri: URI }) {
const thread = this.state.allThreads[threadId]
if (!thread) return
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
if (!model) return // should never happen
- const diffAreasSnapshot = this._editCodeService.getVoidFileSnapshot(uri)
+ const diffAreasSnapshot = this._editCodeService.getOrcideFileSnapshot(uri)
this._addCheckpoint(threadId, {
role: 'checkpoint',
type: 'tool_edit',
- voidFileSnapshotOfURI: { [uri.fsPath]: diffAreasSnapshot },
- userModifications: { voidFileSnapshotOfURI: {} },
+ orcideFileSnapshotOfURI: { [uri.fsPath]: diffAreasSnapshot },
+ userModifications: { orcideFileSnapshotOfURI: {} },
})
}
@@ -1035,7 +1035,7 @@ class ChatThreadService extends Disposable implements IChatThreadService {
for (let i = loIdx; i <= hiIdx; i += 1) {
const message = thread.messages[i]
if (message?.role !== 'checkpoint') continue
- for (const fsPath in message.voidFileSnapshotOfURI) { // do not include userModified.beforeStrOfURI here, jumping should not include those changes
+ for (const fsPath in message.orcideFileSnapshotOfURI) { // do not include userModified.beforeStrOfURI here, jumping should not include those changes
lastIdxOfURI[fsPath] = i
}
}
@@ -1055,13 +1055,13 @@ class ChatThreadService extends Disposable implements IChatThreadService {
return [checkpoint, currCheckpointIdx]
}
private _addUserModificationsToCurrCheckpoint({ threadId }: { threadId: string }) {
- const { voidFileSnapshotOfURI } = this._computeNewCheckpointInfo({ threadId }) ?? {}
+ const { orcideFileSnapshotOfURI } = this._computeNewCheckpointInfo({ threadId }) ?? {}
const res = this._readCurrentCheckpoint(threadId)
if (!res) return
const [checkpoint, checkpointIdx] = res
this._editMessageInThread(threadId, checkpointIdx, {
...checkpoint,
- userModifications: { voidFileSnapshotOfURI: voidFileSnapshotOfURI ?? {}, },
+ userModifications: { orcideFileSnapshotOfURI: orcideFileSnapshotOfURI ?? {}, },
})
}
@@ -1139,9 +1139,9 @@ We only need to do it for files that were edited since `to`, ie files between to
if (message.role !== 'checkpoint') continue
const res = this._getCheckpointInfo(message, fsPath, { includeUserModifiedChanges: jumpToUserModified })
if (!res) continue
- const { voidFileSnapshot } = res
- if (!voidFileSnapshot) continue
- this._editCodeService.restoreVoidFileSnapshot(URI.file(fsPath), voidFileSnapshot)
+ const { orcideFileSnapshot } = res
+ if (!orcideFileSnapshot) continue
+ this._editCodeService.restoreOrcideFileSnapshot(URI.file(fsPath), orcideFileSnapshot)
break
}
}
@@ -1173,9 +1173,9 @@ We only need to do it for files that were edited since `from`, ie files between
if (message.role !== 'checkpoint') continue
const res = this._getCheckpointInfo(message, fsPath, { includeUserModifiedChanges: jumpToUserModified })
if (!res) continue
- const { voidFileSnapshot } = res
- if (!voidFileSnapshot) continue
- this._editCodeService.restoreVoidFileSnapshot(URI.file(fsPath), voidFileSnapshot)
+ const { orcideFileSnapshot } = res
+ if (!orcideFileSnapshot) continue
+ this._editCodeService.restoreOrcideFileSnapshot(URI.file(fsPath), orcideFileSnapshot)
break
}
}
@@ -1201,7 +1201,7 @@ We only need to do it for files that were edited since `from`, ie files between
sticky: true,
actions: {
primary: [{
- id: 'void.goToChat',
+ id: 'orcide.goToChat',
enabled: true,
label: `Jump to Chat`,
tooltip: '',
@@ -1463,7 +1463,7 @@ We only need to do it for files that were edited since `from`, ie files between
// check all prevUris for the target
for (const uri of prevUris) {
- const modelRef = await this._voidModelService.getModelSafe(uri)
+ const modelRef = await this._orcideModelService.getModelSafe(uri)
const { model } = modelRef
if (!model) continue
diff --git a/src/vs/workbench/contrib/void/browser/contextGatheringService.ts b/src/vs/workbench/contrib/orcide/browser/contextGatheringService.ts
similarity index 100%
rename from src/vs/workbench/contrib/void/browser/contextGatheringService.ts
rename to src/vs/workbench/contrib/orcide/browser/contextGatheringService.ts
diff --git a/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts b/src/vs/workbench/contrib/orcide/browser/convertToLLMMessageService.ts
similarity index 94%
rename from src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts
rename to src/vs/workbench/contrib/orcide/browser/convertToLLMMessageService.ts
index 94545c0d751..817a76bf5d6 100644
--- a/src/vs/workbench/contrib/void/browser/convertToLLMMessageService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/convertToLLMMessageService.ts
@@ -9,11 +9,11 @@ import { ChatMessage } from '../common/chatThreadServiceTypes.js';
import { getIsReasoningEnabledState, getReservedOutputTokenSpace, getModelCapabilities } from '../common/modelCapabilities.js';
import { reParsedToolXMLString, chat_systemMessage } from '../common/prompt/prompts.js';
import { AnthropicLLMChatMessage, AnthropicReasoning, GeminiLLMChatMessage, LLMChatMessage, LLMFIMMessage, OpenAILLMChatMessage, RawToolParamsObj } from '../common/sendLLMMessageTypes.js';
-import { IVoidSettingsService } from '../common/voidSettingsService.js';
-import { ChatMode, FeatureName, ModelSelection, ProviderName } from '../common/voidSettingsTypes.js';
+import { IOrcideSettingsService } from '../common/orcideSettingsService.js';
+import { ChatMode, FeatureName, ModelSelection, ProviderName } from '../common/orcideSettingsTypes.js';
import { IDirectoryStrService } from '../common/directoryStrService.js';
import { ITerminalToolService } from './terminalToolService.js';
-import { IVoidModelService } from '../common/voidModelService.js';
+import { IOrcideModelService } from '../common/orcideModelService.js';
import { URI } from '../../../../base/common/uri.js';
import { EndOfLinePreference } from '../../../../editor/common/model.js';
import { ToolName } from '../common/toolsServiceTypes.js';
@@ -538,25 +538,25 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess
@IEditorService private readonly editorService: IEditorService,
@IDirectoryStrService private readonly directoryStrService: IDirectoryStrService,
@ITerminalToolService private readonly terminalToolService: ITerminalToolService,
- @IVoidSettingsService private readonly voidSettingsService: IVoidSettingsService,
- @IVoidModelService private readonly voidModelService: IVoidModelService,
+ @IOrcideSettingsService private readonly orcideSettingsService: IOrcideSettingsService,
+ @IOrcideModelService private readonly orcideModelService: IOrcideModelService,
@IMCPService private readonly mcpService: IMCPService,
) {
super()
}
// Read .voidrules files from workspace folders
- private _getVoidRulesFileContents(): string {
+ private _getOrcideRulesFileContents(): string {
try {
const workspaceFolders = this.workspaceContextService.getWorkspace().folders;
- let voidRules = '';
+ let orcideRules = '';
for (const folder of workspaceFolders) {
- const uri = URI.joinPath(folder.uri, '.voidrules')
- const { model } = this.voidModelService.getModel(uri)
+ const uri = URI.joinPath(folder.uri, '.orciderules')
+ const { model } = this.orcideModelService.getModel(uri)
if (!model) continue
- voidRules += model.getValue(EndOfLinePreference.LF) + '\n\n';
+ orcideRules += model.getValue(EndOfLinePreference.LF) + '\n\n';
}
- return voidRules.trim();
+ return orcideRules.trim();
}
catch (e) {
return ''
@@ -565,12 +565,12 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess
// Get combined AI instructions from settings and .voidrules files
private _getCombinedAIInstructions(): string {
- const globalAIInstructions = this.voidSettingsService.state.globalSettings.aiInstructions;
- const voidRulesFileContent = this._getVoidRulesFileContents();
+ const globalAIInstructions = this.orcideSettingsService.state.globalSettings.aiInstructions;
+ const orcideRulesFileContent = this._getOrcideRulesFileContents();
const ans: string[] = []
if (globalAIInstructions) ans.push(globalAIInstructions)
- if (voidRulesFileContent) ans.push(voidRulesFileContent)
+ if (orcideRulesFileContent) ans.push(orcideRulesFileContent)
return ans.join('\n\n')
}
@@ -637,7 +637,7 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess
prepareLLMSimpleMessages: IConvertToLLMMessageService['prepareLLMSimpleMessages'] = ({ simpleMessages, systemMessage, modelSelection, featureName }) => {
if (modelSelection === null) return { messages: [], separateSystemMessage: undefined }
- const { overridesOfModel } = this.voidSettingsService.state
+ const { overridesOfModel } = this.orcideSettingsService.state
const { providerName, modelName } = modelSelection
const {
@@ -646,7 +646,7 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess
supportsSystemMessage,
} = getModelCapabilities(providerName, modelName, overridesOfModel)
- const modelSelectionOptions = this.voidSettingsService.state.optionsOfModelSelection[featureName][modelSelection.providerName]?.[modelSelection.modelName]
+ const modelSelectionOptions = this.orcideSettingsService.state.optionsOfModelSelection[featureName][modelSelection.providerName]?.[modelSelection.modelName]
// Get combined AI instructions
const aiInstructions = this._getCombinedAIInstructions();
@@ -670,7 +670,7 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess
prepareLLMChatMessages: IConvertToLLMMessageService['prepareLLMChatMessages'] = async ({ chatMessages, chatMode, modelSelection }) => {
if (modelSelection === null) return { messages: [], separateSystemMessage: undefined }
- const { overridesOfModel } = this.voidSettingsService.state
+ const { overridesOfModel } = this.orcideSettingsService.state
const { providerName, modelName } = modelSelection
const {
@@ -679,11 +679,11 @@ class ConvertToLLMMessageService extends Disposable implements IConvertToLLMMess
supportsSystemMessage,
} = getModelCapabilities(providerName, modelName, overridesOfModel)
- const { disableSystemMessage } = this.voidSettingsService.state.globalSettings;
+ const { disableSystemMessage } = this.orcideSettingsService.state.globalSettings;
const fullSystemMessage = await this._generateChatMessagesSystemMessage(chatMode, specialToolFormat)
const systemMessage = disableSystemMessage ? '' : fullSystemMessage;
- const modelSelectionOptions = this.voidSettingsService.state.optionsOfModelSelection['Chat'][modelSelection.providerName]?.[modelSelection.modelName]
+ const modelSelectionOptions = this.orcideSettingsService.state.optionsOfModelSelection['Chat'][modelSelection.providerName]?.[modelSelection.modelName]
// Get combined AI instructions
const aiInstructions = this._getCombinedAIInstructions();
diff --git a/src/vs/workbench/contrib/void/browser/convertToLLMMessageWorkbenchContrib.ts b/src/vs/workbench/contrib/orcide/browser/convertToLLMMessageWorkbenchContrib.ts
similarity index 72%
rename from src/vs/workbench/contrib/void/browser/convertToLLMMessageWorkbenchContrib.ts
rename to src/vs/workbench/contrib/orcide/browser/convertToLLMMessageWorkbenchContrib.ts
index f77dde387b8..86ca5ff0268 100644
--- a/src/vs/workbench/contrib/void/browser/convertToLLMMessageWorkbenchContrib.ts
+++ b/src/vs/workbench/contrib/orcide/browser/convertToLLMMessageWorkbenchContrib.ts
@@ -1,28 +1,28 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { Disposable } from '../../../../base/common/lifecycle.js';
import { URI } from '../../../../base/common/uri.js';
import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js';
import { IWorkbenchContribution, registerWorkbenchContribution2, WorkbenchPhase } from '../../../common/contributions.js';
-import { IVoidModelService } from '../common/voidModelService.js';
+import { IOrcideModelService } from '../common/orcideModelService.js';
class ConvertContribWorkbenchContribution extends Disposable implements IWorkbenchContribution {
- static readonly ID = 'workbench.contrib.void.convertcontrib'
+ static readonly ID = 'workbench.contrib.orcide.convertcontrib'
_serviceBrand: undefined;
constructor(
- @IVoidModelService private readonly voidModelService: IVoidModelService,
+ @IOrcideModelService private readonly orcideModelService: IOrcideModelService,
@IWorkspaceContextService private readonly workspaceContext: IWorkspaceContextService,
) {
super()
const initializeURI = (uri: URI) => {
this.workspaceContext.getWorkspace()
- const voidRulesURI = URI.joinPath(uri, '.voidrules')
- this.voidModelService.initializeModel(voidRulesURI)
+ const orcideRulesURI = URI.joinPath(uri, '.orciderules')
+ this.orcideModelService.initializeModel(orcideRulesURI)
}
// call
diff --git a/src/vs/workbench/contrib/void/browser/editCodeService.ts b/src/vs/workbench/contrib/orcide/browser/editCodeService.ts
similarity index 95%
rename from src/vs/workbench/contrib/void/browser/editCodeService.ts
rename to src/vs/workbench/contrib/orcide/browser/editCodeService.ts
index 80ee4bc9925..78726753784 100644
--- a/src/vs/workbench/contrib/void/browser/editCodeService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/editCodeService.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { Disposable } from '../../../../base/common/lifecycle.js';
@@ -24,9 +24,9 @@ import { Widget } from '../../../../base/browser/ui/widget.js';
import { URI } from '../../../../base/common/uri.js';
import { IConsistentEditorItemService, IConsistentItemService } from './helperServices/consistentItemService.js';
import { voidPrefixAndSuffix, ctrlKStream_userMessage, ctrlKStream_systemMessage, defaultQuickEditFimTags, rewriteCode_systemMessage, rewriteCode_userMessage, searchReplaceGivenDescription_systemMessage, searchReplaceGivenDescription_userMessage, tripleTick, } from '../common/prompt/prompts.js';
-import { IVoidCommandBarService } from './voidCommandBarService.js';
+import { IOrcideCommandBarService } from './orcideCommandBarService.js';
import { IKeybindingService } from '../../../../platform/keybinding/common/keybinding.js';
-import { VOID_ACCEPT_DIFF_ACTION_ID, VOID_REJECT_DIFF_ACTION_ID } from './actionIDs.js';
+import { ORCIDE_ACCEPT_DIFF_ACTION_ID, ORCIDE_REJECT_DIFF_ACTION_ID } from './actionIDs.js';
import { mountCtrlK } from './react/out/quick-edit-tsx/index.js'
import { QuickEditPropsType } from './quickEditActions.js';
@@ -39,15 +39,15 @@ import { ILLMMessageService } from '../common/sendLLMMessageService.js';
import { LLMChatMessage } from '../common/sendLLMMessageTypes.js';
import { IMetricsService } from '../common/metricsService.js';
import { IEditCodeService, AddCtrlKOpts, StartApplyingOpts, CallBeforeStartApplyingOpts, } from './editCodeServiceInterface.js';
-import { IVoidSettingsService } from '../common/voidSettingsService.js';
-import { FeatureName } from '../common/voidSettingsTypes.js';
-import { IVoidModelService } from '../common/voidModelService.js';
+import { IOrcideSettingsService } from '../common/orcideSettingsService.js';
+import { FeatureName } from '../common/orcideSettingsTypes.js';
+import { IOrcideModelService } from '../common/orcideModelService.js';
import { deepClone } from '../../../../base/common/objects.js';
import { acceptBg, acceptBorder, buttonFontSize, buttonTextColor, rejectBg, rejectBorder } from '../common/helpers/colors.js';
-import { DiffArea, Diff, CtrlKZone, VoidFileSnapshot, DiffAreaSnapshotEntry, diffAreaSnapshotKeys, DiffZone, TrackingZone, ComputedDiff } from '../common/editCodeServiceTypes.js';
+import { DiffArea, Diff, CtrlKZone, OrcideFileSnapshot, DiffAreaSnapshotEntry, diffAreaSnapshotKeys, DiffZone, TrackingZone, ComputedDiff } from '../common/editCodeServiceTypes.js';
import { IConvertToLLMMessageService } from './convertToLLMMessageService.js';
// import { isMacintosh } from '../../../../base/common/platform.js';
-// import { VOID_OPEN_SETTINGS_ACTION_ID } from './voidSettingsPane.js';
+// import { ORCIDE_OPEN_SETTINGS_ACTION_ID } from './orcideSettingsPane.js';
const numLinesOfStr = (str: string) => str.split('\n').length
@@ -192,9 +192,9 @@ class EditCodeService extends Disposable implements IEditCodeService {
@IMetricsService private readonly _metricsService: IMetricsService,
@INotificationService private readonly _notificationService: INotificationService,
// @ICommandService private readonly _commandService: ICommandService,
- @IVoidSettingsService private readonly _settingsService: IVoidSettingsService,
+ @IOrcideSettingsService private readonly _settingsService: IOrcideSettingsService,
// @IFileService private readonly _fileService: IFileService,
- @IVoidModelService private readonly _voidModelService: IVoidModelService,
+ @IOrcideModelService private readonly _orcideModelService: IOrcideModelService,
@IConvertToLLMMessageService private readonly _convertToLLMMessageService: IConvertToLLMMessageService,
) {
super();
@@ -203,7 +203,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
const registeredModelURIs = new Set()
const initializeModel = async (model: ITextModel) => {
- await this._voidModelService.initializeModel(model.uri)
+ await this._orcideModelService.initializeModel(model.uri)
// do not add listeners to the same model twice - important, or will see duplicates
if (registeredModelURIs.has(model.uri.fsPath)) return
@@ -279,18 +279,18 @@ class EditCodeService extends Disposable implements IEditCodeService {
// const details = errorDetails(e.fullError)
// this._notificationService.notify({
// severity: Severity.Warning,
- // message: `Void Error: ${e.message}`,
+ // message: `Orcide Error: ${e.message}`,
// actions: {
// secondary: [{
// id: 'void.onerror.opensettings',
// enabled: true,
- // label: `Open Void's settings`,
+ // label: `Open Orcide's settings`,
// tooltip: '',
// class: undefined,
- // run: () => { this._commandService.executeCommand(VOID_OPEN_SETTINGS_ACTION_ID) }
+ // run: () => { this._commandService.executeCommand(ORCIDE_OPEN_SETTINGS_ACTION_ID) }
// }]
// },
- // source: details ? `(Hold ${isMacintosh ? 'Option' : 'Alt'} to hover) - ${details}\n\nIf this persists, feel free to [report](https://github.com/voideditor/void/issues/new) it.` : undefined
+ // source: details ? `(Hold ${isMacintosh ? 'Option' : 'Alt'} to hover) - ${details}\n\nIf this persists, feel free to [report](https://github.com/orcest-ai/Orcide/issues/new) it.` : undefined
// })
// }
@@ -315,7 +315,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
private _addDiffAreaStylesToURI = (uri: URI) => {
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
for (const diffareaid of this.diffAreasOfURI[uri.fsPath] || []) {
const diffArea = this.diffAreaOfId[diffareaid]
@@ -324,10 +324,10 @@ class EditCodeService extends Disposable implements IEditCodeService {
// add sweep styles to the diffZone
if (diffArea._streamState.isStreaming) {
// sweepLine ... sweepLine
- const fn1 = this._addLineDecoration(model, diffArea._streamState.line, diffArea._streamState.line, 'void-sweepIdxBG')
+ const fn1 = this._addLineDecoration(model, diffArea._streamState.line, diffArea._streamState.line, 'orcide.sweepIdxBG')
// sweepLine+1 ... endLine
const fn2 = diffArea._streamState.line + 1 <= diffArea.endLine ?
- this._addLineDecoration(model, diffArea._streamState.line + 1, diffArea.endLine, 'void-sweepBG')
+ this._addLineDecoration(model, diffArea._streamState.line + 1, diffArea.endLine, 'orcide.sweepBG')
: null
diffArea._removeStylesFns.add(() => { fn1?.(); fn2?.(); })
@@ -336,7 +336,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
else if (diffArea.type === 'CtrlKZone' && diffArea._linkedStreamingDiffZone === null) {
// highlight zone's text
- const fn = this._addLineDecoration(model, diffArea.startLine, diffArea.endLine, 'void-highlightBG')
+ const fn = this._addLineDecoration(model, diffArea.startLine, diffArea.endLine, 'orcide.highlightBG')
diffArea._removeStylesFns.add(() => fn?.());
}
}
@@ -344,7 +344,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
private _computeDiffsAndAddStylesToURI = (uri: URI) => {
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
if (model === null) return
const fullFileText = model.getValue(EndOfLinePreference.LF)
@@ -477,11 +477,11 @@ class EditCodeService extends Disposable implements IEditCodeService {
const disposeInThisEditorFns: (() => void)[] = []
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
// green decoration and minimap decoration
if (type !== 'deletion') {
- const fn = this._addLineDecoration(model, diff.startLine, diff.endLine, 'void-greenBG', {
+ const fn = this._addLineDecoration(model, diff.startLine, diff.endLine, 'orcide.greenBG', {
minimap: { color: { id: 'minimapGutter.addedBackground' }, position: 2 },
overviewRuler: { color: { id: 'editorOverviewRuler.addedForeground' }, position: 7 }
})
@@ -496,7 +496,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
fn: (editor) => {
const domNode = document.createElement('div');
- domNode.className = 'void-redBG'
+ domNode.className = 'orcide.redBG'
const renderOptions = RenderOptions.fromEditor(editor)
@@ -585,7 +585,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
offsetLines = 1
}
}
- else { throw new Error('Void 1') }
+ else { throw new Error('Orcide 1') }
const buttonsWidget = this._instantiationService.createInstance(AcceptRejectInlineWidget, {
editor,
@@ -625,7 +625,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
weAreWriting = false
private _writeURIText(uri: URI, text: string, range_: IRange | 'wholeFileRange', { shouldRealignDiffAreas, }: { shouldRealignDiffAreas: boolean, }) {
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
if (!model) {
this._refreshStylesAndDiffsInURI(uri) // at the end of a write, we still expect to refresh all styles. e.g. sometimes we expect to restore all the decorations even if no edits were made when _writeText is used
return
@@ -663,8 +663,8 @@ class EditCodeService extends Disposable implements IEditCodeService {
- private _getCurrentVoidFileSnapshot = (uri: URI): VoidFileSnapshot => {
- const { model } = this._voidModelService.getModel(uri)
+ private _getCurrentOrcideFileSnapshot = (uri: URI): OrcideFileSnapshot => {
+ const { model } = this._orcideModelService.getModel(uri)
const snapshottedDiffAreaOfId: Record = {}
for (const diffareaid in this.diffAreaOfId) {
@@ -687,7 +687,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
}
- private _restoreVoidFileSnapshot = async (uri: URI, snapshot: VoidFileSnapshot) => {
+ private _restoreOrcideFileSnapshot = async (uri: URI, snapshot: OrcideFileSnapshot) => {
// for each diffarea in this uri, stop streaming if currently streaming
for (const diffareaid in this.diffAreaOfId) {
const diffArea = this.diffAreaOfId[diffareaid]
@@ -737,34 +737,34 @@ class EditCodeService extends Disposable implements IEditCodeService {
}
private _addToHistory(uri: URI, opts?: { onWillUndo?: () => void }) {
- const beforeSnapshot: VoidFileSnapshot = this._getCurrentVoidFileSnapshot(uri)
- let afterSnapshot: VoidFileSnapshot | null = null
+ const beforeSnapshot: OrcideFileSnapshot = this._getCurrentOrcideFileSnapshot(uri)
+ let afterSnapshot: OrcideFileSnapshot | null = null
const elt: IUndoRedoElement = {
type: UndoRedoElementType.Resource,
resource: uri,
- label: 'Void Agent',
+ label: 'Orcide Agent',
code: 'undoredo.editCode',
- undo: async () => { opts?.onWillUndo?.(); await this._restoreVoidFileSnapshot(uri, beforeSnapshot) },
- redo: async () => { if (afterSnapshot) await this._restoreVoidFileSnapshot(uri, afterSnapshot) }
+ undo: async () => { opts?.onWillUndo?.(); await this._restoreOrcideFileSnapshot(uri, beforeSnapshot) },
+ redo: async () => { if (afterSnapshot) await this._restoreOrcideFileSnapshot(uri, afterSnapshot) }
}
this._undoRedoService.pushElement(elt)
const onFinishEdit = async () => {
- afterSnapshot = this._getCurrentVoidFileSnapshot(uri)
- await this._voidModelService.saveModel(uri)
+ afterSnapshot = this._getCurrentOrcideFileSnapshot(uri)
+ await this._orcideModelService.saveModel(uri)
}
return { onFinishEdit }
}
- public getVoidFileSnapshot(uri: URI) {
- return this._getCurrentVoidFileSnapshot(uri)
+ public getOrcideFileSnapshot(uri: URI) {
+ return this._getCurrentOrcideFileSnapshot(uri)
}
- public restoreVoidFileSnapshot(uri: URI, snapshot: VoidFileSnapshot): void {
- this._restoreVoidFileSnapshot(uri, snapshot)
+ public restoreOrcideFileSnapshot(uri: URI, snapshot: OrcideFileSnapshot): void {
+ this._restoreOrcideFileSnapshot(uri, snapshot)
}
@@ -997,7 +997,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
else if (lastDiff.type === 'deletion')
endLineInLlmTextSoFar = lastDiff.startLine
else
- throw new Error(`Void: diff.type not recognized on: ${lastDiff}`)
+ throw new Error(`Orcide: diff.type not recognized on: ${lastDiff}`)
}
// at the start, add a newline between the stream and originalCode to make reasoning easier
@@ -1127,8 +1127,8 @@ class EditCodeService extends Disposable implements IEditCodeService {
public async callBeforeApplyOrEdit(givenURI: URI | 'current') {
const uri = this._uriOfGivenURI(givenURI)
if (!uri) return
- await this._voidModelService.initializeModel(uri)
- await this._voidModelService.saveModel(uri) // save the URI
+ await this._orcideModelService.initializeModel(uri)
+ await this._orcideModelService.saveModel(uri) // save the URI
}
@@ -1269,7 +1269,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
linkedCtrlKZone: CtrlKZone | null,
onWillUndo: () => void,
}) {
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
if (!model) return
// treat like full file, unless linkedCtrlKZone was provided in which case use its diff's range
@@ -1376,10 +1376,10 @@ class EditCodeService extends Disposable implements IEditCodeService {
startRange = [startLine_, endLine_]
}
else {
- throw new Error(`Void: diff.type not recognized on: ${from}`)
+ throw new Error(`Orcide: diff.type not recognized on: ${from}`)
}
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
if (!model) return
let streamRequestIdRef: { current: string | null } = { current: null } // can use this as a proxy to set the diffArea's stream state requestId
@@ -1480,7 +1480,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
else if (from === 'ClickApply') {
return extractCodeFromRegular({ text: fullText, recentlyAddedTextLen })
}
- throw new Error('Void 1')
+ throw new Error('Orcide 1')
}
// refresh now in case onText takes a while to get 1st message
@@ -1578,7 +1578,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
_fileLengthOfGivenURI(givenURI: URI | 'current') {
const uri = this._uriOfGivenURI(givenURI)
if (!uri) return null
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
if (!model) return null
const numCharsInFile = model.getValueLength(EndOfLinePreference.LF)
return numCharsInFile
@@ -1617,7 +1617,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
const blocks = extractSearchReplaceBlocks(blocksStr)
if (blocks.length === 0) throw new Error(`No Search/Replace blocks were received!`)
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
if (!model) throw new Error(`Error applying Search/Replace blocks: File does not exist.`)
const modelStr = model.getValue(EndOfLinePreference.LF)
// .split('\n').map(l => '\t' + l).join('\n') // for testing purposes only, remember to remove this
@@ -1678,7 +1678,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
const uri = this._getURIBeforeStartApplying(opts)
if (!uri) return
- const { model } = this._voidModelService.getModel(uri)
+ const { model } = this._orcideModelService.getModel(uri)
if (!model) return
let streamRequestIdRef: { current: string | null } = { current: null } // can use this as a proxy to set the diffArea's stream state requestId
@@ -1968,7 +1968,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
const blocks = extractSearchReplaceBlocks(fullText)
if (blocks.length === 0) {
- this._notificationService.info(`Void: We ran Fast Apply, but the LLM didn't output any changes.`)
+ this._notificationService.info(`Orcide: We ran Fast Apply, but the LLM didn't output any changes.`)
}
this._writeURIText(uri, originalFileCode, 'wholeFileRange', { shouldRealignDiffAreas: true })
@@ -2158,7 +2158,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
].join('\n')
}
else {
- throw new Error(`Void error: ${diff}.type not recognized`)
+ throw new Error(`Orcide error: ${diff}.type not recognized`)
}
// console.log('DIFF', diff)
@@ -2250,7 +2250,7 @@ class EditCodeService extends Disposable implements IEditCodeService {
toRange = { startLineNumber: diff.startLine, startColumn: 1, endLineNumber: diff.endLine, endColumn: Number.MAX_SAFE_INTEGER } // 1-indexed
}
else {
- throw new Error(`Void error: ${diff}.type not recognized`)
+ throw new Error(`Orcide error: ${diff}.type not recognized`)
}
// update the file
@@ -2305,7 +2305,7 @@ class AcceptRejectInlineWidget extends Widget implements IOverlayWidget {
startLine: number,
offsetLines: number
},
- @IVoidCommandBarService private readonly _voidCommandBarService: IVoidCommandBarService,
+ @IOrcideCommandBarService private readonly _orcideCommandBarService: IOrcideCommandBarService,
@IKeybindingService private readonly _keybindingService: IKeybindingService,
@IEditCodeService private readonly _editCodeService: IEditCodeService,
) {
@@ -2328,15 +2328,15 @@ class AcceptRejectInlineWidget extends Widget implements IOverlayWidget {
const lineHeight = editor.getOption(EditorOption.lineHeight);
const getAcceptRejectText = () => {
- const acceptKeybinding = this._keybindingService.lookupKeybinding(VOID_ACCEPT_DIFF_ACTION_ID);
- const rejectKeybinding = this._keybindingService.lookupKeybinding(VOID_REJECT_DIFF_ACTION_ID);
+ const acceptKeybinding = this._keybindingService.lookupKeybinding(ORCIDE_ACCEPT_DIFF_ACTION_ID);
+ const rejectKeybinding = this._keybindingService.lookupKeybinding(ORCIDE_REJECT_DIFF_ACTION_ID);
// Use the standalone function directly since we're in a nested class that
// can't access EditCodeService's methods
const acceptKeybindLabel = this._editCodeService.processRawKeybindingText(acceptKeybinding && acceptKeybinding.getLabel() || '');
const rejectKeybindLabel = this._editCodeService.processRawKeybindingText(rejectKeybinding && rejectKeybinding.getLabel() || '');
- const commandBarStateAtUri = this._voidCommandBarService.stateOfURI[uri.fsPath];
+ const commandBarStateAtUri = this._orcideCommandBarService.stateOfURI[uri.fsPath];
const selectedDiffIdx = commandBarStateAtUri?.diffIdx ?? 0; // 0th item is selected by default
const thisDiffIdx = commandBarStateAtUri?.sortedDiffIds.indexOf(diffid) ?? null;
@@ -2435,7 +2435,7 @@ class AcceptRejectInlineWidget extends Widget implements IOverlayWidget {
// Listen for state changes in the command bar service
- this._register(this._voidCommandBarService.onDidChangeState(e => {
+ this._register(this._orcideCommandBarService.onDidChangeState(e => {
if (uri && e.uri.fsPath === uri.fsPath) {
const { acceptText, rejectText } = getAcceptRejectText()
diff --git a/src/vs/workbench/contrib/void/browser/editCodeServiceInterface.ts b/src/vs/workbench/contrib/orcide/browser/editCodeServiceInterface.ts
similarity index 88%
rename from src/vs/workbench/contrib/void/browser/editCodeServiceInterface.ts
rename to src/vs/workbench/contrib/orcide/browser/editCodeServiceInterface.ts
index 9e33fbd21d9..77f736b4d59 100644
--- a/src/vs/workbench/contrib/void/browser/editCodeServiceInterface.ts
+++ b/src/vs/workbench/contrib/orcide/browser/editCodeServiceInterface.ts
@@ -1,13 +1,13 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { Event } from '../../../../base/common/event.js';
import { URI } from '../../../../base/common/uri.js';
import { ICodeEditor } from '../../../../editor/browser/editorBrowser.js';
import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js';
-import { Diff, DiffArea, VoidFileSnapshot } from '../common/editCodeServiceTypes.js';
+import { Diff, DiffArea, OrcideFileSnapshot } from '../common/editCodeServiceTypes.js';
export type StartBehavior = 'accept-conflicts' | 'reject-conflicts' | 'keep-conflicts'
@@ -73,6 +73,6 @@ export interface IEditCodeService {
interruptURIStreaming(opts: { uri: URI }): void;
// testDiffs(): void;
- getVoidFileSnapshot(uri: URI): VoidFileSnapshot;
- restoreVoidFileSnapshot(uri: URI, snapshot: VoidFileSnapshot): void;
+ getOrcideFileSnapshot(uri: URI): OrcideFileSnapshot;
+ restoreOrcideFileSnapshot(uri: URI, snapshot: OrcideFileSnapshot): void;
}
diff --git a/src/vs/workbench/contrib/void/browser/extensionTransferService.ts b/src/vs/workbench/contrib/orcide/browser/extensionTransferService.ts
similarity index 85%
rename from src/vs/workbench/contrib/void/browser/extensionTransferService.ts
rename to src/vs/workbench/contrib/orcide/browser/extensionTransferService.ts
index b8843e98b96..26fbbc239d9 100644
--- a/src/vs/workbench/contrib/void/browser/extensionTransferService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/extensionTransferService.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { VSBuffer } from '../../../../base/common/buffer.js';
@@ -31,7 +31,7 @@ const extensionBlacklist = [
// ignore extensions
'ms-vscode-remote.remote', // ms-vscode-remote.remote-ssh, ms-vscode-remote.remote-wsl
'ms-vscode.remote', // ms-vscode.remote-explorer
- // ignore other AI copilots that could conflict with Void keybindings
+ // ignore other AI copilots that could conflict with Orcide keybindings
'sourcegraph.cody-ai',
'continue.continue',
'codeium.codeium',
@@ -195,37 +195,37 @@ const transferTheseFilesOfOS = (os: 'mac' | 'windows' | 'linux' | null, fromEdit
if (fromEditor === 'VS Code') {
return [{
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Code', 'User', 'settings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Void', 'User', 'settings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Orcide', 'User', 'settings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Code', 'User', 'keybindings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Void', 'User', 'keybindings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Orcide', 'User', 'keybindings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.vscode', 'extensions'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.void-editor', 'extensions'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.orcide', 'extensions'),
isExtensions: true,
}]
} else if (fromEditor === 'Cursor') {
return [{
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'settings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Void', 'User', 'settings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Orcide', 'User', 'settings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Cursor', 'User', 'keybindings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Void', 'User', 'keybindings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Orcide', 'User', 'keybindings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.cursor', 'extensions'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.void-editor', 'extensions'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.orcide', 'extensions'),
isExtensions: true,
}]
} else if (fromEditor === 'Windsurf') {
return [{
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Windsurf', 'User', 'settings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Void', 'User', 'settings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Orcide', 'User', 'settings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Windsurf', 'User', 'keybindings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Void', 'User', 'keybindings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, 'Library', 'Application Support', 'Orcide', 'User', 'keybindings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.windsurf', 'extensions'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.void-editor', 'extensions'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.orcide', 'extensions'),
isExtensions: true,
}]
}
@@ -238,37 +238,37 @@ const transferTheseFilesOfOS = (os: 'mac' | 'windows' | 'linux' | null, fromEdit
if (fromEditor === 'VS Code') {
return [{
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Code', 'User', 'settings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Void', 'User', 'settings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Orcide', 'User', 'settings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Code', 'User', 'keybindings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Void', 'User', 'keybindings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Orcide', 'User', 'keybindings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.vscode', 'extensions'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.void-editor', 'extensions'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.orcide', 'extensions'),
isExtensions: true,
}]
} else if (fromEditor === 'Cursor') {
return [{
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Cursor', 'User', 'settings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Void', 'User', 'settings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Orcide', 'User', 'settings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Cursor', 'User', 'keybindings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Void', 'User', 'keybindings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Orcide', 'User', 'keybindings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.cursor', 'extensions'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.void-editor', 'extensions'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.orcide', 'extensions'),
isExtensions: true,
}]
} else if (fromEditor === 'Windsurf') {
return [{
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Windsurf', 'User', 'settings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Void', 'User', 'settings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Orcide', 'User', 'settings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Windsurf', 'User', 'keybindings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Void', 'User', 'keybindings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.config', 'Orcide', 'User', 'keybindings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.windsurf', 'extensions'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.void-editor', 'extensions'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), homeDir, '.orcide', 'extensions'),
isExtensions: true,
}]
}
@@ -283,37 +283,37 @@ const transferTheseFilesOfOS = (os: 'mac' | 'windows' | 'linux' | null, fromEdit
if (fromEditor === 'VS Code') {
return [{
from: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Code', 'User', 'settings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Void', 'User', 'settings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Orcide', 'User', 'settings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Code', 'User', 'keybindings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Void', 'User', 'keybindings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Orcide', 'User', 'keybindings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), userprofile, '.vscode', 'extensions'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), userprofile, '.void-editor', 'extensions'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), userprofile, '.orcide', 'extensions'),
isExtensions: true,
}]
} else if (fromEditor === 'Cursor') {
return [{
from: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Cursor', 'User', 'settings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Void', 'User', 'settings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Orcide', 'User', 'settings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Cursor', 'User', 'keybindings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Void', 'User', 'keybindings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Orcide', 'User', 'keybindings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), userprofile, '.cursor', 'extensions'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), userprofile, '.void-editor', 'extensions'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), userprofile, '.orcide', 'extensions'),
isExtensions: true,
}]
} else if (fromEditor === 'Windsurf') {
return [{
from: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Windsurf', 'User', 'settings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Void', 'User', 'settings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Orcide', 'User', 'settings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Windsurf', 'User', 'keybindings.json'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Void', 'User', 'keybindings.json'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), appdata, 'Orcide', 'User', 'keybindings.json'),
}, {
from: URI.joinPath(URI.from({ scheme: 'file' }), userprofile, '.windsurf', 'extensions'),
- to: URI.joinPath(URI.from({ scheme: 'file' }), userprofile, '.void-editor', 'extensions'),
+ to: URI.joinPath(URI.from({ scheme: 'file' }), userprofile, '.orcide', 'extensions'),
isExtensions: true,
}]
}
diff --git a/src/vs/workbench/contrib/void/browser/extensionTransferTypes.ts b/src/vs/workbench/contrib/orcide/browser/extensionTransferTypes.ts
similarity index 79%
rename from src/vs/workbench/contrib/void/browser/extensionTransferTypes.ts
rename to src/vs/workbench/contrib/orcide/browser/extensionTransferTypes.ts
index 4e10707c6dc..d5d45d0800b 100644
--- a/src/vs/workbench/contrib/void/browser/extensionTransferTypes.ts
+++ b/src/vs/workbench/contrib/orcide/browser/extensionTransferTypes.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { URI } from '../../../../base/common/uri.js'
diff --git a/src/vs/workbench/contrib/void/browser/fileService.ts b/src/vs/workbench/contrib/orcide/browser/fileService.ts
similarity index 80%
rename from src/vs/workbench/contrib/void/browser/fileService.ts
rename to src/vs/workbench/contrib/orcide/browser/fileService.ts
index 93da1b1e2cf..e857cc1ae96 100644
--- a/src/vs/workbench/contrib/void/browser/fileService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/fileService.ts
@@ -7,20 +7,20 @@ import { IFileService } from '../../../../platform/files/common/files.js';
import { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';
import { IDirectoryStrService } from '../common/directoryStrService.js';
import { messageOfSelection } from '../common/prompt/prompts.js';
-import { IVoidModelService } from '../common/voidModelService.js';
+import { IOrcideModelService } from '../common/orcideModelService.js';
class FilePromptActionService extends Action2 {
- private static readonly VOID_COPY_FILE_PROMPT_ID = 'void.copyfileprompt'
+ private static readonly ORCIDE_COPY_FILE_PROMPT_ID = 'orcide.copyfileprompt'
constructor() {
super({
- id: FilePromptActionService.VOID_COPY_FILE_PROMPT_ID,
- title: localize2('voidCopyPrompt', 'Void: Copy Prompt'),
+ id: FilePromptActionService.ORCIDE_COPY_FILE_PROMPT_ID,
+ title: localize2('orcideCopyPrompt', 'Orcide: Copy Prompt'),
menu: [{
id: MenuId.ExplorerContext,
- group: '8_void',
+ group: '8_orcide',
order: 1,
}]
});
@@ -31,7 +31,7 @@ class FilePromptActionService extends Action2 {
const fileService = accessor.get(IFileService);
const clipboardService = accessor.get(IClipboardService)
const directoryStrService = accessor.get(IDirectoryStrService)
- const voidModelService = accessor.get(IVoidModelService)
+ const orcideModelService = accessor.get(IOrcideModelService)
const stat = await fileService.stat(uri)
@@ -45,7 +45,7 @@ class FilePromptActionService extends Action2 {
m = await messageOfSelection({
type: 'File',
uri,
- language: (await voidModelService.getModelSafe(uri)).model?.getLanguageId() || '',
+ language: (await orcideModelService.getModelSafe(uri)).model?.getLanguageId() || '',
state: { wasAddedAsCurrentFile: false, },
}, {
folderOpts,
diff --git a/src/vs/workbench/contrib/void/browser/helperServices/consistentItemService.ts b/src/vs/workbench/contrib/orcide/browser/helperServices/consistentItemService.ts
similarity index 98%
rename from src/vs/workbench/contrib/void/browser/helperServices/consistentItemService.ts
rename to src/vs/workbench/contrib/orcide/browser/helperServices/consistentItemService.ts
index ba906ff5978..6aea76c5460 100644
--- a/src/vs/workbench/contrib/void/browser/helperServices/consistentItemService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/helperServices/consistentItemService.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { Disposable } from '../../../../../base/common/lifecycle.js';
diff --git a/src/vs/workbench/contrib/void/browser/helpers/findDiffs.ts b/src/vs/workbench/contrib/orcide/browser/helpers/findDiffs.ts
similarity index 94%
rename from src/vs/workbench/contrib/void/browser/helpers/findDiffs.ts
rename to src/vs/workbench/contrib/orcide/browser/helpers/findDiffs.ts
index 703b2775be6..d092de5c6a5 100644
--- a/src/vs/workbench/contrib/void/browser/helpers/findDiffs.ts
+++ b/src/vs/workbench/contrib/orcide/browser/helpers/findDiffs.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { ComputedDiff } from '../../common/editCodeServiceTypes.js';
@@ -130,7 +130,7 @@ export function findDiffs(oldStr: string, newStr: string) {
// let keys = new Set([...Object.keys(a), ...Object.keys(b)])
// for (let k of keys) {
// if (a[k] !== b[k]) {
-// console.error('Void Test Error:', name_, '\n', `${k}=`, `${JSON.stringify(a[k])}, ${JSON.stringify(b[k])}`)
+// console.error('Orcide Test Error:', name_, '\n', `${k}=`, `${JSON.stringify(a[k])}, ${JSON.stringify(b[k])}`)
// // console.error(JSON.stringify(a, null, 4))
// // console.error(JSON.stringify(b, null, 4))
// testsFailed += 1
@@ -244,8 +244,8 @@ export function findDiffs(oldStr: string, newStr: string) {
// if (testsFailed === 0) {
-// console.log('✅ Void - All tests passed')
+// console.log('✅ Orcide - All tests passed')
// }
// else {
-// console.log('❌ Void - At least one test failed')
+// console.log('❌ Orcide - At least one test failed')
// }
diff --git a/src/vs/workbench/contrib/orcide/browser/media/orcide.css b/src/vs/workbench/contrib/orcide/browser/media/orcide.css
new file mode 100644
index 00000000000..9fa9f29335e
--- /dev/null
+++ b/src/vs/workbench/contrib/orcide/browser/media/orcide.css
@@ -0,0 +1,204 @@
+/*--------------------------------------------------------------------------------------
+ * Copyright 2025 Glass Devtools, Inc. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ *--------------------------------------------------------------------------------------*/
+
+.monaco-editor .orcide-sweepIdxBG {
+ background-color: var(--vscode-orcide-sweepIdxBG);
+}
+
+.orcide-sweepBG {
+ background-color: var(--vscode-orcide-sweepBG);
+}
+
+.orcide-highlightBG {
+ background-color: var(--vscode-orcide-highlightBG);
+}
+
+.orcide-greenBG {
+ background-color: var(--vscode-orcide-greenBG);
+}
+
+.orcide-redBG {
+ background-color: var(--vscode-orcide-redBG);
+}
+
+
+/* Renamed from void-watermark-button to orcide-openfolder-button */
+.orcide-openfolder-button {
+ padding: 8px 20px;
+ background-color: #306dce;
+ color: white;
+ border: none;
+ border-radius: 4px;
+ outline: none !important;
+ box-shadow: none !important;
+ cursor: pointer;
+ transition: background-color 0.2s ease;
+}
+.orcide-openfolder-button:hover {
+ background-color: #2563eb;
+}
+.orcide-openfolder-button:active {
+ background-color: #2563eb;
+}
+
+/* Added for Open SSH button with slightly darker color */
+.orcide-openssh-button {
+ padding: 8px 20px;
+ background-color: #656565; /* Slightly darker than the #5a5a5a in the TS file */
+ color: white;
+ border: none;
+ border-radius: 4px;
+ outline: none !important;
+ box-shadow: none !important;
+ cursor: pointer;
+ transition: background-color 0.2s ease;
+}
+.orcide-openssh-button:hover {
+ background-color: #474747; /* Darker on hover */
+}
+.orcide-openssh-button:active {
+ background-color: #474747;
+}
+
+
+.orcide-settings-watermark-button {
+ margin: 8px 0;
+ padding: 8px 20px;
+ background-color: var(--vscode-input-background);
+ color: var(--vscode-input-foreground);
+ border: none;
+ border-radius: 4px;
+ outline: none !important;
+ box-shadow: none !important;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.orcide-settings-watermark-button:hover {
+ filter: brightness(1.1);
+}
+
+.orcide-settings-watermark-button:active {
+ filter: brightness(1.1);
+}
+
+.orcide-link {
+ color: #3b82f6;
+ cursor: pointer;
+ transition: all 0.2s ease;
+}
+
+.orcide-link:hover {
+ opacity: 80%;
+}
+
+/* styles for all containers used by orcide */
+.orcide-scope {
+ --scrollbar-vertical-width: 8px;
+ --scrollbar-horizontal-height: 6px;
+}
+
+/* Target both orcide-scope and all its descendants with scrollbars */
+.orcide-scope,
+.orcide-scope * {
+ scrollbar-width: thin !important;
+ scrollbar-color: var(--orcide-bg-1) var(--orcide-bg-3) !important;
+ /* For Firefox */
+}
+
+.orcide-scope::-webkit-scrollbar,
+.orcide-scope *::-webkit-scrollbar {
+ width: var(--scrollbar-vertical-width) !important;
+ height: var(--scrollbar-horizontal-height) !important;
+ background-color: var(--orcide-bg-3) !important;
+}
+
+.orcide-scope::-webkit-scrollbar-thumb,
+.orcide-scope *::-webkit-scrollbar-thumb {
+ background-color: var(--orcide-bg-1) !important;
+ border-radius: 4px !important;
+ border: none !important;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+}
+
+.orcide-scope::-webkit-scrollbar-thumb:hover,
+.orcide-scope *::-webkit-scrollbar-thumb:hover {
+ background-color: var(--orcide-bg-1) !important;
+ filter: brightness(1.1) !important;
+}
+
+.orcide-scope::-webkit-scrollbar-thumb:active,
+.orcide-scope *::-webkit-scrollbar-thumb:active {
+ background-color: var(--orcide-bg-1) !important;
+ filter: brightness(1.2) !important;
+}
+
+.orcide-scope::-webkit-scrollbar-track,
+.orcide-scope *::-webkit-scrollbar-track {
+ background-color: var(--orcide-bg-3) !important;
+ border: none !important;
+}
+
+.orcide-scope::-webkit-scrollbar-corner,
+.orcide-scope *::-webkit-scrollbar-corner {
+ background-color: var(--orcide-bg-3) !important;
+}
+
+/* Add orcide-scrollable-element styles to match */
+.orcide-scrollable-element {
+ background-color: var(--vscode-editor-background);
+ --scrollbar-vertical-width: 14px;
+ --scrollbar-horizontal-height: 6px;
+ overflow: auto;
+ /* Ensure scrollbars are shown when needed */
+}
+
+.orcide-scrollable-element,
+.orcide-scrollable-element * {
+ scrollbar-width: thin !important;
+ /* For Firefox */
+ scrollbar-color: var(--orcide-bg-1) var(--orcide-bg-3) !important;
+ /* For Firefox */
+}
+
+.orcide-scrollable-element::-webkit-scrollbar,
+.orcide-scrollable-element *::-webkit-scrollbar {
+ width: var(--scrollbar-vertical-width) !important;
+ height: var(--scrollbar-horizontal-height) !important;
+ background-color: var(--orcide-bg-3) !important;
+}
+
+.orcide-scrollable-element::-webkit-scrollbar-thumb,
+.orcide-scrollable-element *::-webkit-scrollbar-thumb {
+ background-color: var(--orcide-bg-1) !important;
+ border-radius: 4px !important;
+ border: none !important;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+}
+
+.orcide-scrollable-element::-webkit-scrollbar-thumb:hover,
+.orcide-scrollable-element *::-webkit-scrollbar-thumb:hover {
+ background-color: var(--orcide-bg-1) !important;
+ filter: brightness(1.1) !important;
+}
+
+.orcide-scrollable-element::-webkit-scrollbar-thumb:active,
+.orcide-scrollable-element *::-webkit-scrollbar-thumb:active {
+ background-color: var(--orcide-bg-1) !important;
+ filter: brightness(1.2) !important;
+}
+
+.orcide-scrollable-element::-webkit-scrollbar-track,
+.orcide-scrollable-element *::-webkit-scrollbar-track {
+ background-color: var(--orcide-bg-3) !important;
+ border: none !important;
+}
+
+.orcide-scrollable-element::-webkit-scrollbar-corner,
+.orcide-scrollable-element *::-webkit-scrollbar-corner {
+ background-color: var(--orcide-bg-3) !important;
+}
diff --git a/src/vs/workbench/contrib/void/browser/metricsPollService.ts b/src/vs/workbench/contrib/orcide/browser/metricsPollService.ts
similarity index 91%
rename from src/vs/workbench/contrib/void/browser/metricsPollService.ts
rename to src/vs/workbench/contrib/orcide/browser/metricsPollService.ts
index 493c7edaccd..f9ab5ab23b7 100644
--- a/src/vs/workbench/contrib/void/browser/metricsPollService.ts
+++ b/src/vs/workbench/contrib/orcide/browser/metricsPollService.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { Disposable } from '../../../../base/common/lifecycle.js';
diff --git a/src/vs/workbench/contrib/void/browser/miscWokrbenchContrib.ts b/src/vs/workbench/contrib/orcide/browser/miscWokrbenchContrib.ts
similarity index 90%
rename from src/vs/workbench/contrib/void/browser/miscWokrbenchContrib.ts
rename to src/vs/workbench/contrib/orcide/browser/miscWokrbenchContrib.ts
index 83b3ed7b7fd..3b116b9dd7b 100644
--- a/src/vs/workbench/contrib/void/browser/miscWokrbenchContrib.ts
+++ b/src/vs/workbench/contrib/orcide/browser/miscWokrbenchContrib.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
import { Disposable } from '../../../../base/common/lifecycle.js';
@@ -26,7 +26,7 @@ export class MiscWorkbenchContribs extends Disposable implements IWorkbenchContr
private initialize(): void {
// delete blacklisted extensions once (this is for people who already installed them)
- const deleteExtensionsStorageId = 'void-deleted-blacklist-2'
+ const deleteExtensionsStorageId = 'orcide-deleted-blacklist-2'
const alreadyDeleted = this.storageService.get(deleteExtensionsStorageId, StorageScope.APPLICATION)
if (!alreadyDeleted) {
this.storageService.store(deleteExtensionsStorageId, 'true', StorageScope.APPLICATION, StorageTarget.MACHINE)
diff --git a/src/vs/workbench/contrib/void/browser/void.contribution.ts b/src/vs/workbench/contrib/orcide/browser/orcide.contribution.ts
similarity index 55%
rename from src/vs/workbench/contrib/void/browser/void.contribution.ts
rename to src/vs/workbench/contrib/orcide/browser/orcide.contribution.ts
index 35c89184c08..4d4b6508b6e 100644
--- a/src/vs/workbench/contrib/void/browser/void.contribution.ts
+++ b/src/vs/workbench/contrib/orcide/browser/orcide.contribution.ts
@@ -1,6 +1,6 @@
/*--------------------------------------------------------------------------------------
- * Copyright 2025 Glass Devtools, Inc. All rights reserved.
- * Licensed under the Apache License, Version 2.0. See LICENSE.txt for more information.
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
*--------------------------------------------------------------------------------------*/
@@ -23,13 +23,13 @@ import './autocompleteService.js'
// import './contextUserChangesService.js'
// settings pane
-import './voidSettingsPane.js'
+import './orcideSettingsPane.js'
// register css
-import './media/void.css'
+import './media/orcide.css'
// update (frontend part, also see platform/)
-import './voidUpdateActions.js'
+import './orcideUpdateActions.js'
import './convertToLLMMessageWorkbenchContrib.js'
@@ -47,13 +47,13 @@ import './metricsPollService.js'
import './helperServices/consistentItemService.js'
// register selection helper
-import './voidSelectionHelperWidget.js'
+import './orcideSelectionHelperWidget.js'
// register tooltip service
import './tooltipService.js'
// register onboarding service
-import './voidOnboardingService.js'
+import './orcideOnboardingService.js'
// register misc service
import './miscWokrbenchContrib.js'
@@ -62,15 +62,20 @@ import './miscWokrbenchContrib.js'
import './fileService.js'
// register source control management
-import './voidSCMService.js'
+import './orcideSCMService.js'
-// ---------- common (unclear if these actually need to be imported, because they're already imported wherever they're used) ----------
+// ---------- Orcide SSO & Profile services ----------
+
+// SSO authentication service (browser-side)
+import './orcideSSOBrowserService.js'
+
+// ---------- common ----------
// llmMessage
import '../common/sendLLMMessageService.js'
-// voidSettings
-import '../common/voidSettingsService.js'
+// orcideSettings (previously orcideSettings)
+import '../common/orcideSettingsService.js'
// refreshModel
import '../common/refreshModelService.js'
@@ -79,7 +84,25 @@ import '../common/refreshModelService.js'
import '../common/metricsService.js'
// updates
-import '../common/voidUpdateService.js'
+import '../common/orcideUpdateService.js'
// model service
-import '../common/voidModelService.js'
+import '../common/orcideModelService.js'
+
+// Orcide SSO service
+import '../common/orcideSSOService.js'
+
+// Orcide user profile service
+import '../common/orcideUserProfileService.js'
+
+// Orcide collaboration service
+import '../common/orcideCollaborationService.js'
+
+// Orcide LangChain integration service
+import '../common/orcideLangChainService.js'
+
+// Orcide Git PR generation & deployment service
+import '../common/orcideGitService.js'
+
+// Orcide Enterprise & Cursor Ultra features service
+import '../common/orcideEnterpriseService.js'
diff --git a/src/vs/workbench/contrib/orcide/browser/orcide.web.services.ts b/src/vs/workbench/contrib/orcide/browser/orcide.web.services.ts
new file mode 100644
index 00000000000..662a6a7906a
--- /dev/null
+++ b/src/vs/workbench/contrib/orcide/browser/orcide.web.services.ts
@@ -0,0 +1,294 @@
+/*--------------------------------------------------------------------------------------
+ * Copyright 2025 Orcest AI. All rights reserved.
+ * Licensed under the MIT License. See LICENSE.txt for more information.
+ *--------------------------------------------------------------------------------------*/
+
+import { Disposable } from '../../../../base/common/lifecycle.js';
+import { Emitter, Event } from '../../../../base/common/event.js';
+import { registerSingleton, InstantiationType } from '../../../../platform/instantiation/common/extensions.js';
+import { generateUuid } from '../../../../base/common/uuid.js';
+
+import { ILLMMessageService } from '../common/sendLLMMessageService.js';
+import { ServiceSendLLMMessageParams, ServiceModelListParams, OllamaModelResponse, OpenaiCompatibleModelResponse } from '../common/sendLLMMessageTypes.js';
+import { IOrcideSettingsService } from '../common/orcideSettingsService.js';
+import { IMCPService } from '../common/mcpService.js';
+import { MCPToolCallParams, RawMCPToolCall } from '../common/mcpServiceTypes.js';
+import { InternalToolInfo } from '../common/prompt/prompts.js';
+import { IMetricsService } from '../common/metricsService.js';
+import { IOrcideUpdateService } from '../common/orcideUpdateService.js';
+import { IGenerateCommitMessageService } from './orcideSCMService.js';
+import { ProviderName } from '../common/orcideSettingsTypes.js';
+
+
+const OPENAI_COMPAT_BASE_URLS: Partial> = {
+ openRouter: 'https://openrouter.ai/api/v1',
+ openAI: 'https://api.openai.com/v1',
+ deepseek: 'https://api.deepseek.com',
+ groq: 'https://api.groq.com/openai/v1',
+ xAI: 'https://api.x.ai/v1',
+ mistral: 'https://api.mistral.ai/v1',
+};
+
+class LLMMessageServiceWeb extends Disposable implements ILLMMessageService {
+ readonly _serviceBrand: undefined;
+ private readonly _abortControllers = new Map();
+
+ constructor(
+ @IOrcideSettingsService private readonly orcideSettingsService: IOrcideSettingsService,
+ ) {
+ super();
+ }
+
+ sendLLMMessage(params: ServiceSendLLMMessageParams): string | null {
+ const { onError, modelSelection } = params;
+
+ if (modelSelection === null) {
+ onError({ message: 'Please add a provider in Orcide\'s Settings.', fullError: null });
+ return null;
+ }
+
+ if (params.messagesType === 'chatMessages' && (params.messages?.length ?? 0) === 0) {
+ onError({ message: 'No messages detected.', fullError: null });
+ return null;
+ }
+
+ if (params.messagesType === 'FIMMessage') {
+ onError({ message: 'Autocomplete (FIM) is not supported in web mode.', fullError: null });
+ return null;
+ }
+
+ const requestId = generateUuid();
+ const abortController = new AbortController();
+ this._abortControllers.set(requestId, abortController);
+
+ this._doSendChat(params, requestId, abortController);
+
+ return requestId;
+ }
+
+ private async _doSendChat(
+ params: ServiceSendLLMMessageParams,
+ requestId: string,
+ abortController: AbortController
+ ) {
+ const { onText, onFinalMessage, onError, modelSelection } = params;
+
+ if (params.messagesType !== 'chatMessages' || !modelSelection) return;
+
+ try {
+ const { settingsOfProvider } = this.orcideSettingsService.state;
+ const providerSettings = settingsOfProvider[modelSelection.providerName];
+ const apiKey = (providerSettings as Record).apiKey as string | undefined;
+
+ if (!apiKey) {
+ onError({
+ message: `API key not set for ${modelSelection.providerName}. Please configure it in Orcide Settings.`,
+ fullError: null
+ });
+ return;
+ }
+
+ const baseUrl = this._getBaseUrl(modelSelection.providerName, providerSettings);
+ if (!baseUrl) {
+ onError({
+ message: `Provider "${modelSelection.providerName}" requires the desktop app. Use OpenRouter instead.`,
+ fullError: null
+ });
+ return;
+ }
+
+ const messages = this._buildMessages(params.messages, params.separateSystemMessage);
+
+ const body: Record = {
+ model: modelSelection.modelName,
+ messages,
+ stream: true,
+ };
+
+ const headers: Record = {
+ 'Content-Type': 'application/json',
+ 'Authorization': `Bearer ${apiKey}`,
+ };
+
+ if (modelSelection.providerName === 'openRouter') {
+ headers['HTTP-Referer'] = 'https://ide.orcest.ai';
+ headers['X-Title'] = 'ide.orcest.ai';
+ }
+
+ const response = await fetch(`${baseUrl}/chat/completions`, {
+ method: 'POST',
+ headers,
+ body: JSON.stringify(body),
+ signal: abortController.signal,
+ });
+
+ if (!response.ok) {
+ const errorText = await response.text();
+ onError({
+ message: `API error (${response.status}): ${errorText}`,
+ fullError: new Error(errorText)
+ });
+ this._abortControllers.delete(requestId);
+ return;
+ }
+
+ const reader = response.body!.getReader();
+ const decoder = new TextDecoder();
+ let fullText = '';
+ let fullReasoning = '';
+ let buffer = '';
+
+ while (true) {
+ const { done, value } = await reader.read();
+ if (done) break;
+
+ buffer += decoder.decode(value, { stream: true });
+ const lines = buffer.split('\n');
+ buffer = lines.pop() || '';
+
+ for (const line of lines) {
+ const trimmed = line.trim();
+ if (!trimmed.startsWith('data: ')) continue;
+
+ const data = trimmed.slice(6);
+ if (data === '[DONE]') {
+ onFinalMessage({ fullText, fullReasoning, anthropicReasoning: null });
+ this._abortControllers.delete(requestId);
+ return;
+ }
+
+ try {
+ const parsed = JSON.parse(data);
+ const delta = parsed.choices?.[0]?.delta;
+ if (delta?.content) {
+ fullText += delta.content;
+ onText({ fullText, fullReasoning });
+ }
+ if (delta?.reasoning_content || delta?.reasoning) {
+ fullReasoning += (delta.reasoning_content || delta.reasoning);
+ onText({ fullText, fullReasoning });
+ }
+ } catch {
+ // skip malformed SSE chunks
+ }
+ }
+ }
+
+ onFinalMessage({ fullText, fullReasoning, anthropicReasoning: null });
+ this._abortControllers.delete(requestId);
+ } catch (err: unknown) {
+ if (err instanceof Error && err.name === 'AbortError') return;
+ const message = err instanceof Error ? err.message : String(err);
+ onError({ message, fullError: err instanceof Error ? err : new Error(message) });
+ this._abortControllers.delete(requestId);
+ }
+ }
+
+ private _getBaseUrl(providerName: ProviderName, providerSettings: Record): string | null {
+ const known = OPENAI_COMPAT_BASE_URLS[providerName];
+ if (known) return known;
+
+ if (providerName === 'openAICompatible' || providerName === 'liteLLM' || providerName === 'awsBedrock') {
+ return (providerSettings.endpoint as string) || null;
+ }
+
+ return null;
+ }
+
+ private _buildMessages(
+ messages: unknown[],
+ separateSystemMessage: string | undefined
+ ): { role: string; content: string }[] {
+ const result: { role: string; content: string }[] = [];
+
+ if (separateSystemMessage) {
+ result.push({ role: 'system', content: separateSystemMessage });
+ }
+
+ for (const msg of messages) {
+ const m = msg as { role: string; content: unknown };
+ if (typeof m.content === 'string') {
+ result.push({ role: m.role === 'model' ? 'assistant' : m.role, content: m.content });
+ } else if (Array.isArray(m.content)) {
+ const textParts = m.content
+ .filter((p: Record) => p.type === 'text' || p.text)
+ .map((p: Record) => (p.text as string) || '')
+ .join('');
+ if (textParts) {
+ result.push({ role: m.role === 'model' ? 'assistant' : m.role, content: textParts });
+ }
+ }
+ }
+
+ return result;
+ }
+
+ abort(requestId: string) {
+ const controller = this._abortControllers.get(requestId);
+ if (controller) {
+ controller.abort();
+ this._abortControllers.delete(requestId);
+ }
+ }
+
+ ollamaList(params: ServiceModelListParams) {
+ params.onError({ error: 'Ollama model listing is not available in web mode.' });
+ }
+
+ openAICompatibleList(params: ServiceModelListParams) {
+ params.onError({ error: 'Model listing is not available in web mode.' });
+ }
+}
+
+
+class MCPServiceWeb extends Disposable implements IMCPService {
+ readonly _serviceBrand: undefined;
+
+ state: { mcpServerOfName: Record; error: string | undefined } = {
+ mcpServerOfName: {},
+ error: undefined,
+ };
+
+ private readonly _onDidChangeState = new Emitter();
+ readonly onDidChangeState: Event = this._onDidChangeState.event;
+
+ async revealMCPConfigFile(): Promise { }
+ async toggleServerIsOn(): Promise { }
+ getMCPTools(): InternalToolInfo[] | undefined { return undefined; }
+
+ async callMCPTool(_toolData: MCPToolCallParams): Promise<{ result: RawMCPToolCall }> {
+ throw new Error('MCP is not available in web mode.');
+ }
+
+ stringifyResult(result: RawMCPToolCall): string {
+ return JSON.stringify(result);
+ }
+}
+
+
+class MetricsServiceWeb implements IMetricsService {
+ readonly _serviceBrand: undefined;
+ capture(): void { }
+ setOptOut(): void { }
+ async getDebuggingProperties(): Promise