Skip to content

Commit f94232e

Browse files
vakovalskiiclaude
andcommitted
chore(release): fold #289 #290 + review fixes into 7.18.0
- merge perf/unblock-active-poll (#289) and dapsychyoo's desktop node resolve fix (#290) - resolve #288 x #289 lsof conflict in favor of #289's async argv call; retarget the argv-safety test at _refreshQwenOpenFiles - changelog entries for #289 #290 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent ea64cf3 commit f94232e

2 files changed

Lines changed: 12 additions & 6 deletions

File tree

‎src/changelog.js‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
const CHANGELOG = [
44
{
55
version: '7.18.0',
6-
date: '2026-08-02',
7-
title: 'Running agents: one tree for every agent — plus a Projects layout fix',
6+
date: '2026-10-02',
7+
title: 'One Running-agents tree, no more search/poll freezes, accessibility & security fixes',
88
changes: [
99
'Running agents now lists every agent that is actually running — the ones inside codbash\'s own terminal panes as well as the ones in external terminals (iTerm, Terminal.app, Warp, cmux). Previously an agent running in an in-app pane vanished from the tree, so a project with both showed only half the picture. Rows are colored by where they run and grouped project → agent → session (switchable to agent → project → session), with top-level groups collapsed by default. Thanks @NovakPAai',
1010
'Fixed the Projects launcher cards: an unbalanced tag left every button and dropdown stretched to full card width on its own row instead of a compact action row. Thanks @NovakPAai',
1111
'Accessibility: calendar days, session cards and Add-project tabs are now reachable and operable from the keyboard, dialogs close on Escape and return focus where you left it, and screen readers announce the selected tab and day correctly. Thanks @NovakPAai',
1212
'Security: your LLM API key is no longer sent back to the browser when Settings loads — the dashboard now shows only a masked hint of the stored key. Saving other settings keeps the key; clearing it is now an explicit action. Thanks @NovakPAai',
1313
'Performance: searching no longer freezes the app. Building the search index re-read every session in one synchronous burst — a multi-second stall that also froze the terminal; it now works in small chunks and streams large transcripts instead of loading them whole. Thanks @NovakPAai',
1414
'The GitHub connect dialog is now keyboard-navigable and announces failures instead of silently waiting: network errors during authorization used to be swallowed, leaving "Waiting for authorization…" on screen with nothing happening. Thanks @NovakPAai',
15+
'Performance: the 5-second running-agents poll no longer stalls the app — a blocking lsof lookup for Qwen sessions ran right on the server loop and froze terminal typing while it ran; it now runs in the background and is cached',
16+
'Desktop app: launching from Finder/Dock no longer crashes with "spawn node ENOENT" on machines where Node is installed only through nvm — the app now finds nvm\'s default Node (and Volta/~/.local installs) and shows a clear dialog if no Node is found at all. Thanks @dapsychyoo',
1517
],
1618
},
1719
{

‎test/auth-modal-and-exec-safety.test.js‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,14 @@ test('the cancel button is wired in JS, not by walking parentElement', () => {
8888
// interpolation, i.e. a value being spliced into a shell command line.
8989
const INTERPOLATED_EXEC = /execSync\(\s*`[^`]*\$\{/;
9090

91-
test('findQwenSessionByPid runs lsof via argv, not a shell string', () => {
92-
const body = fn(src('src/data.js'), 'findQwenSessionByPid');
93-
assert.doesNotMatch(body, INTERPOLATED_EXEC, 'must not interpolate the pid into a shell command');
94-
assert.match(body, /execFileSync\('lsof', \['-a', '-p', String\(pid\), '-Fn'\]/,
91+
// The Qwen lsof lookup moved off the event loop into _refreshQwenOpenFiles
92+
// (#289); it must still pass the pid as argv, never a shell string.
93+
test('Qwen open-file lookup runs lsof via argv, not a shell string', () => {
94+
const source = src('src/data.js');
95+
for (const name of ['findQwenSessionByPid', '_refreshQwenOpenFiles']) {
96+
assert.doesNotMatch(fn(source, name), INTERPOLATED_EXEC, name + ' must not interpolate the pid into a shell command');
97+
}
98+
assert.match(fn(source, '_refreshQwenOpenFiles'), /_execFileAsync\('lsof', \['-a', '-p', String\(pid\), '-Fn'\]/,
9599
'must pass the pid as a separate argv entry');
96100
});
97101

0 commit comments

Comments
 (0)