Merge main into feature/pinnedContext - #478
Open
aws-toolkit-automation wants to merge 44 commits into
Open
Conversation
Currently, we pass the modelSelection flag in createChat, but we need to pass it to server so that server knows if client has the ability or not. With this change we pass the modelSelection in awsCapabilities in lsp initilization.
This PR implements pinned context functionality for Amazon Q Eclipse plugin, allowing users to pin files to their chat conversations for persistent context. This feature improves the relevance of Amazon Q responses by maintaining important context throughout the conversation. * Adds the ability to pin/unpin files in Amazon Q chat conversations * Implements automatic active editor tracking with 100ms debouncing * Enables the @pin Context feature visible in the chat UI * Provides LSP server integration for pinned context operations * Handles UTF8 rendering on Windows devices This change also remove the isUriInWorkspace check for when lsp sends showDocument notification to client. This check would gate the ability to open documents not present in the workspace which is required for paths associated with prompts/rules that are stored on disk and require opening it in the IDE for editing.
This change overrides/hides the pinned context hint text which is incorrectly shown for Eclipse as the shortcut key already exists. In a future change, an appropriate shortcut key and hint text will be configured
Bump version to 2.3.0
This change improves the proxy support story for the extension. With this, we honor customer CA cert if specified in the preferences UI. If it is not supplied, instead of leaving it blank, we now detect system certificates and send it over to the node based language server. This allows us to address some issues where users are on corporate proxies/firewalls that have a proxy url but not an explicitly defined cert and expects applications to honor system certs. We currently do the same system cert detection when downloading artifacts for lsp. Follows a similar approach as JB: aws/aws-toolkit-jetbrains#5553
There is not sufficient logging around the developer profile fetching logic in the login flow. This change adds more logging. In addition, unnecessary restrictive validation checks on the stored and returned Q developer profiles has been removed as we want to rely on the backend to give us valid results. Only validation to check the shape of the stored value is now used, if it is incorrect, we expect further calls to the backend to fail with an appropriate message.
Bumps version to 2.3.2.
Adds support to dynamically retrieve available models for a region(e.g., Claude 4, Claude 3.7, Claude 3.5) from the backend. Wires up the aws/chat/listAvailableModels protocol handler to support model selection in AmazonQ chat.
Merges feature branch containing improvements for ADT ABAP support into main. Relevant PRs * adt support #487 * Support updating remote when ABAP files are edited #495 * handle the null case for contentType in adt plugin environment #496 * Fix: Handle removing paint listeners with ADT viewer and allow multiline text in inline chat #500
This change simplifies and improves the release process. Instead of manually doing an update across necessary files to update the plugin version(PR #502), this adds a script that would make the version updates necessary. A corresponding entry has been added in the Contributing guide.
This change is being made in correspondence to a mynah change Amazon-Q-Developer/mynah-ui#429 Certain icons were problematic when rendered by Webkit used by Eclipse on Mac which led to errors. Error was caused due to hitting transparency limits: WebCore::GraphicsContextCG::endTransparencyLayer(). * To mitigate it in addition to upstream change, eclipse client will now inject a flag to the backing UI JS to allow it to skip styling that handles transparency layers in particular within chat-item-cards. * In addition the progress.svg icon shown when a chat response is in progress is a complex animation that overloads Webkit. To mitigate it, a simple static spinner icon now overrides that problematic icon on the Eclipse side. * The text rate limiting to avoid flooding the Webview has been reduced to prevent delays and the lastProcessingTime computation has been fixed. This was accidentally delaying (additionalMessage)button state changes as well that are not rate limited.
Bump version to 2.5.0 similar to #502. Created using the update-version script
Adds ability to override manifest urls when local testing with the env variable Q_MANIFEST. When set, this url will be used to fetch and launch the language server from.
Fixes test failures when run locally on Windows due to incorrect unix hardcoded path.
…rough ADT plugin (#519)
…tion returns null (#528)
* Bump version to 2.6.3 * patch
The chat-client's onContextCommandFilter callback sends filterContextCommands via postMessage/ideCommand, but the Java backend had no Command enum value or handler for it. The message was silently dropped, so the @ picker could only search within the initial capped set of context commands. Add FILTER_CONTEXT_COMMANDS to Command enum, AmazonQLspServer interface, action handler routing, and ChatCommunicationManager to forward the request to the LSP and send the response back to the webview.
* feat(auth): add maintenance-mode UI to Amazon Q login webview Mirrors the JetBrains sign-in redesign so Eclipse matches the same look/feel. - qOptions.vue: add centered "Welcome to Amazon Q" header, yellow maintenance warning banner with Learn more link, disabled "Create New Account" button with lock icon, and "existing users" divider. Update Builder ID / Identity Center titles and descriptions and change the primary button label to "Sign in with existing account". - common.scss: tighten shared login sizing to align with the VSCode sign-in view. Base font 15→13px, title 15→14px, section gap 20→12px, login-flow-button 55→30px tall, border-radius 3→4px, bottom margin 100→12px, container max-width 300→260px. - selectableItem.vue: shrink the option card — icons 20→16px, padding 15→10/12px, switch fixed 38px height to min-height 50px, title 13px bold, description 12px with wrapping so the longer Identity Center text doesn't get clipped. - logo.vue: shrink the AMAZONQ logo 100→56px (Toolkit 100→72px), drop wrapper padding-top 75→65px, and center the login-stage logo so it matches the JetBrains/VSCode presentation. * feat(auth): route maintenance banner Learn more through IDE openUrl Add OPEN_URL command so the webview can delegate external link opens to the host, which surfaces the standard Amazon Q confirm dialog before launching the system browser instead of navigating inside JCEF. * fix(auth): show maintenance banner for returning users too Move the Welcome header, maintenance banner, disabled Create New Account button, and existing-users divider above the existing connections list so they always render — not just for new users. Returning users with saved SSO URLs now see the same maintenance messaging. Also rename 'Connect with an existing account' → 'Connect with an account' since the section now appears below the banner context. * fix(auth): flatten login flow and remember last IdC input - Remove separate 'Connect with an account' section from qOptions.vue. Existing connections now appear inline under the 'existing users' divider alongside Builder ID and Identity Center, matching VS Code and JetBrains. - Persist last-used Identity Center startUrl and region to Eclipse preferences after successful IdC login. Pre-populate the SSO form with these values on next load so returning users don't have to re-enter their organization's start URL and region. * fix(auth): use string concatenation for JS object to avoid format issues Replace String.format with concatenation to prevent potential issues if the regions JSON contains percent characters that would be misinterpreted as format specifiers. * fix(auth): force-populate SSO Start URL via $nextTick fallback Vue 3's mounted() hook does not fire reliably for ssoLoginForm inside the SWT Browser, so v-model's initial DOM sync for the Start URL input was being skipped and the persisted IdC URL never appeared in the field on the first visit to the SSO form. Switch the computed get/set pattern to local data() fields synced back to Vuex via watch, and schedule a $nextTick callback from created() that writes the persisted Start URL directly into the input once Vue flushes its render. The callback bails if the user has already typed (el.value non-empty) so it never overwrites user input. * chore: update maintenance banner to end-of-support wording Update banner message from 'maintenance mode' to 'end of support on April 30, 2027' across all login surfaces. * chore: update banner wording — new accounts unavailable starting 5/15
* feat(notifications): add one-time Kiro sunset toast on startup Shows a sticky Mylyn notification popup once on plugin startup with Dismiss and Learn more actions. Learn more opens https://kiro.dev in the external browser. Dismissal is persisted in the plugin store so the toast does not reappear on subsequent launches. * chore: update sunset toast to end-of-support wording - Title: 'Amazon Q Developer end of support' - Body: end-of-support April 30 2027, new accounts unavailable 5/15 - Learn more URL: https://aws.amazon.com/q/developer/
Add upload-artifact steps to the Maven build workflow so the plugin JAR and p2 update site ZIP are downloadable from the Actions tab on every PR and main push. Retained for 30 days.
…lipping (#549) * ci: upload plugin JAR and update site as build artifacts Add upload-artifact steps to the Maven build workflow so the plugin JAR and p2 update site ZIP are downloadable from the Actions tab on every PR and main push. Retained for 30 days. * fix(notifications): prevent Learn More from suppressing sunset toast and fix popup clipping - Learn More now opens the URL and closes the popup without persisting the dismissed key, so the notification reappears on next launch - Only the explicit Dismiss button suppresses future appearances - Fix notification popup height calculation to use width-constrained computeSize so wrapped text and button row are not clipped
- Update message: 'starting May 15, 2026' instead of 'starting 5/15' - Update Learn More URL to https://aws.amazon.com/blogs/devops/amazon-q-developer-end-of-support-announcement/
* chore: bump version to 2.7.1 * doc: patch #550
* chore: bump version to 2.7.1 * doc: patch #550 * chore: bump version to 2.7.2
* doc: update message in toast notification * chore: bump version to 2.7.3
…562) Eclipse 2026-06 (4.40.0) bundles a newer Jetty whose PathResource#resolve builds a URI-style path such as "/C:/Users/.../amazonq-ui.js" and passes it to Path#resolve, which throws InvalidPathException on Windows (illegal ':' after the leading slash). This left the Amazon Q chat and login webviews showing a blank screen. Replace the ResourceHandler/PathResource-based asset serving with a small java.nio-based handler that resolves the requested path relative to the asset directory, which stays valid on every platform. The handler keeps a path-traversal guard and advertises content types by extension. The public API of WebviewAssetServer is unchanged, so callers are unaffected. Adds WebviewAssetServerTest covering content-type resolution and HTTP serving (asset retrieval, nested assets, and 404 handling).
* feat(notifications): add hosted file-based in-IDE notifications Adds a client-side notifications feature to the Eclipse plugin, matching the schema and behavior of the other Amazon Q IDE plugins. On startup (after the language server is ready) a background poller fetches a hosted JSON file over HTTPS every 10 minutes and shows targeted in-IDE toasts. - Schema 2.x "combined" payload model + a polymorphic condition DSL (==, !=, >, >=, <, <=, anyOf, noneOf, and, or, not) with a single Jackson deserializer. - Rules engine gates display on compute/os/ide/extension/authx conditions (semver for ide/extension versions; SNAPSHOT builds and not-installed extensions are never shown). - ETag-cached fetcher that degrades gracefully: any failure (absent file, 403/404, empty, malformed, offline) resolves to "show nothing" and only logs. Supports a file:// endpoint for local testing. - Toasts: Info/Warning auto-dismiss; Critical persists until dismissed. Actions: ShowUrl, UpdateExtension, OpenChangelog, plus More and Dismiss. Dismissals persist for 60 days; emergencies re-show until dismissed. - User preference "Show Amazon Q notifications" (default on) as a kill switch; telemetry (toolkit_showNotification / toolkit_invokeAction) is independent of notification polling and respects the telemetry opt-in. - 42 unit tests covering parsing, the DSL, rules, fetch/degradation, dismissal, and filtering/dedup. Wired into LspStartupActivity (start) and Activator.stop (clean shutdown). * fix(notifications): point changelog action at the releases page The OpenChangelog notification action opened https://github.com/aws/amazon-q-eclipse/blob/main/CHANGELOG.md, which 404s (there is no CHANGELOG.md in the repo). Point AMAZON_Q_CHANGELOG_URL at the GitHub releases page (the de-facto changelog for the repo) so 'View changelog' resolves. * docs(notifications): reword persistence comment to drop internal term Replace an internal-only reference in the CRITICAL-persistence javadoc with a provider-neutral phrasing; no behavior change. * fix(notifications): harden targeting, startup, and fetch correctness Correctness/robustness fixes surfaced by review of the notifications feature: - ETag: persist the response ETag after a successful 200 so the conditional GET (If-None-Match) actually works; previously the ETag was never written, so every poll re-downloaded and the 304 path was unreachable. Also clean up the temp cache file if the atomic move fails. - Version targeting: sanitize the plugin Bundle-Version to major.minor.micro (drop the OSGi qualifier) before rules evaluation, so extension.version conditions compare with semver instead of lexical ordering (e.g. 2.7.4 < 2.7.10). - Dev builds: suppress polling on unreleased/dev builds (qualifier == "qualifier" or contains "snapshot") unless an explicit endpoint override is set, so dev builds don't receive production notifications while local testing still works. - STARTUP-once: consume the startup window only when a STARTUP notification actually renders, not merely when the first poll runs, so one filtered on the first poll can still show later in the session once it qualifies. - Telemetry accuracy: emit showNotification and mark the id shown only after the toast actually renders (completion callback); on skip/failure the id is un-marked so it retries on a later poll. - First poll no longer runs synchronously in start(); it is scheduled so start() does not block the shared startup worker thread on network I/O. - Batch resilience: skip null notification elements and isolate per-notification processing so one bad entry cannot abort the whole poll. - Severity parsing is case-insensitive (a mis-cased "critical" no longer downgrades to an auto-fading INFO toast). - Tighten the stop()/reschedule() race so a poll cannot be armed after shutdown. Adds tests: ETag write + If-None-Match, 304-with-cache, 500/offline degradation, clean-version extension targeting, case-insensitive severity, STARTUP filtered-then- qualifies, startup-window-after-render, render-failure retry, null batch element. * fix(notifications): make polling restartable, harden dismissal store, bound fetch - Kill-switch is now reversible in-session: a preference-change listener pauses polling when disabled and resumes it when re-enabled, instead of requiring an IDE restart. NotificationPollingService is refactored into a restartable lifecycle (start / pause via onEnabledPreferenceChanged / permanent shutdown) with an injectable scheduler + suppliers. - Dismissal store: persist the reset when stored state is corrupt (so it stops re-parsing and re-warning on the bad value every poll), and make the id comparison null-safe so a stored entry with a null id cannot NPE and abort all notification processing. - Fetch: tighten the per-request timeout (30s -> 10s) and backoff base (1s -> 0.5s) so a poll cannot occupy a shared worker-pool thread for tens of seconds on a slow/blocked network. Adds NotificationPollingServiceTest (start-once, kill-switch off/on resume, dev-build gating, reschedule-at-interval, shutdown-cancels-and-prevents-rearm, start-after-shutdown) and dismissal tests for corrupt-state repair and null-id safety. * fix(notifications): cap payload size, null-safe rule comparisons, more coverage - Cap the fetched payload at ~1MB so a mis-pointed or oversized endpoint cannot buffer an arbitrary amount into memory and attempt to parse it. - Rules engine: make equality/ordering operators null-safe on the actual system value so a null os.version/ide.version (etc.) evaluates to a non-match instead of throwing NPE mid-poll. - Document that authx.ssoScopes is intentionally a no-op until Eclipse collects SSO scopes, so payloads don't rely on it for targeting. Tests: oversized-payload ignored, null-actual-value non-match (+ null os.version ordering), null/duplicate-id and non-array-anyOf parsing behavior. * refactor(notifications): address adversarial re-review nits Follow-ups from an adversarial re-review of the hardening commits (no functional bugs were found; these are robustness/clarity refinements): - NotificationPollingService.start(): set running=true only after the scheduler actually accepts the first poll, so a worker-pool rejection at startup leaves the service restartable instead of latched into a started-but-never-scheduled state. Add a test for the rejection-then-retry path. - Remove a dead post-assignment shutdown recheck in reschedule() (both methods are synchronized on the same monitor, so it could never fire) and clarify the comment. - Make the dismissal corrupt-state test deterministic: seed the wrong-shape value through the same putObject/getObject byte path the store uses, so Gson reliably throws, rather than relying on Base64-decoding-of-non-Base64 behavior. - Drop a vacuous assertion in the polling test. * fix(notifications): set running=true before scheduling the first poll Regression from the earlier lifecycle refactor: the first poll is scheduled with delay 0, so on a real ScheduledExecutorService the pool thread can run pollOnce() before start() returns. pollOnce() early-returns unless running==true, and running was being set AFTER scheduling — so the very first poll could silently no-op (no fetch, no toast, no reschedule, no log). Set running=true before scheduling (the field is volatile so the poll thread observes it) and roll it back only if the scheduler rejects the task. The prior unit tests used a scheduler that deferred execution, so they never reproduced the delay-0 inline-execution race. Add InlineScheduler + firstPollExecutingInlineAtScheduleTimeStillRuns, which runs the delay-0 task synchronously at schedule time and fails against the old ordering. * fix: bundle commons-logging instead of Require-Bundle (fixes load on Eclipse 4.40+) The plugin bundles Apache HttpClient 4.x (via the AWS SDK apache-client), which requires org.apache.commons.logging at runtime. That was satisfied by a platform Require-Bundle on 'org.apache.commons.logging'. Newer Eclipse (4.40+) renamed that Orbit bundle to 'org.apache.commons.commons-logging', so the old Require-Bundle no longer resolves and the ENTIRE plugin fails to load on current Eclipse. Fix: bundle commons-logging.jar as a plugin lib like the other third-party deps (add commons-logging to maven-dependency-plugin includeGroupIds + Bundle-Classpath) and drop the platform Require-Bundle. The plugin now self-supplies commons-logging and no longer depends on the platform bundle's name, so it loads on 4.32 (baseline) through 4.40+ regardless of Orbit renames. Verified: built jar contains target/dependency/commons-logging.jar; installed into a bare Eclipse 4.40 dropins/ (which lacks the old bundle name) -> plugin loads cleanly, no unresolved- bundle errors, notifications render. 499 tests still green. * fix(notifications): position each stacked toast by its own width (fixes off-screen shift) A notification toast could be shifted right, off the edge of the screen. Root cause was in repositionNotifications() (run on close()): it derived a single x from the CLOSING shell's width and applied it to every surviving toast, ignoring that each survivor has its own width. Because toast widths differ (a short Info toast is ~250px; a Critical toast with an action-button row hits the 400px cap) and Info toasts auto-dismiss while Critical toasts persist, the common case was a narrow toast closing while a wide one remained -> the wide toast was placed at the narrow toast's x and its right edge hung ~150px off-screen. Unlike the open path (Mylyn's open() self-corrects via fixupDisplayBounds), reposition had no such guard. Fix: right-align and stack each surviving toast by its own getShell().getSize(), mirroring initializeBounds(). Also floor x at the client-area left edge in both initializeBounds() and repositionNotifications() as belt-and-suspenders against any residual width/DPI skew, so a toast can never be pushed off-screen to the right.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Automatic merge failed
Command line hint
To perform the merge from the command line, you could do something like the following (where "origin" is the name of the remote in your local git repo):