Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,34 @@ This feature integrates CLS (Copilot Language Server) server-side session persis

---

### TC-008: Cancelled terminal tool call stays cancelled after restoration

**Type:** `Regression`
**Priority:** `P0`

#### Preconditions
- Copilot Chat is open in Agent mode
- A workspace is open so the `run_in_terminal` tool can execute
- A model that supports tool calls is selected

#### Steps
1. Send a message that makes Copilot use the `run_in_terminal` tool to perform a longer-running task (e.g. "run a command that takes a while, such as `ping -n 30 127.0.0.1`")
Comment thread
xinyi-gong marked this conversation as resolved.
2. While the terminal tool call is still running (spinner active on the tool status), click Cancel on the chat response
3. Verify the terminal tool call status updates to the **cancelled** icon (no longer spinning)
4. Click "New Chat" to start a fresh conversation
5. Open chat history and select the original conversation to restore it

#### Expected Result
- After restoration, the terminal tool call still shows the **cancelled** icon
- The tool call status does **not** revert to running/spinning (no rotating/ongoing indicator reappears)
- The cancelled status is consistent between the live cancel and the restored view

#### 📸 Key Screenshots
- [ ] **After cancel** — Terminal tool call showing the cancelled icon (not spinning)
- [ ] **After restore** — Same terminal tool call restored with the cancelled icon, not reverted to running

---

## Screenshots Checklist
> Consolidated list of all key screenshot moments.

Expand All @@ -195,3 +223,5 @@ This feature integrates CLS (Copilot Language Server) server-side session persis
- [ ] `TC-006` Restored history with successful follow-up and no 400 error
- [ ] `TC-007` Original conversation showing assistant reply
- [ ] `TC-007` Restored conversation with correctly attributed messages and no duplicates
- [ ] `TC-008` Cancelled terminal tool call showing cancelled icon after cancel
- [ ] `TC-008` Restored terminal tool call still cancelled, not reverted to running
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
# Editor Indentation Preferences for Inline Completions

## Overview
When Copilot produces an **inline completion (ghost text)**, the indentation it
suggests (tab character vs. spaces and the tab width) should follow the
platform's **default text editor preferences** instead of always defaulting to
spaces with a tab size of 4.

The formatting options are resolved by `FormatOptionProvider` and sent on each
completion request as `CompletionDocument.insertSpaces` / `tabSize` by
`CompletionProvider`. For Java and C/C++ projects the language-specific
formatter settings continue to apply. For every other case — an unknown
language, a file with no extension, or a file with no project — the provider
now reads the Eclipse text editor preferences
`org.eclipse.ui.editors/spacesForTabs` and `org.eclipse.ui.editors/tabWidth`.
If those preferences cannot be read it falls back to the previous hardcoded
defaults (spaces, tab width 4).

> **Important:** these options affect **inline completions only**, not the
> Agent-mode file create/edit tools. The verification must therefore be done
> by triggering ghost-text completions in an editor, not by asking Agent mode
> to write a file.

These preferences are configured under
**Preferences → General → Editors → Text Editors**:
- **"Insert spaces for tabs"** maps to `spacesForTabs`.
- **"Displayed tab width"** maps to `tabWidth`.

Entry points:
- Window → Preferences → General → Editors → Text Editors
- Typing in a text editor to trigger an inline completion (ghost text)

Not exercised:
- Direct unit-level invocation of `FormatOptionProvider` (covered by
`FormatOptionProviderTests`).
- Agent-mode file create/edit tools (they do not consult these options).
- Java/C-specific formatter configuration screens.

---

## Prerequisites

