From 0fc42472873b37e4628092b6f41ccaf2fa972bb9 Mon Sep 17 00:00:00 2001 From: Adam Weidman Date: Sun, 8 Mar 2026 21:40:17 -0400 Subject: [PATCH] refactor: make createExecution the primary lifecycle API --- .../executionLifecycleService.test.ts | 21 +++++++++++++++++-- .../src/services/executionLifecycleService.ts | 13 +++++++----- .../src/services/shellExecutionService.ts | 8 ++++++- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/packages/core/src/services/executionLifecycleService.test.ts b/packages/core/src/services/executionLifecycleService.test.ts index 2702da9488..53c897ba13 100644 --- a/packages/core/src/services/executionLifecycleService.test.ts +++ b/packages/core/src/services/executionLifecycleService.test.ts @@ -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) { diff --git a/packages/core/src/services/executionLifecycleService.ts b/packages/core/src/services/executionLifecycleService.ts index 636b376c0c..d1cacff65e 100644 --- a/packages/core/src/services/executionLifecycleService.ts +++ b/packages/core/src/services/executionLifecycleService.ts @@ -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 { diff --git a/packages/core/src/services/shellExecutionService.ts b/packages/core/src/services/shellExecutionService.ts index 336db6fb41..8b34b418cc 100644 --- a/packages/core/src/services/shellExecutionService.ts +++ b/packages/core/src/services/shellExecutionService.ts @@ -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 {