A comment written with no session tab open opens one, and that panel knows its directory long before it has loaded the session list and selected its session. The webview filed the draft on the first snapshot that had a directory, with the session key falling back to "draft" because no session was current yet. The panel's composer reads the session's key, so the chip never appeared, while the editor thread saw the draft in the store snapshot and reported it attached. A session panel now stamps its session on every comment it delivers, and the webview waits until it actually shows that session before filing. The sidebar files on its current session or an open new-session draft, and no longer falls back to "draft" merely because nothing is selected yet. The resolver is a pure module with tests. Claude-Session: https://claude.ai/code/session_01VqV56Hez25hTxXH4ipJfzH
57 lines
2.3 KiB
TypeScript
57 lines
2.3 KiB
TypeScript
import { describe, test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { resolveCommentTarget } from './inlineCommentTarget';
|
|
|
|
const snapshot = (overrides = {}) => ({
|
|
currentSessionId: null,
|
|
sessionDirectory: null,
|
|
draftOpen: false,
|
|
draftDirectory: null,
|
|
currentDirectory: '/repo',
|
|
...overrides,
|
|
});
|
|
|
|
describe('resolveCommentTarget', () => {
|
|
test('a booting panel with a directory but no session keeps waiting', () => {
|
|
// This was the bug: the draft went under `draft` here, a key the
|
|
// session's composer never reads, and the chip never appeared.
|
|
assert.equal(resolveCommentTarget(snapshot(), 'ses_1'), null);
|
|
assert.equal(resolveCommentTarget(snapshot()), null);
|
|
});
|
|
|
|
test('a session panel files only once it shows the session the comment is for', () => {
|
|
assert.equal(resolveCommentTarget(snapshot({ currentSessionId: 'ses_other', sessionDirectory: '/repo' }), 'ses_1'), null);
|
|
assert.deepEqual(
|
|
resolveCommentTarget(snapshot({ currentSessionId: 'ses_1', sessionDirectory: '/repo/wt' }), 'ses_1'),
|
|
{ directory: '/repo/wt', sessionKey: 'ses_1' },
|
|
);
|
|
});
|
|
|
|
test('the session directory wins over the webview directory', () => {
|
|
assert.deepEqual(
|
|
resolveCommentTarget(snapshot({ currentSessionId: 'ses_1', sessionDirectory: '/repo/wt' })),
|
|
{ directory: '/repo/wt', sessionKey: 'ses_1' },
|
|
);
|
|
assert.deepEqual(
|
|
resolveCommentTarget(snapshot({ currentSessionId: 'ses_1' })),
|
|
{ directory: '/repo', sessionKey: 'ses_1' },
|
|
);
|
|
});
|
|
|
|
test('the sidebar files on an open new-session draft', () => {
|
|
assert.deepEqual(
|
|
resolveCommentTarget(snapshot({ draftOpen: true, draftDirectory: '/repo/other' })),
|
|
{ directory: '/repo/other', sessionKey: 'draft' },
|
|
);
|
|
assert.deepEqual(
|
|
resolveCommentTarget(snapshot({ draftOpen: true })),
|
|
{ directory: '/repo', sessionKey: 'draft' },
|
|
);
|
|
});
|
|
|
|
test('nothing is filed without any directory', () => {
|
|
assert.equal(resolveCommentTarget(snapshot({ currentSessionId: 'ses_1', currentDirectory: null })), null);
|
|
assert.equal(resolveCommentTarget(snapshot({ draftOpen: true, currentDirectory: null })), null);
|
|
});
|
|
});
|