McpToolFilter.MaskBased.fromMaskList treated a null mask list the same as an empty/blank one and returned ProhibitAll. ACP agents without an explicit idea_mcp_allowed_tools / mcp.tool.filter resolve their session tool filter to null, so every IDE MCP tool (including the dotTrace analyze tools) was denied and the execute_tool router exposed nothing but itself.
This was latent until MCP tool-state filtering was unified to also apply the session filter in VIA_ROUTER mode; previously router mode hardcoded AllowAll, so the null->ProhibitAll mapping had no visible effect.
Treat a null mask (no filter configured) as AllowAll, matching the documented "null exposes all tools" contract, while keeping an explicitly empty/blank string as ProhibitAll. The fix lives in the shared community filter, so it covers both the AIA and AIR ACP paths.
(cherry picked from commit 1e55c1950ea1630b38061037df5321f01804f2e8)
NET-MR-18836
(cherry picked from commit 5249db4a775d13cd4bfcb386ced1474ec22800b3)
IJ-CR-216670
GitOrigin-RevId: 235b9d76ff51ababb12935aaa4cc35cef92b1471
Partial cherry-pick of 5e27b1400321582612657da9ecd321eefea8aea5, extracting
only the client-tagging.
GitOrigin-RevId: 1cf07418aad47cdaf361daca048556e9dcabbc46
Air plugin code depends on this platform method.
Partial cherry-pick of 5e27b1400321582612657da9ecd321eefea8aea5, extracting
only this method.
GitOrigin-RevId: 84c9aa9f1ba2be6f4489fca7371c6d931ab07b36
The debugpy/DAP backend does not launch the debuggee through
PythonCommandLineState.startProcess: DebugpyConfigProvider.createConfig
assembles the environment from scratch and serializes it into the DAP
launch request. Compared with PythonCommandLineState.prepareEnv it was
missing setupVirtualEnvVariables (VIRTUAL_ENV and the venv-prefixed
PATH) and addCommonEnvironmentVariables (PYCHARM_HOSTED,
PYTHONUNBUFFERED, resetHomePathChanges), so a debugged process ran
without its virtualenv activated and subprocess calls to tools installed
in the venv failed with FileNotFoundError. The pydevd backend was
unaffected because it goes through PythonCommandLineState.execute.
Extract those two steps into
PythonCommandLineState.addCommonAndVirtualEnvVariables, along with the
PYCHARM_HOSTED decision inlined in initEnvironment
(shouldAddPyCharmHosted), and call them from the default createConfig at
the same ordering point, so run-configuration envs still win over the
activated ones and PATH is prefix-merged. Placing the call in the
interface default means every provider inherits it.
Add PyDebuggerVirtualEnvTest, which runs against both backends and so
asserts the parity directly.
IJ-MR-216263
(cherry picked from commit 21b59a59a1a1f9550c68e4c1d61d4e27a376ead2)
IJ-MR-216551
GitOrigin-RevId: 81080faed737880d84ffdab470791be629a293b0
(cherry picked from commit 69e1e9067feba65cf59dfa3acb0f2fdeeb0f2a3c)
Platform-only pick: the original commit also touched plugins/air
(AgentThreadsSessionSearch.kt, its test, and agent-sessions-search.spec.md);
those changes were stripped from this pick.
GitOrigin-RevId: 81db874a273ade5f1b5f39756d3afeb64b983a9d
(cherry picked from commit e7d49b9c5ca4a3e11c510cb4a23721ea257f6e40)
Platform-only pick: the original commit also touched plugins/air
(AgentPromptInlineEmptyStateProvider.kt, its test, and
global-prompt-entry.spec.md); those changes were stripped from this pick.
GitOrigin-RevId: bcc87a6acdb72088818a17630605081b8b208ff9
(cherry picked from commit f932654ebb993ed2b120dd1eee14cc506696b88c)
Platform-only pick: the original commit was almost entirely a plugins/air
refactor (AIR file-mention/completion services moved between
backend/session/runtime, frontend/prompt/prompt, and shared/prompt, plus
BUILD.bazel/.iml/spec updates); all of that was stripped from this pick,
leaving only the platform-side BackendBasedDocument.kt change.
GitOrigin-RevId: e6a6a9cff01525e5a365e960abcae64f046e997c
(cherry picked from commit 97780ae9d90e5658fdddf7c4669e2d57766823fd)
Platform-only pick: the original commit also touched plugins/air spec files
(global-prompt-composer.spec.md, global-prompt-entry.spec.md); those changes
were stripped from this pick.
GitOrigin-RevId: 17536cf0fd4ea2f715c6dbdef9fedaf71a8da46e
(cherry picked from commit 86cc011fc32d93c8c85a0d63e6bec0f3e8eff06d)
Platform-only pick: the original commit also touched plugins/air (AgentPromptLaunchSettingsController.kt,
AgentPromptLaunchSettingsView.kt, AgentPromptPaletteView.kt, AgentPromptInlineEmptyStateProvider.kt,
AgentPromptInlineEmptyStatePrologue.kt, AgentPromptGenerationSettingsCatalogService.kt, associated tests,
and spec files); those changes were stripped from this pick.
GitOrigin-RevId: f5a153ea382a429334e442f33a15efc0b5652b73
Allow AIR projects to replace managed npx or uvx runners through .air.yaml so repositories can use tools such as Bun without provisioning the default runtime.
Resolve overrides before AIR registry package installation and apply them consistently to session, restore, discovery, install, and launch-preparation paths. Matching overrides suppress managed runtime and package prewarming while binary preparation remains unchanged; invalid commands fall back to the managed runner. The AIA ACP provider remains unchanged.
Restrict the post-resolution override rewrite to LOCAL catalog entries.
A registry entry served by a catalog provider that is not override-aware
(the duplicated AIA ACP engine can win the shared AcpAgentsCatalog EP
race) resolves to managed npx arguments and the npm install working
directory; rewriting that config leaked `--no --` and the install dir
into the replacement runner and produced a broken command line. Such
entries now keep their managed config, matching the spec fallback rule.
Pin the registry version in the override start config
(`<package>@<version>`) so the replacement runner launches the same
version the managed installer would pin, instead of latest.
Skip distribution resolution in installOrUpdateAgent when no overrides
are configured, avoiding a blocking EEL round-trip on every install,
consistent with the launch-preparation path.
(cherry picked from commit ed30895025f601dfe05f7963cfb2de223754a852)
IJ-MR-214637
GitOrigin-RevId: 15fb2e2c0b2c4673df685f88adf756c4f900820d
PySdkListener is published on the application message bus, so every
open project's PyPackagingToolWindowService received module SDK updates
from unrelated projects and re-pointed itself at the foreign SDK. When
the user created a venv in project B, project A's PPTW switched to that
venv. Gate the callback on module.project == project so only the
project that owns the module reacts.
PY-91321 [PPTW] show full interpreter path in a tooltip on the header
The header ellipsizes the interpreter path when the tool window is
narrow (and hides it entirely below a threshold), which is useful for
the layout but hides the venv name the user relies on to identify the
active environment. Expose the untruncated path via toolTipText on
both the path label and its wrapper — the wrapper carries the tooltip
when the label collapses to invisible so the hover target survives even
in the tightest header.
PY-91319 [PPTW] set 30/70 default split between package list and doc preview
Horizontal (bottom/top) anchor rendered a ~50/50 split, cramping the doc
pane. Default the OnePixelSplitter proportion to 0.3 so the list takes
the narrow left column and the doc preview keeps the remaining space,
per the redesign spec. Bump the splitter key to .v2 so users with the
old 0.55 stored proportion also pick up the new default.
[PPTW] misc UI polish
Move-anchor action: use ToolWindowMoveAction.Anchor.BottomLeft /
RightBottom so the switch is atomic (single fireStateChanged, no
duplicate stripe buttons and no wrong-side flash), pick the matching
icon (MoveToBottomLeft / MoveToRightBottom), and reword the tooltips
to name the exact destination corner.
PPTW header: keep stripeTitle pinned to the plain "Python Packages"
so the stripe-button tooltip stays clean, and surface the active
interpreter path via a CustomComponentAction registered in
setTitleActions. The path lives in a JBLabel with context-help
foreground, ellipsizes from the tail, and disappears entirely when the
header cannot fit a legible slice; budgets are derived from
ActionToolbar.DEFAULT_MINIMUM_BUTTON_SIZE so they track LaF scaling.
Doc pane: switch the header separator from JBColor.GRAY to
JBColor.border() so it stays visible on Light / Darcula themes, and
paint the placeholder / loading / JCEF backgrounds with
JBUI.CurrentTheme.ToolWindow.background() to eliminate the seam
against the surrounding tool window.
PY-90501 [PPTW] paginate search results on keyboard navigation
PPTW renders one JTree per repository inside a single scroll pane. When
the DOWN key reached the last row of a tree the tree absorbed the key
without moving the outer scroll bar, so the scroll adjustment listener
never fired and pagination was keyboard-inaccessible (trackpad/wheel
already worked because they scroll the viewport directly).
Trigger loadMore from the tree selection listener whenever selection
lands on the last row and pendingMore > 0 — source-agnostic. loadMore
preserves the previous selection and advances by one so the caret keeps
moving into the newly revealed rows instead of resetting to the top.
PY-91300 [PPTW] refresh state on venv changes without requiring PPTW to be opened first
Two related issues in the "user creates a venv, then clicks + Add package
before opening PPTW" flow:
PyPackagingToolWindowService subscribed to PySdkListener /
ModuleRootListener / FileEditorManagerListener only from initialize,
which runs on PPTW first-open. Venv-creation events before that were
dropped and PPTW stayed on stale state until the user also switched
between subproject editors. Move subscribeToChanges into init so the
listeners attach as soon as the project service is created.
The + Add package inlay handler opened PyInstallPackageDialog before
the packaging service had a currentSdk, so the install click read null
and silently no-oped. Resolve the SDK from the clicked module and
await initForSdk before opening the dialog.
PY-91263 [PPTW] grow install popup to screen bottom when doc pane opens
The doc pane shared the tiny default popup height with the results list
and was nearly unreadable. Snapshot the pre-toggle size, extend the popup
downward to ScreenUtil.getScreenRectangle().maxY on open, restore on
close, and keep balloonFullSize in sync so a later applyBalloonSize
does not collapse back to the old height.
PY-90113 [PPTW][Uv] hide transitives of declared packages from "Not added to pyproject.toml"
Non-workspace branch of UvPackageManager.getPackageTree only filtered by
declared root names; transitives of a declared package that surfaced as
roots in uv pip tree (typical after a fresh uv add jupyterlab) were
labeled undeclared. Mirror the workspace path: collect every name shown
inside declared subtrees and also drop the project root names, so only
truly standalone packages remain in the group.
Adds an @ApiStatus.Internal buildNonWorkspacePackageStructure helper
and unit tests exercising the jupyter scenario against pure fixtures.
PY-91302 [PPTW] rename "Uninstalled" section caption to "Not installed"
Section groups packages available from repositories that aren't installed
yet; "Not installed" reads as the current state rather than a past action.
GitOrigin-RevId: 34138df28efbab8e87bedab47a61ad56237d0cad
Starting from version 0.12 `uv` requires `uv venv --clear --force` if
the directory is not an actual venv, so our SDK creation with
overriding existing .venv directory might fail.
We don't really check for a venv directory in our validation, but rather
for python binary. So in some rare cases we might fail on venv override
if it contains just the binary, but not `pyvenv.cfg`.
(cherry picked from commit 0fbffe683d0156f9cf04b072d44dc7cd2cf581e7)
IJ-MR-216050
GitOrigin-RevId: ac63940b43cd670fe19ed89b508c5c86ba7283a5
PY-90072
PPTW: promote anchor-toggle action to the tool-window header
Add PyTogglePackagingToolWindowAnchorAction so users can switch
between bottom and right docking directly from the PPTW header
without opening the gear menu. Also center the "Advanced Package
Install" icon between the search field and the right border.
PPTW: show active interpreter path in the tool-window title
Render the SDK interpreter path next to "Python Packages" in the
tool-window stripe title using PyInterpreterHeaderTitleRenderer.
The path start-ellipsizes on resize so the tail (.venv/bin/python)
stays visible when the header is narrow. Clears automatically when
switching to a file with no Python SDK.ё
Original MR: IJ-MR-215692
PY-89838 PY-90501 PY-91037 PY-91040 PY-91041 PY-91067 PY-91077: Python Packages tool window redesign follow-ups and bug fixes
Original MR: IJ-MR-214946
GitOrigin-RevId: 552de7eb4445ee1f185de0b03ebf9db71c75faa4
Wait for workspace model synchronization before migrating global Python SDKs
so delayed JPS synchronization cannot overwrite the migrated entities.
Use ASSOCIATED_PROJECT_PATH as the effective non-canonical working directory
until migration writes WORKING_DIRECTORY. This keeps legacy interpreters
visible while preserving the original XML before migration.
(cherry picked from commit ae7a7953e379f76ac777d653109cc1a3984c4386)
IJ-MR-215819
GitOrigin-RevId: 39c25fa4e82f565affebc0d07db434b3b23e36ca
The debugpy backend switcher, its extension point, and all promotion
UI (GotIt tooltip, editor banner, install action, post-install
restart dialog) previously lived in the `python/dap-python-plugin`
module. That module is a separately installable plugin — so when it
is not installed, the IDE has no way to tell users about the debugpy
backend or offer to install the plugin.
Move the switcher action, the backendSwitchHandler extension point,
and the Debug tool-window setup into `community/python` so they are
always available in any IDE with Python support. The DAP plugin now
only contributes a handler implementation rather than owning the
entire UI.
With the switcher always present, add three promotion surfaces:
- A GotIt tooltip anchored to the Mode selector that appears on the
first Python debug session when the DAP plugin is not installed.
The tooltip retries only when the button loses visibility (e.g.
tab switch), not when the user explicitly dismisses it.
- An editor notification banner (PluginSuggestionProvider) shown on
Python and notebook files, offering one-click install.
- A post-install dialog that offers to switch the backend to debugpy
and restart active debug sessions immediately.
The switcher now tracks one button reference per project frame
(list of WeakReferences resolved by window ancestor) so the GotIt
tooltip targets the correct frame in multi-project setups.
FUS telemetry for backend-switch and report-issue events is routed
through two new default-no-op callbacks on the extension point
(onBackendSwitched, onReportIssueClicked), implemented by the DAP
plugin's handler to call PythonDapUsageCollector. This keeps the
statistics collector in the DAP module while letting community code
trigger the events.
The plugin is renamed from "PythonDAP" to "Python DAP Debugger",
its description is rewritten to highlight key benefits (lower
overhead on 3.12+, stable DAP connection model), and its icon is
replaced. A YouTrack issue-tracker link is added to the plugin
descriptor.
Other notable changes:
- PyDapPluginLoadListener is now a project-level service so its
lifecycle is tied to the project, not the application.
- PyDapPluginInstallGotItScopeHolder service is removed; coroutine
scope is obtained from PythonDebuggerScope.childScope() instead.
- listen(null) on PyDapPluginLoadListener now clears a stale
callback rather than silently keeping the old one.
- afterInstallSwitchDebugpy iterates openProjects correctly,
using the loop variable instead of a stale parameter.
Merge-request: IJ-MR-213033
Merged-by: Maxim Popov <maxim.popov@jetbrains.com>
(cherry picked from commit a439b0817068bfc860e2fad52a43f062f84609bf)
(cherry picked from commit d59b77fd8b742f571177f9e482a65492d578f7c6)
IJ-MR-214967
GitOrigin-RevId: 3704a24590138fc5c4ac1780e2a5070845552fb4
A drop that carries no files but provides a plain string (e.g. a node dragged
out of the Figma Layers tree, or text dragged from an editor) is now sent to
the shell as is, the same way pasted text is. Drops on the tab bar still
require a file to derive the working directory from.
GitOrigin-RevId: 69667f3a99fd2f32cf1e3b2f5061c99e5c3d78e2