refactor: make createExecution the primary lifecycle API

This commit is contained in:
Adam Weidman
2026-03-08 21:40:17 -04:00
parent f2e2014894
commit 0fc4247287
3 changed files with 34 additions and 8 deletions

View File

@@ -32,8 +32,8 @@ describe('ExecutionLifecycleService', () => {
ExecutionLifecycleService.resetForTest();
});
it('completes virtual executions in the foreground and notifies exit subscribers', async () => {
const handle = ExecutionLifecycleService.createVirtualExecution();
it('completes managed executions in the foreground and notifies exit subscribers', async () => {
const handle = ExecutionLifecycleService.createExecution();
if (handle.pid === undefined) {
throw new Error('Expected virtual execution ID.');
}
@@ -59,6 +59,23 @@ describe('ExecutionLifecycleService', () => {
unsubscribe();
});
it('supports explicit execution methods for managed executions', async () => {
const handle = ExecutionLifecycleService.createExecution(
'',
undefined,
'remote_agent',
);
if (handle.pid === undefined) {
throw new Error('Expected virtual execution ID.');
}
ExecutionLifecycleService.completeVirtualExecution(handle.pid, {
exitCode: 0,
});
const result = await handle.result;
expect(result.executionMethod).toBe('remote_agent');
});
it('supports backgrounding virtual executions and continues streaming updates', async () => {
const handle = ExecutionLifecycleService.createVirtualExecution();
if (handle.pid === undefined) {

View File

@@ -10,6 +10,7 @@ export type ExecutionMethod =
| 'lydell-node-pty'
| 'node-pty'
| 'child_process'
| 'remote_agent'
| 'none';
export interface ExecutionResult {
@@ -190,14 +191,15 @@ export class ExecutionLifecycleService {
};
}
static createVirtualExecution(
static createExecution(
initialOutput = '',
onKill?: () => void,
executionMethod: ExecutionMethod = 'none',
): ExecutionHandle {
const executionId = this.allocateVirtualExecutionId();
this.activeExecutions.set(executionId, {
executionMethod: 'none',
executionMethod,
output: initialOutput,
kind: 'virtual',
onKill,
@@ -218,13 +220,14 @@ export class ExecutionLifecycleService {
}
/**
* @deprecated Use createVirtualExecution() for new call sites.
* @deprecated Use createExecution() for new call sites.
*/
static createExecution(
static createVirtualExecution(
initialOutput = '',
onKill?: () => void,
executionMethod: ExecutionMethod = 'none',
): ExecutionHandle {
return this.createVirtualExecution(initialOutput, onKill);
return this.createExecution(initialOutput, onKill, executionMethod);
}
static appendOutput(executionId: number, chunk: string): void {

View File

@@ -32,6 +32,7 @@ import {
ExecutionLifecycleService,
type ExecutionCompletionOptions,
type ExecutionHandle,
type ExecutionMethod,
type ExecutionOutputEvent,
type ExecutionResult,
} from './executionLifecycleService.js';
@@ -226,8 +227,13 @@ export class ShellExecutionService {
static createVirtualExecution(
initialOutput = '',
onKill?: () => void,
executionMethod: ExecutionMethod = 'none',
): ShellExecutionHandle {
return ExecutionLifecycleService.createVirtualExecution(initialOutput, onKill);
return ExecutionLifecycleService.createVirtualExecution(
initialOutput,
onKill,
executionMethod,
);
}
static appendVirtualOutput(pid: number, chunk: string): void {