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
7 changes: 7 additions & 0 deletions doc/release-check-list.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ Net effect: UT shrinks the manual matrix to "did the wiring and UI connect", not
- [ ] `C055` `[E2E]` **Stash preserves chat:** Hiding and restoring the pane preserves helper process, connection state, and chat history.
- [ ] `C056` `[E2E]` **Tab close cleans up:** Closing the owning tab physically closes its ACP session, cleans up the helper, and does not leave a broken pane.
- [ ] `C247` `[new]` `[E2E]` **Closing a tab mid-turn leaves sibling agent tabs working:** When one tab closes with a prompt in flight, only its ACP session is closed; the shared agent CLI remains alive and another tab can continue chatting without a restart. _(#419/#425; E2E: `Feature.SharedAgentLifecycle`.)_
- [ ] `C278` `[new]` `[E2E]` **`/new` physically closes the replaced ACP session before creating another:** Replacing a conversation releases the prior ACP session before creating its successor and does not replay the old session. _(#610; E2E: `Feature.AgentProtocolExperience`.)_
- [ ] `C215` `[new]` `[E2E]` **Agent panes are not persisted into saved layout:** Saving and restoring a window layout does not resurrect a previously-open agent pane; restored windows come back without an unexpected agent pane. _(#360/#275.)_

### Built-in agent chat matrix
Expand Down Expand Up @@ -174,6 +175,8 @@ Net effect: UT shrinks the manual matrix to "did the wiring and UI connect", not
- [ ] `C066` `[E2E]` **Keyboard navigation works:** Arrow keys, Tab completion, Ctrl combinations, and Esc behave correctly.
- [x] `C067` `[UT✓]` `[E2E]` `[MANUAL]` **IME/non-ASCII input works:** IME and non-ASCII input are usable if the release supports localized typing. _(UT: `render_agent_input_accepts_non_ascii` types accented-Latin/Greek/CJK via the real key handler and asserts the input buffer holds them verbatim (multi-byte caret advance) + they render. E2E send path (wtcli send-keys) cannot carry non-ASCII, so the product side is UT-covered; IME composition stays MANUAL.)_
- [ ] `C068` `[UT✓]` `[E2E]` **Streaming output renders correctly:** Agent response chunks, tool calls, plans, status lines, and literal JSON render without corruption. _(UT: `streaming_two_chunks_coalesce_in_app_chat`, `tool_call_surfaces_card_in_chat`, `tool_call_completion_updates_card_status` (in-place, no dup), `plan_surfaces_card_in_chat`, `render_chat_all_message_variants`; Assistant JSON remains ordinary chat text.)_
- [ ] `C279` `[new]` `[UT✓]` `[E2E]` **ACP tool details and transcript order survive the real process boundary:** Execute commands and output, plans, and trailing prose retain ACP arrival order through the stdio agent, master, Helper, and rendered pane. _(#601/#611/#612; E2E: `Feature.AgentProtocolExperience`.)_
- [ ] `C280` `[new]` `[UT✓]` `[E2E]` **Clarification modal returns the selected answer to the requesting ACP session:** A blocking agent question renders its choices and returns the exact selected answer and index to the owning ACP session. _(#606; E2E: `Feature.AgentProtocolExperience`.)_
- [x] `C069` `[UT✓]` `[E2E]` **Permission UI works:** When the agent requests a command/tool permission, the user can allow or reject it. _(UT: `permission_allow_round_trips_to_agent`, `permission_reject_round_trips_to_agent`, `permission_quick_allow/reject_key_round_trips_to_agent`, `render_permission_card_shows_options`, `render_permission_compact_shows_hint`; the `y`/`n` quick-key case-match bug was fixed here.)_
- [ ] `C070` `[E2E]` **Insert into pane works:** A validated Direct Helper Proposal can be inserted into the target terminal pane without running.
- [ ] `C253` `[new]` `[E2E]` **Insert returns keyboard focus to the target shell pane:** After Insert delivers a command without running it, normal window keyboard input continues in that target pane. _(#533; E2E: `Feature.AgentProposalFocus`.)_
Expand All @@ -190,13 +193,17 @@ Net effect: UT shrinks the manual matrix to "did the wiring and UI connect", not
- [x] `C078` `[UT✓]` **`/stop` works:** Stops/cancels an in-progress turn.
- [x] `C079` `[UT✓]` **`/sessions` works:** Switches to session-management view. _(UT: `slash_sessions_opens_agents_view`.)_
- [ ] `C080` `[UT✓]` `[E2E]` **`/model` works:** Opens/selects model where supported; unsupported agents fail gracefully. _(UT: `slash_model_*`; picker render covered by `render_model_picker_lists_models`, full UI flow still E2E.)_
- [ ] `C281` `[new]` `[UT✓]` `[E2E]` **Slash command search matches substrings and ranks the match:** Typing a middle substring filters the command popup and selects the matching command. _(#615; E2E: `Feature.AgentPopup`.)_
- [ ] `C282` `[new]` `[UT✓]` `[E2E]` **ACP session config picker preserves order and hot-applies a selection:** `/config` renders Agent-provided options in order, sends the selected value to the live ACP session, and reflects its update without restarting. _(#616; E2E: `Feature.AgentProtocolExperience`.)_
- [ ] `C283` `[new]` `[UT✓]` `[E2E]` **Agent pane title reflects the confirmed active model:** After ACP confirms the session model, the XAML agent-pane title displays that model rather than stale configured state. _(#634; E2E: `Feature.AgentProtocolExperience`.)_
- [ ] `C255` `[new]` `[UT✓]` `[E2E]` **ACP model updates refresh the active picker:** A model reported by a later ACP `config_option_update` replaces stale `session/new` selection state in the active session's `/model` picker. _(UT: `session_notification_routes_model_config_update`, `model_config_update_refreshes_active_session_picker`; #538; E2E: `Feature.AgentModelSync`.)_
- [ ] `C256` `[new]` `[UT✓]` `[E2E]` **`/model` hot-applies without restarting the agent:** Selecting another model sends the live ACP session update while preserving the current helper and agent process. _(UT: `slash_model_hot_applies_cloud_model_to_live_session`; #554; E2E: `Feature.AgentModelLifecycle`.)_
- [ ] `C257` `[new]` `[E2E]` **Settings model changes restart and reconnect the agent:** Changing the configured cloud model rebuilds the shared agent stack, reconnects, and applies the new model to the fresh session. _(#554; E2E: `Feature.AgentModelLifecycle`.)_
- [ ] `C259` `[new]` `[UT✓]` `[E2E]` **BYOK provider serves the selected model end to end:** An OpenAI-compatible provider selected in Settings is isolated into Copilot, uses its optional Credential Manager API key, receives chat-completions requests for the configured model, and remains the only `/model` choice. _(UT: custom-provider environment, credential resolution, and settings launch-configuration tests; #447; E2E: `Feature.ByokProvider`.)_
- [ ] `C260` `[new]` `[UT✓]` `[E2E]` **Leaving BYOK restarts and restores cloud models:** Clearing the custom model selection rebuilds the shared agent stack, reconnects Copilot without provider overrides, and restores its native cloud catalog. _(UT: clean cloud discovery and settings rebuild tests; #447; E2E: `Feature.ByokProvider`.)_
- [ ] `C261` `[new]` `[UT✓]` `[E2E]` **Compact height keeps the recommendation and input usable:** At the real Agent Pane splitter minimum, the selected recommendation summary, Run/Insert actions, and editable input remain visible, and Insert still targets the owning shell without discarding its draft. _(UT: compact action-panel planning, recommendation rendering, and minimum-size tests; #580; E2E: `Feature.AgentCompactLayout`.)_
- [ ] `C258` `[new]` `[UT✓]` `[E2E]` **Proposal MCP routing is isolated per tab:** Each ACP session receives a distinct proposal MCP server identity, and tool calls route only to that session's owning Helper even after another tab connects. _(UT: `server_configs_isolate_session_identity_and_capability`, proposal MCP capability routing tests; #560; E2E: `Feature.ProposalMcpRouting`.)_
- [ ] `C284` `[new]` `[UT✓]` `[E2E]` **Tab-targeted terminal actions accept a direction hint across Session MCP:** A validated `open_and_send` request may retain a direction hint when its destination is a new tab. _(#599; E2E: `Feature.AgentProtocolExperience`.)_
- [x] `C081` `[UT✓]` **Unknown slash command is safe:** Unknown `/command` does not lose user input or crash.
- [ ] `C225` `[E2E]` **`/agent` picker works:** `/agent` opens a keyboard-operable picker containing the current installed/allowed agents, and selecting the current agent is a safe no-op.
- [ ] `C241` `[new]` `[E2E]` **`/agent` completion selection is safe:** Enter activates the highlighted matching agent without rebuilding the pane or changing the global default when it is already selected. _(#487; E2E: `Feature.PerTabAgent`.)_
Expand Down
8 changes: 7 additions & 1 deletion test/e2e/Invoke-ItE2EReport.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,13 @@ $cfg.TestResult.Enabled = $true
$cfg.TestResult.OutputFormat = 'NUnitXml'
$cfg.TestResult.OutputPath = (Join-Path $OutDir 'results.xml')

$result = Invoke-Pester -Configuration $cfg
$pesterOutput = @(Invoke-Pester -Configuration $cfg)
$result = $pesterOutput |
Where-Object { $_.PSObject.Properties.Name -contains 'Tests' -and $_.PSObject.Properties.Name -contains 'FailedCount' } |
Select-Object -Last 1
if (-not $result) {
throw 'Pester did not return a test result object.'
}

# ── Shared helpers ──────────────────────────────────────────────────────────
function Get-FailureWhere($err) {
Expand Down
3 changes: 3 additions & 0 deletions test/e2e/ItE2E/Public/Ui.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,9 @@ function Invoke-UiMouseDrag {
[int]$HoldMs = 50
)
process {
if (-not (Set-WtWindowForeground -App $App -Attempts 3 -DelayMs 150)) {
throw 'No interactive desktop is available for physical mouse injection.'
}
$args = @('drag', "$FromX,$FromY", "$ToX,$ToY", '--hold-ms', $HoldMs)
if ($Right) { $args += '--right' }
$result = Invoke-WinAppUi -App $App -UiArgs $args
Expand Down
1 change: 1 addition & 0 deletions test/e2e/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ authenticated ACP agents. Current status (run on the Store package):
| `Feature.FreFlow.Tests.ps1` | §0 FRE overlay click-through (Next→Save, privacy link, close-safety) | 5 |
| `Feature.FreExecutionPolicy.Tests.ps1` | §0 FRE execution-policy verdict (deterministic via registry; **Dev**, auto-skips) | 3 (1 conditional skip) |
| `Feature.AgentPaneInteraction.Tests.ps1` | open/hide/focus, input/rendering, slash, Copilot chat | 14 |
| `Feature.AgentProtocolExperience.Tests.ps1` | PRs #599/#601/#606/#610/#611/#612/#616/#634: terminal actions, ACP tool/transcript rendering, clarification input, session configuration, model title, and replacement cleanup across the deployed helper/master boundary | 6 |
| `Feature.AgentImageAttachmentEditing.Tests.ps1` | PR #536: inline image tokens move and delete atomically while preserving adjacent prompt text | 1 |
| `Feature.AgentModelSync.Tests.ps1` | PR #538: ACP config-option updates replace stale session model state in the active picker | 1 |
| `Feature.AgentModelLifecycle.Tests.ps1` | PR #554: `/model` hot-apply and Settings-driven model restart/reconnect lifecycle | 2 |
Expand Down
Loading
Loading