Terminal hover (M1, shipped):
- ``terminal_link_click`` now strips ANSI/VT100 escapes at
``classify_terminal_token`` entry so abspath / URL detection works
against ANSI-coloured ``ls`` output (allocation-free fast path when
no ``\x1b`` is present).
- New ``_RELPATH_PATTERN`` + ``_resolve_relpath_in_cache(view, token)``
resolve relative tokens against the workspace mirror via
``RemoteToLocalCacheMapper`` — only marked clickable when the local
cache file actually exists; directory / ``..`` traversal /
no-context cases all safely fall through.
- Click handler routes ``relpath`` outcomes through
``_handle_local_path`` directly (no bridge round-trip needed).
- Structured ``terminal_link.hover.*`` / ``terminal_link.click`` logs
at every decision point now name ``matched_kind`` / ``matched_text``
/ ``resolved_target`` / ``action`` / ``outcome`` /
``source=hover_cache|reclassify`` so the next macOS Cmd+click
"paint OK / click silent" repro can be diagnosed from logs alone.
Terminal close (M4, partial):
- ``terminal_tmux_session.close_terminal_session(host, name, *, kind)``
unifies the three close paths via ``TerminalCloseOutcome``:
``"plain"`` = ``tmux kill-session`` (non-persistent default-on-pane
close), ``"kill"`` = same SSH effect but explicit user action
(palette command path), ``"detach"`` = current default (no SSH
call, session persists).
- New ``sessions_terminal_close_default`` setting accepts
``"detach"`` (default, current behavior) or ``"plain"``;
``"kill"`` deliberately excluded from default policy
(regression-guarded).
- ``kill_terminal_session()`` retained for backward compat —
``close_terminal_session("plain"|"kill")`` delegates so
session-name validation + argv shape stay in one place.
- Palette wiring (new ``Sessions: Close Remote Terminal (don't
persist)`` command) + on-pane-close listener that reads the new
setting are deferred to a follow-up commit; the internal API in
this release is feature-complete and tested but not yet
user-reachable from the palette.
Diagnostic instrumentation (no behavior change):
- ``jupyter_hosting.build_notebook_url`` logs ``local_port`` +
``notebook_path`` at entry.
- ``commands_python_pipeline._open_remote_jupyter_in_browser`` logs
the constructed URL right after ``build_notebook_url``, again at
``finish()`` entry, again immediately before ``webbrowser.open``,
and ``.exception(...)`` inside the previously-silent
``except Exception: pass`` branch — pinpoints which step swallows
the open in the slow-link "queue.done elapsed_ms=27748 but no
browser tab" repro.
- ``ssh_file_transport._execute_rust_bridge_request_persistent``
extracts ``payload_bytes`` + ``params.max_traversal_depth`` from
the request payload and threads both into the
``bridge.request_timeout`` trace event, so the mirror-sync
deep-traversal hang
(``stall_phase=awaiting_response_dispatch`` after 45s) reports the
depth + payload size that hit the timeout.
- ``sessions_native::broker::dispatch_response_line`` gains an
env-gated (``SESSIONS_BROKER_DISPATCH_DEBUG``) stderr trail
covering enter / parse-OK / parse-FAILED / no-id-drop /
id-and-slot-presence — zero noise unless explicitly enabled,
drained through the existing ``STDERR_TAIL_CAPACITY=100`` ring so
``_rust_ffi.stderr_tail(host_alias)`` surfaces the trace
post-repro.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This keeps `sublime/` as the real package root for local installs while making distribution reproducible with a dedicated `.sublime-package` build script.
Made-with: Cursor
Bootstrap the repository with uv-managed Python tooling and pre-commit checks so each small feature slice can be validated before commit.
Made-with: Cursor