- Eclipse IDE with the GitHub Copilot for Eclipse plugin installed and
activated.
- The user is signed in to GitHub Copilot and inline completions are enabled.
- A workspace with at least one open project that is **neither a Java nor a
C/C++ project** (a General/empty project), so the editor text preferences
are the deciding factor.
- Knowledge of the current values of **Preferences → General → Editors →
Text Editors → "Insert spaces for tabs"** and **"Displayed tab width"** so
they can be restored after testing.
- Because completion content is model-influenced, prefer a prompt/context that
reliably forces an **indented multi-line suggestion** (e.g. an opening
brace/block), and inspect the **raw whitespace** of the accepted text rather
than relying on the displayed tab width.

---

## 1. Spaces configuration

### TC-001: Inline completion uses spaces when "insert spaces for tabs" is on
Comment thread
xinyi-gong marked this conversation as resolved.

**Type:** `Happy Path`
**Priority:** `P0`

#### Preconditions
- A non-Java/non-C project is open in the workspace.
- A file whose language is unknown / has no extension (e.g. a file named
`sample` with code-like content) is open in the editor.

#### Steps
1. Open **Preferences → General → Editors → Text Editors**, check
**"Insert spaces for tabs"**, set **"Displayed tab width"** to `2`, then
click **Apply and Close**.
2. In the editor, type content that forces an indented multi-line
continuation, for example an opening block and a newline:
`function greet() {` then press Enter so Copilot suggests the indented
body as ghost text.
3. Accept the inline completion (Tab).
4. Reveal whitespace ("Show whitespace characters") or inspect the raw bytes
of the inserted lines.

#### Expected Result
- The accepted completion indents the body with **spaces** (not tabs), at
**2 spaces** per level, matching the configured tab width.
- No error dialog appears and the Eclipse error log has no formatting
exception.

#### 📸 Key Screenshots
- [ ] **Editor preferences** — "Insert spaces for tabs" checked, tab width 2.
- [ ] **Accepted completion whitespace** — Indentation shown as 2-space groups.

---

## 2. Tabs configuration

### TC-002: Inline completion uses tabs, and switching the preference updates the next request

**Type:** `Happy Path`
**Priority:** `P0`

#### Preconditions
- A non-Java/non-C project is open in the workspace.
- An unknown-language / extensionless file is open in the editor.

#### Steps
1. Open **Preferences → General → Editors → Text Editors**, **uncheck**
"Insert spaces for tabs", set **"Displayed tab width"** to `4`, then click
**Apply and Close**.
2. In the editor, trigger an indented multi-line completion (as in TC-001) and
accept it. Reveal whitespace / inspect raw bytes.
3. Change editor preferences to **spaces**, tab width `2`. Apply and close.
4. Trigger another indented completion in the same or a new unknown-language
file and accept it. Reveal whitespace.

#### Expected Result
- The first accepted completion indents with **tab characters** (`\t`).
- After switching the preference, the next completion indents with **2
spaces**.
- The provider reads the current editor preference value on **each completion
request** rather than caching the first observed value.
- No error dialog appears and the Eclipse error log has no formatting
exception.

#### 📸 Key Screenshots
- [ ] **Tabs completion** — Tab indentation under the tabs preference.
- [ ] **Spaces completion** — 2-space indentation after switching the preference.

---

## 3. Regression — language-specific projects are unaffected

### TC-003: Java completion still uses the Java formatter settings, not editor preferences

**Type:** `Regression`
**Priority:** `P0`

#### Preconditions
- A **Java** project is open in the workspace with its own
formatter/indentation settings (e.g., tabs for Java).
- Editor preferences (General → Text Editors) are set to a **different**
value than the Java formatter (e.g., spaces, tab width 2).
- A `.java` source file is open in the editor.

#### Steps
1. In the Java file, trigger an indented multi-line inline completion (e.g.
inside a method body) and accept it.
2. Reveal whitespace / inspect raw bytes of the inserted lines.

#### Expected Result
- The Java completion follows the **Java formatter** indentation settings, not
the generic text editor preferences.
- Only unknown/extensionless/projectless cases consult the editor
preferences; Java (and C/C++) behavior is unchanged.

#### 📸 Key Screenshots
- [ ] **Java completion whitespace** — Indentation matches the Java formatter,
independent of the General text-editor preference.

