* feat(terminal): support markdown links and cross-platform local file opening
Support terminal Ctrl+Click navigation for Markdown links and local paths across Windows, macOS, and Linux. Addresses https://github.com/Kuddev/pebrel/issues/203.
- Improve DEFAULT_HINT_REGEX: use [a-z] for smart-case insensitivity, ASCII word boundaries for drive letters, balanced nested parentheses in Markdown links, and exclusion of CJK punctuation.
- Release terminal lock before filesystem/network I/O when opening hints to prevent UI freezing on slow/remote drives.
- Pass pane and AnswerReader cwd to resolve relative paths, with localized warning toast when cwd is absent.
- Support generic protocol URIs and explicit OSC 8 hyperlinks without rigid whitelist blocking.
- Support Unix hostname resolution (gethostname, HOST, HOSTNAME) for file:// URIs without corrupting percent characters in raw disk paths.
- Integrate with platform::file_manager as the single authoritative file opener, with fallback to file reveal and failure visibility in both GPUI toasts and legacy shell toasts.
* fix(links): preserve hint actions and move file opening off UI threads
---------
Co-authored-by: kuddev <kuddev@users.noreply.github.com>
A heading label in the reader's outline wrapped once it exceeded the panel
width. The row's height is fixed during layout measurement, and the
horizontal available width of that scroll layer is not reliable there, so
the second line was painted outside its row box and landed on the next
heading's title. It only appeared with a narrow details panel and long
numbered headings.
Labels now use `truncate()`, so an outline row is always exactly one line
tall and its height no longer depends on the heading text. The full label
stays reachable through the row tooltip and the existing "copy heading"
context menu.
`Tooltip` now comes from the GPUI shell prelude, keeping third-party entry
points in the controlled list instead of importing `gpui_component` at the
call site.
`focus_tests` covers the contract: with the details panel at its minimum
width, the longest heading's row must be as tall as the shortest one's.
Co-authored-by: tataraDM <2201325624@qq.com>
Co-authored-by: Kuddev <christianmazel230@gmail.com>
The screen watchdog downgrades `Working -> Done` after the pane's screen has
been static for 5 ticks (it samples at 1 Hz), and that transition used to
notify unconditionally. But a static screen is not evidence that the agent
stopped: Claude Code prints nothing while it thinks, and a long command such
as a full build writes nothing for minutes. The result was a "回合完成" toast
while the task was still running.
The screen is only a fallback for when the hook never arrives. When hooks are
live, the agent CLI's own `TurnDone` is the authoritative terminal state, so
keep the screen-derived transition (the sidebar dot still updates) but stay
silent about it. Clients without hooks keep the old behaviour, where the
screen really is the only evidence.
This is the notification half of the problem. The other half is that
`active_background_tasks` never fires for Claude Code — its `Stop` payload
carries no `background_tasks` field — so the guard at the top of the
`TurnDone` arm is dead code for that CLI. Left as-is for now.
explorer.exe parses its command line without CommandLineToArgvW rules:
quoting the whole "/select,<path>" argument makes it truncate at the
first space and fall back to the deepest existing ancestor directory.
Pass /select,"<path>" via raw_arg so only the path is quoted.
The legacy shell hand-rolled the same argument; route it through
platform::file_manager so the construction stays in one authority.
Fixes#167