Running a console added a new Result N tab per run. As in IntelliJ, a run now replaces that console's unpinned result tabs (in place of the first of them); a run without result sets keeps them and shows Output. Pin Tab (tab menu or the result toolbar) keeps a result: its close button becomes Unpin and close gestures spare it; Close All but Pinned closes the rest. Explain Plan replaces only an unpinned plan tab, and the 12-tab limit never evicts pinned or just-created tabs. The shared Tabs component gets an opt-in pinned item flag.
Co-authored-by: Mr0Bread <55754540+Mr0Bread@users.noreply.github.com>
Select Next / Previous Tab for database results get default shortcuts in every keymap preset, the same keys as editor-tab navigation (IntelliJ macOS ⇧⌘] / ⇧⌘[ and ⌃→ / ⌃←, IntelliJ Windows/Linux Alt+→ / Alt+←, VS Code and Eclipse their editor-tab keys). They apply while focus is in Results (tracked with focusin so it survives a replaced grid or tab) and move focus to the destination tab; elsewhere the keys keep switching editor tabs.
Co-authored-by: Mr0Bread <55754540+Mr0Bread@users.noreply.github.com>
The JSON extractor converted numeric cells through JavaScript Number before JSON.stringify, rounding BIGINTs and high-precision decimals in the preview, Copy as JSON, the dialog clipboard and file export. Numeric cells are now written as normalized decimal text (sign, leading zeros and an empty fraction normalized, digits and exponent kept); non-finite or non-decimal text stays a string as before.
Refs #3105
Co-authored-by: LunarFeller <269972968+LunarFeller@users.noreply.github.com>
Result sorting, filter value order and selection Min/Max compared numeric cells through JavaScript Number, so BIGINTs beyond 2^53 and high-precision decimals that round to the same double kept the wrong order. The comparator still uses the float difference when it is non-zero (rounding is monotonic) and compares the decimal digits and exponent order for rounded ties.
Refs #3105
Co-authored-by: LunarFeller <269972968+LunarFeller@users.noreply.github.com>
Commit Message History opened below its button, over the message field, and the menu reserved an empty icon column. It now opens above the Amend bar, aligned with the message's left edge, and Menu takes iconColumn={false} to leave out the icon column for rows without icons.
Co-authored-by: ffgenius <+ffgenius@users.noreply.github.com>
Database result tabs get Close, Close Others, Close All, Rename Tab, Select Next Tab and Select Previous Tab from the right-click menu or Shift+F10. They are actions, so they can also be bound in the keymap. Close, Close Others and Rename act on the clicked tab without selecting it, which keeps its hover look while the menu is open (showContextMenu takes an optional owner element). Navigation starts from the active tab and wraps through Output. Output, consoles and connections are never closed, and a renamed Query Plan keeps its title when the plan is replaced.
Blocking prompts (promptInput, chooseItem, pickItems, message dialogs) now suspend workbench shortcuts while open, so typing in Rename Tab can't edit the query console behind it. In plain text fields, Backspace/Delete with a modifier stays native text deletion.
Co-authored-by: Mr0Bread <55754540+Mr0Bread@users.noreply.github.com>
The database Results view uses the unpadded compact tab strip, so the selected Output tab touched the Services pane edge. The Results strip now has a --space-2 inline inset of its own; other compact strips are unchanged.
Co-authored-by: Mr0Bread <55754540+Mr0Bread@users.noreply.github.com>
Git Branches had a fixed size (380 px, 440 px with several repositories, at most 440 px of list), so long branch names were cut off and only about a dozen branches fit. Its right edge, bottom edge and bottom-right corner now resize it within a minimum size and the window. The popup keeps its anchored top-left corner, the branch list fills the new height, and the last size is kept in localStorage and used on the next open.
Popup gains resizable, minWidth, minHeight, initialSize and onResized, with the same meaning as on Dialog, so other anchored popups can opt in later. The e2e test measures the popup after its open animation.
Co-authored-by: formiat <29867335+formiat@users.noreply.github.com>
* feat(python): manage every interpreter from a Python settings folder
Settings › Languages & Frameworks now groups Python settings in one folder: All Interpreters (new), Dependencies (the project interpreter and its packages), Docstrings (split out of the interpreter page) and Ruff. All Interpreters lists interpreters detected on the machine, the ones other recently opened projects use and the ones added there, with a search field, PyCharm's "hide interpreters of other projects" and "show interpreter paths" toggles, and + / − to add an interpreter or remove it from the list (hidden, never deleted; a removed project interpreter falls back to the project virtualenv).
Each interpreter's source has its own icon (virtualenv, conda, uv, Poetry, pyenv/mise/asdf, system) in the list, the Add Interpreter dialog, the interpreter combo and the status bar menu. The IDE-wide list and its view options are global settings that a project cannot override; removed interpreters also disappear from the interpreter combo and the status bar popup.
* fix(python): compare interpreter paths by their own case rules and cap probes
A POSIX interpreter path kept only its own case (Linux allows `/opt/Python` and
`/opt/python` side by side); only Windows drive/UNC paths are folded now, and the
status bar uses the same key as the list. A configured `~/…` interpreter is matched
against the absolute path the backend resolves it to, so the "Project interpreter"
badge and removing it in use keep working without the frontend knowing the home
directory.
`sdk_python_project_interpreters` probes at most four recent projects at a time
instead of one thread per project, so opening All Interpreters does not start ~30
pythons at once. The hidden-but-in-use interpreter stays selectable in the combo and
status popup (custom entry / current fallback); that is now documented on `exclude`.
---------
Co-authored-by: arookieofc <arookieofc@gmail.com>
The Command Execution Policy and the permission card treated any request titled `Run …` as a shell command, but the title is free text the agent writes: a Codex request for wider sandbox access titled `Run git status` was approved by an allow entry `git status`. Only a tool call of kind `execute` now counts as a command, and only its structured `rawInput.command` is evaluated and shown; other requests ask with their own title. A command approval that also grants network access can still be blocked but is never auto-approved. Permission entries carry the command, so the card no longer parses the title; the native Codex driver puts the resolved command and any network context into rawInput.
Co-authored-by: rohitdanda <10144914+rohitdanda@users.noreply.github.com>
The locator resolves to two leaf spans — the comment tokenizes as
multiple spans — so the strict-mode expect flakes. Every other
multi-match token in the spec already uses .first().
Snowflake is a built-in data source kind: connection dialog, key-pair, browser single sign-on, password or token sign-in, the database tree, SQL consoles, and Snowflake-aware SQL assistance and syntax colours. The driver speaks Snowflake's session protocol over the existing reqwest + rustls stack, with no JDBC/ODBC or native library and no new package. Metadata is read with SHOW / DESCRIBE, which need no running warehouse; introspected names are kept on disk for completion.
Co-authored-by: vvnadolskyy <12991410+vvnadolskyy@users.noreply.github.com>
Switching a theme with several windows open flickered for seconds: the plugin theme is shared by every window, and each window put back the theme its own settings named whenever it changed, before those settings caught up. Windows now act on the plugin theme only when their own selection changes, and applying the theme already shown keeps its stylesheet instead of replacing it.
Theme previews in the gear menu, Quick Switch and Settings waited 500 ms, and on themes written with hsl() or color-mix() the terminal took up to a second to read its colours: each token was resolved through a new element inserted under the root, restyling the whole page every time. Previews now show at once, and token colours resolve through one element kept for it.
The built-in One Light and One Dark themes are removed in favour of the One Dark Pro plugin; settings naming them read as Islands Light and Islands Dark.
With tabs placed left or right, the tab column was sized to its longest label (140–260 px) and never shrank, so in a narrow split group a long file name left the editor almost no room. The column is now capped at 40% of its group; long labels truncate and keep the full path in the tooltip. Top and bottom placement are unchanged.
Co-authored-by: Mr0Bread <55754540+Mr0Bread@users.noreply.github.com>
Matches in the Find in Files and Search Everywhere preview use the editor scheme's search result background (IntelliJ's SEARCH_RESULT_ATTRIBUTES, new token --bg-search-result with values for every built-in theme) instead of the lists' SearchMatch yellow, as a background only so syntax colours stay readable. SEARCH_RESULT_ATTRIBUTES now imports into the new token; --bg-search-match keeps coming from SearchMatch.
Closes#2858
Co-authored-by: formiat <29867335+formiat@users.noreply.github.com>
CodeMirror leaves the caret before an inserted snippet that has no fields, so accepting a field like `val` at `root.` put the caret before it. LSP snippets without tab stops, choices or unresolved variables now get a final ${0} stop; SQL functions without parameters had the same problem and get one too. Snippets with fields keep their selection.
Closes#2936
Co-authored-by: jiejie1133 <116809768+jiejie1133@users.noreply.github.com>
Near the window edge CodeMirror caps the hover tooltip's height, but the documentation section kept its own 380px maximum and ran past the popup's border. The tooltip is now a flex column whose sections shrink and scroll within it.
Fixes#2910
A blank console row rendered a U+200B text node to keep its height, and selections and Copy took that node as content. Blank rows now get their height from the row box (minHeight = rowHeight) and render no text.
Closes#2878
Co-authored-by: aconeshana <52204454+aconeshana@users.noreply.github.com>
The splash covers the page and swallows raw mouse presses until it has faded
out. Only one spec waited for it, so the tool window resize test sometimes
pressed on the splash instead of the gap (3 of 15 runs locally). The workbench
fixture now waits for it to be removed.
mermaid 12.1.0 still asks for katex ^0.16, which GHSA-238p-pmpm-9mq7 affects (fixed in 0.18.2). A pnpm override resolves mermaid's katex to 0.18.10; mermaid only uses renderToString, which is unchanged. An e2e test checks that KaTeX math in mermaid labels still renders. The override can go once mermaid is 12.3+.
Co-authored-by: rohitdanda <10144914+rohitdanda@users.noreply.github.com>
A tool window's Options menu gets a View Mode submenu with Dock Pinned (the default), Dock Unpinned and Undock, as actions `toolwindow.viewMode.dockPinned|dockUnpinned|undock` (category Window). Unpinned and undocked windows hide when focus moves to the editor or another tool window, not to a popup, menu or dialog; an undocked window lies over the editor at its side without resizing it, and its inner edge resizes it. The mode is kept per window in the project layout, saved with Tool Window Layouts and reset by Restore Default Layout.
A menu button in a tool window now takes focus when clicked: WebKit doesn't focus clicked buttons, so the menu returned focus to the editor on close and hid a window just switched to Dock Unpinned or Undock.
Co-authored-by: formiat <29867335+formiat@users.noreply.github.com>
The selection-occurrence cache keyed matches by absolute buffer row and relied on onRender to invalidate edited lines, so a full scrollback trimming from row 0, CSI 3 J or clear() shifted cached margin and scrollback rows without invalidation, and a selection trimmed off row 0 left its boxes behind. The cache now anchors a marker at row 0 while populated (any top trim disposes it and clears the cache), invalidates active-screen rows across baseY advances on write, and clears the overlay when a trim removes the selection.
Co-authored-by: dengliu <5108773+dengliu@users.noreply.github.com>
Settings no longer lists a Project Structure page; File › Project Structure…
(⌘; / Ctrl+Alt+Shift+S) opens the standalone dialog, which already had the
same sections. Arrow keys in the dialog's sidebar follow its navigation order.
- A plugin quick fix may change or open files in the project's content
roots (a project window group's members, extra Project Structure
folders), still never git's own files; before, it was disabled for
every file outside the primary root.
- `git init` (New Project › Create Git repository) uses the configured
git executable again.
- Mermaid output is cleaned before it is shown: remote image sources,
external `url()`, `@import` and address strings in its CSS are
removed, so `style`/`classDef` values and HTML labels fetch nothing.
- The reply image e2e test loads a web image only after its button is
clicked; the post-checkout hook test runs in a trusted scope.
- Capability docs list `project.write` as high risk.
- Restricted Mode git: reads run without a signature verifier, hooks
(including config-defined ones), an external diff, filters or a lazy
fetch, also inside submodules; every repository and every git starts
restricted until the project is trusted.
- project.write and plugin quick fixes cannot reach git's own files under
any spelling or through links; project.write is a high-risk grant.
- Built-in web server: each served root has its own port and token; a
file outside the project is served with its folder minus dot names, or
alone when that folder is the home folder or above it; no fixed port.
- Images, references, Markdown links and language-server links reach no
network share other than the one already open.
- Marketplace: entries whose id or version no manifest may carry are
dropped; an index read over the network names nothing on this machine;
network reads are bounded in size and time.
- Agent replies load remote images on a click; the Markdown preview and
Mermaid configuration no longer fetch from other hosts.
The Services tool window listed services nobody added: an injected Docker connection, Spring Boot by default and every configuration that had ever run. Now only added types, connections and registries are listed, removal takes effect at once, an untouched injected Docker connection is dropped from older docker.json files, and the detail pane has a single scrollbar with console controls only (Run/Debug/Stop stay on the window toolbar).
Co-authored-by: qtvbwfn <5848026+qtvbwfn@users.noreply.github.com>
Removing a member from a workspace reset every detected project type, so the remaining members briefly showed folder icons and fell back to name order. The cached types of members still in the same workspace are kept while the rescan runs.
Co-authored-by: shohruh-genius <7658451+shohruh-genius@users.noreply.github.com>
F4 in the Commit tool window opened the selected file, then the tree handled the same key as Enter and opened the diff preview, which took the focus. Tree takes an onJumpToSource handler for F4 / Cmd+Down; the commit and Git Log changed-files trees use it to open the file itself.
Fixes#2696
Translate the project popup actions and the non-empty target error; translate the JDK field label. Fix clippy in ide-jdwp, formatting, RUSTSEC-2026-0486 (rustix 1.1.6) and agent E2E tests that expected the removed floating Quote button.
The terminal Find bar painted matches with the old text-search tokens; it now uses --bg-search-match / --bg-search-match-current (blended over the panel background) like the editor. The active match's decoration goes to xterm's top layer so it stays visible above the selection the search places, and ⌘F with the Find bar already open seeds it from a fresh user selection while keeping the query when the selection is the current match.
Co-authored-by: dengliu <5108773+dengliu@users.noreply.github.com>
With a font whose glyph box is taller than the line height (e.g. font size 18–20 with the default 22px line height), selecting text on one line also painted the rows above and below: growToLineBoxes probed the rows at the glyph box's top and bottom edges, which then fell in the neighbouring rows, and .cm-openidea-selected painted an unclipped inline background at glyph height. Outer rows are now resolved at each marker's vertical midpoint and row seams align to the line boxes (block widgets and zero-width trailing markers handled), and the inline selection background is capped at 1lh in the editor, notebook cells and diff/merge viewers, with a plain colour fallback where lh is unsupported.
Co-authored-by: dengliu <5108773+dengliu@users.noreply.github.com>
- Reasoning and tool calls fold into one run including running calls, so a run
keeps its place while a call finishes. Its summary names what runs now; it no
longer leads with "Reasoning". A folded thought shows its first line. An open
run is bounded and follows its latest call.
- The working / starting / retrying row with its timer ends the conversation
instead of sitting above the composer, for sessions and subagents alike.
- Selecting text no longer pops up a Quote button; Quote stays in the context menu.
- A selection clamped to the conversation ends in its last selectable text, not on
its edge: WebKit painted a selection ending there into the composer, as a
triple-click on the last paragraph showed.
- Sending a message while scrolled up returns to the end, where it shows.
The bookmark gutter's 2px side padding applied to the empty spacer element too, so the column kept 4px in files without bookmarks. The padding now applies only to elements that hold a marker, so the column is 0px until the file has a bookmark.
Co-authored-by: wildcatDownstairs <26499420+wildcatDownstairs@users.noreply.github.com>
The Run console hard-coded the --font-mono stack and --fs-code, so Settings › Tools › Terminal › Font (family, fallback, size, or Use editor font) never reached process output. resolveMonoFont() now resolves the terminal font choice for both xterm and the DOM console, and the console's virtual row height follows the font size (round(size × 1.5), 20px at the default 13px) so rows don't overlap.
Co-authored-by: makise2060 <263516586+makise2060@users.noreply.github.com>
Selecting text in the terminal highlights its other occurrences in the visible rows, like the editor's identifier-under-caret highlight. Only the viewport (plus a few rows of margin) is scanned, matches are cached per logical line and drawn in one overlay layer, recomputation is coalesced to one pass per animation frame, and highlights are cleared during heavy output and redrawn once it settles. Wrapped lines and wide characters map to the right cells; multi-line, very short or whitespace-only selections, the alternate buffer and Find-bar selections are skipped. Settings › Tools › Terminal › Highlight occurrences of selected text turns it off.
Co-authored-by: dengliu <5108773+dengliu@users.noreply.github.com>
Without the preview, `.content` has no definite height and the results pane's `flex: 1` (0% basis) collapsed it to its padding in the system WebKit of macOS 15, so Search Everywhere and Go to File showed no rows. The pane now uses an `auto` basis.
Ending a mouse selection in an agent conversation now shows a small floating
Quote button above it. It takes no focus, so Ctrl+C still copies, and it goes
away when the selection is cleared, the conversation scrolls, Escape is
pressed or something else is clicked. It runs the same agents.quoteReply
action as the context menu, which is unchanged.
Co-authored-by: panda-student <71381346+panda-student@users.noreply.github.com>
The Push dialog's target branch field was free text only. It now completes
from the branches the chosen remote already has (typing, Up/Down, click; a
typed origin/ prefix is accepted). Prefix matches come first, then other
contiguous matches, then looser ones. Enter only takes a row once one was
chosen, free text still creates a new branch, and the "New" hint shows only
for a name the remote doesn't have. The list widens to the longest name up
to 640px, with the full name as a tooltip beyond that.
Co-authored-by: Veng0923 <+Veng0923@users.noreply.github.com>
In the modal Local Changes view (Git tool window), double-click and Enter always opened the diff. `openNode` in `CommitView.tsx` ignored the commit interface. The modal view now opens the source file and the non-modal Commit tool window keeps the diff. A new `vcs.commit.doubleClickOpensDiff` setting (unset = follow the interface) is exposed as Show on Double-Click → Source / Diff / Follow the Interface.
Co-authored-by: aconeshana <52204454+aconeshana@users.noreply.github.com>
Workspace roots always sorted by name and only Maven/Gradle roots had a type icon. Project types are now detected from root build/SDK file names (no file contents or tools are read, up to four concurrent listings) through one registry (projectType.ts) that supplies names, icons, markers and refresh handling; roots show the type's icon, and Sort by Type groups roots by type with natural name order inside each type. Flutter and Vite logos come from Simple Icons (CC0, recorded in THIRD_PARTY_LICENSES.md).
Co-authored-by: shohruh-genius <7658451+shohruh-genius@users.noreply.github.com>
Docker Compose files get Compose Specification completion, hover and validation from yaml-language-server: languages/yaml.toml maps the pinned compose-spec schema to the standard Compose filename globs, and ide-sdk / ide-lsp feed content-detected Compose files and user overrides (Kept / Excluded as !path negations) into yaml.schemas, reconfiguring only when that set changes. The Compose editor completes and navigates (⌘-click / ⌘B) references to declared services, networks, volumes, configs and secrets in depends_on, links, volumes_from, extends.service, networks, volumes, configs and secrets.
Co-authored-by: dengliu <5108773+dengliu@users.noreply.github.com>
Settings › Project Structure › Dependencies lists other projects this one depends on (and, in a workspace, the roots each member depends on). Dependency projects join the content roots, so the index, Project view and run see them, and navigation resolves across them: nav_resolve_module maps an import path to a file in the file's navigation roots, and nav_index_definitions answers bare-name lookups filtered to those roots inside the index (so own-root matches can't evict dependency matches). navigation_roots is memoized for 1 s, and hand-written member_dependencies keys with the other path separator match on Windows.
Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
Oracle data sources now connect through the pure-Rust oracledb thin driver (pinned to 26.0.0-beta.5) instead of ODPI-C, so no Oracle Instant Client, ORACLE_HOME or Instant Client setting is needed; TNS descriptors and tnsnames.ora aliases still work in the Database field. The database tree gains a packages folder for Oracle schemas, and a package's DDL opens as its specification and body. The database guide's Oracle section is rewritten for the thin driver.
Co-authored-by: boenkkk <17746937+boenkkk@users.noreply.github.com>
The changes tree registered drag sources only for rows that already belonged to a changelist, so files under Unversioned Files could not be dragged. Drag sources and drop targets are now separate: every file or folder row drags, and dropping unversioned paths on a changelist runs Add to VCS (git add) before moving them into that list.
Co-authored-by: panda-student <71381346+panda-student@users.noreply.github.com>
A resize drag set document.body.style.cursor, so as soon as the pointer left the 1px handle the element under it (tree, editor, button) showed its own cursor mid-drag. The drag now holds the cursor on <html> with a data-drag-cursor rule that overrides descendant cursors, released on pointerup/pointercancel/window blur, with nested locks restoring the outer cursor. Tool-window gaps, split and stripe handles, the dialog resize grip and database / Git Log column resizing share it, and the handles use ew-resize / ns-resize throughout.
Co-authored-by: makise2060 <263516586+makise2060@users.noreply.github.com>
A Maven goal or Gradle task run from the build tool window carried the JAVA_HOME the build model had when the tree was built, and that value was frozen into the (persisted) temporary configuration, so correcting the JDK in Settings only took effect after a restart, or not at all. For IDE-generated build-tool configurations JAVA_HOME is now derived: Settings (the Maven runner JRE, the Gradle JVM) decide at each launch, a saved configuration drops the derived value, and a dead path no longer outlives its setting. Configurations of the user's own, and Tomcat's JDK field, keep their JAVA_HOME.
Fixes#2433
Co-authored-by: ppxb <17081240+ppxb@users.noreply.github.com>
Small upward scrolls while a reply streamed were still treated as being at the end, so each update pulled the view back down. Following pauses on upward wheel, touch or keyboard input before the browser scrolls, and queued updates can't resume it until the user scrolls down or jumps to the latest reply; streaming, resize and late diagram updates leave the viewport alone meanwhile.
Search Everywhere had a fixed 220px preview and a separate results height cap. It now has a remembered vertical split (initially one third results, two thirds preview); the query keeps focus while resizing and the active result stays visible when the list shrinks. Action names line up with file names, shortcuts stay readable, and scope controls move to a second row in narrow popups.