---

## Screenshots Checklist

- [ ] TC-001 — Editor preferences (spaces, width 2) + accepted completion with
2-space indentation.
- [ ] TC-002 — Tabs completion vs. spaces completion after a preference switch.
- [ ] TC-003 — Java completion indentation unchanged by the General
text-editor preference.
Original file line number Diff line number Diff line change
Expand Up @@ -219,3 +219,68 @@ Not exercised:
#### Key Screenshots
- [ ] **Local file tool link** -- The tool result shows a clickable absolute path outside the workspace.
- [ ] **External local file editor** -- The external local file opens in an Eclipse editor.

### TC-007: Workspace directory and project links reveal in the Project Explorer

**Type:** `Happy Path`
**Priority:** `P1`

#### Preconditions
- The Eclipse workbench is open with at least one project (e.g., `demo`) that contains a sub-folder (e.g., `src`).
- The **Project Explorer** view is open.
- Copilot Chat is open in Agent mode.

#### Steps
1. Send a prompt that causes Agent mode to reference the workspace sub-folder by path (for example, ask it to list the
contents of the `src` folder so the tool result renders a directory link).
2. When the tool call appears in the Chat view, click the directory link for the `src` folder.
3. Verify the `src` folder is selected and revealed in the **Project Explorer** (no external browser opens).
4. Send a prompt that causes Agent mode to reference the project root, then click the project link in the tool result.
5. Verify the project is selected and revealed in the **Project Explorer**.

#### Expected Result
- Clicking a workspace folder or project link reveals and selects that resource in the Project Explorer.
- No external browser or web page is opened for directory/project links.
- No error dialog is shown and the Eclipse error log has no navigation exception.

#### Key Screenshots
- [ ] **Directory tool link** -- The tool result shows a clickable workspace folder link.
- [ ] **Folder revealed** -- The `src` folder is selected and revealed in the Project Explorer.
- [ ] **Project revealed** -- The project root is selected and revealed in the Project Explorer.

#### Notes on failure modes
- Clicking the directory link opens a browser or does nothing -- the folder/project branch may not route through
`UiUtils.revealInExplorer`.
- The resource is opened in an editor instead of being revealed -- folder/project types may be incorrectly treated as
files.

### TC-008: File URI link with a line-number fragment opens the external local file

**Type:** `Edge Case`
**Priority:** `P2`

#### Preconditions
- The Eclipse workbench is open.
- Copilot Chat is open in Agent mode.
- The local test directory outside the workspace exists and contains `existing-local-file.txt` with multiple lines.

#### Steps
1. Send a prompt that causes Agent mode to reference `existing-local-file.txt` by absolute path with a line-number
fragment (for example, a link ending in `#L10` or a `file:` URI with a `#L10` fragment).
2. When the tool call appears in the Chat view, click the file path link.
3. Verify Eclipse opens `existing-local-file.txt` in an editor (the trailing line-number fragment is treated as a
fragment, not part of the file name).

#### Expected Result
- The line-number fragment is stripped when resolving the local path, so the correct external file opens.
- Eclipse does not report a missing file named `existing-local-file.txt#L10` or a path-resolution error.
- No error dialog is shown and the Eclipse error log has no local file navigation exception.

#### Key Screenshots
- [ ] **Fragment file link** -- The tool result shows a clickable local path with a `#L10` fragment.
- [ ] **External file opened** -- The external local file opens in an Eclipse editor despite the fragment.

#### Notes on failure modes
- Eclipse reports the file cannot be found -- the `#` fragment may not be stripped before resolving the local path.
- A relative-path or `https:` link is unexpectedly opened as a local file -- the URI-scheme guard in
`FileUtils.getLocalFilePath` may be bypassed.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ Entry points exercised:
- Agent mode with a prompt that triggers `run_subagent`.
- Chat history panel: switching to a different conversation and back.
- Cancel (stop) button during subagent execution.
- Cancel button on a subagent tool-confirmation dialog.
- `conversation/destroy` LSP call on session switch.

