Fixes#2393
Importing run configurations from .run/ and .idea/ skipped every JarApplication entry because there was no equivalent type. Adds a JAR Application run configuration (path to JAR, VM options, program arguments, JRE, working directory, environment) that runs java [VM options] -jar <jar> [args] and debugs over JDWP like the Application type, and maps JarApplication on import (JAR_PATH, VM/program parameters, working directory, alternative JRE path, envs).
Run and Debug console toolbars used 13/14px icon overrides, which made the controls too small; they now use the standard 16px icons, with a Scroll to End icon. The shared single-row console find bar overflowed narrow panels (Close ended up past the right edge); at 360px and below it now wraps to two rows, across Run, Debug, Services and stack traces.
Refs #2381
- Dialogs: an editor opened behind a dialog (e.g. the new file's tab behind "Add File to Git") could take keyboard focus after the dialog opened, so Enter/Escape went to the editor. Dialogs now keep focus while they are the top layer.
- Copy Reference failed with NotAllowedError: the WebView clipboard requires user activation, which native menu actions and async work (resolving the reference) outlive. Text copies now go through a native clipboard_write_text command (NSPasteboard / Win32 / GTK), and every navigator.clipboard.writeText caller uses the shared helper. The command is allowed in restricted (untrusted) projects like the other clipboard commands.
Next/Previous Difference (toolbar arrows, F7 / Shift+F7) moved the selection without focusing the editor, and CodeMirror draws the caret only in a focused editor, so the caret at the reached difference was invisible. The diff and merge editors now focus the pane they navigate in and centre the difference; with synchronized scrolling, a follower pane's delayed layout scroll no longer pulls the navigation source back (also under reduced motion).
Co-authored-by: HandsomeXi <42278397+HandsomeXi@users.noreply.github.com>
The Enter that commits an input-method candidate (keyCode 229 / isComposing) reached text-field handlers as a plain Enter, so Find in Files, Run Anything and several popups acted on it. Only handlers that called isImeKey themselves were safe. One capture-phase listener now stops IME keys from reaching any <input>/<textarea> handler, without cancelling the default action; xterm's textarea and CodeMirror's contenteditable keep their own IME handling.
Co-authored-by: ntbang0901 <121003585+ntbang0901@users.noreply.github.com>
Mermaid diagrams in agent Markdown are rendered in the active theme's colours but were drawn only once, so switching theme left them in the old palette. The Markdown view now subscribes to theme changes and redraws its diagrams.
Co-authored-by: panda-student <71381346+panda-student@users.noreply.github.com>
Fixes#2396
The watcher reacted to every notify event kind. On inotify, reloading .git/info/exclude (or scanning a directory) opens files, which emits Access events, which triggered another rule reload and resync, looping forever. Access events are now dropped once, before queueing and in batch_detailed, so reads never schedule reloads, resyncs or change events; writes still arrive as Modify events. Covered for ignore files, Git metadata and normal files.
Fixes#2397
The startup guard in public/boot.js treated every window error with a message as fatal, including the benign "ResizeObserver loop completed with undelivered notifications" (and "loop limit exceeded") that a layout during startup can raise without an error object. These are now ignored; real errors, rejections, script load failures and the 30 s timeout still show the failure page.
Refs #2261
The editor and editor-tab Git submenu listed only part of the available Git actions. It now also offers Merge, Rebase, New Branch, New Tag, Reset HEAD, Stash/Unstash, a GitHub submenu, Manage Remotes and Clone, with labels and enablement from the action registry (all repository actions disabled outside Git).
Fixes#2326
gopls sends a field's type in labelDetails.detail (" int"), which was appended to the name ("Capint"). Only a parameter signature suffix of a callable item stays beside the name now; any other label detail goes to the right-hand type column. Covered with gopls, Java, TS, Python and Rust payload shapes.
The four large scattered-edit diff tests pressed ⌘↑ to reach the document start before F7. Since #2317 ⌘↑ opens the Navigation Bar and takes focus, so F7 never reached the viewer. Use ⌘Home and assert the right pane keeps focus. Product code unchanged.
Compact toolbar buttons shrank their icons too, so Git, diff and merge actions looked smaller than standard toolbar icons. Standard toolbar icons now stay 16px regardless of button size, keeping the 14px revert icons in Merge and Agents; the diff viewer uses dedicated side-by-side/unified and apply-arrow icons (Apache-2.0 expui assets), and divider positioning is scoped to its band SVG so arrows keep separate click areas while #2346's metric-based centring still holds. Verified on macOS across Git toolbars, Commit, diff (fonts, zoom, themes), merge and agent revert icons.
.rst files open as reStructuredText instead of plain text: highlighting for section titles, directives, comments, roles, inline literals, emphasis/strong, links, substitutions, footnotes, field lists and literal blocks after :: and code-block; section titles in the Structure view, File Structure popup and breadcrumbs, with levels assigned per adornment style in order of first use as docutils does (overline+underline distinct from underline only); ⌘/ toggles '.. ' comments without turning '..text' into one. Refs #1681.
Co-authored-by: wildcatDownstairs <26499420+wildcatDownstairs@users.noreply.github.com>
In a narrow Terminal tool window the search field's options and match count pushed the navigation and close buttons out of view (24px overflow), and session tab controls were misaligned. Search now lays out on a control-width grid (match count and navigation on their own row when narrow) and session controls align with the tool window header. Verified on macOS with tabs, new sessions, splits, search, light/dark and narrow panes.
Servers that send both labelDetails.description (the type) and detail (the whole signature), such as JDT.LS, showed the name and parameters twice: the right-hand column repeated the full signature. The LSP conversion now carries labelDetails.description through, including the resolve round trip, and the right column prefers it; a blank description falls back to the previous text and servers without labelDetails render as before. Refs #2326.
Co-authored-by: ntbang0901 <121003585+ntbang0901@users.noreply.github.com>
The perf suite had no terminal scenario, so nothing guarded the terminal row cache (#2239) against regressions. The new terminalTui scenario streams a full-screen TUI into the terminal at 10 fps (every row rewritten, only the spinner row changed, the title updated, as agent CLIs do) while typing in an editor, through a hidden action registered only in dev and perf builds. rowsRebuiltPerTuiFrame counts row elements rebuilt per frame independently of MutationObserver batching and fails when no terminal output arrives; budget 3 (about 1.4 with the cache, the screen height without it).
Co-authored-by: brunobelloni <14021404+brunobelloni@users.noreply.github.com>
Adds the Navigation Bar — project › directories › file › symbol for the active editor, each segment opening a popup of its children — and a choice of where it lives: in the status bar (default, where it was before), above the editor, or hidden, from View › Appearance › Navigation Bar or Settings › Appearance. The choice is stored as appearance.navigationBar; the old showNavigationBar boolean migrates at load time. The row stays put while tabs change, follows the Project view's selection until the editor takes focus again, and Jump to Navigation Bar works in every placement (a popup bar when hidden), with keyboard navigation of segments and popups.
Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
Two settings under Appearance & Behavior › System Settings, both off by default so current behaviour is unchanged: "Close the window instead of showing the Welcome screen" closes the last window rather than replacing it with Welcome (on Windows/Linux the app exits; on macOS it keeps running in the Dock, reopening shows Welcome and Quit exits), and "Close all editor tabs when the window closes" drops that window's saved editor session. Cancelling the close writes the tabs back; a missing value keeps the old behaviour.
Co-authored-by: lzskyline <9845170+lzskyline@users.noreply.github.com>
When an agent asked several questions at once (AskUserQuestion), the card stacked them in one scrolling block, so a narrow composer showed only part of the prompt. The card now shows one question at a time behind tabs, with Previous / Next paging, a 1 / N count and a mark on answered questions; all panels stay mounted in one grid cell so the card keeps the tallest question's height. A single question renders as before. Tabs reuse the shared tab component with keyboard focus handling, long text wraps, and paging stays visible below long questions.
Co-authored-by: panda-student <71381346+panda-student@users.noreply.github.com>
Ctrl-hover, Ctrl+click, Ctrl+B and Quick Definition on one word each sent their own lspGoto, and on jdtls identical requests run in parallel at full cost. They now share one in-flight or recent request per editor, document version, server generation, word and kind (definition, declaration, type definition); edits, empty answers and errors are never reused, and a newer go-to gesture in an editor supersedes older ones, so a late answer no longer navigates, retries or shows a hint. The syntax fallback still answers when no server does. Hover then click: 2 requests → 1; three rapid clicks: 3 → 1. Server-side cancellation of lspGoto is a follow-up. Refs #2314.
Co-authored-by: ntbang0901 <121003585+ntbang0901@users.noreply.github.com>
In an SSH or dev-container window, Reveal in Finder, Open In › Finder, Select In and Navigate › File Path passed the server's path to this desktop's file manager, which failed with "No such file or directory" or could open an unrelated local file with the same path. One check, canRevealInFileManager, now decides whether a path belongs to this desktop (plus WSL paths on Windows through \\wsl.localhost); menus hide the item in other remote windows, the action and File Path warn instead, and Create Patch no longer offers to show a patch saved on the server. Log, config folder and local recent projects still reveal from a remote window. Refs #1670.
Co-authored-by: ntbang0901 <121003585+ntbang0901@users.noreply.github.com>
The diff viewer's gutter arrows and the inline Revert button sat off-centre on their change blocks: they used fixed offsets that did not follow the editor's line height or the gutter width. They are now positioned from the editor's metrics and spacing tokens, centred independently of width. Covers modified, multi-line, deletion-only and insertion-only blocks, paired and merge accept controls, font sizes and zoom.
Co-authored-by: ntbang0901 <121003585+ntbang0901@users.noreply.github.com>
On a dark theme Mermaid diagrams painted near-black: node fills and borders came from the editor surface and chrome border, class-diagram labels used nodeBorder, and with darkMode Mermaid darkened every derived series colour by 75%, turning pies black. Fills now use a lifted surface, strokes and labels use the foreground, series colours are passed in explicitly, Gantt task labels stay readable against their bars, and diagrams use the classic look (the neo look hard-codes a black start state). Applies to the Markdown preview and agent chat, which share the theme helper; covered for flowchart, sequence, class, state, pie and Gantt in light and dark.
Co-authored-by: lzskyline <9845170+lzskyline@users.noreply.github.com>
.ino sketches get C++ highlighting and code intelligence through Arduino Language Server: completion, signature help, hover, definition navigation and diagnostics. The IDE finds arduino-cli, clangd and the language server installed by Arduino IDE 2 (or paths from languages.arduino settings), reads the board FQBN from sketch.yaml or settings, roots the server at the sketch, and works around the server's capability quirks. Build, upload and serial monitor are left to a plugin.
Co-authored-by: mushketer888 <2189038+mushketer888@users.noreply.github.com>
The empty editor's hint grid places cells automatically in two columns; a row whose action had no shortcut left out its key cell, so every later label moved into the shortcut column. Rows with an action now always render the key cell, empty when unbound. Covered over every keymap preset and user overrides.
Co-authored-by: ntbang0901 <121003585+ntbang0901@users.noreply.github.com>
Adding a project to a native macOS tab group anchored the group on the newly opened window, so AppKit took that window's normal frame and the group left full screen (black margins, stacked title bar and tab strip). Tab sync now anchors on the group's currently selected window and only selects the new tab. Verified on macOS with the system tab preference set to always and manual, in full screen and windowed: open, switch, close, merge and detach tabs. Fixes#2224.
Without a language server, inline <script> blocks of HTML containers (vue, html, svelte, jsp) had no File Structure entries, breadcrumbs or Go to Declaration. The structure service now nests each script block's TS/JS declarations under its script entry, with region-local UTF-16 positions mapped to document coordinates, and the declaration fallback answers from the block grammar's tree inside a script. Language server answers still take precedence. Covers multiple and uppercase script blocks, CRLF, multi-byte text before a script, memo reuse per document version and parser errors.
Co-authored-by: qtvbwfn <5848026+qtvbwfn@users.noreply.github.com>
Stack-trace navigation only searched the first 50 fuzzy file matches, so in a project with many files of the same name the project source could be skipped in favour of a library or decompiled class. Frames now look up every indexed file with the exact source basename (new find_files_named) and then apply the existing package-path and declaration checks. Covers Java, Kotlin (including sources outside their package directory), Scala and Groovy; older remote servers fall back to their full fuzzy list. Refs #1660.
A manual update check could end without a visible answer: balloons were hidden whenever a saved layout listed Notifications as open, even when that tool window was not actually shown (welcome screen, hidden panel), and marking the list read dropped unlogged balloons. Balloons now defer only to an effectively visible Notifications tool window, and only listed entries are marked read. Covers update available, up to date and error in project, welcome and light-edit windows. Fixes#2285.
The theme row only re-previewed a staged theme that differed from the saved one, and only when the list closed, so re-picking the saved theme quickly or pressing Reset left the earlier pick painted in the Settings window. It now shows its staged theme, or the saved one, whenever that changes and whenever the list closes.
Co-authored-by: ntbang0901 <121003585+ntbang0901@users.noreply.github.com>
- Map jdt://, jar: and decompiled class URIs to <archive>!/<entry> paths inside the library archive
- revealPath handles them in one place, so Select Opened File and autoscroll both work
Co-authored-by: LU XIANGRUI <26499420+wildcatDownstairs@users.noreply.github.com>
The IME duplicate-commit gate dropped every emission after the first one in a commit, including xterm's device/cursor replies and mouse reports, so TUIs stopped getting answers after typing through an IME. The gate now only collapses text; ESC-prefixed output always reaches the PTY. Refs #2160.
- Add ui.notify-project: it shows only in that project's window (the most recently focused one if there are several) and works without a calling window
- Button commands run in the window showing the notification; a closed project returns not-found, with nothing shown and no fallback to another window
- Bump the plugin API to 1.5.0 (wit/, SDK copy, ENGINE_VERSION, API_VERSION) and rebuild all components
- Add Project::notify and its mock to the SDK; update plugins/README.md
Co-authored-by: LU XIANGRUI <26499420+wildcatDownstairs@users.noreply.github.com>
- The local data directory (tools, language servers, index caches) is resolved in one place, ide_host::data_dirs::local_data_dir
- The variable must be an absolute path; a missing directory is created, and an unwritable one exits with an error instead of falling back to the system default
- Config and log directories still follow the system
- Add docs/data-directories.md
Co-authored-by: LU XIANGRUI <26499420+wildcatDownstairs@users.noreply.github.com>
A plugin command that takes seconds (an LLM call that fills the commit message) gave no
sign at the button that the click was taken, and a second click started a second run.
Actions may now set `indicatesRunning`: the action runner counts their in-flight runs
and an IconButton bound to such an action shows a spinner, sets aria-busy and ignores
clicks until the run settles. Plugin commands set it, so every toolbar slot that draws
them (editor.title, mainToolbar, commit.message) is covered without a plugin API change
and without features importing each other. The button stays focusable (aria-disabled,
not disabled). Spinner moves to its own module so Button can use it without a cycle
with Feedback, which re-exports it.
Refs #2254
Co-authored-by: NguyenBang <nguyenbang@Mac.lan>
- The console result grid reuses the table editor's Submit / Revert actions and shortcuts, active only while the grid has focus and pending edits
- ⌘↩ while editing a cell confirms that cell before submitting (the table editor does the same)
- Submit / Revert button tooltips show their shortcuts; the result grid supports Go to Column
- ⌘↩ still executes the statement in the SQL editor
Closes#2332
Co-authored-by: LU XIANGRUI <26499420+wildcatDownstairs@users.noreply.github.com>
- Render the flowchart from the issue verbatim and assert its nodes and subgraph are not pure black
- Add an assertion for the sequence diagram loop control block (.labelBox); the #2288 test only covered cluster
Co-authored-by: LU XIANGRUI <26499420+wildcatDownstairs@users.noreply.github.com>
Update libsqlite3-sys to 0.39.1 (SQLite 3.54.1), which needs SQLx at its unreleased rev 10462fa: SQLx 0.9.0 on crates.io caps libsqlite3-sys below 0.38. The rev also brings the 48 other commits on SQLx's main since 0.9.0. Cargo deny allows this one Git source and requires revision pins.
* fix(vim): let mapleader shadow built-in keys like <Space> and , (#2337)
codemirror-vim prefers a full match over a partial one, so a user mapping
that starts with <Space> or , never fires: the built-in <Space>->l and
,->repeatLastCharacterSearch commands run first and clear the key buffer.
While an rc mapping begins with a key a built-in uses, unmap the built-in;
restore it on the next applyRcCommands pass so mapclear()'s user/default
boundary stays honest (Vim.unmap does not update defaultKeymapLength).
* fix(vim): pass the context arg Vim.unmap's typings require (#2337)
CodeMirror's tooltip container in `body` carries the editor's theme classes,
so the themes' `height: 100%` gave it a full window of height. Scrolling to a
position the editor had already reached then moved the page itself, leaving
the title bar cut off and an empty band at the bottom.
Set the height on `.cm-editor` only, and clip the body so nothing outside
`#root` can make the page scrollable.
The modal-commit diff dialog always reopened at its default 1100x720.
Pass the persisted size as the dialog's initialSize and save it when a
resize ends, like the Find in Files popup already does.
IDEA's Diff.OpenInEditor copies EditSource's shortcuts, which the Mac OS X 10.5+ keymap binds to F4 and ⌘↓. The IntelliJ (macOS) preset only had F4 for diff.jumpToSource, which macOS often takes for itself. The binding is scoped by diffEditorFocus, so ⌘↓ still moves to the document end in other editors.
Closes#2292
Co-authored-by: NguyenBang <nguyenbang@NTBANG.local>
WebKitGTK hands the composer an empty clipboardData when the clipboard
holds only an image, as after a GNOME screenshot, and refuses
navigator.clipboard.read(). Ctrl+V then attached nothing. A paste that
carries no data now reads the image through the GTK clipboard with the
new clipboard_image command.
Co-authored-by: NealimeKenna <22195793+NealimeKenna@users.noreply.github.com>