Replace the right-aligned wrapping button row with full-width rows
stacked vertically inside a bordered container, mirroring the diff
block styling within tool calls. Kind semantics move from solid
button backgrounds to a colored Lucide icon per row (check-check /
check / x / ban), gated by displaySettings.showEmojis like other
tool call icons. Long option names truncate with ellipsis and expose
the full text via the title attribute.
Layout is now stable regardless of option name length or view width,
and all !important declarations plus the unreachable selected/disabled
permission styles are removed.
The .agent-client-error-overlay-link rule the banner anchor relies on was
missing from the previous commit, so the link rendered unstyled
(flagged in PR review). Add the rule.
CLAUDE.md mandates 'one short line max' for comments, and a Discord
PR review bot pointed out that several comments added in this PR
ranged from 2 to 13 lines. Trim them, then add one new 1-line note
that the title-update useEffect intentionally fires on initial mount
in addition to subsequent sessionTitle changes — the React-default
behavior the bot flagged as easy to misread.
* computeSessionTitle JSDoc: 13 lines → 1 line (matches sibling
helpers in session-helpers.ts).
* ChatPanel title-update effect block: 5 lines of context comment
collapsed; new 1-line note clarifies the initial-mount fire is
intentional.
* ChatComponent handleSessionTitleChanged comment: 5 → 1 line.
* ChatView.getDisplayText comment: 2 → 1 line.
* ChatView.refreshDisplayText JSDoc: 8 lines → 1-line inline comment.
* styles.css view-header-title-container comment: 8 → 1 line.
No behavior change.
The previous commit made the tab strip header reflect the session
title via WorkspaceLeaf.updateHeader(), but Obsidian's *inner*
view-header (the bar with ◀▶ nav buttons + centered title + view
actions, shown only in editor-area placements) is not refreshed by
that API. It kept showing the initial 'New session' even after the
tab updated, producing a confusing dual-title display.
Hide just the .view-header-title-container with visibility: hidden
(not display: none) so:
* The stale title text disappears.
* The flex slot is preserved, keeping view-actions (this plugin's
and any other plugins') anchored on the right.
* Nav buttons on the left and the action area on the right both
remain usable.
* In sidebar placements, .view-header is already absent so this is
a no-op.
The 'more' (...) icon next to each session was a clickable <div>:
no tabIndex (not focusable), no aria-label (screen readers had
nothing to announce), no Enter/Space activation (keyboard users
couldn't open the menu).
Switch to a <button type="button"> with aria-label='Session
actions' and the Obsidian 'clickable-icon' utility class for
hover/focus styling parity with MessageBubble's CopyButton and
ErrorBanner's close button.
Update moreRef's type to HTMLButtonElement, and reset browser
<button> defaults (background, border, padding, font) on
.agent-client-session-item-more so the visual matches the prior
<div> implementation pixel-for-pixel.
Resolve SessionHistoryModal.tsx conflict by keeping the PR's
extraction of EditTitleModal into its own file, and apply dev's
window.setTimeout fix to the extracted EditTitleModal.ts.
The mode/model/configOption selectors used native <select> elements,
which opened downward (overlaying the input), couldn't be styled
(browser-default selection rectangle), and truncated labels mid-word.
Replace with a small ToolbarDropdown component that opens Obsidian's
Menu (the same API already used for the sidebar menu in ChatPanel).
The new trigger renders as inline typography — no button chrome — and
the menu opens above the trigger via showAtPosition, so it no longer
covers the input. Active selection uses Menu.setChecked() and inherits
Obsidian theme tokens.
Layout: dropdowns are left-aligned, send button pinned right via
margin-left: auto. Per-category icons (shield/cpu/sliders-horizontal/
brain) add visual hierarchy without adding labels.
Removes the useObsidianDropdown hook and the <select>-specific !important
overrides in styles.css. Net -46 lines.
Separate agentCwd from vaultPath so the agent's working directory
can differ from the vault root. Add ChangeDirectoryModal with text
input and native folder picker (Electron dialog API). Both sidebar
and floating More menus get the new menu item.
Also adds a cwd banner below the header when working outside vault,
and syncs agentCwd on session restore/fork from history.
Add pencil icon to session history items that opens an EditTitleModal
for renaming sessions. The title is persisted locally via saveSession
with optimistic update and rollback on error. For agent-only sessions,
the original session cwd is preserved (not the current vault path).
Fix CSS selector from descendant (.a .b) to compound (.a.b) since both
classes are on the same element. Remove redundant markdown-rendered rule
and max-width constraint that prevented overflow-x scrolling.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Show a copy button when hovering over any message (user or assistant)
that contains text content. Uses callback ref for reliable icon
rendering on conditional mount, and handles text_with_context alongside
plain text extraction.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Rewrite ChatHeader to use .nav-header + .nav-buttons-container
with .clickable-icon .nav-action-button for native sidebar look
- Set navigation=false on ChatView to hide unused .view-header
- Replace custom header button CSS with Obsidian's clickable-icon
- Adjust layout spacing for sidebar, floating chat, and dropdowns
- Use Obsidian CSS variables for colors, fonts, and spacing
Add OverlayVariant type ("error" | "info") to support both error
displays and informational notifications. Remove outside-click-to-close
behavior, render suggestions as copyable code blocks for non-error
variants, and restrict emoji to error variant only.