fix(pty,subprocess,lsp): address review round on cancellation, lookup, and contracts
- pty-local: a pre-write inspection rejection no longer releases a canceled send while its foreground SIGINT is in flight; the interrupt path retains the slot and its post-signal tail resumes polling. Regression pins the failure-shaped cancellation and a close-during-write release. - pty-local: SEND_ACTIVE names which provider operation is draining; README states the never-settling-provider outcome (slot retained, close recovers). - subprocess-local: resolveExecutable rejects relative paths containing separators instead of expanding them per PATH entry with a misleading not-found error; seam JSDoc pins the rule for every provider. - subprocess-local: LocalTerminalHandle documents why the seam's in-flight-join promise holds without operation tracking. - lsp-local: the oversized-source diagnostic reports the observed byte lower bound; README documents that processId: null trades away server-side orphan cleanup after a hard-killed harness. - pty/subprocess seams: cross-reference the twin five-member signal unions. - pty-local: TODO markers for send-state consolidation and initialize-race relocation.
This commit is contained in:
@@ -77,6 +77,11 @@ export class LocalSubprocessService extends SubprocessService {
|
||||
signal?.throwIfAborted()
|
||||
const environment = childEnv(env)
|
||||
const absolute = isAbsolute(command)
|
||||
if (!absolute && (command.includes('/') || (process.platform === 'win32' && command.includes('\\')))) {
|
||||
throw new Error(
|
||||
`subprocess-local: command ${JSON.stringify(command)} is a relative path; use an absolute path or a bare PATH name`,
|
||||
)
|
||||
}
|
||||
const candidates = absolute ? [command] : this.executableCandidates(command, environment)
|
||||
for (const candidate of candidates) {
|
||||
signal?.throwIfAborted()
|
||||
|
||||
@@ -24,7 +24,14 @@ function signalName(number: number | undefined): NodeJS.Signals | null {
|
||||
return null
|
||||
}
|
||||
|
||||
/** A local terminal whose process-session ownership stays below the PTY backend. */
|
||||
/**
|
||||
* A local terminal whose process-session ownership stays below the PTY backend.
|
||||
* The seam's terminate() promise — no write, inspection, or signal in flight
|
||||
* after settlement — holds here without operation tracking only because every
|
||||
* handle call completes synchronously under the hood (node-pty write, ps-based
|
||||
* inspection). A first genuinely asynchronous step in any handle call must add
|
||||
* the tracking a remote provider needs.
|
||||
*/
|
||||
export class LocalTerminalHandle implements SubprocessTerminalHandle {
|
||||
readonly pid: number
|
||||
readonly output = new PassThrough()
|
||||
|
||||
Reference in New Issue
Block a user