diff --git a/.github/workflows/close-invalid-pr-writer.yml b/.github/workflows/close-invalid-pr-writer.yml new file mode 100644 index 00000000..1094d6f4 --- /dev/null +++ b/.github/workflows/close-invalid-pr-writer.yml @@ -0,0 +1,100 @@ +name: Close invalid PR writer + +on: + workflow_run: + workflows: [Close issue/PR on adding invalid label] + types: [completed] + # pull_request does not run for conflicted PRs, so reconcile from the trusted default branch. + schedule: + - cron: '*/5 * * * *' + workflow_dispatch: + +permissions: {} + +jobs: + close-invalid-pr-from-workflow-run: + if: > + github.repository == 'github/copilot-cli' && + github.event_name == 'workflow_run' && + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.repository.full_name == github.repository + runs-on: ubuntu-latest + permissions: + actions: read + pull-requests: write + concurrency: + group: close-invalid-pr-${{ github.event.workflow_run.pull_requests[0].number || github.run_id }} + cancel-in-progress: false + steps: + - name: Close invalid PR + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + WORKFLOW_RUN_ID: ${{ github.event.workflow_run.id }} + run: | + set -euo pipefail + + trusted_workflow_id="$(gh api "repos/$GH_REPO/actions/workflows/close-invalid.yml" --jq .id)" + workflow_run="$(gh api "repos/$GH_REPO/actions/runs/$WORKFLOW_RUN_ID")" + + if [ "$(jq -r .workflow_id <<<"$workflow_run")" != "$trusted_workflow_id" ] || + [ "$(jq -r .event <<<"$workflow_run")" != "pull_request" ] || + [ "$(jq -r .repository.full_name <<<"$workflow_run")" != "$GH_REPO" ]; then + echo "Workflow run is not a trusted pull_request run from $GH_REPO; skipping." + exit 0 + fi + + if [ "$(jq '.pull_requests | length' <<<"$workflow_run")" -ne 1 ]; then + echo "Workflow run is not associated with exactly one PR; skipping." + exit 0 + fi + + pr_number="$(jq -r .pull_requests[0].number <<<"$workflow_run")" + run_head_sha="$(jq -r .head_sha <<<"$workflow_run")" + run_head_repo="$(jq -r '.head_repository.full_name // empty' <<<"$workflow_run")" + pr="$(gh api "repos/$GH_REPO/pulls/$pr_number")" + + if [ -z "$run_head_repo" ] || + [ "$(jq -r .base.repo.full_name <<<"$pr")" != "$GH_REPO" ] || + [ "$(jq -r '.head.repo.full_name // empty' <<<"$pr")" != "$run_head_repo" ] || + [ "$(jq -r .head.sha <<<"$pr")" != "$run_head_sha" ]; then + echo "PR #$pr_number no longer matches the workflow run head; skipping." + exit 0 + fi + + if [ "$(jq -r .state <<<"$pr")" != "open" ] || + ! jq -e 'any(.labels[]?; .name == "invalid")' >/dev/null <<<"$pr"; then + echo "PR #$pr_number is not open with the invalid label; skipping." + exit 0 + fi + + gh api -X PATCH "repos/$GH_REPO/pulls/$pr_number" -f state=closed + + reconcile-invalid-prs: + if: > + github.repository == 'github/copilot-cli' && + (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') + runs-on: ubuntu-latest + permissions: + pull-requests: write + concurrency: + group: close-invalid-pr-reconciliation + cancel-in-progress: false + steps: + - name: Close open PRs with the invalid label + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + run: | + set -euo pipefail + + gh api --paginate "repos/$GH_REPO/pulls?state=open&per_page=100" \ + --jq '.[] | select(any(.labels[]?; .name == "invalid")) | .number' | + while read -r pr_number; do + pr="$(gh api "repos/$GH_REPO/pulls/$pr_number")" + + if [ "$(jq -r .state <<<"$pr")" = "open" ] && + jq -e 'any(.labels[]?; .name == "invalid")' >/dev/null <<<"$pr"; then + gh api -X PATCH "repos/$GH_REPO/pulls/$pr_number" -f state=closed + fi + done diff --git a/.github/workflows/close-invalid.yml b/.github/workflows/close-invalid.yml index 4078bd87..18288ff0 100644 --- a/.github/workflows/close-invalid.yml +++ b/.github/workflows/close-invalid.yml @@ -1,36 +1,42 @@ name: Close issue/PR on adding invalid label -# **What it does**: This action closes issues that are labeled as invalid in the repo. +# **What it does**: This action closes invalid issues and signals invalid PRs to a trusted writer. on: issues: types: [labeled] - pull_request_target: + pull_request: types: [labeled] -permissions: - contents: read - issues: write - pull-requests: write +permissions: {} jobs: - close-on-adding-invalid-label: - if: - github.repository == 'github/copilot-cli' && github.event.label.name == - 'invalid' + close-issue-on-adding-invalid-label: + if: > + github.repository == 'github/copilot-cli' && + github.event_name == 'issues' && + github.event.label.name == 'invalid' runs-on: ubuntu-latest - + permissions: + issues: write steps: - name: Close issue - if: ${{ github.event_name == 'issues' }} env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - URL: ${{ github.event.issue.html_url }} - run: gh issue close $URL + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPOSITORY: ${{ github.repository }} + ISSUE_NUMBER: ${{ github.event.issue.number }} + run: gh api -X PATCH "repos/$GH_REPOSITORY/issues/$ISSUE_NUMBER" -f state=closed - - name: Close PR - if: ${{ github.event_name == 'pull_request_target' }} + signal-invalid-pr-label: + if: > + github.repository == 'github/copilot-cli' && + github.event_name == 'pull_request' && + github.event.label.name == 'invalid' + runs-on: ubuntu-latest + permissions: {} + steps: + - name: Record invalid PR label signal env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - URL: ${{ github.event.pull_request.html_url }} - run: gh pr close $URL + PR_NUMBER: ${{ github.event.pull_request.number }} + run: | + echo "Invalid label signal for PR #$PR_NUMBER" diff --git a/changelog.md b/changelog.md index 08e1930e..381986dd 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,430 @@ +## 1.0.80 - 2026-08-14 + +- Update model configurations + +## 1.0.79 - 2026-08-10 + +- The /sandbox configuration dialog shows where sandbox settings are stored in settings.json +- Add support for enterprise allow-auto-only policy so /allow-all auto works while full allow-all remains blocked. +- Allow enterprise-managed sandbox policy to enforce a proxy URL while credentials remain user-controlled +- A tool directory inside your workspace that is on PATH (.venv/bin, node_modules/.bin, an in-repo GOPATH) no longer turns that part of the workspace read-only in the sandbox +- The /sandbox configuration dialog groups the git, gh, and (on macOS) keychain settings under a new Auth tab, and the settings keys moved from `sandbox.gitAuth`/`sandbox.ghAuth` to `sandbox.auth.git`/`sandbox.auth.gh`. There is no migration: the old keys are ignored in settings files, and SDK requests that still send them are rejected as invalid rather than ignored +- Added a `worktreeBaseRef` setting that controls whether `/worktree`, `/worktree new`, and `--worktree` start from HEAD or the remote default branch. All three now default to HEAD; previously `--worktree` started from the remote default branch. +- Model picker groups models into Recent, Recommended, New, and other sections, and Shift+Tab switches grouping views. +- Large monorepos now use tgrep ([trigram-indexed grep for fast regex search in large codebases](https://github.com/microsoft/tgrep)) instead of ripgrep +- Agent Plugins spec plugins can now ship extensions under a com.github.copilot/extensions/ directory +- Add support for the kimi-k3 model +- Combine `--plan` with `--mode autopilot` to plan first and then implement without waiting for approval +- The `/app` command now opens the current session in the GitHub Copilot desktop app instead of landing on Home with the wrong folder (requires GitHub Copilot app 1.1.3 or later) +- On macOS, a sandbox read-only path nested inside a writable one now stays read-only instead of inheriting the write permission from the wider path +- On macOS, sandboxed commands can use UNIX-domain sockets again, so tools that talk over a local IPC pipe (tsx, vite, esbuild, jest workers) no longer fail with `listen EPERM` +- Sandboxed commands work when the working directory lives on a Windows Dev Drive +- `/theme` now only shows its deprecation notice for a valid color mode, so a mistyped mode no longer suggests an invalid command or hides the notice from your next valid `/theme`. +- Sandboxed git now authenticates to Azure DevOps, GitHub Enterprise Server, GitLab, and other non-GitHub remotes you have stored HTTPS credentials for +- Ask user multi-select prompts include an Other option for free-text answers +- Improve teleported subagent /tasks navigation with nested tree browsing, current/all and finished-task filters, and a live timeline you can steer +- A rare internal delay no longer prints a diagnostic warning on top of the interactive UI +- A failed session-history load no longer leaves the timeline permanently empty: the failure was silently discarded, so the transcript stayed blank for the rest of the session with nothing logged. It is now retried, and reported in the transcript and the log if it still fails +- Resuming a long session no longer collapses the timeline's scroll range while history renders in the background: entries that had not finished rendering were published as if they did not exist, so the scrollbar and scroll position jumped until the background render caught up +- Manage multiple concurrent sessions from the Sessions tab and sidebar +- Sandboxed wrapper builds (make and friends) get the dev tool caches their recipes need, based on the build manifests in the working directory +- Prompt pinning is off by default; set pinnedPrompts to true to enable it. +- Sandboxed commands can reach the network again on recent Windows builds, where every outbound connection was blocked even with outbound access enabled and no proxy configured +- Plugin custom agents honor deferred-tool-loading frontmatter +- Use `/worktree new` to start a new session in a new worktree +- A sandbox that cannot start an MCP server now fails in seconds instead of stalling the session, and sandbox startup failures for both MCP and language servers now say the sandbox was at fault and how to fix or opt out of it +- Login links are clickable during web and device-code sign-in +- Pin the current prompt one row higher, in the row the tab bar already reserves, so it keeps the shape of the prompt it copies while costing the timeline one row less +- Leave the pinned prompt off by default on terminals under 30 rows, where it would crowd the output; set pinnedPrompts explicitly to override at any size +- Compute /context attribution against the Auto-resolved model so token totals are accurate for Free/Student users +- Disabling an extension no longer breaks elicitation, canvases, or tool permission prompts for other extensions +- A prompt stashed with ctrl+s now stays with the session it was typed for, so switching away and back and pressing ctrl+s restores it instead of finding it gone +- On Linux, searches and most shell commands blocked by the sandbox now offer to re-run outside it +- BREAKING: the sandbox setting `allowDevToolCaches` is renamed `allowDevToolAccess`, since it grants dev-tool config and registries too, not just caches. The old key is no longer read and is ignored silently, so an existing `false` opt-out reverts to the default (on). Rename it in settings.json and in any managed/MDM policy. +- Add /sandbox policy to show effective sandbox paths, denials, and network access +- Queue prompts, shell commands, and supported slash commands in local sessions to run in order after the current task finishes +- Set "autoUpdate": true on an extraKnownMarketplaces entry in your user settings to auto-update its plugins at session start +- /sandbox tags inactive settings as (disabled) and explains why they are locked, and documents dev tool caches in copilot help sandbox +- Show "pending · ctrl+c to cancel" for in-flight steering prompts +- Make /model session-scoped by default, and use /config model to set defaults for future sessions. +- Pin the current prompt as a single line instead of a three-row framed block, so it reads as chrome and returns rows to the timeline; with the tab bar on it sits directly below the tabs and costs the timeline nothing + +## 1.0.78 - 2026-08-03 + +- Timeline headers show how long each tool call took, right-aligned and ticking live while it runs (for calls of at least 5 seconds). On by default — disable with `/settings showToolDurations`. +- First-party plugins automatically update to the latest version at session start +- Add the experimental /new-worktree command to create a new worktree and start a new conversation in it +- Copilot login now defaults to the browser flow for local desktop subprocesses without a TTY, including IDE integrations, while remote and headless environments continue using device code +- Interactive shell shortcut now launches on Enter and shows an inline hint when "$" is armed +- Extension slash commands run their handler exactly once per invocation when several extensions are loaded +- Inline images no longer render with their first row repeated down the whole picture after the timeline scrolls +- A run whose prompt is piped over stdin now treats its `sessionEnd` hook the same way `-p` does: the hook fires once per completed agent turn with `reason` `complete` (or `error` if the turn failed), instead of once at shutdown with `user_exit`. As with `-p`, a piped run that exits before completing a turn fires no `sessionEnd` hook +- Split-view sidebar: the red close confirmation now reads `x again to close` (or `x again to exit CLI` on the last session) instead of `x close`, so a second press is clearly what closes +- Expose token usage in ACP prompt results and live usage_update notifications +- Added a forceRemoteSettingsRefresh managed setting that requires a fresh managed-settings fetch on startup +- Disabling the sandbox from a bypass prompt applies only to that session; new sessions start sandboxed again +- Managed settings now fall back to the persistent cache whenever a server-managed settings fetch fails for any reason (network error, a non-success HTTP status, or a malformed/unparseable response), and fail open — starting without the unconfirmed server restriction rather than the prior fail-closed behavior — when no usable cached policy is available +- When the sandbox blocks a shell command and bypass is allowed, CLI offers to re-run it outside the sandbox without asking the model +- /rewind no longer requires git and restores only the files Copilot changed, skipping any file whose contents no longer match what Copilot last wrote, with a conversation-only or conversation + files choice +- Add /permissions to switch between approval modes. +- ACP mode supports closing sessions with the closeSession request. +- Ctrl+Q now enqueues the highlighted mid-text skill completion instead of the partial token +- Switching sessions no longer restarts MCP servers or rebuilds hook state, so a turn running in another session is never halted with a stale-hook error +- Refresh deferred MCP tools after OAuth authentication +- New sandbox setting `allowDevToolCaches` (on by default): grants sandboxed builds access to toolchain caches, registries, and installs so builds work without extra setup. Set false to opt out. +- Honor explicit GitHub MCP toolset/tool config: keep gh-overlap tools and stop steering to the gh CLI when you opt in +- Warn on startup about unknown top-level keys in user settings.json (e.g. a misspelled setting) instead of silently ignoring them +- Shell completion for --model now suggests auto and supported model names +- Render long session transcripts progressively to keep scrolling responsive +- Resuming a long session is dramatically faster and far lighter on memory, because its history is now read once at startup (in parallel, across CPU cores) instead of being re-read in full for every check the CLI runs before it can paint. In our benchmark a 230MB, 74k-event transcript came back in well under a second instead of about ten, at roughly a quarter of the peak memory; the exact gain depends on your machine's core count and disk +- The /allow-all auto safety-judge model is no longer user-configurable; the judge model is now selected automatically. + +## 1.0.77 - 2026-07-30 + +- Unconditional autopilot approval now disables sandbox for the current session when bypass is allowed +- Ctrl+G opens your editor to edit ask_user freeform answers without closing the prompt +- Add a browser-based (web) OAuth login flow, now the default for `copilot login` on local interactive terminals (device code remains the default on remote/headless terminals). Use `--web-flow`/`--device-code` to force a mode, or pick one in the interactive `/login` command +- Support enforcing managed sandbox policy via macOS and Windows native MDM settings +- Allow reasoning effort to be omitted so the server can select the default + +## 1.0.76 - 2026-07-29 + +- Add enable/disable controls in /plugins for plugins, instructions, agents, LSP servers, and hooks +- Add support for the grok-4.5 model +- Sandbox denied paths are enforced for relative and symlinked entries on macOS and Linux (Windows cannot deny per path) +- Unsent prompt text now stays with the session it was typed for (for the rest of the CLI session) instead of following you to the session you switch to +- Resuming a session now restores its autopilot or plan mode instead of reverting to interactive, so the autopilot-only `task_complete` tool stays available and the mode matches the session you left +- URL permission prompts now keep their sandbox-bypass warning and the model's reason when a host integration rebuilds the prompt, so an elevated fetch is no longer shown as an ordinary one +- When an update is auto-downloaded, the notification suggests /restart and drops the warning color +- /diff scrolls and syntax-highlights large multi-file diffs faster +- Split-view sidebar: hover-to-focus is now off by default (opt in with `sidebar.hoverFocus`), the active session card is accented by default (opt out with `sidebar.accentActiveSession`), and the closed-state `open sidebar` hint always renders in the neutral hint color +- `web_fetch` now follows HTTP redirects instead of failing, asking permission for the redirect target when it is on a different origin and showing where the redirect came from +- Add a directable queue manager (staff) to reorder, edit, remove, repeat, and immediately send queued messages +- New Sessions sidebar for managing multiple concurrent sessions: switch between them, spawn new ones, and see their status at a glance. Turn it on with experimental mode (`/experimental on`). +- Enterprise administrators can enforce a restrictive sandbox floor: managed settings tighten (but never loosen) the user's sandbox policy, and the `/sandbox` dialog surfaces the org-configured managed values with locked fields and managed filesystem paths so admins can confirm what is enforced. +- Sessions no longer fail every turn with "Holder terminated during creation" after a subagent finishes +- Startup tips only suggest /init in repositories that don't already have Copilot instructions +- A `userPromptSubmitted` hook returning a non-string value for `modifiedPrompt`, `modifiedTransformedPrompt`, or a handled `responseContent` no longer corrupts the session; the value is ignored, a type-only warning naming the field is logged, an empty-string replacement is rejected instead of blanking the model-facing content, a hook that sets `handled` without a usable `responseContent` is now diagnosed instead of silently falling through to the model, and a `null` `additionalContext` is treated as absent instead of being injected as the literal text `null`; hook output is also bounded at 10 MiB per invocation, so an HTTP or command hook returning an unbounded response can no longer exhaust memory or leave an oversized session behind +- Show recent shell output for large commands that write to a file +- The /instructions picker now respects --no-custom-instructions. +- Render inline images in Rio terminals that support Kitty graphics +- Sandboxed searches now offer an immediate bypass prompt and avoid duplicate bypass prompts. +- Voice mode pauses playing media before recording and resumes it afterward, where supported (macOS and Windows) +- Show the number of active scheduled prompts in the footer +- Add /limits predict to suggest a session AI-credit limit from similar sessions. +- Add configurable timed refreshes for custom status-line commands +- Queued messages list no longer shows a blank row or inflated count, and Ctrl+C removes your own newest queued message +- Changing the `mouse` setting mid-session now takes effect immediately, from both `/settings mouse on|off` and the `/settings` dialog, instead of being saved but ignored until the CLI restarted +- web_fetch routes through the configured sandbox proxy when outbound is allowed, and denies egress when network.allowOutbound is false (a proxy no longer overrides the user's outbound policy); when a proxied fetch fails it warns that curl/wget share the same proxy, and suggests requestSandboxBypass only when the sandbox proxy itself is unreachable +- Improve subagent delegation for small tasks and parallel work +- Queue mid-turn /model changes and apply them after the current response finishes +- Restore the early warning when unreclaimable system and tool context nears the limit, before automatic compaction is blocked +- Session working directory no longer reverts to the original checkout shortly after `/worktree` switches into a new worktree +- MCP tools load faster from definition-scoped snapshots, with process-wide and per-server cache opt-outs. +- Autopilot stays selected after task_complete by default; set stayInAutopilot to false to return to interactive mode after each task + +## 1.0.75 - 2026-07-24 + +- Add support for Claude Opus 5 + +## 1.0.74 - 2026-07-23 + +- Typing `?` while the /search bar is open enters it as text instead of opening quick help +- Add support for Open Plugin Spec v1 plugin manifests and mcp.json configuration +- IDE integration reconnects reliably when the CLI reloads MCP servers or changes directory +- Multi-turn subagent timelines show every prompt and response in the correct order after reopening /tasks +- Subagent timelines identify whether prompts came from the main agent or another subagent +- Show a first-run splash to opt into the default sandbox +- Adding support for gemini-3.6-flash +- The `/mcp add` and `/mcp edit` wizard now preserves `=` characters in environment variable values (such as base64 padding), so secrets and tokens are stored correctly. +- Remote session uploads stop retrying permanent Mission Control 400/404 responses +- Show Tab in /settings footer to switch scope tabs +- Downscale oversized tool-result images so CAPI Responses requests continue +- When multiplexing sessions, a session's open dialog no longer leaks into another session; eligible pickers reopen when you switch back +- The `$` interactive shell shortcut now opens a shell even while the agent is working +- Fully honor the skill disable-model-invocation flag +- Warn when a participating language server reports a different symbol than the one requested +- Steering interrupts shell output waits without stopping the running command +- Increase the Responses request size limit +- Plan mode now allows session-folder planning artifacts while still blocking clear file mutations outside the session folder. +- Add `/model plan` (or `/model --plan`) to pick a model used while in plan mode; pass a model id, `off` to clear, or no id to open the picker. Reverts to the session model when you leave plan mode. +- Resume search matches session titles even when whitespace differs + +## 1.0.73 - 2026-07-20 + +- Anthropic subagents continue working when additional directories are configured +- Resolve relative links in custom agent instructions from the agent file location + +## 1.0.72 - 2026-07-20 + +- An `agentStop` hook that always blocks no longer loops indefinitely: the CLI now ends the turn after 8 consecutive blocks, and `agentStop` hooks receive a `stop_hook_active` flag so they can detect a forced continuation and self-limit +- Add opt-in git and gh authentication inside the OS sandbox +- Sandbox macOS keychain access now defaults off for tighter isolation; re-enable it in /sandbox if a command needs it +- Lifecycle and subagent hook commands run in the current session directory after /cd +- Deleting an MCP server with /mcp delete stops its running background process +- Toggling /sandbox restarts only local MCP servers and leaves remote servers connected +- Command approvals no longer carry over to another repository after you switch with /cd +- The GitHub tab's Open in web action now reliably launches your browser on Windows +- Preserve pasted prompt content when changing models through Ctrl+X /model +- Corrected the added-line count shown when creating a file so files ending in a trailing newline no longer report one extra line +- /worktree and /move no longer fail to create a worktree for an auto-generated branch name when many similarly-named branches or a leftover worktree directory already exist: the numeric-suffix search is no longer capped at 5 and now skips stale unregistered worktree directories (an explicitly supplied branch name still errors on a collision) +- /worktree no longer intermittently runs the kickoff task in the main repo instead of the new worktree +- /worktree and /move now propagate folder trust to the new worktree before switching when the source is already trusted (avoiding a spurious folder-trust prompt in that case), /move addresses its git stash precisely so a concurrent stash can't misplace changes, and worktree creation skips a leftover directory instead of failing +- Show the exit resume hint for a renamed session with no messages when its workspace is only available as a cached snapshot +- Show a connected message after a slow MCP server eventually connects +- Add `update`/`uninstall` verbs to `/plugins`, let `enable`/`disable`/`remove` target plugins, MCP servers, or skills via `--plugin`/`--mcp`/`--skill` flags or a positional kind, and support installing skills with `/plugins install --skill` +- Add a /plugins help command plus skill, MCP, and marketplace management for full /plugin parity +- Session exports keep angle brackets intact in inline code and top-level fenced code blocks +- Show MCP server status correctly for names like constructor and **proto** +- Keep the session highlight on the nearest live row when closing a session, in both the Sessions split view and the standalone Sessions tab +- Pad inline hex color swatches once inside Markdown lists +- Type $ at the prompt to open an interactive shell in the current session directory (enable it with `/settings shellShortcut on`; off by default) +- Nested markdown lists render correctly in buffered output (`-p --stream off` and detail screens): sub-bullets are no longer glued onto the parent item's line or flattened, and are indented under their parent +- `copilot skill list` now strips terminal control characters from skill names and descriptions, so a crafted skill can no longer inject ANSI escape sequences into the listing output. +- Install skills from the CLI with `copilot plugins install --skill ` (add `--scope project` to a file or URL install to install into the repository) +- Show default values in /settings and let booleans cycle back to default +- Require SSO for remote control when managed settings demand it +- Mask secret values in /settings show output +- Show hex color codes written as inline code (e.g. `#FF0000`) as color swatches, and add a renderHexColors setting (on by default) to toggle hex-color swatches +- Add /model --session (-s) to change the model, reasoning effort, or context window for just the current session, leaving global settings unchanged. +- Detect VS Code, Cursor, and Windsurf through parent processes in /terminal-setup +- The Sessions sidebar is now navigable with the keyboard and mouse (arrows open and focus it and move the selection, and Enter or a click switches to a session; press n to spawn a session or x twice to close one from the keyboard); /settings can disable it or stop restoring remembered sessions +- Add --plugin, --mcp, and --skill flags for plugin mutations +- Add skill removal support to `copilot plugins remove --skill` +- Wrap ask-user and elicitation inputs in the split-pane chat view +- Modified vim keys (Ctrl+K, uppercase J/K) no longer move the selection in tool-permission prompts and other text-input select menus; only unmodified j/k, the arrow keys, and Ctrl+P/Ctrl+N navigate. +- `/terminal-setup` now refuses to modify a VS Code keybindings.json that contains a JSON syntax error (instead of rewriting it and reporting success), matching its documented invalid-JSON handling. +- Reveal full file paths when expanding compact editing rows +- Make the plan-approval menu deterministic across models +- Keep /add-dir directories visible in the agent context across turns +- Multi-turn subagents are always enabled, so you can send follow-up messages to running agents +- Enable tool search for Claude Haiku 4.5+ +- Emoji shortcodes like :tada: no longer render with a spurious trailing space in printed and PR/issue/gist output +- Deliver scheduled prompts as steering messages when the agent is busy + +## 1.0.71 - 2026-07-16 + +- `copilot -p --autopilot` no longer hangs when a background shell or agent outlives the turn; it now honors the COPILOT_TASK_WAIT_TIMEOUT_SECONDS timeout the same way plain `-p` does. +- Reopening the /subagents model picker keeps each agent's reasoning effort and context tier +- Refresh memory context after 30 minutes in long-lived sessions +- Keep MCP tool lists up to date when servers change +- Avoid leaving long-running background git processes after exit +- Add a configurable maximum for Ctrl+R command history +- On startup, an invalid settings.json now shows a warning identifying the offending value instead of silently ignoring your settings +- /terminal-setup no longer skips setup on terminals without real kitty keyboard support +- Add /voice devices to choose and persist the microphone for voice mode +- Limit which built-in agents are available to tasks and subagents +- Add canvas support in the CLI for extension-driven interactions +- Enforce the sandbox filesystem policy on LSP file reads and rename edits +- Allow empty owner and author emails in marketplace metadata +- Keep all MCP Server Type options visible on short terminals +- Mark disabled skills in `copilot skill list` and its JSON output +- Plan mode now hard-blocks built-in tool calls that would modify the workspace, so the agent can no longer edit files or run mutating shell commands while planning (built-in mutators like opening a pull request are blocked; MCP and external tools are still allowed) +- Improve /chronicle cost-tips recommendations with richer cost profiles +- Highlight standalone hex colors inline in Markdown +- Persist GitHub MCP toolset/tool config via settings.json (githubMcpToolsets, githubMcpTools, etc.) +- Add `plugins marketplace` subcommands to list, add, and remove plugin marketplaces +- Persist sidebar sessions across restarts +- Add plugins marketplace browse and update commands +- Split /worktree and /move: /worktree now creates a new worktree and leaves your uncommitted changes behind, while the new /move carries them into the new worktree +- Add local and cloud cost profiles to /chronicle cost-tips +- Switching to autopilot mid-turn now auto-answers questions asked during that same turn +- Custom agents that request a shell tool by alias now also receive the matching read, list, and stop shell tools +- Slash commands and their autocomplete now match regardless of case (e.g. /SESSION works like /session) +- Show repo-enabled plugins in /plugin list and skill pickers +- Press ? twice to dismiss quick help and start a prompt with a literal ? +- Shell completions suggest positional-argument choices +- Show the /app launch message and download link immediately on Linux +- Validate --max-autopilot-continues rejects NaN, negative, and fractional values +- Honor NO_COLOR in the CLI even when chalk cached a color level +- Apply updated session options (shell flags, streaming, custom agent defaults) immediately after /settings changes +- Announce the focused /model row for screen readers +- Announce the focused picker row to screen readers +- Show selected custom agents once in /agent and keep their source label when the file name differs from the display name +- Clear the /model pricing banner when no models match +- Keep /share file session and /share html session from using the full-session selector as an output path +- Honor --context in fresh interactive sessions +- Fixed the model picker changing a hidden model's reasoning effort or context window when the search matched no results, and hid the inert key hints shown in that empty state +- Display plugin root skills as /plugin instead of /plugin:plugin +- Keep valid hooks in a config file when one hook entry is malformed +- Denying write(path) now blocks only the specified path +- Using --add-github-mcp-tool "\*" now enables all GitHub MCP tools +- Render empty untracked files without a phantom added line +- Show clean failure messages when copilot skill add fails +- Press Enter on a blank settings array item to show an error instead of saving an empty value +- Press Enter once to toggle booleans with a registered default in /settings +- Declining folder trust in /cwd keeps your live session open and returns to the previous folder +- Show a warning when a workspace MCP config is malformed or cannot be loaded +- Make bare `copilot mcp` and `copilot skill` print help and exit 0, matching `copilot plugin`. Consistent with `plugin`, the implicit `help ` form is not supported for these groups; use `copilot mcp --help` (or `copilot skill --help`) instead. +- Show malformed allowed_models.txt policy errors cleanly in -p mode +- Resume synced sessions by name without a false multiple matches error +- Show an error when --name is used with --session-id for an existing session +- Show --plugin-dir plugins in copilot plugin list +- Keep backgrounded sessions alive when you switch away from them +- Link bare #number GitHub refs in -p --stream off output +- Show the startup banner only on the first launch when set to once +- Allow `copilot update` and `/update` to accept `stable` as a channel +- Surface --plugin-dir warnings in the terminal +- Surface the real load error for malformed custom agents +- Reject --continue when used with --resume +- Prompt mode now exits non-zero when a `--share` or `--share-gist` export fails +- Server mode reconnects OAuth MCP servers from cached tokens +- Keep stored Git credential helpers available for marketplace plugin installs +- The /model picker shows the Auto model description as markdown with a clickable Learn More link +- Keep sessions tied to their working directory across prompts, restarts, and workspace tools +- Always offer a custom answer in ask_user choice prompts +- Lower the default maximum sub-agent nesting depth from 6 to 4 to curb runaway recursive sub-agent delegation. Usage-based billing users can still adjust `subagents.maxDepth` (up to 128). +- Add a pinned prompts setting in /settings to control prompt pinning +- Add Repo and Repo (local) scope tabs to the /settings dashboard +- Interactive shell commands now fail with a retryable "reconfiguring" message instead of an "unknown shellManager handle" error after the shell manager is disposed, and a detached command's completion notification is no longer lost when the shell context is reconfigured while a read is in progress +- Reject custom-agent names that would create hidden files +- Reject malformed --allow-tool and --deny-tool patterns with an error message +- Show retained shell output in /tasks Shell Details for finished tasks +- Remove duplicate Error: prefixes from plugin command failures +- Shell completions stop suggesting subcommands as flag values +- Show singular message counts in /usage activity graph +- Keep /cd from switching to files or inaccessible directories +- Dismissing the quick-help overlay with ? no longer leaves a stray ? in the prompt +- --sandbox and --no-sandbox now show their "ignored" warning during interactive startup when the sandbox feature is unavailable (previously it was only visible in non-interactive mode) +- Show the full command with its arguments (not just the wrapper) in the /mcp server detail view +- Hide the inert navigate and view-log hints in the empty /lsp logs (LSP Services) panel +- Exit non-interactive prompt runs with a failure code when a prompt is blocked before responding +- Show the Auto discount in the redesigned inline model picker +- New sessions start in the default directory instead of the active session's cwd +- Fish completion only offers enum values for closed-choice flags +- Use targeted validation commands and lighter install guidance by default +- Use ctrl+x → x to close a session and ctrl+x → h to hide the split sidebar + +## 1.0.70 - 2026-07-09 + +- Add GPT-5.6 model support +- Show a single Error prefix for mcp and skill command failures +- Show the real parse error when --agent selects a malformed custom agent +- web_fetch works through mandatory HTTPS proxies +- Hide / search on the Gists tab +- Treat superseded subagent runs as cancellations instead of failures +- Add paginated session.mcp.resources read/list/listTemplates RPCs for MCP server resources +- preToolUse hooks that exit with code 2 deny tool calls +- Create draft skills when Forge finds a clear workflow pattern +- Hide the GitHub App install nudge in remote terminals +- Pin plugins to an exact commit SHA using the `sha` field in plugin source configuration +- Add --sandbox and --no-sandbox flags to turn the OS-level shell sandbox on or off for the current session only, without changing your saved sandbox setting (useful with -p) +- Add /refine to rewrite a rough, stream-of-consciousness prompt into a clear one +- Add --repo and --local flags to /settings and /model +- Add a setting to show or hide timeline timestamps +- Let a trusted repository pin the model, effort level, and context tier and extend the URL/MCP/skill deny lists via .github/copilot/settings.json +- Expose SDK APIs to manage live MCP servers in running sessions +- Show the active user's models after /user switch +- Declining an extension's permission prompt no longer disables tool approvals for the rest of the session +- Avoid redundant background agent notifications after a blocking read_agent returns its result +- Startup auth errors recommend the real `copilot login` command +- Keep merge-semantics settings editable in /settings +- Re-sync managed plugins when their cache is missing or empty +- Copy the last assistant response even after command echoes +- Persist the last-logged-in user on every login so a restarted runtime client stays authenticated +- Hide /agent picker navigation hints when there is nothing to select +- Open the plan file or research report with Ctrl+Y in any mode +- Keep terminal color scheme changes in sync over SSH and remote shells +- Prefill /chronicle search so it can accept a query +- Show a distinct scrollbar thumb glyph in the /model picker on the no-color path (--no-color, non-color terminals) so the scroll position stays visible +- Skip launching a browser in remote terminals +- Arrow keys in /search and reverse search stay in search instead of switching tabs +- Restore tool event ordering so permission prompts appear after tool start +- Show only one cancellation message when streaming is aborted +- Keep /pr tables aligned in compact timeline view +- Show clear validation errors for empty or non-ASCII skill and command names +- Keep footer selection highlights aligned when the session bar is open +- Fail fast when marketplace plugin git auth needs a terminal prompt +- Dismiss other pending read and fetch sandbox-bypass prompts after you disable the sandbox +- Fix a crash on Windows triggered by desktop toast notifications +- Improve GPT-5.6 commentary guidance for tool-driven progress updates +- Highlight the sidebar toggle hint in the input footer +- Make markdown links and bare URLs in the timeline and tool output clickable +- Reclaim the blank line under the home tab bar: the timeline (and Sessions+Current split) sits flush under the tabs when a prompt is pinned, keeping one breathing line only while nothing is pinned +- Press Tab to switch the context window in /model +- Long-running sessions refresh enterprise managed settings hourly +- Mark locally-spawned MCP servers that run inside the sandbox in `/mcp list` (e.g. `connected (sandboxed)`) + +## 1.0.69 - 2026-07-07 + +- Label built-in file edits with a (sandbox policy) badge instead of (sandboxed), since they follow the sandbox policy on a best-effort basis rather than running in the OS-level sandbox +- Reload installed plugin extensions without restarting a session +- Add a /plugins dashboard to manage installed plugins +- Open quick help from an empty prompt without leaving a stray ? +- Add minimal reasoning effort for gemini-3.5-flash +- Show a scrollbar in the /model picker list +- Show disabled servers as disabled in /lsp test +- Let built-in file edits bypass the sandbox when you approve it +- web_fetch now follows the active sandbox network policy (denying outbound or local targets the policy blocks) and, when the host opts in via sandbox.allowBypass, lets you approve a one-time bypass from the fetch prompt +- Show exact local assistant usage in Chronicle and session SQL +- Confirm before resuming a remote session from a different repository +- Delay read-only remote session creation until you send the first message +- Display reasoning-effort labels in the CLI footer +- Show descriptions for sandbox userPolicy settings in /settings +- Reject explicitly empty --name= values when starting a session +- Create delegate PRs against the current branch by default, with /delegate --base to choose another PR target branch +- Make /copy fall back to wl-copy on Wayland +- Improve /sandbox add-path suggestions so they open only when you ask for them +- Improve /chronicle cost-tips with more precise evidence-backed recommendations +- Hold Alt (Option on macOS) while scrolling to move one line at a time +- Resume and switch large sessions faster +- Speed up /diff rendering and scrolling on large diffs +- Keep the full /model picker on screen when the timeline is full, re-snapping as its details banner grows so the search box and hint bar are no longer clipped below the terminal +- Hide transient console windows when the CLI starts helper processes on Windows +- Auto-approval timeline entries now include the request subject, such as the command, path, URL, or tool name +- /allow-all auto now requires experimental mode (/experimental on or --experimental) instead of the AUTO_APPROVAL env var or feature flag +- Show /rubber-duck in pre-auth help and self-documentation +- Include files inside new untracked directories in /diff local edits +- A prompt taller than the screen stays scrollable when its top scrolls off, instead of collapsing to a pinned header +- Require Copilot login before ACP authenticate returns success +- Show the full assistant response in prompt mode when --stream is off +- Disconnect a repo-scoped plugin's MCP server when the repo disables it or the session leaves the declaring repository +- Prevent `copilot init` from hanging in non-interactive mode +- Reject empty --session-id= values instead of ignoring them +- Reject empty --resume= values instead of starting a new session +- Preserve emoji in truncated timeline tool arguments +- Show plain Shift+Enter in /terminal-setup output +- Keep session resume working when token timing includes fractional milliseconds +- Complete @-mentions for files whose names start with [DIR] +- Sign in to MCP servers through the CLI OAuth callback flow +- Reveal the full /user switch picker when the timeline is full so its hint bar is no longer clipped below the terminal +- Add /mcp list to show attached MCP servers and their status, and allow /mcp list and /plugin list to run while the agent is working +- Allow opening the /mcp manager while the agent is working to enable or disable servers mid-turn; add, edit, delete, and re-auth stay paused until the turn finishes +- Add auto allow-all mode that auto-approves requests an LLM judge evaluates as acceptable +- Add a `stayInAutopilot` setting (default false) that keeps the CLI in autopilot mode after an autopilot task completes +- Pinned prompts keep their full frame aligned while scrolling +- Suppress macOS pasteboard stderr during clipboard reads and writes +- Keep colons intact in rendered markdown output +- Warn when multiple plugins define the same MCP server +- Collect debug logs without truncating large files or dropping multiline secrets +- Find PRs from worktree branches when the local branch name differs from the PR head ref +- Skip the autopilot permission prompt when bypass mode is disabled by policy +- Allow WSL UNC paths for local files in the CLI +- Apply --reasoning-effort reliably when the CLI starts +- Keep slash-command picker rows intact in tab-expanding terminals +- Keep model switches working when tool call IDs include punctuation +- Double-press Esc now interrupts the running main turn (flushing queued messages), or stops background agents when the main agent is idle +- Prevent benign Windows crash reports when the CLI exits +- Wrap clipboard writes in tmux passthrough so copy reaches the outer terminal +- OAuth-gated MCP servers now register their tools after reconnect +- Keep CLI authentication working in one-shot sessions +- Ctrl+C dismisses ask_user and elicitation prompts like Escape +- Show Authenticate for cancelled MCP OAuth requests +- Keep /help from listing rewind/undo twice +- Keep MCP servers in needs-auth after OAuth cancellation +- Hide staff-only commands from pre-auth help and self-documentation +- Surface skill loading errors and warnings in `skill list` +- Browse and filter models more easily in the CLI model picker +- Resume sessions faster by removing quadratic work when rebuilding the timeline +- Warn when static context uses most of the prompt budget and block requests when little conversation room remains +- Improve CLI responsiveness when reading and writing session databases +- Improve slash-command and theme picker option descriptions +- Remove inert sandbox host lists and the Clear policy on exit toggle +- Add file and folder completion to /sandbox path entries +- Update a backgrounded session's branch label in the Sessions split view when its working directory changes +- Skip unnecessary MCP reloads when returning to an already-loaded session +- Prevent the tgrep indexer from running out of memory on large monorepos, and fall back to ripgrep if the indexer is killed instead of repeatedly restarting it + ## 1.0.68 - 2026-07-01 - Add support for the kimi-k2.7-code model