fix(subagent-acp): reject an empty config cwd at load

path.resolve('') is the process cwd, so an empty configured cwd would
silently reintroduce the launch-directory fallback the parent-session
cwd resolution removed. Fail at plugin load with an actionable message
instead.
This commit is contained in:
Yichen Jiang
2026-07-19 15:56:32 +08:00
parent 05f0c12880
commit b758a7496b
4 changed files with 32 additions and 11 deletions

View File

@@ -26,11 +26,11 @@ export interface Config {
/** Arguments passed to {@link command}. */
args: string[]
/**
* Working directory override for the child process and its ACP session. A
* relative path resolves against the harness launch directory at load, and
* the result must be an existing directory. When omitted, each child
* inherits its delegating parent session's cwd — and starting one from a
* parent session that has no cwd fails.
* Working directory override for the child process and its ACP session.
* Must be non-empty; a relative path resolves against the harness launch
* directory at load, and the result must be an existing directory. When
* omitted, each child inherits its delegating parent session's cwd — and
* starting one from a parent session that has no cwd fails.
*/
cwd?: string
/**
@@ -160,6 +160,11 @@ export function apply(ctx: Context, config: Config): void {
const resolved = config as ResolvedConfig
assertPositiveFinite('disposeEofGraceMs', resolved.disposeEofGraceMs)
assertPositiveFinite('disposeGraceMs', resolved.disposeGraceMs)
// `path.resolve('')` is the process cwd — an empty string would silently
// reintroduce the launch-directory fallback this resolution removed.
if (resolved.cwd === '') {
throw new Error('subagent-acp: config cwd must not be empty — omit the key to inherit the parent session cwd')
}
// Interpret a relative configured cwd against the harness launch directory
// ONCE, at load, and fail a misconfigured directory here — not per start.
const validated: ResolvedConfig = resolved.cwd === undefined