* refactor: rename allowedHosts to hostnames for DNS rebinding config The old name confused users who thought it was related to CORS. "hostnames" communicates that you're declaring the daemon's own hostnames, not granting access to external parties. Backward compatible: old config files (daemon.allowedHosts), env var (PASEO_ALLOWED_HOSTS), CLI flag (--allowed-hosts), and Nix option (allowedHosts) all still work as deprecated aliases. * fix(nix): update npmDepsHash to match current package-lock.json
68 lines
2.3 KiB
TypeScript
68 lines
2.3 KiB
TypeScript
import { Command, Option } from "commander";
|
|
import chalk from "chalk";
|
|
import {
|
|
startLocalDaemonForeground,
|
|
startLocalDaemonDetached,
|
|
type DaemonStartOptions as StartOptions,
|
|
} from "./local-daemon.js";
|
|
import { getErrorMessage } from "../../utils/errors.js";
|
|
|
|
export type { DaemonStartOptions as StartOptions } from "./local-daemon.js";
|
|
|
|
type RawStartCommandOptions = StartOptions & {
|
|
allowedHosts?: string;
|
|
};
|
|
|
|
export function startCommand(): Command {
|
|
return new Command("start")
|
|
.description("Start the local Paseo daemon")
|
|
.option("--listen <listen>", "Listen target (host:port, port, or unix socket path)")
|
|
.option("--port <port>", "Port to listen on (default: 6767)")
|
|
.option("--home <path>", "Paseo home directory (default: ~/.paseo)")
|
|
.option("--foreground", "Run in foreground (don't daemonize)")
|
|
.option("--no-relay", "Disable relay connection")
|
|
.option("--no-mcp", "Disable the Agent MCP HTTP endpoint")
|
|
.option("--no-inject-mcp", "Disable auto-injecting the Paseo MCP into created agents")
|
|
.option(
|
|
"--hostnames <hosts>",
|
|
'Daemon hostnames (comma-separated, e.g. "myhost,.example.com" or "true" for any)',
|
|
)
|
|
.addOption(new Option("--allowed-hosts <hosts>").hideHelp())
|
|
.action(async (options: RawStartCommandOptions) => {
|
|
await runStart({
|
|
...options,
|
|
hostnames: options.hostnames ?? options.allowedHosts,
|
|
});
|
|
});
|
|
}
|
|
|
|
export async function runStart(options: StartOptions): Promise<void> {
|
|
if (options.listen && options.port) {
|
|
console.error(chalk.red("Cannot use --listen and --port together"));
|
|
process.exit(1);
|
|
}
|
|
|
|
if (!options.foreground) {
|
|
try {
|
|
const startup = await startLocalDaemonDetached(options);
|
|
console.log(chalk.green(`Daemon starting in background (PID ${startup.pid ?? "unknown"}).`));
|
|
console.log(chalk.dim(`Logs: ${startup.logPath}`));
|
|
} catch (err) {
|
|
exitWithError(getErrorMessage(err));
|
|
}
|
|
return;
|
|
}
|
|
try {
|
|
const status = startLocalDaemonForeground(options);
|
|
process.exit(status);
|
|
} catch (err) {
|
|
const message = getErrorMessage(err);
|
|
exitWithError(`Failed to start daemon: ${message}`);
|
|
}
|
|
}
|
|
|
|
function exitWithError(message: string): never {
|
|
console.error(chalk.red(message));
|
|
process.exit(1);
|
|
}
|