Skip to content

Merge main into feature/pinnedContext - #478

Open
aws-toolkit-automation wants to merge 44 commits into
feature/pinnedContextfrom
autoMerge/feature/pinnedContext
Open

Merge main into feature/pinnedContext#478
aws-toolkit-automation wants to merge 44 commits into
feature/pinnedContextfrom
autoMerge/feature/pinnedContext

Conversation

@aws-toolkit-automation

Copy link
Copy Markdown
Collaborator

Automatic merge failed

  • Resolve conflicts and push to this PR branch.
  • Do not squash-merge this PR. Use the "Create a merge commit" option to do a regular merge.

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):

git stash
git fetch --all
git checkout origin/feature/pinnedContext
git merge origin/main
git commit
git push origin HEAD:refs/heads/autoMerge/feature/pinnedContext

shruti0085 and others added 30 commits July 9, 2025 09:18
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.
* 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.
chungjac and others added 14 commits April 21, 2026 14:01
* 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
* 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants