blob: a9a2d76a3f488bd4ecf96a937a9d16a0563e22cf [file]
import type { VerifiedGitRuntimeInput } from '@maka/storage/managed-workspace-owner';
import { resolveBundledGitRuntime } from './bundled-git-runtime.js';
import type { PublishedProjectDirectoryRoot } from './project-directory-authority.js';
import {
createExecutionRuntimeHostComposition,
type ExecutionRuntimeHostComposition,
} from './execution-composition.js';
import type { RuntimeHostCompositionContext } from './host-kernel.js';
import {
defineInteractiveRuntimeHostComposition,
type RuntimeHostCompositionSource,
} from './host-composition.js';
export interface ExecutionRuntimeHostCompositionSourceOptions {
readonly managedWorkspaceGitRuntime?: VerifiedGitRuntimeInput;
readonly bundledGitResourcesRoot?: string;
readonly projectDirectoryRoots?: readonly PublishedProjectDirectoryRoot[];
}
export interface ExecutionRuntimeHostCompositionDependencies {
readonly createComposition?: (
context: RuntimeHostCompositionContext,
options: Parameters<typeof createExecutionRuntimeHostComposition>[1],
) => Promise<ExecutionRuntimeHostComposition>;
}
export async function createExecutionRuntimeHostCompositionSource(
options: ExecutionRuntimeHostCompositionSourceOptions,
dependencies: ExecutionRuntimeHostCompositionDependencies = {},
): Promise<RuntimeHostCompositionSource> {
if (options.managedWorkspaceGitRuntime && options.bundledGitResourcesRoot) {
throw new Error('Managed workspace Git runtime must have exactly one authority');
}
const managedWorkspaceGitRuntime = options.bundledGitResourcesRoot
? await resolveBundledGitRuntime({ resourcesRoot: options.bundledGitResourcesRoot })
: options.managedWorkspaceGitRuntime;
const compositionOptions = {
...(managedWorkspaceGitRuntime ? { managedWorkspaceGitRuntime } : {}),
...(options.projectDirectoryRoots
? { projectDirectoryRoots: options.projectDirectoryRoots }
: {}),
};
const createComposition = dependencies.createComposition ?? createExecutionRuntimeHostComposition;
return defineInteractiveRuntimeHostComposition((context) =>
createComposition(context, compositionOptions),
);
}