import { SandboxAgent } from "sandbox-agent";
import { detectAgent, buildInspectorUrl } from "@sandbox-agent/example-shared";
import { startDockerSandbox } from "@sandbox-agent/example-shared/docker";
import fs from "node:fs";
import path from "node:path";
import { fileURLToPath } from "node:url";

const __dirname = path.dirname(fileURLToPath(import.meta.url));

// Verify the bundled MCP server exists (built by `pnpm build:mcp`).
const serverFile = path.resolve(__dirname, "../dist/mcp-server.cjs");
if (!fs.existsSync(serverFile)) {
  console.error("Error: dist/mcp-server.cjs not found. Run `pnpm build:mcp` first.");
  process.exit(1);
}

// Start a Docker container running sandbox-agent.
console.log("Starting sandbox...");
const { baseUrl, cleanup } = await startDockerSandbox({ port: 3004 });

// Upload the bundled MCP server into the sandbox filesystem.
console.log("Uploading MCP server bundle...");
const client = await SandboxAgent.connect({ baseUrl });

const bundle = await fs.promises.readFile(serverFile);
const written = await client.writeFsFile(
  { path: "/opt/mcp/custom-tools/mcp-server.cjs" },
  bundle,
);
console.log(`  Written: ${written.path} (${written.bytesWritten} bytes)`);

// Create a session with the uploaded MCP server as a local command.
console.log("Creating session with custom MCP tool...");
const session = await client.createSession({
  agent: detectAgent(),
  sessionInit: {
    cwd: "/root",
    mcpServers: [{
      name: "customTools",
      command: "node",
      args: ["/opt/mcp/custom-tools/mcp-server.cjs"],
      env: [],
    }],
  },
});
const sessionId = session.id;
console.log(`  UI: ${buildInspectorUrl({ baseUrl, sessionId })}`);
console.log('  Try: "generate a random number between 1 and 100"');
console.log("  Press Ctrl+C to stop.");

const keepAlive = setInterval(() => {}, 60_000);
process.on("SIGINT", () => { clearInterval(keepAlive); cleanup().then(() => process.exit(0)); });
