- collectMcpServerNames takes an includeDisabled flag (default true); the
/mcp completer now passes false for test/reconnect/reauth/unauth, whose
handlers (#resolveServerForAuth, reconnectServer) can never resolve a
disabled-only discovered name (dropped from mcpManager, absent from
mcpServers). enable/disable keep offering it since #handleSetEnabled
handles that case for both directions.
- Moved the /mcp autocomplete CHANGELOG entry from the now-released
## [17.1.0] section (where an earlier upstream merge relocated it) back
under ## [Unreleased].
- Shimmed writable select.value in export-html harness; linkedom's getter-only HTMLSelectElement.value made template.js theme assignment throw under strict mode.
- Bound the oauth-flow port blocker to 127.0.0.1 explicitly; macOS lets a specific-address bind coexist with a wildcard one, so the flow bound the blocked port and never fell back.
- Re-anchored atomic-rewrite race tests on rewriteEntries() after the compaction-supersede rewrite trigger was removed in cb63ebd.
- Superseded compaction summaries render as elided placeholders in the forward transcript since cb63ebd; only the active compaction keeps its text and frames.
/mcp remove <name> only ever succeeds against a config-file mcpServers
entry (project scope by default, user scope via --scope user) —
runtime-discovered-only servers have no config entry and always fail
with "not found in <scope> config". Restrict remove completions to
config-file names, and tag a user-only name with --scope user so the
inserted command is directly executable.
- collectMcpServerNames now unions userConfig.disabledServers so a
third-party-discovered server that was /mcp disable'd (and thus dropped
from mcpManager.getAllServerNames()) still tab-completes as an /mcp
enable target.
- collectMcpServerNames accepts an optional preloaded { userConfig,
projectConfig }; #handleList() passes what it already read instead of
re-reading both config files a second time.
- /mcp's argument completer catches collectMcpServerNames failures (e.g.
malformed config JSON) and returns null instead of letting the
rejection escape un-awaited callers.
Adds an exported collectMcpServerNames() helper (used by both /mcp list
and the new completer) and a runtime-bound getArgumentCompletions for
/mcp that resolves server names after enable/disable/test/remove/
reconnect/reauth/unauth, filtered by the typed prefix. Subcommands with
a different argument shape (add, smithery-search, ...) keep returning
null, and subcommand-name completion is unaffected.
Closes#5654.
Settings.get returns raw merged config without element validation, so a
scalar or non-string tools.xdevInlineDevices entry reached Bun.Glob and
threw while building the system prompt. Normalized the allowlist to
string patterns and compiled globs once per render.
Applied the session-scoped tool reset after /branch and /btw create their
branched logical sessions, closing the same stale-state leak as /new,
handoff, and cross-session switches.
Added a branch transition to the staged-preview regression matrix.
Applied the session-scoped tool reset after handoff creates its replacement session.
Added regression coverage for stale staged preview directives across handoff.
Fixes#4093
Cleared queued tool-choice directives and ACP always decisions after successful logical session transitions.
Added new-session and cross-session regression coverage for staged resolves and both ACP always decisions.
Fixes#4093
- Pinned displaceable snapshots like hub waiting polls and todo lists to the viewport during active execution.
- Prevented unpinned spinner ticks from repeatedly committing mutating rows to native scrollback and force-sealing blocks.
Extract the first-wins global registration into an exported
ensureGraphCommonJsRequireRegistered() seam and assert its idempotent
(first-wins) contract directly, instead of copying the module and importing
the copy at runtime. Removes the inline await import() banned under
packages/coding-agent and keeps regression coverage: the test fails if the
registration reverts to an unconditional set.
Fixes#6449
On npm/source-link installs the @(scope)/pi-coding-agent root shim is served
from src/, so an extension's import evaluates a second instance of
legacy-pi-compat.ts. Its unconditional top-level
Reflect.set(globalThis, COMMONJS_REQUIRE_GLOBAL, evaluateGraphCommonJs)
clobbered the host bundle's populated CommonJS graph bridge with an empty-state
copy, breaking transitive CommonJS dependency resolution for legacy pi
extensions ("Missing graph-owned CommonJS definition").
Guard the registration to first-wins so the host-owned bridge survives a
second module instantiation.
Fixes#6449