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
Editors on Windows such as Notepad save UTF-8 with a BOM, which serde_json rejects, so such an http-client.env.json offered no environments.
Refs #2435
On Linux, saving a password (e.g. a new data source with Save password ticked) left the dialog on Connecting…: the Secret Service client runs its blocking calls on a tokio runtime of its own, and from a Tauri command thread the nested block_on panicked with "Cannot start a runtime from within a runtime"; keyring's poisoned LazyLock then made every later password access panic until restart. SecretFile, used for database, SSH, git and proxy passwords, now runs store access on a plain thread when called from async code.
Co-authored-by: devadapter <23102962+devadapter@users.noreply.github.com>
std::fs::canonicalize returns \\?\-prefixed paths on Windows, so a process grant's pinned program path was stored in that form. Canonicalize the program's directory with dunce, which keeps the usual form.
Fixes#2001
Co-authored-by: zaojiaoci <31303376+zaojiaoci@users.noreply.github.com>
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"
}
zip 9.1.3's reserved-device-name check sliced entry names at byte offsets, so a WAR or tool archive with a multi-byte file name (e.g. `ZC机柜.jpg`) panicked with "end byte index is not a char boundary" on Windows. Raise zip to 9.2.3, which checks on character boundaries; this covers Tomcat WAR deployment and ZIP/VSIX tool extraction, the two enclosed_name callers.
Fixes#2456
Co-authored-by: xtr-hub <242808782+xtr-hub@users.noreply.github.com>
- 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
* feat(mybatis): navigate and complete @ResultMap ids (#2461)
@ResultMap on a method jumps to @Results(id) in the same file, else to
the XML <resultMap>; resultMap= on XML statements jumps to <resultMap>;
all three get gutter markers and @ResultMap( completes ids (annotation
ids plus XML ids, merged). Unterminated strings now end at the newline
and interface-level ; resyncs paren tracking, so typing half-written
annotations no longer swallows the rest of the file.
* chore(mybatis): retrigger CI after retargeting to main
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>
* fix(java): 重启后外部改动不增量编译导致 NoClassDefFoundError (#2527)
* 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(java): re-stamp mtime-preserving external edits before launch builds
Launch fingerprints detect external edits via content hash, but the Maven
rebuild that triggers is timestamp-incremental: sources whose mtime did not
advance are skipped, so the rebuild compiles nothing and the stale snapshot
is re-recorded as fresh. After an IDE restart the launch then reuses those
stale classes (NoClassDefFoundError).
Session::build now diffs the stored fingerprint against the fresh one,
re-stamps (bumps mtime on) sources whose content changed while
(length, mtime) stayed the same, and re-scans before building, so the
rebuild actually recompiles them and the record written afterwards matches.
Related to #2476
* feat(mybatis): navigate and complete #{} in annotation SQL (#2461)
Annotation @Select/@Insert/@Update/@Delete SQL strings now resolve
Definition, and complete parameter names after #{. Works without
any XML (pure-annotation mappers). Also fixes parse_java splitting
statements on braces/semicolons inside string literals.
* feat(mybatis): silence clippy type-complexity with LitSpan alias
External Libraries and published version catalogs fell back to ~/.m2/repository when Settings › Maven configured no local repository, ignoring <localRepository> in ~/.m2/settings.xml, so only jars that also existed under ~/.m2/repository were listed. The default lookup now lives in ide_sdk::apply and is shared with Lombok agent detection. Sibling: Gradle user home (#2466).
External Libraries looked up Gradle dependency jars only under $GRADLE_USER_HOME or ~/.gradle, ignoring Settings › Gradle › user home, so projects whose Gradle cache lives elsewhere listed no Gradle dependencies. The scan now resolves the home like published_version_catalog: the setting first, then the environment / default home.
Co-authored-by: zmh69695328 <18231787+zmh69695328@users.noreply.github.com>
Launch fingerprints detect external edits via content hash, but the Maven
rebuild that triggers is timestamp-incremental: sources whose mtime did not
advance are skipped, so the rebuild compiles nothing and the stale snapshot
is re-recorded as fresh. After an IDE restart the launch then reuses those
stale classes (NoClassDefFoundError).
Session::build now diffs the stored fingerprint against the fresh one,
re-stamps (bumps mtime on) sources whose content changed while
(length, mtime) stayed the same, and re-scans before building, so the
rebuild actually recompiles them and the record written afterwards matches.
Related to #2476
* 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.
Mapper XML gains Go to Definition and gutter markers for
<mapper namespace> (the interface), resultMap=/extends= (resultMap
ids, namespace-qualified or same-file) and <include refid=>
(<sql> ids, with refid completion). Links resolve even when the
interface is missing; unresolvable refs link nowhere.
This covers the XML-side navigation of #2461; annotation SQL,
OGNL, type aliases and Java type refs remain open.
Issue #2439's project declares encoding="GBK"; its pom.xml is GBK bytes,
so read_to_string failed and the project was silently skipped (Maven tool
window showed 'No maven project', reload/add did nothing) while CLI Maven
reads it fine. Decode XML files via BOM, the encoding declaration, UTF-8,
then a chardetng guess; use it for POM, parent-chain, source-root and
settings.xml reads.
Refs #2439
* 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>
README.md had trailing blank lines oxfmt rejects. On macOS a plugin workbench test compared the pinned program's canonical /private/var path with the raw /var temp path. On Windows the IntelliJ settings test set a modification time through a read-only handle, and the JAR import test expected forward slashes where $PROJECT_DIR$ in program parameters expands to the native root. A remote plugin run test also read its output file before the run had written it; both waits there now wait for the complete content.
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.
PHP had no regression coverage. Adds a php-app fixture (Composer + Pest) with language, run and debug smoke cases, and a php entry in the Language smoke workflow: PHP 8.5 with Xdebug via setup-php, Intelephense pinned like the other servers. Other languages' selectors are unchanged.
Co-authored-by: lleviathe <95321986+lleviathe@users.noreply.github.com>
build.rs read CARGO_MANIFEST_DIR through env!(), which is fixed when the build script is compiled. Cargo reruns that binary after a checkout moves without recompiling it, so the script panicked when the old path was gone, or kept the old path's dev identity when something still existed there. The script now reads CARGO_MANIFEST_DIR at run time; the Windows manifest path for the linker follows the move too.
Co-authored-by: lleviathe <95321986+lleviathe@users.noreply.github.com>
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