mirror of
https://github.com/binaricat/Netcatty.git
synced 2026-11-09 15:52:14 +00:00
* feat: add --open-terminal-shell launch flag
Queue local-terminal launches as { path?, shell? } so a discovered shell
id or executable can open a tab on its own or with --open-terminal-path.
Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>
* fix: serialize open-terminal launches during shell discovery
Await shell discovery on an ordered queue so a later path-only request
cannot create its tab first, including when App Lock drains.
Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>
---------
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: 陈大猫 <binaricat@users.noreply.github.com>
55 lines
1.5 KiB
TypeScript
55 lines
1.5 KiB
TypeScript
import assert from 'node:assert/strict';
|
|
import test from 'node:test';
|
|
import { createOpenTerminalQueue } from './openTerminalQueue';
|
|
|
|
test('idle open-terminal work stays in call order on the caller turn', () => {
|
|
const queue = createOpenTerminalQueue();
|
|
const order: string[] = [];
|
|
|
|
queue.enqueue(() => { order.push('path-a'); });
|
|
queue.enqueue(() => { order.push('path-b'); });
|
|
|
|
assert.deepEqual(order, ['path-a', 'path-b']);
|
|
});
|
|
|
|
test('a path-only open waits for an in-flight shell discovery', async () => {
|
|
const queue = createOpenTerminalQueue();
|
|
const order: string[] = [];
|
|
let releaseDiscovery: () => void = () => {};
|
|
const discovery = new Promise<void>((resolve) => {
|
|
releaseDiscovery = resolve;
|
|
});
|
|
|
|
const shellRequest = queue.enqueue(async () => {
|
|
order.push('shell');
|
|
await discovery;
|
|
order.push('shell-tab');
|
|
});
|
|
const pathRequest = queue.enqueue(() => {
|
|
order.push('path-tab');
|
|
});
|
|
|
|
assert.deepEqual(order, ['shell']);
|
|
releaseDiscovery();
|
|
await shellRequest;
|
|
await pathRequest;
|
|
assert.deepEqual(order, ['shell', 'shell-tab', 'path-tab']);
|
|
});
|
|
|
|
test('a failed open-terminal request does not block the next one', async () => {
|
|
const queue = createOpenTerminalQueue();
|
|
const order: string[] = [];
|
|
|
|
const failed = queue.enqueue(async () => {
|
|
order.push('shell');
|
|
throw new Error('discovery failed');
|
|
});
|
|
const next = queue.enqueue(() => {
|
|
order.push('path-tab');
|
|
});
|
|
|
|
await assert.rejects(failed, /discovery failed/);
|
|
await next;
|
|
assert.deepEqual(order, ['shell', 'path-tab']);
|
|
});
|