Not exercised:
Expand Down Expand Up @@ -222,3 +223,47 @@ Not exercised:

#### Key Screenshots
- [ ] **After restore** — conversation unchanged, no extra messages.

---

## 6. Tool-confirmation dialog cancel layout

### TC-007: Subagent panel collapses after confirmation dialog is cancelled

**Type:** `Regression`
**Priority:** `P1`

#### Preconditions
- The Chat view is open in Agent mode.
- A new conversation (fresh session).
- The selected agent triggers a tool that requires confirmation
(e.g., a command that needs to run in the terminal).

#### Steps
1. Send a prompt that triggers subagent execution where the subagent
wants to run a command (e.g., `scan for CVEs`, or
`run ls in the terminal`).
2. Wait for the subagent's tool **confirmation dialog** to appear inside
the subagent card (Allow / Skip buttons).
3. Click **Skip** on the confirmation dialog.
4. Observe the subagent card area after the dialog disposes.

#### Expected Result
- The subagent panel resizes/collapses to fit its remaining content.
- **No empty/blank gap** is left at the bottom of the subagent area where
the confirmation dialog used to be (the bug in #169).
- A skip label/message is shown where appropriate, and the scroller
minimum height is recomputed in a single layout pass.
- The send button returns to the send state.

#### Key Screenshots
- [ ] **Confirmation dialog visible** — Allow / Skip buttons shown
inside the subagent card.
- [ ] **After skip** — subagent panel collapsed with no empty area below.

#### Notes on failure modes
- Empty area left below the subagent card → `cancelConfirmation()` did not
trigger `requestRefreshScrollerLayout()`; the `ScrolledComposite`
`setMinHeight()` was never recomputed after the dialog disposal.
- Verify the Allow path is unaffected: clicking **Allow** on a
separate invocation should still lay out correctly (no regression).
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,48 @@ Entry points:
- Model A still shows **`High`**; Model B still shows **`Low`**.
- Each model's effort is independent — changing one did not affect the other.

---

## TC-003: Thinking effort descriptions are fully readable in the hover card

**Type:** `Regression`
**Priority:** `P1`

Regression guard for
[issue #233](https://github.com/microsoft/copilot-for-eclipse/issues/233) /
[PR #234](https://github.com/microsoft/copilot-for-eclipse/pull/234). The hover
card previously clamped its width to a fixed maximum (`LONG_POPUP_WIDTH = 300`),
which truncated the longer per-level description text in the **Thinking effort**
section. The fix removes that cap so the hover shell uses its natural packed
width (only enforcing a `250` px minimum), letting every description wrap and
render in full.

#### Preconditions
- A reasoning-capable model (e.g. Claude Sonnet 4.6) advertising multiple
effort levels, each with a descriptive sub-label (e.g.
`Low — Faster responses, less reasoning`,
`Medium — Balanced reasoning and speed`,
`High — Deeper reasoning, slower responses`).

#### Steps
1. Open the Copilot Chat view and click the model picker to open the dropdown.
2. Hover over the reasoning-capable model to open its hover card.
3. Locate the **Thinking effort** section and read each effort level's
description line in full.
4. Visually compare the right edge of the longest description against the hover card border.

#### Expected Result
- The hover card is wide enough to display the full description for every effort
level — no text is clipped, cut off, or replaced with an ellipsis at the right
edge.
- Each description ends with its natural last word (or wraps onto a second line)
rather than being truncated mid-word against the card border.
- The hover card width is never narrower than the `250` px minimum, so short
content still renders cleanly.

#### 📸 Key Screenshots
- [ ] **Hover card — full descriptions** — Thinking effort section showing each
level's complete, untruncated description text.
- [ ] **Right-edge close-up** — the longest description's final word fully
visible inside the card border (no clipping/ellipsis).

Loading