mirror of
https://github.com/binaricat/Netcatty.git
synced 2026-10-09 15:58:34 +00:00
c6bdcffb89
* feat: add dynamic terminal tab titles for shell-reported session names Follow OSC 0/2 window titles on session tabs so tools like Claude Code can show live session state, with a per-host opt-out to keep connection names instead. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: address dynamic tab title review findings Restore the missing cn import, clear dynamic titles when the shell sends an empty OSC title, and drop stored dynamic titles when a host disables the feature. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: preserve renamed session labels and align focus sidebar titles Prefer user-assigned customName over shell titles, skip no-op dynamic title updates, and use resolveSessionTabTitle in the workspace focus sidebar. Co-authored-by: Cursor <cursoragent@cursor.com> * feat: show coding agent icons on session tabs Detect Claude Code, Codex, OpenCode, Droid, and other CLIs from OSC titles and launch commands, reusing shared agent icon assets inspired by freshell pane icons. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: harden coding CLI detection across SSH and startup paths Wire output scanning through attachSessionToTerminal, seed providers from auto startup commands, prevent title signals from overriding command detection, clear sticky state on shell titles, and release output scanners on session close. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: reset CLI output scanner when provider state clears Prevent exited-agent banners from immediately re-sticking the tab icon after the shell title returns to a normal shell name. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: update sticky CLI provider when title signals a different agent Allow agent switches in the same terminal while still resetting the output scanner whenever the provider identity changes. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: avoid clearing CLI provider on blank titles and cap output scan Ignore transient empty OSC titles and stop banner scanning after 16KB of unmatched output so regular SSH sessions do not pay perpetual scan cost. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: prefer runtime CLI provider over host startup command on tabs Runtime detection from commands, output, and titles should win over static host startup commands when resolving the session tab icon. Co-authored-by: Cursor <cursoragent@cursor.com> * fix: satisfy eslint for terminal escape stripping regexes Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
37 lines
1.3 KiB
TypeScript
37 lines
1.3 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import {
|
|
createCodingCliOutputScanner,
|
|
inferCodingCliProviderFromOutput,
|
|
stripTerminalControlSequences,
|
|
} from './codingCliOutputDetect';
|
|
|
|
test('inferCodingCliProviderFromOutput detects Codex startup banner', () => {
|
|
assert.equal(
|
|
inferCodingCliProviderFromOutput('>_ OpenAI Codex (v0.141.0)\r\nmodel: gpt-5.5'),
|
|
'codex',
|
|
);
|
|
assert.equal(
|
|
inferCodingCliProviderFromOutput('OpenAI Codex (v0.141.0)'),
|
|
'codex',
|
|
);
|
|
});
|
|
|
|
test('inferCodingCliProviderFromOutput detects other CLI banners', () => {
|
|
assert.equal(inferCodingCliProviderFromOutput('Welcome to Claude Code'), 'claude');
|
|
assert.equal(inferCodingCliProviderFromOutput('GitHub Copilot CLI'), 'copilot');
|
|
assert.equal(inferCodingCliProviderFromOutput('Factory Droid ready'), 'droid');
|
|
});
|
|
|
|
test('createCodingCliOutputScanner finds providers across chunked output', () => {
|
|
const scanner = createCodingCliOutputScanner();
|
|
assert.equal(scanner.feed('>_ Open'), undefined);
|
|
assert.equal(scanner.feed('AI Codex (v0.141.0)'), 'codex');
|
|
assert.equal(scanner.feed('more output'), 'codex');
|
|
});
|
|
|
|
test('stripTerminalControlSequences removes ANSI color codes', () => {
|
|
const stripped = stripTerminalControlSequences('\x1b[1mOpenAI Codex\x1b[0m');
|
|
assert.equal(stripped, 'OpenAI Codex');
|
|
});
|