- A marketplace index given as a local Windows path (`C:\market\index.json`)
resolves its packages next to it; only URLs are joined with `/`.
- HTTP requests to `localhost` try IPv4 loopback first, then IPv6: local
servers such as Ollama usually listen on IPv4, and on Windows a refused
`::1` cost about two seconds per request.
- Tests that assumed Unix: an absolute program path is the platform's, a
manifest rewritten by a test may have CRLF line ends, the precompiled-cache
test replaces the cache file only after the host that maps it is gone, and
the MyBatis test lets its first call build the index before asserting.
- The icon theme test's time limits guard against work growing faster than
the icon count rather than measure the runner.
- A provider result produced after its soft deadline is dropped even when it
is already waiting (the caller was scheduled late or waited on another
plugin first), so the deadline holds on a busy machine. The result is
timestamped when the plugin's thread produces it, so a result that came in
time is still used when it is read late.
- Each precompiled-component write uses its own temporary file: two threads
storing the same component could rename a half-written file into place.
- Tests: the cache-corruption case replaces the file instead of overwriting
the one a running component maps; the yield test no longer counts on a
tick rate; a test that runs a shell script is Unix-only like its
neighbours.
- Plugin web pages declare `@types/node` for their Vite configs instead of
finding the repository's.
- Themes: a plugin theme is an `appearance.theme` value
(`plugin:<id>/<theme>`), offered by Settings › Appearance (and the
preferred themes of Sync with OS), Quick Switch, the toolbar gear menu and
Welcome › Customize. The project window selects it in the plugin host;
picking a built-in theme clears it. While its plugin is off, the built-in
theme of its kind shows and the choice is kept.
- File icon themes: chosen in Settings › Appearance › File icon theme and
kept in `appearance.fileIconTheme`, so every window follows.
- Keymap: plugins' default shortcuts show in Settings › Keymap as the
defaults of their actions: removable, changeable, resettable and part of
conflict checks.
- Problems: a plugin's problems are withdrawn when it stops, fails, is
disabled or uninstalled. Settings › Inspections lists them under Plugins by
plugin name; stored overrides of `plugin:` producers parse correctly.
- Status bar items of plugins are named in the status bar menu and can be
hidden.
- Languages added or removed by plugins refresh Override File Type, the
Code Style pages and Inspections without a restart.
- Uninstalling a plugin deletes the secrets it declared.
- The Settings window follows plugin changes made elsewhere.
- The plugin system is marked Preview (Settings › Plugins, README); Harbor
Night is versioned 0.1.0 like the other official plugins.
- Release: the official plugins are packed, signed (secret
PLUGIN_SIGNING_KEY) and indexed into the release as
`plugins-index.json`; released builds use it as the default marketplace.
Without the key the step is skipped.
- Graphviz: `.dot` / `.gv` files open beside a live preview (a web view
rendering with Graphviz compiled to WebAssembly) in any layout engine,
with zoom, pan, Fit and SVG / PNG export through the save dialog. What
Graphviz reports goes from the page to the plugin's code, which publishes
it as problems on the named line. A DOT language, file icons and a
New Graphviz Graph template.
- Regex Tester: a tool window whose html view sends pattern, flags, text and
replacement as you type; the plugin matches with Rust's regex (linear time)
and answers with matches, groups and the replacement in UTF-16 offsets.
Use Selection and Test Selection take the editor's selection.
- License Header: files without a copyright / SPDX header are reported when
they open and on save; a quick fix and a command add one in the file's
comment syntax (after a shebang or encoding line); a project scan in a
background task reports the rest. Holder and license are settings.
- Harbor Night becomes an official plugin and the one source of the theme
files: `openidea-plugin new --template theme`, the theme docs and tests
start from it.
- Tool windows' renders and events carry the window's active editor, as
commands do, so a view's buttons can act on what the user is editing.
- knip leaves plugins' web pages (projects of their own) alone.
- Remove the Kubernetes official plugin.
- `hello` and `language-toy` move from `plugins/` to
`crates/ide-plugin/tests/fixtures/`: they stay what the host's tests run
against, but are no longer listed as plugins of the repository.
- A `jobs` fixture takes over what only Kubernetes exercised: a tree view
filled by a pinned program, a terminal for the activated entry in the
invoking window, string and number settings, locally and in remote
projects.
- `plugins/` now holds only the official plugins; `build.sh`, CI and the
debug plugin catalog follow.
Install Plugin from Package File now takes an `.oiplugin`, a `.zip` or a
package folder's `plugin.toml`, and goes through the same install page
(capabilities, signature, consent) as every other install.
- A zip may hold the package at its root or in its only folder, as zipping
the folder makes; archiver metadata (`__MACOSX`, `.DS_Store`, `._*`) is
left out. A zip without a `plugin.toml` there, such as an IntelliJ plugin,
is refused with a message saying so. Unsafe paths, links and size limits
are checked as for `.oiplugin` files.
- Picking a `plugin.toml` installs its folder.
Co-authored-by: florentvdry <[email protected]>
Plugins can now ship a web page as the UI of a view or custom editor
(`web = "web/index.html"`), so editors built on web libraries are plugins
rather than part of the core.
- Web views: every file under the page's directory is part of the package
(checked, copied on install, covered by the digest and signature) and
served through the `openidea-plugin` URL scheme, under a per-revision
path with a CSP of its own, into an `<iframe sandbox="allow-scripts">`.
An update or reinstall reloads open pages.
- Frame bridge (`window.openidea`), shared by html bodies and web pages:
theme, messages to the plugin's code, `document.get/edit/replace/onChange`
(versioned edits that join the text editor's undo history, Save and dirty
state), `saveFile`/`openFile` through the IDE's dialogs, and IDE shortcuts
the page leaves alone.
- Custom editor layouts: tab, split (Editor and X) or preview over the text
editor, switchable from the tab's actions.
- New points `fileIcons` and `fileTemplates`; new optional capability
`clipboard` for web views.
- Excalidraw official plugin: `.excalidraw` / `.excalidraw.json` open as an
interactive canvas kept in step with the file's text, with self-hosted
fonts, PNG/SVG export, images, file icons, a New Drawing template and
JSON highlighting. Closes#732.
- Fixes: a lock-order deadlock between listing plugins and refreshing
project pins; the dev server ignored edits under `src/features/plugins`.
- `plugins/build.sh` builds and checks web pages; CI typechecks and tests
them.
Co-authored-by: Deng Liu <[email protected]>
Plugin API (breaking; the plugin system is unreleased):
- Remove the runtime `contributions` interface (register-command,
register-language, register-theme). Commands, languages and themes are
declared in plugin.toml only, so everything a plugin contributes goes
through the install preview and consent. The registry drops runtime
scope, `contribute` and `dispose_runtime`; inline `definition` in
language and theme declarations is gone.
- `completion-item.kind` is a string (the 25 LSP kinds; unknown kinds show
no icon), like the other open-ended kinds.
- `lifecycle.activate` and `commands.run` return `types.error` instead of a
string. The host maps it to the matching error kind, and only `failed`
counts against the plugin: cancelling, a missing grant or an unknown
command does not. The SDK's `Plugin` returns `Result<_, Error>`; plain
messages convert to `Error::Failed`.
Runtime:
- Editor providers of several plugins are called at the same time
(`Actor::submit` + `Pending::wait`): the wait is the slowest plugin's,
not the sum, so each gets the full edit-path budget.
Versioning and tooling:
- Components are checked at install and by `openidea-plugin check` for the
plugin API they were built for; another major or a newer minor is
refused with what to do.
- Tests: the SDK's WIT matches the host's, a simulated next-minor host
links every shipped component, every host function has an SDK wrapper,
released APIs only grow (no snapshot until the first release).
- plugins/build.sh builds every checked-in component, records a source
fingerprint next to it, and `--check` fails on stale components; CI runs
it plus fmt, clippy (host and wasm) and tests for the SDK, the official
plugins and the fixtures.
- The API evolution rules and the checklist for a new host function are in
plugins/README.md; the design notes under docs/ are removed.
Rework the plugin system per docs/plugin_plan.md (P0–P8):
- Extension-point registry (ide-extension) so new contribution types register
without touching the kernel; languages, run detectors, providers, views and
UI contributions go through it.
- Per-plugin capability consent with a risk-graded ledger; process
capabilities are pinned to resolved binary paths and hashes.
- Async, actor-per-plugin Wasm runtime with lazy activation, cancellation,
events, long-running tasks and idle reclamation.
- Plugin host moved into ide-host, shared by local and remote projects.
- Distribution: install/package tooling (openidea-plugin bin) and a static
market index.
- WIT frozen as openidea:[email protected]; Rust SDK with mock host.
- Ten official validation plugins under plugins/official.
A remote window sends a command to openidea-server only when the server registers it; none of the db_* commands were registered, so they ran locally, where a remote window has no project ("no project is open in this window"). The command bodies move from src-tauri into ide_host::ops::db, the Tauri commands become thin wrappers, and the remote dispatcher registers the same ops, with cancellation for execute / table page / explain. db_export_file stays local because exports are written on the user's machine.
Fixes#1019
Co-authored-by: a-rookie-of-C-language <[email protected]>
oxfmt ran only below an oxfmt configuration and reused the Prettier settings. It now has its own settings group and page (path, enabled languages, formatting provider, run on save) next to Prettier. For a language with an external formatter, oxfmt formats it when enabled for that language and either an oxfmt configuration is found above the file or oxfmt is the selected provider; otherwise Prettier, when enabled. Turning Prettier off for a language still leaves it to the language server. New Reformat with Prettier / Reformat with oxfmt commands run that tool regardless of the settings and report languages it cannot format.
Co-authored-by: d0whc3r <[email protected]>
A linked worktree created below the project while it was open never joined the repository set: its files had no status entries or gutter marks until the project was reopened.
A linked worktree's `.git` is a gitfile and its HEAD lives under `<main>/.git/worktrees/<name>/`. The watcher classified both as non-metadata, `.git/worktrees` was never watched, and the repository rescan only reacted to `<repo>/.git/HEAD`. The watcher now reports the `.git` path and `.git/worktrees/**` (without `.lock` files) as VCS changes and watches `.git/worktrees`; the rescan accepts a worktree's `.git`; and the Add/Remove Worktree commands refresh the repository set directly, so both the in-IDE and the external `git worktree` paths are covered.
Fixes#927.
Co-authored-by: a-rookie-of-C-language <[email protected]>
Root cause, two parts:
- An explicit save (Save All before a checkout, before running, before Commit) also wrote documents that were not modified, running save actions such as stripping trailing whitespace and adding a final newline on them — files the user never touched gained whitespace-only changes. Saves now skip clean documents, as autosave already did.
- After our own VCS operations rewrote files (checkout, rollback, stash, patch, ignore, commit/worktree hooks, Directory Compare), clean editor buffers were only refreshed by the file watcher, which can miss a rewrite that keeps the length and the timestamp's millisecond. Those operations now reload clean buffers synchronously before returning, keeping each document's chosen encoding; modified buffers keep the existing conflict handling.
Fixes#893
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Root cause: shelved file paths are relative to the repository they were shelved from, but Compare with Local, Show Diff, navigation and Unshelve joined them to the selected VCS root. In a project folder that is not itself a repository (or holds several), the local file was not found and Compare with Local stayed disabled. Shelves now record their repository (older shelves fall back to the primary repository), imported patches record the current one, and every shelf action resolves paths against it, with Windows separators handled. Stash and Apply Patch already kept their repository.
Fixes#875
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Pasting an image, audio or video from the clipboard into a local terminal saves the bytes to the per-user terminal cache (20 MB limit, files older than 24 h cleaned up on the next paste, private permissions) and inserts the shell-quoted path without running anything. Copied files paste their original paths, plain text pastes unchanged, and SSH sessions keep the existing remote image-paste route. Paths are quoted per shell (zsh/bash, fish, PowerShell, cmd.exe); fish quoting now escapes backslashes and single quotes.
Fixes#838
Co-authored-by: kkMihai <[email protected]>
Multi-file refactorings could drop LSP document versions, overwrite content changed after a preview, or leave earlier files saved after a later write failed. Workspace edits now keep server versions and preview fingerprints, are validated on a staging copy, snapshot disk and open buffers, and roll back on commit failure (retaining recovery files if rollback fails). The whole edit is one Undo/Redo step in editors and in the notification. Version reads and transaction work run off the async workers. Closes#461.
Co-authored-by: shohruh-genius <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Closing a project only cancelled its agents and notebooks; its window's requests, run processes, terminal shells and debug sessions kept running until app exit, and the language server shutdown was a detached task a closing app could drop (orphaned jdtls). Closing now cancels the window's requests, kills its run processes and shells, stops its debug sessions and waits for the language servers to shut down; other windows are untouched. Terminals are keyed by owner window so they can be closed per window.
Co-authored-by: misswell <[email protected]>
LightEdit created its project as trusted and refresh_project_trust skips light projects, so opening a loose notebook detected Python environments in the file's folder and could run a repository-shipped .venv/bin/python without a trust prompt. LightEdit now starts restricted and stays restricted when folder trust changes, since one session can hold files from unrelated folders; notebooks still open and save, while interpreter discovery, kernel execution and external formatting are refused. Opening the folder as a trusted project enables execution as before.
Fixes#849
Co-authored-by: kkMihai <[email protected]>
In a remote-project window, pasting a clipboard image into the terminal uploads it to the SSH host that owns the terminal (new term_store_image command over the existing remote RPC) and inserts the POSIX-quoted path after a successful upload, without a newline. Images go to a private per-user terminal-images directory (0700/0600, UUID names, no-follow descriptor-relative writes) and expire after 24 hours on the next upload. Failures notify and insert nothing; text paste and local terminals are unchanged. Images over 20 MiB are rejected in both the frontend and the host.
Co-authored-by: dvictor357 <[email protected]>
Browse in the Remote Development dialog failed with "no project is open in this window" on the welcome screen, and in untrusted project windows: remote_bootstrap_list was not classified in the restricted-mode allowlist, so IPC authorization required a trusted project before the command reached SSH. The listing itself already used the selected SSH configuration and never depended on a project.
remote_bootstrap_list and deploy_test_connection are now allowed alongside the other application-level remote commands; both only connect or list remote paths and run no project code. Every other command used by the dialog and the welcome screen's remote entries was checked and is already classified.
Fixes#672
Two folders can now be compared from the project view (Compare Directories with two folders selected, or Compare With… on one folder, also in Find Action). The result tree marks entries as only on left, only on right, contents differ or identical, with a name filter and a show-identical toggle; double-click opens the existing diff editor, and files or whole subdirectories can be copied to either side (overwrite and delete ask first, extra files in the target are kept). Comparison runs in the background with progress and cancel, honours the project's exclusions, and works for remote projects through the same file commands.
The comparison tree and diff preview are shared with the Git folder/revision comparison.
Verified on macOS (subdirectories, Chinese names, binary files, copy both ways, delete, cancel on large files); Windows and Linux not run.
Fixes#520
Help › About showed no version, build or runtime in untrusted project windows and on the welcome screen.
Root cause: the restricted-mode allowlist added with project trust missed app_build_info and other application-level commands, so they were rejected wherever the window had no trusted project; the frontend then cached the failed build info for the whole session.
Fix: classify all registered commands and allow the 24 that only read application information or change the user's own application state (build info, log location, update checks, cache invalidation, file clipboard, JDK download, Docker settings, database export paths, patch export, system environment); JDK download now uses the application tool directory instead of project tool settings. Execution commands (run, build, debug, language servers, tool install from project settings) stay blocked. Build info is retried after a failure instead of being cached. Verified on macOS in an untrusted project and on the welcome screen; Windows not run.
Related to #519
With Transparent native-to-ascii conversion on, pasting or typing existing \uXXXX escapes into a .properties file and saving wrote them back as \u005CuXXXX, so the file on disk changed meaning.
Root cause: the shared properties encoder escaped the backslash of any valid ASCII Unicode escape. It now writes ASCII escapes as they are and only converts non-ASCII characters; a literal backslash right before a non-ASCII character is still protected. The same encoder serves every write path, so normal/auto save, find and replace in open and closed files, workspace edits, Local History restore and partial Git stage/commit are all covered.
Verified on macOS following the reporter's steps (paste escapes, save, reload externally); Windows and Linux not run.
Fixes#519
New terminals typed the virtualenv activation command for the wrong shell: on Windows the default terminal is PowerShell, but the activation line was chosen from $COMSPEC (cmd), so PowerShell just echoed "...\activate.bat" and the project interpreter was not activated.
Root cause: terminal_activation guessed the shell from $SHELL / $COMSPEC instead of the shell the PTY actually starts. Same class on macOS/Linux when the inherited $SHELL differs from the login shell the terminal uses, and for a blank configured shell.
Fix: the host resolves the shell once with the terminal's own resolve_shell and uses it both to start the PTY and to pick the activation command; terminal_activation takes the resolved shell and no longer reads the environment. Tests cover PowerShell/cmd paths, blank settings and a host-level run with an unrelated $SHELL. Verified in the app on macOS (default zsh and configured bash); not run on Windows.
Fixes#631
Projects now open with a user-owned trust decision. The prompt offers Preview in Restricted Mode, Don't Open and Trust Project, with an optional trusted parent folder; preview is the default focus so Enter never grants trust.
Restricted projects keep browsing, editing, saving, search and highlighting. Project-controlled execution is denied by default in the backend: run, debug, build, tools, language servers, plugins and Git commands that could honour repository configuration. Trusting a project enables those paths without reopening it, and decisions can be revoked in Settings.
Terminals stay available when the user opens one, without project shell settings, environment or virtualenv activation. A shell prompt that runs git in the folder can still honour the repository's core.fsmonitor.
Fixes#462
Open files only reloaded from file watcher events, so a change the watcher skipped stayed stale in its tab: excluded and git-ignored folders, files outside the project, and missed events.
- Re-check open documents against disk when the window gains focus, off the UI thread and debounced. Clean documents reload, dirty ones keep the existing warning, and unchanged ones cost one metadata call.
- Refresh the project tree and Git status on the same focus event.
- Add "Synchronize external changes when switching to the IDE window" under System Settings, on by default.
Fixes#563
The server choosers listed every configured server without checking mapping coverage or exclusions, so choosing the wrong one silently skipped the files.
- Add a shared eligibility check, available through desktop IPC and host RPC, that never contacts a server.
- Filter Upload to, Download from, Compare and Delete choosers by it. A selection lists a server if it covers at least one path, and the rest are reported as skipped.
- Explain why the default server cannot take a selection, by file name, instead of doing nothing. Apply the same exclusion rules when a transfer runs.
Fixes#538
C/C++ files in a CMake project ran as standalone compiler commands, so multi-source programs failed to link. Single-file debugging selected CodeLLDB although the language uses lldb-dap. File aliases such as /tmp and /private/tmp could apply one rename edit twice. CMake command names were highlighted as variable definitions.
- Add CMake Configure, Build and CTest configurations, and read the File API codemodel after configuring to discover executable targets and their sources. Context runs select the owning target and build it first. Configuring only runs before the first build, since a configured build directory regenerates by itself.
- Debug C/C++ files and CMake targets with lldb-dap, and map CMake's recorded source root to its canonical path so breakpoints resolve.
- Coalesce file aliases and duplicate edits before preview and application, deduplicate references, and avoid reopening an open document through an alias.
- Replace the CMake syntax mode with command, argument keyword, predefined variable, boolean, number, string, comment and expansion highlighting.
Properties documents passed through charset decoding alone, leaving Unicode escapes in the shared document text.
- Add a default-off "Transparent native-to-ascii conversion" setting under the properties encoding and a stable action. Changing it reloads clean properties buffers in place; dirty buffers keep their codec.
- Decode eligible escapes and surrogate pairs when constructing documents, and save non-ASCII as uppercase escapes in pure ASCII. Backslash pairs, malformed escapes, unpaired surrogates and line terminator escapes stay literal, so an edit cannot split a property across lines.
- Use the same codec for search, closed-file readers, Git diffs, staging and partial commits. Clean saves and undone edits preserve the original bytes.
Fixes#519
Deployment only supported SFTP, so a web root on the same machine or on a mounted share still needed an SSH server.
Servers now have a type: SFTP or Local or mounted folder. A local server has a folder and optional web URL and shares upload on save, upload and download, delete, compare and sync, excludes, mappings and the Remote Host view with SFTP through one backend filesystem. Copies never read the whole file into memory, a file is never copied onto itself, and Test Connection checks the folder exists and is writable. Existing servers stay SFTP.
Fixes#467
Project rows only showed generic folder and filename icons, so JVM modules, packages and declarations looked alike.
Rows now show Maven and Gradle project and module icons, packages, Spring configuration and Boot application classes, runnable classes, test classes, Java and Kotlin declaration types, and generated, compiled and javadoc output folders. Editor tabs, Goto File and Recent Files use the same resolver. Types come from a bounded syntax parse of visible files, served locally and over remote RPC.
Spring stereotypes keep their ordinary type icons, and .class files stay binary.
Fixes#347
Workspaces open several local project folders in one IDE session (File › New / Open / Manage Workspace…, or Attach when opening a project, which creates a workspace automatically for a plain project window). Member folders are the Project view roots and take part in indexing, Find in Files, Git, language servers, run configurations and builds; agent tasks choose which member they work in. Window › Merge All Project Windows groups project windows into one window with project tabs (switch, reorder, close, move to a new window), restored on reopen.
Closes#241Closes#198Closes#286
The merge view blamed both side panes against HEAD, so lines that only exist on the merged branch showed as Not Committed Yet. vcs_blame takes an optional revision (validated, passed to git blame --contents -); the merge view blames Yours on HEAD and Theirs on MERGE_HEAD (swapped during a rebase).
Co-authored-by: a-rookie-of-C-language <[email protected]>
- Git › Show History is offered for folders, multi-selection and the project root, not just single files.
- The Push dialog lets you pick any configured remote; pushing to another remote keeps the upstream's branch name and shows outgoing commits against that remote's branch.
- The Changes toolbar gains New Changelist (changelists already supported new/edit/delete/set active/move).
- Compare with Current gains Show Diff, opening the whole-project diff between the branch and HEAD.
- Merge view: F7 / Shift+F7 navigate conflicts, the three panes scroll together, and each side pane can be annotated with Git Blame of its own content.
- Windows-only test fixes in ide-lsp and ide-sdk.
Fixes#343Fixes#310Fixes#358Fixes#348Fixes#320
Refs #317
Co-authored-by: a-rookie-of-C-language <[email protected]>
Adds Settings › Build Tools › Gradle: Gradle JVM (defaults to the Project JDK), distribution (wrapper or local installation with its home) and Gradle user home, stored in the project or global settings.
Sync and Gradle tool-window tasks use the configured JVM, launcher and GRADLE_USER_HOME. Run configurations keep their own choices: one that uses the wrapper runs gradlew, one that runs plain `gradle` resolves it from the local installation, then the pinned toolchain, then PATH; an explicit JAVA_HOME in the configuration wins over Gradle JVM. Derived defaults are applied at launch and not saved into run configurations. New Gradle configurations start with the wrapper off when the project uses a local installation.
Fixes#232
Git blobs were always decoded as UTF-8, so files in GBK or other legacy encodings showed every line as changed in the gutter, diff, blame and commit views, and staging/committing could re-encode them wrongly.
Blob text is now decoded and encoded with the file's encoding: the open document's encoding, else detection on the working file with the project default as fallback, else detection on the blob. Covers line hunks, file-at-revision, blame, stage patch/hunks, commit, conflict versions, diff text, and the agent worktree's file_at, partial commit and patch helpers. Text that cannot be represented in the target encoding is reported as an error instead of being written lossily.
Fixes#243
未在 Windows 实机验证。
Detected run configurations (Spring Boot and Java applications, npm scripts, Maven/Gradle tasks, pytest, Cargo, Go, …) could not be removed: the − button was disabled because a removed detection would be found again. As in IntelliJ IDEA, they can now be removed and stay removed: the removed id is stored in the workspace-local run.local.toml (suppressed-ids) and detection skips it; saving a configuration with that id again lifts the suppression. Applies to the Run/Debug Configurations − button, the Delete key in its tree, and Delete in the run configuration chooser. Removing a saved override still restores the detected configuration; temporary configurations are unchanged.
Refs #271
The Git tool window followed one globally selected repository even when multiple roots were registered. Aggregate repository logs and branches, preserve repository identity in selections, history tabs, stashes, diffs and patch commands, and capture repository targets for delayed operations and dialogs. Validate tag names against the captured repository.
Fixes#195
* feat(settings): HTTP Proxy settings for the IDE's outgoing connections
Add Appearance & Behavior › System Settings › HTTP Proxy with three modes:
No proxy, Auto-detect proxy settings (the default; environment proxy as
before) and Manual proxy configuration (HTTP or SOCKS, host and port, a
comma-separated "No proxy for" list with `*` wildcards, optional proxy
authentication). "Check connection…" GETs a URL with the settings as edited
and reports the status or the error.
- ide-core: `ProxySettings` plus routing (no-proxy globs, loopback always
direct, credentials percent-encoded), the current proxy for the process,
curl arguments and child-process variables.
- ide-http: `client::build` / `client::shared` is the one HTTP client
constructor; the HTTP Client requests and the update check go through it.
- ide-tools: curl downloads (tools, JDKs, debug adapters, agent registry,
remote server) follow the setting.
- A manual proxy reaches child processes (language servers, debug adapters,
terminals, git) as HTTP_PROXY / HTTPS_PROXY / ALL_PROXY / NO_PROXY.
- The proxy password is kept in the owner-only saved passwords file
(`proxy-password.json` in the app data directory), not in settings.toml.
Co-Authored-By: Claude <[email protected]>
* fix(host): Allow the Unix-only post-start test helpers on Windows
Co-Authored-By: Claude <[email protected]>
---------
Co-authored-by: Claude <[email protected]>
The remote server read the login shell's PATH once and cached it, had no project-level environment, and changed environment variables only took effect after reinstalling or a manual restart.
- Every openidea-server start re-reads the remote login shell's full environment (`$SHELL -ilc env -0`), with the cached PATH only as a fallback when the shell doesn't answer.
- A project's `.devcontainer/devcontainer.json` (or `.devcontainer.json`) applies on remote hosts: `remoteEnv` (with `${localEnv|containerEnv|env:X[:default]}`, workspace variables and `null` to unset) reaches every child process through one environment overlay (terminals, run configurations, language servers, debuggers, build tools, git), and `postStartCommand` (string, array or parallel object) runs once per server start in the project root as a cancellable background task; a failure raises a notification with the exit code and the last output lines without blocking the project.
- Reload Environment (`remote.reloadEnvironment`, File menu and Find Action) re-resolves the login shell and `remoteEnv` without restarting the server, starting from the process's original environment so prepended PATH entries don't pile up; it lists the changed variables, notes that running processes keep their environment, and offers to restart language servers.
- The JSONC reader moves to `ide_core::jsonc` and is shared with ide-run.
Claude-Session: https://claude.ai/code/session_01Dq6jQQn8ZhRfkkyj3PRutA
Files can now be opened without a project. A file dropped on the Welcome screen, picked with File › Open File…, or passed on the command line or to a second instance opens in a lightweight window: editor tabs only, with no project tree, indexing, language servers, VCS or project tool windows. Syntax highlighting, find, save, undo and Local History still work. More files opened later join the same window as new tabs. Open as Project in the status bar opens the file's directory as a full project, following the open-project policy, and reopens the file there.
Backend: a light session reuses Project with an unindexed index, no LSP or VCS, and a flat watch on each opened file's directory. It is never reused as a project for the same root. Previously a file passed at launch opened its parent directory as a project.