import type { Environment, EnvironmentProbeResult } from "@paperclipai/shared"; import type { Db } from "@paperclipai/db"; import { ensureSshWorkspaceReady } from "@paperclipai/adapter-utils/ssh"; import { resolveEnvironmentDriverConfigForRuntime, type ParsedEnvironmentConfig, } from "./environment-config.js"; import os from "node:os"; export async function probeEnvironment( db: Db, environment: Environment, options: { resolvedConfig?: ParsedEnvironmentConfig } = {}, ): Promise { const parsed = options.resolvedConfig ?? await resolveEnvironmentDriverConfigForRuntime(db, environment.companyId, environment); if (parsed.driver === "local") { return { ok: true, driver: "local", summary: "Local environment is available on this Paperclip host.", details: { hostname: os.hostname(), cwd: process.cwd(), }, }; } try { const { remoteCwd } = await ensureSshWorkspaceReady(parsed.config); return { ok: true, driver: "ssh", summary: `Connected to ${parsed.config.username}@${parsed.config.host} and verified the remote workspace path.`, details: { host: parsed.config.host, port: parsed.config.port, username: parsed.config.username, remoteWorkspacePath: parsed.config.remoteWorkspacePath, remoteCwd, }, }; } catch (error) { const stderr = error && typeof error === "object" && "stderr" in error && typeof error.stderr === "string" ? error.stderr.trim() : ""; const stdout = error && typeof error === "object" && "stdout" in error && typeof error.stdout === "string" ? error.stdout.trim() : ""; const code = error && typeof error === "object" && "code" in error ? (error as { code?: unknown }).code : null; const message = stderr || stdout || (error instanceof Error ? error.message : String(error)) || "SSH probe failed."; return { ok: false, driver: "ssh", summary: `SSH probe failed for ${parsed.config.username}@${parsed.config.host}.`, details: { host: parsed.config.host, port: parsed.config.port, username: parsed.config.username, remoteWorkspacePath: parsed.config.remoteWorkspacePath, error: message, code, }, }; } }