eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
290 lines (289 loc) • 9.42 kB
TypeScript
import { CommandData } from "./api-client/validators.js";
import { APIClient } from "./api-client/api-client.js";
import "./api-client/index.js";
import { Signal } from "./utils/resolveSignal.js";
import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from "./_workflow-serde.js";
//#region src/command.d.ts
/**
* Cached output from a command execution.
*/
interface CommandOutput {
stdout: string;
stderr: string;
}
/**
* Serialized representation of a Command for @workflow/serde.
*/
interface SerializedCommand {
sandboxId: string;
cmd: CommandData;
/** Cached output, included if output was fetched before serialization */
output?: CommandOutput;
}
/**
* Serialized representation of a CommandFinished for @workflow/serde.
*/
interface SerializedCommandFinished extends SerializedCommand {
exitCode: number;
}
/**
* A command executed in a Sandbox.
*
* For detached commands, you can {@link wait} to get a {@link CommandFinished} instance
* with the populated exit code. For non-detached commands, {@link Sandbox.runCommand}
* automatically waits and returns a {@link CommandFinished} instance.
*
* You can iterate over command output with {@link logs}.
*
* @see {@link Sandbox.runCommand} to start a command.
*
* @hideconstructor
*/
declare class Command {
/**
* Cached API client instance.
* @internal
*/
protected _client: APIClient | null;
/**
* Lazily resolve credentials and construct an API client.
* @internal
*/
protected ensureClient(): Promise<APIClient>;
/**
* ID of the session this command is running in.
*/
protected sessionId: string;
/**
* Data for the command execution.
*/
protected cmd: CommandData;
exitCode: number | null;
protected outputCache: Promise<{
stdout: string;
stderr: string;
both: string;
}> | null;
/**
* Synchronously accessible resolved output, populated after output is fetched.
* Used for serialization.
* @internal
*/
protected _resolvedOutput: CommandOutput | null;
/**
* ID of the command execution.
*/
get cmdId(): string;
get cwd(): string;
get startedAt(): number;
/**
* @param params - Object containing the client, sandbox ID, and command data.
* @param params.client - Optional API client. If not provided, will be lazily created using global credentials.
* @param params.sessionId - The ID of the session where the command is running.
* @param params.cmd - The command data.
* @param params.output - Optional cached output to restore (used during deserialization).
*/
constructor({
client,
sessionId,
cmd,
output
}: {
client?: APIClient;
sessionId: string;
cmd: CommandData;
output?: CommandOutput;
});
/**
* Serialize a Command instance to plain data for @workflow/serde.
*
* @param instance - The Command instance to serialize
* @returns A plain object containing the sandbox ID, command data, and output if fetched
*/
static [WORKFLOW_SERIALIZE](instance: Command): SerializedCommand;
/**
* Deserialize plain data back into a Command instance for @workflow/serde.
*
* The deserialized instance will lazily create an API client using
* OIDC or environment credentials when needed.
*
* @param data - The serialized command data
* @returns The reconstructed Command instance
*/
static [WORKFLOW_DESERIALIZE](data: SerializedCommand): Command;
/**
* Iterate over the output of this command.
*
* ```
* for await (const log of cmd.logs()) {
* if (log.stream === "stdout") {
* process.stdout.write(log.data);
* } else {
* process.stderr.write(log.data);
* }
* }
* ```
*
* @param opts - Optional parameters.
* @param opts.signal - An AbortSignal to cancel log streaming.
* @returns An async iterable of log entries from the command output.
*
* @see {@link Command.stdout}, {@link Command.stderr}, and {@link Command.output}
* to access output as a string.
*/
logs(opts?: {
signal?: AbortSignal;
}): AsyncGenerator<{
data: string;
stream: "stdout";
} | {
data: string;
stream: "stderr";
}, void, void> & Disposable & {
close(): void;
};
/**
* Wait for a command to exit and populate its exit code.
*
* This method is useful for detached commands where you need to wait
* for completion. For non-detached commands, {@link Sandbox.runCommand}
* automatically waits and returns a {@link CommandFinished} instance.
*
* ```
* const detachedCmd = await sandbox.runCommand({ cmd: 'sleep', args: ['5'], detached: true });
* const result = await detachedCmd.wait();
* if (result.exitCode !== 0) {
* console.error("Something went wrong...")
* }
* ```
*
* @param params - Optional parameters.
* @param params.signal - An AbortSignal to cancel waiting.
* @returns A {@link CommandFinished} instance with populated exit code.
*/
wait(params?: {
signal?: AbortSignal;
}): Promise<CommandFinished>;
/**
* Get cached output, fetching logs only once and reusing for concurrent calls.
* This prevents race conditions when stdout() and stderr() are called in parallel.
*/
protected getCachedOutput(opts?: {
signal?: AbortSignal;
}): Promise<{
stdout: string;
stderr: string;
both: string;
}>;
/**
* Get the output of `stdout`, `stderr`, or both as a string.
*
* NOTE: This may throw string conversion errors if the command does
* not output valid Unicode.
*
* @param stream - The output stream to read: "stdout", "stderr", or "both".
* @param opts - Optional parameters.
* @param opts.signal - An AbortSignal to cancel output streaming.
* @returns The output of the specified stream(s) as a string.
*/
output(stream?: "stdout" | "stderr" | "both", opts?: {
signal?: AbortSignal;
}): Promise<string>;
/**
* Get the output of `stdout` as a string.
*
* NOTE: This may throw string conversion errors if the command does
* not output valid Unicode.
*
* @param opts - Optional parameters.
* @param opts.signal - An AbortSignal to cancel output streaming.
* @returns The standard output of the command.
*/
stdout(opts?: {
signal?: AbortSignal;
}): Promise<string>;
/**
* Get the output of `stderr` as a string.
*
* NOTE: This may throw string conversion errors if the command does
* not output valid Unicode.
*
* @param opts - Optional parameters.
* @param opts.signal - An AbortSignal to cancel output streaming.
* @returns The standard error output of the command.
*/
stderr(opts?: {
signal?: AbortSignal;
}): Promise<string>;
/**
* Kill a running command in a sandbox.
*
* @param signal - The signal to send the running process. Defaults to SIGTERM.
* @param opts - Optional parameters.
* @param opts.abortSignal - An AbortSignal to cancel the kill operation.
* @returns Promise<void>.
*/
kill(signal?: Signal, opts?: {
abortSignal?: AbortSignal;
}): Promise<void>;
}
/**
* A command that has finished executing.
*
* The exit code is immediately available and populated upon creation.
* Unlike {@link Command}, you don't need to call wait() - the command
* has already completed execution.
*
* @hideconstructor
*/
declare class CommandFinished extends Command {
/**
* The exit code of the command. This is always populated for
* CommandFinished instances.
*/
exitCode: number;
/**
* @param params - Object containing client, sandbox ID, command data, and exit code.
* @param params.client - Optional API client. If not provided, will be lazily created using global credentials.
* @param params.sessionId - The ID of the session where the command ran.
* @param params.cmd - The command data.
* @param params.exitCode - The exit code of the completed command.
* @param params.output - Optional cached output to restore (used during deserialization).
*/
constructor(params: {
client?: APIClient;
sessionId: string;
cmd: CommandData;
exitCode: number;
output?: CommandOutput;
});
/**
* Serialize a CommandFinished instance to plain data for @workflow/serde.
*
* @param instance - The CommandFinished instance to serialize
* @returns A plain object containing the sandbox ID, command data, exit code, and output if fetched
*/
static [WORKFLOW_SERIALIZE](instance: CommandFinished): SerializedCommandFinished;
/**
* Deserialize plain data back into a CommandFinished instance for @workflow/serde.
*
* The deserialized instance will lazily create an API client using
* OIDC or environment credentials when needed.
*
* @param data - The serialized command finished data
* @returns The reconstructed CommandFinished instance
*/
static [WORKFLOW_DESERIALIZE](data: SerializedCommandFinished): CommandFinished;
/**
* The wait method is not needed for CommandFinished instances since
* the command has already completed and exitCode is populated.
*
* @deprecated This method is redundant for CommandFinished instances.
* The exitCode is already available.
* @returns This CommandFinished instance.
*/
wait(): Promise<CommandFinished>;
}
//#endregion
export { Command, CommandFinished, CommandOutput, SerializedCommand, SerializedCommandFinished };
//# sourceMappingURL=command.d.ts.map