blob: b4d65a2869ec718121c4963f552e488769dc99e1 [file]
import type { RuntimeContinuationSafetyObservation } from './runtime-resume.js';
export interface ResolvedWorkspaceIdentity {
workspaceIdentity: string;
canonicalPath: string;
}
export interface LocalContinuationSafetyInspectorDeps {
readSessionCwd(sessionId: string): Promise<string>;
resolveWorkspaceIdentity(cwd: string): Promise<ResolvedWorkspaceIdentity>;
listAvailableToolNames(sessionId: string): Promise<readonly string[]>;
hasPendingBackgroundOperations(sessionId: string): Promise<boolean>;
readWorkspaceCheckpoint?: (
sessionId: string,
) => Promise<RuntimeContinuationSafetyObservation['workspaceCheckpoint']>;
}
export function createLocalContinuationSafetyInspector(
deps: LocalContinuationSafetyInspectorDeps,
): (sessionId: string) => Promise<RuntimeContinuationSafetyObservation> {
return async (sessionId) => {
const cwd = await deps.readSessionCwd(sessionId);
const [workspace, availableToolNames, hasPendingBackgroundOperations, workspaceCheckpoint] =
await Promise.all([
deps.resolveWorkspaceIdentity(cwd),
deps.listAvailableToolNames(sessionId),
deps.hasPendingBackgroundOperations(sessionId),
deps.readWorkspaceCheckpoint?.(sessionId),
]);
return {
workspaceIdentity: workspace.workspaceIdentity,
workspacePath: workspace.canonicalPath,
backgroundOperationsSettled: !hasPendingBackgroundOperations,
availableToolNames: [...new Set(availableToolNames)].sort(),
...(workspaceCheckpoint ? { workspaceCheckpoint } : {}),
};
};
}