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.
Find results and Show Usages use the native 16px file/folder icons, and the four search indicators share the 16px eight-spoke animation, replacing 12/14px overrides; the preview and rerun controls get their proper icons.
Run and Services test trees now use 16px status and filter icons and the shared eight-spoke running indicator. The fixed 11/13px glyphs made columns uneven, and a status change shifted the name; the running indicator now follows the tree's icon size.
The Name field was squeezed and the dialog overflowed in narrow or zoomed windows because the sidebar, label column and header controls had fixed widths. Add a remembered sidebar splitter, shared label columns, and wrapping Name/storage and footer groups; Before launch actions stay together and both panes keep scrolling independently when the dialog is resized.
Update could fail when incoming files collided with local untracked files and show nothing, because VCS popups were disabled. The shared Git command runners now mark progress and results as responses to a user command, so Update, Pull, Fetch, Push and local Git operations stay visible; background notifications and explicitly handled or cancelled failures stay quiet.
Without a per-language Tabs and Indents override, Reformat Code asked the
language server for the indent detected in the file. A file indented with 2
spaces (e.g. formatted elsewhere with Google style) then reformatted to 2
spaces and reported "already properly formatted", while a new file got 4.
Reformat now always asks for the Code Style indent (EditorConfig included);
detection only affects editing, and an indent chosen for the file in the
status bar still applies.
Fixes#2467
The type hierarchy loaded a level only when its node was expanded, so every
type showed an expand arrow, also one without subtypes. The level below each
shown type is now loaded ahead, four requests at a time, so a leaf shows as
one. Call hierarchies stay lazy.
Fixes#2471
The Hierarchy tool window's content tab had no close button, so a type or
call hierarchy stayed until another one replaced it. The tab is closable
now; closing it clears the tree and hides the tool window, which has no
other content.
Refs #2471
When the code has errors (e.g. a statement without its semicolon), Introduce
Variable falls back to a syntax-based declaration and types it from the hover
of the call the expression ends in. That call was found with a greedy regex,
so in `demo.getList().get(0)` the argument list swallowed `().get(0)` and
the hover of `getList` typed the variable as `List<String>`. The trailing
call is now found by matching its parentheses.
Fixes#2509
The JetBrains Kotlin LSP reports an annotation usage as a constructor call
(`method`), so the name after `@` took the Function call colour while the
`@` had Metadata. Names of annotation usages, including use-site targets
(`@field:Name`) and nested names (`@Outer.Inner`), now get the annotation
class; labels such as `return@forEach` and `this@Outer` are left alone.
Fixes#2543
Every pause brought Threads & Variables to the front, so stepping from the Console tab switched away from the output after each Step Over. Only a stop at a breakpoint, exception or pause request does that now; finishing a step keeps the tab the user is on.
Refs #2494
On Windows and Linux the main menu button's size, slot and the frameless bar's left padding were hardcoded, so the button sat 6px right of the stripe icons below it and stayed 30px in compact mode. It now reads the stripe tokens and uses the 20px glyph of the other title bar tool buttons.
Co-authored-by: Clarence404 <36807519+Clarence404@users.noreply.github.com>
With the overlay title bar, macOS draws the window buttons over the page, so a tall dialog (e.g. Push) or one dragged to the top edge had its title bar covered. The dialog layer now keeps a top margin of at least the title bar height on macOS, and dragging stops there. Windows and Linux are unchanged.
Co-authored-by: EjaYF <9842286+EjaYF@users.noreply.github.com>
Add to .gitignore in the changes view is now a submenu with .gitignore and .git/info/exclude, as in the project view's Git menu, and the file the rule was written to opens in both cases.
Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
Line-marker buttons reuse the indexed-marker button class, whose theme sized every icon to 16px; in the 14px line-marker column, which clips to its width, every icon lost a pixel column on both sides. The 16px size now applies only inside the indexed-marker gutter.
Fixes#2479
{
"message": "Not Found",
"documentation_url": "https://docs.github.com/rest",
"status": "404"
}
- Project view: the Git submenu was gated on the project root being a
repository, so it never appeared when the repositories are found later
below a non-Git root. It now also follows the VCS availability that the
Commit tool window uses.
- Commit: when only one repository had included changes, every staged but
excluded file of every repository was passed to it, and the commit failed
with "<path> is outside the repository". Paths that belong to another known
repository are now left to that repository.
Fixes#2517Fixes#2518
The startup failure screen treated every unhandled promise rejection before
the workbench was ready as fatal. A rejected background request (WebKit
reports it as "TypeError: Load failed") then stopped startup on machines
where the app had started fine before. Such a rejection is now remembered and
only reported if startup also times out.
Errors without a stack (WebKit's network TypeErrors) were serialised with
JSON.stringify and showed as "{}"; they now show their name and message.
Fixes#2445
OMP (Oh My Pi) ships its own ACP server (`omp acp`), so it runs through the same ACP pipeline as the other built-in agents. Adds it to the built-in providers with its logo, so an installed `omp` shows up in the agent picker without a custom agent definition.
Co-authored-by: silencezhang7 <173236693+silencezhang7@users.noreply.github.com>
* feat(agents): stream reply text as appends and repaint only changed blocks
The backend sends only the text added to a streaming message (AgentEvent::Append)
instead of the whole entry every flush. Replies render per top-level Markdown
block, keeping the DOM of blocks that didn't change, and streaming text is
revealed at a steady pace.
* feat(agents): fold finished turns and summarize work by what it did
A finished turn's work before its reply folds into one line under its message
("Reasoning · Ran 1 command · Read 4 files · 12s"), runs of tool calls say what
they did instead of how many there were, and reasoning stays open and bounded
while it streams. New Settings › Agents values choose turn folding, smooth text,
reasoning and tool call display, tool output expansion, the send key and what
sending does while the agent works; per-agent defaults are stored for new tasks.
* feat(agents): ask approvals and show progress above the composer
An approval the agent waits for is asked above the composer, answered with
1, 2, 3… when the focus isn't in a text field, and recorded in the
conversation once answered. Beside it: the plan's progress, the task's changed
files (opening the changes), running subagents and background work, queued
messages, and a line saying what the agent does now and for how long.
* feat(agents): one Settings › Agents page for every agent
Agents get their own settings group. Its page lists every agent this machine
runs, built in or installed from the ACP Registry, with what each needs
(update, not found, custom) beside the selected one's status, sign-in, the
settings its new tasks start with, and how it launches. Add Agent… opens the
ACP Registry in a dialog; Remove and Update act on registry agents in place.
Chat and MCP Server move under it, and Chat gains the sending and conversation
options.
* test(e2e): follow approvals to the tray and work into turn folds
* fix(agents): lay out agent defaults in rows and name reasoning in work summaries
* fix(settings): keep ⌘Enter as written in every locale
* feat(agents): show the ACP Registry as a list beside the selected agent
Add Agent lists registry agents compactly (name, and Installed or Update) and
shows the selected one's version, runtime, authors, description, links and
Install / Update / Remove beside the list, instead of a card per agent with
badges and a button on every row.
* fix(agents): open Add Agent at a fixed size with the list scrolling inside
* feat(agents): list every agent in one searchable list, installed first
Registry agents that can be installed now sit under the installed ones
instead of behind Add Agent. The selected agent's page puts Install,
Update and Remove next to its name and lays out Sign In, New Tasks and
Launch as titled sections with label rows.
* feat(settings): make Agents a group of Coding Agents, Chat and MCP Server
* feat(agents): show each task's agent icon and move chat placement to the options menu
Task rows and session tabs show the icon of the agent the task runs;
rows mark only tasks that are still working or need attention, since
their group already says the rest are ready. Chat in Tool Window and
Chat in Editor move from the header into the tool window's options
menu as a checked pair.
* fix(agents): put actions under a turn's final reply only, and keep selections clean
Interim messages of a turn no longer carry a time and action row, and
the final reply gets one once the turn ends. Code in replies uses a
tint of the text colour instead of an opaque fill, so a selection no
longer leaves light boxes around it, and diagram labels are skipped
when selecting across a reply.
* feat(toolwindows): let a window keep its options out of the title
A tool window can set plainTitle so its own options stay in the "⋮"
menu and its title gets no "▾". The Agents window uses it.
* fix(agents): line up the settings form of an agent
The selects of New Tasks share one width, and the label column is as
wide in every section, so the controls of New Tasks and Launch start
at the same place.
* fix(agents): call copying a task into a new one Fork everywhere
The task menu, the user message and the reply offered the same
operation as Copy to a New Task, Copy to a New Task From Here and
Branch Conversation from Here. They now read Fork Task and Fork from
Here.
* fix(agents): label the fork buttons and menu item just Fork
* fix(agents): label the task's terminal entry just Terminal
* fix(agents): fold the session header into the status line and quiet the chat chrome
- The task's terminal and changes buttons move to the end of the status line above
the composer; the header row that repeated the tab's title and status is gone.
- The status line leaves out the model when the composer's picker shows it.
- Your messages show their actions and send time beside "You" on hover instead of
in a row under them, so turns sit closer together.
- Session tabs show a dot only while something waits for you: an unread reply, a
question or an error. A spinner still marks a running task.
- The composer's attach buttons are plain toolbar icons, the image one monochrome;
in a narrow composer the model button drops the effort so the model stays readable.
* fix(agents): answer approvals only from the focused session and never cut a turn short to steer
Number keys answer an approval only while the focus is in its session.
With "Sends it into the turn", a message to an agent that can't take it
mid-turn (or a turn waiting for input) is queued instead of cancelling
the turn. A task waiting for you shows a dot instead of a spinner, and a
turn that ran into an error before its reply stays unfolded.
* fix(agents): keep text that streams while a conversation loads
Entry events that arrive while a conversation loads are applied on top
of the loaded copy instead of being lost to it, so a long reply no
longer reloads the whole conversation over and over. A reply that
streams on as appends marks its task unread even when its conversation
isn't open. The backend keeps only the length and end of the text it
sent, rather than a copy it compares in full on every flush.
* fix(agents): render HTML blocks whole and leave drawn diagrams alone while a reply streams
A reply with an HTML block (such as <details> around Markdown) renders
as one piece, so the block wraps what it should. While a reply streams,
only the text after its finished blocks is cut again, and a diagram
already drawn stays in place with its zoom and pan.
* fix(settings): read agent setting values it doesn't know as their defaults
A hand-edited agent setting with an unknown value, or a non-text value
in agent defaults, no longer makes the whole settings file be ignored.
* fix(agents): drop Open from a task's context menu
Clicking a task already opens it.
* feat(scheme): support a selection foreground colour (#2446)
Settings › Editor › Color Scheme › General › Editor gains a
Selection foreground attribute next to Selection background, wired
to a new --fg-editor-selection token. The editor paints selected
text with it (.cm-openidea-selected, including the diff viewer);
unset it keeps the previous rendering, with syntax colours showing
through (token default: inherit). .icls import/export round trips
it via SELECTION_FOREGROUND.
* test(themes): palette themes inherit selection foreground from base
Solarized/One keep the base default (preserve syntax colours on
selection); record that intent in INHERITED_FROM_BASE.
* fix(vcs): dedupe recent date filters by label (#2443)
The remembered date preset was compared by JSON, but its rolling
after/before timestamps are recomputed on every selection, so each
switch of the date filter appended a look-alike duplicate that
localStorage kept across restarts. Compare date values (and whole
snapshots) by label instead, and dedupe on read so already-corrupted
state heals itself.
* chore: fix README formatting (pre-existing oxfmt violation blocking CI)
Branch and tag menus' Show Diff with Working Tree opened a dialog (or a
separate comparison window under Tauri). It now shows the worktree diff in
a sidebar Compare tool window instead, with Jump to Source opening the
selected file in the editor and Swap Sides exchanging the two diff sides.
Closes#2442
* fix(db): connect to StarRocks via a MySQL-compatible preset (#2452)
StarRocks speaks the MySQL wire protocol but rejects the non-constant
SET sql_mode=(SELECT ...) handshake sqlx sends by default. Add a
StarRocks data source preset (MySQL driver, port 9030) that turns off
pipes_as_concat/no_engine_substitution, and recognize the starrocks URL
scheme.
* test(i18n): allowlist StarRocks product name in text catalog
* fix(boot): ignore ResizeObserver loop also when delivered as an Error (#2468)
WebKit (Tauri on Linux) can report the benign loop notification with
an Error object attached, which bypassed the bare-message guard and
showed a fatal startup dialog. Match on the engine-generated message
instead; no genuine startup failure carries these strings.
* chore: fix README formatting for oxfmt check
* fix(vcs): let Git Log ref labels size to content (#2447)
Remove the unconditional 180px per-label cap and let the refs row use
the full subject cell when space allows, shrinking with ellipsis (full
name kept in the title tooltip) only when space truly runs out.
* chore: fix README formatting (pre-existing oxfmt violation blocking CI)
Ctrl/Cmd+wheel (and the Increase/Decrease Font Size actions) only resized
the focused editor. They now step every open editor to the same value, and
newly opened editors inherit the shared zoom; Reset Font Size resets it.
Closes#2480
* fix(build): scope Build Artifacts to the active file's module
Build Artifacts always packaged the whole reactor (all 57 modules in the
reporter's project) because the frontend passed a null file. Route it
through moduleTarget like Build Module does, so Maven runs
'-pl <module> -am package' and Gradle runs '<module>:assemble'; with no
active file it still falls back to the whole project. Backend already
supported module-scoped artifacts for Maven and Gradle, no Rust change.
Refs #2476
* fix(build): translate the module-scoped Build Artifacts description
The new action description needs a zh catalog entry (the only complete
locale) and the old text must go from every catalog (the stale-entry
check covers all locales); otherwise textCatalog.test.ts fails.
Refs #2476
Alt+Shift+R is swallowed by overlays that hook the Alt+R family (NVIDIA
performance overlay, Xbox Game Bar), leaving Eclipse-preset users with no
way to trigger refactor/project/db rename. Shift+F6 (IntelliJ's rename,
free in this preset) now works as an alternative entry point.
Refs #1876
* docs: remove unreferenced user guides
Drop docs/command-line.md, databases.md, java.md, unity-external-editor.md
and docs/media/debug.jpg. Nothing in the repository links to them.
Plugin, theme and README assets under docs/ stay.
* docs: keep only plugin docs under docs/
Remove docs/themes.md and docs/data-directories.md. Move the upstream
Atom One source revisions into THIRD_PARTY_LICENSES.md, drop the links
to the removed page, and move the README's WeChat QR code to
.github/assets/.
* docs: move plugin docs next to plugins/README.md
docs/plugins/themes.md and indexing.md move to plugins/. Update the
theme doc generator, its test, the plugin template, AGENTS.md and every
link to the new paths.
Plugin run targets keep running programs, tests and package scripts inside
the target. Language servers and debuggers run on the host again:
- Remove the Language server targets settings page, the project-only
`languageServerTargets` setting and the PHP / Node.js "Language server:
run in target" option.
- Remove debugging through plugin targets; Debug on a plugin target is
refused again. PHP Remote Debug and Python remote configurations with a
path mapping debug programs in containers.
- Remove LSP / DAP message path mapping, read-only container documents and
the `ide-core` path-mapping module that only these used.
- Run-target validation (API 1.5, unreleased) no longer has a `debug`
operation, and debug start no longer takes a request id.
* feat(dap): debug C/C++ with GDB's native DAP interpreter
Fixes#2338
Native debugging was LLDB-only (lldb-dap, CodeLLDB), so toolchains and
embedded setups that ship GDB (pretty printers, .gdbinit, gdbserver
targets) had no debugger in the IDE. Adds a built-in "gdb" adapter:
`gdb -i dap` over stdio, with an install hint. GDB's DAP interpreter
shipped in GDB 14, so a launch with an older GDB is refused with the
found and the required version in the message (prepare_gdb, a probe
like debugpy's). C/C++ run configurations pick the debugger in the
Debug adapter control - GDB is an explicit choice there, the default
stays lldb-dap. The c-app fixture (C and C++ entry points) is debugged
with GDB in the language smoke; real_adapters gains a gdb case that
skips itself without a GDB 14+ on PATH.
* fix(dap): start GDB 15 sessions with the launch after the configuration
GDB 15 starts the program inside its launch request, so the launch-first
order every other adapter uses races the breakpoint upload: the run can
be past the breakpoints before setBreakpoints lands, and configurationDone
is refused with notStopped while the program is off. GDB 14 runs the
program at configurationDone and 16+ defers the whole launch there, so
both are fine with launch-first; 15.x is the one version that needs the
launch to go out after configurationDone. The order now follows a
gdb --version probe (only for the gdb adapter); a fake adapter speaking
GDB 15's wire behavior pins the ordering and the notStopped refusal.
* fix(dap): harden GDB startup and expression evaluation
---------
Co-authored-by: l0ng-ai <24760907+l0ng-ai@users.noreply.github.com>
Plugins that declare net:ask can reach an HTTPS or loopback host their manifest does not list after the user allows it: Allow once, Always allow (remembered in the grant ledger, revocable in Settings › Plugins) or Deny. Unattended calls never prompt and are denied until the host is allowed. In remote development the dialog offers Allow for this session instead; the approval stays in memory on the server and ends with the connection, so no grant exists that the desktop cannot list or revoke.
Closes#2165
Co-authored-by: Inf1mum <8135225+Inf1mum@users.noreply.github.com>
Adds a nightly channel. Twice a day nightly.yml builds the newest main commit that passed CI and publishes it as a prerelease (OpenIDEA Nightly, ai.l0ng.openidea.nightly, own data and update manifest), or stops when nothing is newer than the last nightly. Platform builds move from release.yml into the reusable release-build.yml so both channels build the same way.
Versions are one patch above main with a timestamp suffix; each build gets its own v…-nightly.… tag (remote development downloads the server by version) and the last 14 are kept; a rolling nightly release holds latest.json. No MSI or RPM for nightlies. Nightly builds skip the CNB mirror manifest, and their automatic update prompts (startup and periodic) appear at most once a day; a manual check always answers.
Workflow permissions default to contents: read with write granted per job, Apple signing secrets reach only macOS builds, stable release.yml rejects nightly tags, tag pruning only matches -nightly. tags, and nightly runs share one concurrency group.
An agent task's editor tab now shows a spinner while the task is busy and a
status dot once it finishes, failing or limited shown in danger. Terminal
tabs show the same: a spinner while a command runs (or a one-shot program
session is still starting) and an exited / failed dot afterwards.
The editor kind contribution gains an optional trailing(input) callback
rendered in the tab's trailing slot, next to the pin icon; the agents
feature uses it for a TaskStatusMark reading the task status out of the
agents store. The store bumps the tab-title revision on status changes
too, not only on renames, so the mark follows live.
Closes#2233
Only compose.yml / docker-compose.yml were recognised as Compose files, so custom-named or content-only Compose YAML had no Docker icon, no gutter run markers and no Compose support, and running a docker-compose configuration from the gutter added a duplicate top-level Docker Compose group in Services. Compose files are now detected by filename (*compose*.yml/yaml) and by a bounded content scan that excludes Kubernetes, OpenAPI, GitHub Actions, Helm values and mkdocs files; content-detected files show a banner to confirm or reject, and the choice is stored in project settings and follows IDE renames. Detected files get the Docker icon in the tree and tabs, run markers on services: (whole stack) and on each service, and docker runs stay under the Docker node in Services.
Co-authored-by: dengliu <5108773+dengliu@users.noreply.github.com>
Project and folder roots could intercept archive entries and block valid
library candidates. Match entries only to their registered archive roots,
comparing Windows paths in their normalised form. Resolve Gradle sources
jars to registered binary jars in sibling hash directories under the same
artifact version.
Follow-up to #2378
Continuous typing delayed window focus reports and could route project
notifications to the previously focused window. Report focus and blur
immediately, cancel pending snapshots, and keep editor updates debounced.
Add regression tests for both focus transitions during continuous editing.
Follow-up to #2375
Text started 6px from the gutter and 4px below the top, and a multi-line selection left native-selection slivers in the inset, stopped before the right edge, filled first/last rows only to glyph height and only partly covered folded rows; the caret row lost its highlight under a selection and sticky lines showed none. CodeMirror's RectangleMarker.forRange sizes edge rows to the glyphs and stops at the line padding, and WebKit paints the gaps with the global ::selection colour. The selection layer now grows markers to row boxes, extends selected lines to the right edge, fills rows the selection runs past (folded included) and hides native selection inside .cm-content; one LINE_INSET (2.5px) drives line padding, indent guides, wrap indent, right margin, code lenses, sticky lines, Distraction Free and the VCS viewer panes; no top padding. The caret row stays highlighted under a selection, sticky lines paint their part of it (keeping gaps between disjoint ranges), and selection geometry is measured in batched read/write phases, reused while scrolling and skipped for empty selections.
Co-authored-by: w4terlaw <90312144+w4terlaw@users.noreply.github.com>
Closes#2408
Plugin run targets were static argv wrappers: a plugin couldn't refuse a built-in Run/Test/Debug launch through its target (for example when its container project is stopped), so the wrapper started and could start the environment as a side effect. API 1.5 adds an optional run-target-validation export: after trust, ownership, process-grant and pin checks the host calls validate with the operation, bare program name and working directory; an error refuses the launch with the plugin's (prefixed, bounded) message and keeps the selected target. Plugins without the export behave as before. Calls wake reclaimed instances, use the host call timeout, are cancelled with the launch, and fail closed on trap/timeout; for remote projects validation runs on the server. SDK helpers, plugins/README.md and fixtures updated.
Refs #2331
Every grid cell edited in the same plain text box whatever its SQL type. Boolean columns (boolean, tinyint(1), bit) now show a checkbox on editable rows that writes the literal the driver renders, Space toggles it, and the editor offers true / false / NULL (NULL only for nullable columns). Enum columns with a known value list choose from it, keeping an unknown current value selectable. Set NULL and Set DEFAULT are cell actions (db.setCellNull / db.setCellDefault, ⌘⌫ / ⇧⌘⌫ on macOS) over the selected range; Set DEFAULT drops the pending value on added rows and writes literal defaults on existing ones, and is disabled for expression defaults. Works in the table editor and console results alongside the JSON value editor. Remaining in #2331: date/time editors, numeric/date validation, PostgreSQL enum introspection, FK lookup, DEFAULT keyword for expression defaults on existing rows.
Co-authored-by: Inf1mum <8135225+Inf1mum@users.noreply.github.com>