docs/notes-3.7.0beta3.txt
Rama master · réplica de lectura del repositorio original.
Version 3.7.0beta3 was built on June 2, 2026.
New Features:
- Tabs can now be placed on the right side
of the window.
Improvements:
- Undo Close now has the ⌘⇧T shortcut. Show
Tabs in Fullscreen moved to ⌘⇧U.
- Sending or copying clippings now prefixes
each one with its title in bold Markdown and
separates multiple clippings with a
configurable string (default is a line of
two dashes). See the Clipping Separator
advanced setting.
- In a workspace session of type code review, the
system prompt is now editable in Settings >
General > AI > Prompts. It defaults to the
bundled prompt and is passed to Claude Code at
launch.
- Clippings now keep history. An archive
button in the clippings panel snapshots
the current list and clears it; back and
forward buttons walk the history. The
new `it2 session archive-clippings`
command and matching `iterm2.archive_
clippings` API call do the same. Claude
Code reviews now automatically archive
before each pass, so each review starts
with a clean list while old findings
remain reachable.
- The clippings and inline AI chat panels
can now be resized by dragging their left
edge. The chosen width is remembered per
machine.
- Closing a pinned tab now requires
confirmation, whether via the close
button, middle-click, ⌘W, or quitting
the app. The dialog identifies the tab
as pinned so the prompt is clear.
- The Cycle Tabs Forward and Cycle Tabs
Backward key actions now have a help
button explaining their tap-vs-hold
behavior.
- Add DeepSeek v4-flash and v4-pro models.
- DeepSeek v4 thinking mode is now supported.
Toggle the lightbulb in the chat toolbar to
enable. Reasoning summaries appear live in
the conversation and round-trip correctly
on multi-turn tool calls (fixes a 400 from
the API when reasoning_content was missing).
- The “Configure AI Model Manually…” popover
now has a section for custom HTTP headers
that are appended to every AI request (chat,
vector store, and file upload). Useful for
proxy auth or routing tags. Custom headers
override built-in headers with the same
name. Values are stored unencrypted in
iTerm2’s preferences.
- PDF chat attachments now work on Anthropic.
Previously the bytes were mangled into a
UTF-8 approximation; PDFs are now sent as
native document content blocks. The chat
attachment picker also disables files the
current AI provider cannot accept, and
rejected drag-and-drop attachments now show
an explanatory alert instead of vanishing
silently.
- In ttmux, the per-pane modifyOtherKeys state is
now restored on attach (using tmux 3.5+’s
pane_key_mode format), so reattaching while nvim
or another app is running keeps the correct key
reporting mode active.
- Open Quickly now uses recency as a
tiebreaker, so the session list (whether
the query is empty or matches several
panes) is ordered most-recently-used
first across tabs and windows. The
current session is omitted from results
since it is never a useful jump target,
so Cmd-Shift-O followed by Enter now
jumps to the most-recently-used other
pane. A new preview side panel shows a
snapshot of the highlighted session.
Open Quickly can also be assigned a
system-wide hotkey in Settings > Keys
that works while another app is in
front, without activating iTerm2 until
you commit a selection.
Bug Fixes:
- iTerm2 no longer spuriously offers to reset
terminal state or restore the tab and window
title when the local hostname changes (for
example when mDNS renames your .local host)
or when you run sudo. Any two localhosts are
now treated as the same host.
- AI chat no longer fails with a tool_use_id
error after an auto-approved command. The
tool call was dropped from saved history
while its result was kept; the prompt is now
repaired when reloaded, healing chats saved
by earlier versions too.
- Session notes now keep their distance from
the top-right corner of a session when it
is resized, instead of from the bottom-left.
- A tab no longer shows a stale or missing
session status (such as “waiting”) when a
pane carrying a status is closed, moved
between tabs, or reparented (for example by
entering or exiting a workgroup). The tab’s
aggregated status is now recomputed whenever
its set of sessions changes.
- Full-screen programs that don’t use the
alternate screen buffer (such as Claude
Code) no longer destroy on-screen content
when, on startup, they move the cursor to
the top of the screen and repaint over it.
The visible screen is now scrolled into
history first. Requires shell integration.
- The “taking a long time to check state
restoration” prompt no longer appears so
readily right after login, when the system
is busy and disk I/O is slow. The integrity
check timeout is now extended in the first
ten minutes after boot, the prompt's
wording is friendlier, and it defaults to
continuing rather than discarding windows.
Issue 11809.
- Editing a color in a color well no longer
silently switches the picker from sRGB to
P3 (or back). The color space the well is
showing is now preserved across the edit
roundtrip. Issue 12720.
- The Python API server now takes an
advisory lock on its socket directory at
startup. A second iTerm2 instance sharing
the same application-support directory
(e.g. two non-suited copies launched from
different .app bundles) will refuse to
start the API server instead of silently
unlinking and rebinding the original
instance’s socket.
- Localhost detection no longer breaks when
your computer's hostname changes (for
example after switching networks). Whether
a session is on the local machine is now
recorded when the host is first reported,
rather than recomputed later by comparing
names. This fixes the git status bar, the
workgroup diff list, opening local files,
and uploads/downloads going stale after a
rename.
- Pressing Enter to commit an IME
composition (e.g. Chinese, Japanese,
Korean) in the AI Chat input no longer
prematurely submits the unfinalized
candidate text.
- Open Quickly now updates the MRU order
when you jump to a session, so repeated
Cmd-Shift-O Enter cycles between the two
most-recently-used panes instead of
drifting onto a sibling pane that
happened to be active in the destination
tab. Issue 12799.
- Open Quickly recency now strictly follows
focus order. Jumping to a pane no longer
bumps the previously-active sibling in the
destination window, and structural changes
(closing a pane, splitting, restoring) in
background windows no longer reorder the
list, so Cmd-Shift-O Enter reliably
toggles between the last two focused
panes. Issue 12799.
- OSC color overrides (foreground, background,
cursor, selection, palette, and the iTerm2
SetColors variants) now survive macOS Light
/ Dark appearance switches and toggles of
the separate light / dark colors profile
setting. The override is written to every
appearance variant of the profile key so
it persists until OSC 110/111 or a manual
reset clears it.
- The Cockpit orchestrator’s send_text tool
now routes payloads containing control bytes
(ESC, Ctrl-C, etc.) as raw keystrokes instead
of bracketed pastes. The previous wrap turned
embedded control bytes into literal pasted
data, so e.g. sending ESC :q ENTER to a vim
session inserted “^[:q” as text instead of
quitting. Pure prompt-style text still goes
through as a paste, as Ink-based TUIs expect.
- Showing the clippings panel in a window
zoomed to fit the display no longer grows
the window horizontally. The tab content
area absorbs the panel’s width instead,
mirroring the toolbelt’s behavior.
- The Install Claude Code Integration intro is
now presented as a real sheet attached to the
installer panel, rather than a subview
overlay. Enter now correctly activates
Continue instead of the Install/Next button
it was visually covering.
- Workgroup peer-switch and toolbar shortcuts
now fire no matter which view in the terminal
window has keyboard focus, including the Diff
peer’s Run Anyway button, the Code Review
prompt’s text view, and the clippings table.
They are now dispatched centrally instead of
relying on the focused view to forward them.
- The Claude Code installer now reliably adds
Enter/Exit Workgroup triggers to divorced
sessions whose original profile was picked.
The previous pass matched on the dict’s
KEY_ORIGINAL_GUID, which could be stale
after an arrangement reload. The walk now
also consults each live or buried session’s
runtime originalProfile reference.
- The Code Review prompt overlay no longer
drifts out of sync with light/dark mode. The
panel cached a CGColor snapshot of
windowBackgroundColor resolved against an
arbitrary NSAppearance.current, so its
background could disagree with its own text
view. It now uses the existing layer-backed
solid color view, which refreshes the color
in updateLayer under the correct drawing
appearance.
- The heavy window border no longer leaves its
corners unbordered on low-opacity windows. The
corner-radius detector failed on transparent
windows (their interior is not opaque enough),
so the border fell back to a wrong radius and
the corner arc was clipped away. Detection now
works at any opacity, with a better per-OS
fallback radius. Issue 12882.
- The heavy window border now stays flush with
the window edges instead of sometimes drawing
as a smaller inner rounded rectangle. Its view
could be left at a stale size and was not kept
in sync with the window. Issue 12882.
- The legacy (non-GPU) renderer now invalidates
only the lines that actually changed, instead
of repainting the entire view on every cell
update. Heavy TUI animations (e.g. spinners
that rewrite a single line at high frequency)
use significantly less CPU on hosts where the
GPU renderer is disabled. Issue 12790.
- Anthropic tool calls reloaded from a chat
transcript would fail with HTTP 400 because
the function output got serialized as plain
text instead of a tool_result block. The
parser stored the tool_use id only on the
inner FunctionCall while the serializer
looked on the outer wrapper, so the id was
lost on round-trip. Both fields are now
populated so persisted tool calls survive
the round-trip.
- Anthropic requests no longer 400 when a
stray user message gets persisted between a
tool_use and its matching tool_result. The
request builder reorders so the tool_result
is always emitted immediately after the
tool_use, with any intervening messages
bumped to after it.
- Fix a launch crash when a saved status bar
layout referenced an RPC-provided text
component whose configuration was missing
the registration request (for example, from
a partial profile restoration). The base64
decoder dereferenced a NULL pointer instead
of returning nil. Issue 12861.
- The “Respect shortcuts from System Settings >
Keyboard > Keyboard Shortcuts > Keyboard”
option used subset matching on modifier keys,
so a system shortcut bound to Ctrl+Right (or
any other strict subset of an event’s
modifiers) would also intercept
Ctrl+Shift+Right and similar keystrokes.
Modifier comparison is now exact. Issue 12859.
- When launched with -suite, orphan adoption
could no longer reattach to surviving
multi-server daemons after a state-database
loss. The application-support directory is
already isolated per suite, but daemon
sockets were also being named with the
suite in the filename, while the orphan
adopter (and the settings-export exclusion
list) still expected the plain
iterm2-daemon- prefix. The suite is now
carried only by the containing directory,
matching how the dotdir fallback already
worked. A transitional fallback accepts
the {suite}-daemon-N.socket form so betas
that wrote that name don't strand their
daemons across the upgrade. Issue 12860.
- Fix a crash when a Python API client invoked
a function whose argument string contained
non-BMP characters (for example, emoji). The
expression tokenizer’s optional-path
recognizer indexed by Unicode scalar while
the surrounding tokenizer tracks UTF-16
positions, so the offset could run past the
scalar count and trap. Issue 12856.
- When ESC #3, #4, or #6 (DECDHL/DECDWL) was
received mid-line, characters already on the
line were correctly doubled in size but the
cursor was not advanced to compensate, so
text printed afterward overwrote the right
half of the existing characters. The cursor
is now repositioned when the line’s width
class changes.
- ssh:// URL handling and Bonjour-discovered
host profiles now find ssh through the user’s
login shell PATH, so Homebrew’s ssh (or any
ssh outside /usr/bin) is used. The advanced
setting SshSchemePath, when changed from its
default, still wins. Issue 3415.
- The faint-text opacity slider in Profiles >
Colors now has a minimum of 0.1, and existing
profiles with a stored value below 0.1 are
clamped at runtime. A value of 0 caused SGR 2
text to render in exactly the background
color, making it invisible. The slider’s
tooltip was also incorrect (it described
minimum contrast); it now describes faint
text opacity.
- The “open password manager automatically”
feature no longer triggers when a shell
script briefly disables terminal echo to
suppress the visible echo of an OSC report
response (e.g. it2getvar, it2profile -g).
ECHO must now stay off for at least 0.2
seconds — tunable via the
DetectPasswordInputDebounce advanced
setting — before iTerm2 treats it as a
password prompt.
- Fix the Minimal-theme tab bar overlapping the
terminal in fullscreen when adding a second
tab with “Hide tab bar when there is only
one tab” enabled. The titlebar accessory
hosting the tab bar grew from zero to its
full height but the content view was not
re-laid out to leave room for it. Issue
12811.
- The Touch ID for sudo offer no longer relies on
AppleScript admin elevation, which fails on
macOS 26 with EPERM when writing to
/etc/pam.d/. Accepting the offer now lets you
copy the install command or run it in a new
iTerm2 window where you can enter your sudo
password.
- Fix a bug where suppressing a warning would
not stick across launches when prefs are
loaded from a custom folder with “Save
changes: Automatically.” The debounced save
could lose the race against app exit, so
the next launch overwrote the just-saved
suppression with the stale remote copy.
applicationWillTerminate now flushes
synchronously when Automatic mode is on.
- Fix Ctrl-letter keystrokes appearing as
literal text (e.g., “0x4” for Ctrl-D) in
tmux -CC mode when the tmux server has
extended-keys enabled and an inner app
has turned on modifyOtherKeys. Control
bytes 0x00–0x1F are now sent through
send-keys with the -H flag on tmux
3.0a or newer, which bypasses tmux 3.5’s
silent literal-text fallthrough for
unmodified C0 bytes. Issue 12845.
- Fix dragging a tab or split pane onto a
window with only one tab. The destination
window’s tab bar is hidden in that case, so
AppKit could not deliver drag events to it
and a brand-new window was created instead.
Tab bars are now temporarily shown for the
duration of any tab or session drag.
Issue 12846.
- Extend dual-mode SGR to underline color
via CSI 58:12:Rl:Gl:Bl:Rd:Gd:Bd m and
CSI 58:13:Nl:Nd m.
- Request the badge authorization option
from UNUserNotificationCenter so the
dock-tile bell-count badge actually
renders and the “Badge application
icon” toggle appears in System
Settings › Notifications › iTerm.
- Hide a top-right status indicator while
the mouse is hovering an inline button
it overlaps, so the button stays
reachable.
- Honor IT2_APP_PATH in the iterm2
Python library’s AppleScript cookie
request, matching the “it2” CLI. Lets
external scripts targeting a -suite
dev build get a cookie from the right
iTerm2 instance instead of whichever
one macOS routes to. Issue 12850.
- Honor IT2_SUITE when checking for
disable-automation-auth in the iterm2
Python library, so external scripts
targeting a -suite instance no longer
silently fail with 401 when stock
iTerm2 has “Always Allow All Apps”
enabled. Issue 12864.
- Add advanced settings to customize
the window border color for focused
and unfocused windows (requires
“Show border around windows” with
no title bar).
- Add a per-profile “Contextual Alternates”
toggle to the font picker’s options menu,
for fonts that expose calt. Lets you keep
calt-based coding ligatures on for one
profile while turning off surprising
substitutions (e.g. Monaspace rendering
[] as a checkbox) on another. Issue 12847.
- Add an Erase All Settings and Data
button in Settings > General >
Settings. It offers to export first,
then erases preferences, profiles,
saved sessions, scripts, and the
contents of ~/.iterm2 and the app
support folder, then quits
immediately. Issue 12852.
- Add keyboard shortcut bindings to
workgroup toolbar items. Navigation
cluster (back, forward, reload) and
the standalone reload toolbar item
each support a per-action shortcut,
with defaults of ctrl-cmd-left,
ctrl-cmd-right, and cmd-R. Shortcuts
take precedence over profile key
bindings and main menu items but
defer to global key bindings.
- Add an optional per-peer shortcut
for jumping to a peer in a workgroup.
Configurable in the workgroup
session settings; when unset, the
built-in opt-shift-cmd-number
fallback still works. Custom peer
shortcuts route through the same
pipeline as workgroup toolbar
shortcuts, so they beat profile
bindings and the main menu but
defer to global key bindings.
- Fix vertical window resize being
silently rejected when the window
sits partly below the screen.
- Coalesce pending re-evaluations of
interpolated strings. Previously,
every dependency change enqueued a
fresh dispatch_async on the main
queue, so a tmux -CC pane title that
changed many times per second could
pile millions of blocks onto the main
queue and exhaust memory. Issue
12857.
- Built-in browser: hide our message
handlers and skip the page-world
Notification, geolocation, console,
and audio bridges inside Cloudflare
Turnstile, hCaptcha, and similar
challenge frames so the captcha
probe sees an unmodified Safari
surface.
- Built-in browser geolocation: stop
silently dropping requests when
permission is not granted; the page
now receives a PERMISSION_DENIED
error instead of hanging. Push the
decision to the calling frame so
navigator.permissions.query reflects
reality, and route success and error
callbacks back to the originating
iframe instead of always the main
frame. Stop persisting system-level
denials (Location Services off, OS
prompt declined) as per-site
decisions; only an explicit Allow
or Block in the per-site dialog is
remembered. The same fix applies to
notification permissions.
- Honor the option-modified “Quit and
Close All Windows” menu item. iTerm2
now samples the option modifier at
quit time and erases saved state when
the user picked the option-modified
menu item, so it actually closes all
windows on the next launch. Issue
12852.
- Clear tab status when a session’s
program terminates (broken pipe or
tmux detach) so stale status text
and indicators no longer linger.
- Fix a stall after large output bursts
when the main thread was reading every
line of the burst to announce it for
VoiceOver. Two changes: the LineBlock
metadata provider no longer allocates
a heap block per inner-loop iteration
(which was churning through the objc
associated-objects table on release),
and the new-output announcement is
capped to the most recent 256 lines so
giant floods stop overwhelming
VoiceOver’s speech queue.
- Fix Session Status toolbelt rows
appearing in arbitrary order when
the toolbelt is first opened. The
initial population now sorts by
priority like every other update
path.
- Add a Diff workgroup session mode
that defers running the configured
command until there are staged or
unstaged changes to show. The Claude
Code workgroup’s Diff peer uses it,
so the peer no longer launches
difftool on a clean tree. Existing
Claude Code workgroups are migrated
on first launch so the Diff peer
picks up the new mode automatically;
flip it back to Regular in Settings
if you prefer the old behavior.
- Add a urlHandlerCommand advanced
setting. When set, clicking a URL
(including OSC 8 hyperlinks and
auto-detected URLs) runs it as a
/bin/sh -c task with the URL in
\(url) and a background-open flag in
\(background), instead of handing the
URL to the system. Its output goes to
the Script Console. Lets you route
links through your own script, e.g. to
open in the background or pick a
browser mode. Empty by default, so
normal URL opening is unchanged.
Issue 12878.
- Script Console no longer jumps to the
top when a new entry arrives. The
script list keeps its scroll position
and selection, and a filtered log view
stays put as new lines come in.
- Fix black, unreadable text in the
Script Console Logs tab in dark mode.
- Session Stats now shows the correct
keyboard shortcut for workgroup peers
that have a custom peer-switch
shortcut configured, instead of always
showing the built-in ⌥⇧⌘ number.
- Jobs toolbelt and the status bar job
popover gain a “Notify on Termination”
right-click option. Monitored jobs show
a bell next to their name, and when the
chosen process exits a modal alert names
the job and process ID.
- The badge no longer hides behind the
clippings panel. It now right-aligns
at the inner edge of the right-gutter
panel area in both the legacy and GPU
renderers.
- AI text-typing tools (send_text in
orchestration mode and
insert_text_at_cursor in
session-bound mode) now accept a
small backslash-escape vocabulary so
the agent can drive control keys.
Recognized: \\ for a literal
backslash, \n, \r, \t, and \uXXXX
(four hex digits) for any Unicode
scalar. Set append_newline to false
for a standalone control key (e.g.
Escape) so iTerm2 doesn’t tack a
newline onto it. Lets the agent
send things
like for Ctrl-D, for
Ctrl-Z, for Ctrl-L, and
for Escape.
- Implement start_session for the
orchestrator. The agent can now
spawn a new window, tab, or
vertical split via the existing
start_session tool. Every spawn
prompts for user approval inline
in the chat, with the placement
and command (if any) shown in the
prompt. Returns the new session’s
synthetic workgroup_id so the
agent can immediately drive the
new session with the other tools.
- Dropping a file onto the AI chat
text field now offers to attach it
when the current backend supports
that file type, instead of always
inserting its path as text. The
choice can be remembered.
- AI chat can now attach images to
OpenAI models (vision), and audio
to OpenAI audio models on the
chat-completions API. Attachment
support is now decided by modality
rather than a per-format allow
list: if a backend can carry an
image, PDF, audio, or video block,
you can attach it, and an
unsupported file is reported by the
model instead of being silently
refused.
- Announcements now become narrower
when the clippings panel is visible
so they no longer overlap it.
- Python API: GetPromptResponse now
has excluded_subranges, listing the
cell regions inside the command
range that the shell marked as
non-input via OSC 133;A;k=s|c|r
(PS2 prefixes, right-prompt cells).
Available on responses to
async_get_last_prompt and
async_get_prompt_by_id. Always
empty on PromptMonitor.PROMPT
notifications — fetch via the RPC
after a COMMAND_END notification
for the populated value.
- OSC 133 aid= now tracks nested
shell-integration sessions: a local
shell that runs ssh into a remote
shell with shell integration (or a
REPL that emits its own A/B/C/D)
no longer confuses iTerm2's mark
bookkeeping when the inner D's
arrive before the outer's. Each
mark carries the aid from its
A/B/C/D markers and a parentAid
pointing at the open mark it
nested under. D;aid=X closes the
matching command instead of the
topmost. If an outer command dies
(ssh tunnel drop, etc.) without
the inner ever closing, the outer
D cascade-closes every still-open
mark whose parentAid chain leads
back to it so no inner mark leaks
as still-running.