You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Backslash sequences in paths and code no longer turn into line breaks
and tabs. A Windows path such as ...\Roaming\npm\node_modules\...
showed as three lines with the n missing, and a \t lost its letter,
because a text element made from C# in Unity 2022.3 parses \n / \t
by default. Every text element the panel builds now has that parsing off
(TextEscapes): the Overview's agent path, the executable field, tool
card input / output, diffs, code blocks, history rows and the rest. docs/design-notes/2026-09-18-text-escape-sequences.md.
The v0.58.0 tag, and therefore the public mirror and its release zip,
captured the tree before the redesign's last five commits (phase 4
disclosure rows, the second hint diet round and Overview reconnect row,
the UXML card/row templates with the USS fixes, the guide screenshots).
Those commits kept the version at 0.58.0, so the tag landed on the commit
that introduced the version, not on the merged head. This release
republishes the complete tree; no code change since 0.58.0 on main.
Settings has five tabs and an Overview. The single sixteen-card
scroll became Overview / Agent / Panel / Unity integration / Connection,
one tab body at a time, with the tab you left remembered for the editor
session (the header gear reopens it). The new Overview tab holds no
control: a Setup card (agent found?, signed in?, Unity operations on?)
and an "In effect now" card (permission mode, auto-approve level,
default model, language, and a red line whenever every permission check
is being skipped), each row with a "Change" link to the setting's one
home; the setup rows offer the obvious next move ("Set up", "Sign in",
"Enable") when a step is not done. The About card's version pills and
links are the Overview's footer. Phase 1 of docs/design-notes/2026-09-17-settings-redesign-plan.md.
One "go to this setting" entry point.AgentPanelWindow.ShowSettings (tab, cardId) selects the tab, opens a collapsed card and scrolls to it;
the first-run "Log in" button, the Overview links and the UapOps card's
auto-approve cross-reference (now a link instead of a sentence) all use
it.
Settings search. A search field at the right of the Settings title:
typing hides the tab strip and shows, from every tab at once, only the
rows whose label, hint, tooltip, button caption or current value contains
the text (case-insensitive), each surviving card headed by a
"Tab > Card" crumb; a hit inside a collapsed card or foldout opens it.
Clearing the field (or Esc) puts the tab you were on back exactly as it
was. The Overview tab is not searched, since it only mirrors other
settings. Phase 3 of docs/design-notes/2026-09-17-settings-redesign-plan.md.
A status pill on every Settings card header. The one-word state a
card used to bury in a line at the bottom of its body now sits at the
right end of its header, readable with the card collapsed: Unity
operations "Port N" / "Off" / "Not running", Agent "Signed in" /
"Not signed in" / "Not found", Appearance the detected CJK font, Model
the model a new session will run, Custom instructions "Not set" /
"N lines", Quick actions and Console errors their counts, Extension
profiles "N detected", uLoop and the Unity plugin "Installed" / "Not
installed", the danger zone "All off" / "Skipping checks". Tone (green
/ amber / neutral) only tints; the text always says the state. Phase 2
of docs/design-notes/2026-09-17-settings-redesign-plan.md.
Changed
The danger zone is its own collapsed card at the end of the Agent
tab, no longer the third row of the Conversation card, and it only
takes the warning surface while "Skip ALL permission checks" is ON.
At 300px the tab strip shows short labels ("Unity", "Connect").
Fewer always-visible hint lines in Settings. Twenty-two lines that
restated a label, repeated what the reconnect banner says, or described
one of twelve module switches moved onto the control's tooltip (a "?"
mark when long): the per-module descriptions, the Unity operations and
Extension profiles opening paragraphs, the notifications focus caveat,
the web fetch / search field notes, the staging-folder line, the
disallowed-tools "one per line", the subagent-card caveat and the agent
picker's "applies at the next reconnect". What stays visible is the one
line you need to choose (auto-approve scope, validation gate, the two
auto-continue switches, sign-in method, Ctrl+Enter).
The Unity operations, uLoop and Appearance cards no longer end with a
status line; the header pill carries it.
uap_web_fetch: the agent can look at images, PDFs and pages on the
web. Every agent's own web fetch flattens a URL to text, so a PNG or a
PDF found by a web search could not be seen. The new Core tool (module web, default ON) fetches one URL and returns it in the form the model
can use: PNG/JPEG downscaled like a composer attachment and returned
inline as an image block (the tool card shows the thumbnail), GIF/WebP
passed through as-is when under 5 MB, PDFs and any other file saved
under Library/AgentPanel/Downloads/ with the path (Claude Code reads
the PDF with Read; the result says which page ranges to ask for), HTML
reduced to readable text (title, headings, list items) plus the page's
image and link URLs so "search -> page -> the picture in it" is two or
three calls, and other text (JSON, XML, Markdown, SVG) returned with a max_chars / offset window. Body kind is decided from the first
bytes before the Content-Type, so a PNG served as application/octet-stream is still an image. The download runs on the
UapOps worker thread (never blocks the Editor); only the image
downscale hops to the main thread. Public http/https hosts only:
loopback, private, link-local and multicast destinations are refused,
on every redirect hop; 20 MB and 20 s caps; no cookies or credentials
are ever sent. The tool is deliberately not read-only -- an outbound
URL is a data-exfiltration channel for a prompt-injected agent -- so
every call shows a permission card naming the host and path
("Always allow" still works). Downloads older than 7 days or beyond
200 MB are pruned. Settings gain a "Web fetch" module row. Design note: docs/design-notes/2026-09-17-web-fetch-tool.md.
uap_web_fetch can import what it fetched as a project asset, and
the fetch destinations can be narrowed per project. A save_to
argument (a path under Assets/ with an extension) writes the
downloaded bytes there and imports them synchronously, reporting the
asset path and GUID -- "fetch this texture and put it on the material"
is one call; an existing file is kept unless overwrite is true. The
Web fetch settings gain "Allowed hosts" and "Blocked hosts" lists (one
host per line, subdomains included, blocked wins, empty allowed list =
any public host), enforced on the first URL and on every redirect hop
on top of the built-in private-address policy, which the lists can
never loosen. Design note docs/design-notes/2026-09-17-web-fetch-tool.md (stage 2).
uap_web_fetch extracts PDF text on request.as:"text" or a pages range ("3", "1-5", "7-") returns the text of a fetched PDF
in the result, page by page with --- Page N of M --- markers, so an
agent whose file reader cannot open PDFs (Codex, Grok) can still read a
paper or a manual; Claude Code keeps the saved-file path as well. The
extractor is dependency-free and best-effort: it scans every object
(no xref trust), opens object streams, decodes Flate (with PNG/TIFF
predictors), LZW, ASCIIHex, ASCII85 and RunLength, maps codes through /ToUnicode CMaps or WinAnsi / Standard / MacRoman + /Differences
glyph names, and derives word gaps and line breaks from tracked pen
positions and glyph widths (kerned runs stay one word, sub/superscripts
stay on the line). Encrypted files, XObject forms and scanned pages
yield no text and say so. Design note docs/design-notes/2026-09-17-web-fetch-tool.md sections 4.3 and 12.
The Agent card no longer offers a primary "Sign in" while an ACP agent
is already connected. The card now has four distinct shapes: signed
out (primary "Sign in" plus the how-to hint), signing in (status,
Cancel and the browser link), connecting ("Connecting to {agent}...",
no buttons) and signed in (the sign-in method line and a plain "Switch
account"). Design note docs/design-notes/2026-09-17-acp-account-card-phases.md.
Sketch strokes and pins no longer see the hidden main scene while a
prefab is open. In Prefab Mode the depth contour traced the room
behind the prefab, and a pin or a surface stroke could land on it:
the renderer scan returned the main scene's objects even though the
stage does not draw them. Picking and the contour now keep only what
the current stage contains. Design note docs/design-notes/2026-09-17-scene-sketch-strokes.md section 9.
The wheel now moves an axis-locked sketch plane from any viewpoint.
A Z plane seen from above did not respond, because the depth step fell
back to the view direction when it was nearly perpendicular to the
plane; an axis plane now always moves along its own normal. Same note.
The sketch plane's readout (depth, axis, key hints) sits at the Scene
view's top-left instead of next to the cursor, so it is visible for
every plane and view. Same note.
Sketch strokes: draw in the Scene view and hand the line to the
agent. The context bar's new "Sketch" menu (and an "Agent Sketch"
toolbar overlay in the Scene view) arms one of two modes; a left drag
then draws a stroke (S1, S2, ...) that becomes a context chip carrying
the world-space points, and the new read-only uap_stroke_list tool
(module markers) returns every stroke as JSON -- points, per-point
normals and the objects a surface stroke was drawn on, length, closed
flag, bounds and the sketch plane. Plane mode draws on a plane at
a depth you choose: the Scene view shows the plane's section contour
on every mesh it cuts, a depth-tested grid patch under the cursor, and
a readout of the depth and of how far the surface under the cursor is
in front of or behind the plane; the wheel and [] move the depth,
F snaps it to the surface under the cursor, X/Y/Z lock a world-axis
plane, C returns to camera-facing, Shift draws a straight line. Surface mode draws on the mesh surface under the cursor. Strokes
are Scene-view overlays only (also drawn into camera-mode screenshots),
survive a domain reload, and vanish on scene change or Play Mode; the
chip's X, the "N scene markers" chip's clear button, or Esc handles
them like pins. Design note docs/design-notes/2026-09-17-scene-sketch-strokes.md.
The CLI card and the Account card are now one "Agent" card. It
reads top to bottom as: which agent, whether its command was found
(with the install button when not), whether it is signed in, the
sign-in method, the sign-in buttons, and a closed-by-default
"Advanced (executable / command)" foldout holding the former CLI
fields, which opens itself while the command is not found. One
"Reconnect" button replaces "Re-detect", "Reconnect now" and the ACP
"Reconnect". The "Diagnostics" card is renamed "CLI output (stderr)".
Settings values and the reconnect-banner behavior are unchanged.
Design notes: docs/design-notes/2026-09-17-account-card-agent-picker-and-acp-init.md
(the picker's move out of the collapsed CLI card, the first step) and docs/design-notes/2026-09-17-agent-card-merge.md (the merge).
"API key authentication" (Claude Code only) and "Auth method id"
(ACP only) are now one "Sign-in method" row whose shape follows the
selected agent: Claude Code offers "Auto (leave it to the CLI)" /
"Subscription only", an ACP agent takes its authenticate method id.
Switching to an ACP agent no longer leaves the Claude hint line
behind. Design note 2026-09-17-agent-card-merge.md, section 3.
Fixed
"Connected with an API key (acp)" no longer shows under a
"Subscription only" picker. After switching from an ACP agent back to
Claude Code, the Account card read the ACP bridge's synthesized
system/init (which carried apiKeySource: "acp") as Claude API-key
billing until Claude's own init arrived. An init an ACP bridge produced
is never counted as Claude API-key auth, and the bridge now reports apiKeySource: "none". Design note docs/design-notes/2026-09-17-account-card-agent-picker-and-acp-init.md.
A Console error caused by the agent's own tool call no longer raises
the "ask the agent to fix these" chip. Measured with Codex: it passed uap_editor_execute_menu a menu path that does not exist
(GameObject/Duplicate); the tool answered found:false and the agent
worked around it, but Unity also logs an Error for that call, so the red
chip appeared, stayed for the rest of the session and was then offered
to the next agent as well ("Ask Grok to fix") although nothing was wrong
with the project. Errors logged on the main thread while a UapOps tool is
running are now attributed to that call: they are appended to the tool
result (Unity Console errors logged during this call:, at most 5
lines) so the agent still sees them, and they stay off the chip. Errors
from other threads, and anything the project logs again after the call,
reach the chip as before. uap_editor_execute_menu additionally checks
that the menu item exists before running it, so that particular Error is
no longer logged at all. Design note: docs/design-notes/2026-09-17-tool-caused-console-errors.md.
uap_scene_save: save a scene without any dialog. Saves the active
(or a named) loaded scene in place, or to path (Assets/.../Name.unity,
folders created) with saveAsCopy / overwrite. An untitled scene
without path is refused up front instead of reaching Unity, which
would open the Save Scene dialog. There was no save tool before, so
agents ran the File/Save menu instead -- see below.
Fixed
uap_editor_execute_menu no longer parks the Editor behind a native
modal dialog. A live Codex session ran File/Save on an untitled
scene: Unity opened the native Save Scene dialog inside the call, the
Editor loop did not tick once until a person closed it (288 s), every
other uap_* call died "never started" and the panel stopped answering
permission requests. The menu items measured to open such a dialog
(File/Save while a scene is untitled, File/Save As..., File/Open Scene, File/Build And Run, File/Exit, Assets/Import New Asset..., Assets/Import Package/Custom Package...)
are now refused before they run, with the alternative in the message.
Build Settings, Project Settings, Preferences and the rest are ordinary
windows and keep working.
A main-thread timeout now says when a modal dialog is the cause
(Windows). For dialogs a third-party menu or tool opens, the timeout
text names the dialog and says only a person can close it, instead of
"will finish on its own"; calls issued while it is open fail in 8 s
with the same note.
A screenshot returned as text no longer freezes the Editor for
minutes. Codex hands an MCP result over as one JSON string, base64
picture included; the tool card's image-path detection ran two regexes
that were quadratic on such text (measured: 431 s of "not responding"
for a 498 KB screenshot, 256 s in the live session, shown as "Hold on
... EditorUpdatePump.OnEditorUpdate"). The scan is now linear (same
input: 1 ms) and finds the same paths. Design note: docs/design-notes/2026-09-17-modal-menu-and-base64-scan.md.