openclaw/extensions/boltbot/deploy/deploy.ts
duy 1096cc16e6 feat: add boltbot extension — EigenCloud verification layer
Trustless hosting extension for Moltbot via EigenCloud infrastructure:
- EigenAI provider with x-api-key auth and configPatch registration
- Action tier classification for all 23 canonical tools
- Receipt logging on after_tool_call hook (medium/high tier)
- Anomaly detection (BCC, outbound curl, process, gateway)
- SQLite receipt store with EigenDA proxy backend
- Dashboard API endpoints (/boltbot/receipts, /receipt, /stats)
- EigenCompute TEE deploy script and Dockerfile
2026-01-29 12:55:24 -08:00

65 lines
2.2 KiB
TypeScript

#!/usr/bin/env tsx
import { execFileSync } from "node:child_process";
import { resolve, dirname } from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const projectRoot = resolve(__dirname, "../../..");
function required(name: string): string {
const val = process.env[name];
if (!val) {
console.error(`Missing required env var: ${name}`);
process.exit(1);
}
return val;
}
async function main() {
const privateKey = required("ECLOUD_PRIVATE_KEY");
const environment = process.env.ECLOUD_ENVIRONMENT ?? "sepolia";
const appName = process.env.ECLOUD_APP_NAME ?? "boltbot";
const instanceType = process.env.ECLOUD_INSTANCE_TYPE ?? "e2-medium";
const envVars: Record<string, string> = {
EIGENCLOUD_API_KEY: required("EIGENCLOUD_API_KEY"),
TELEGRAM_BOT_TOKEN: required("TELEGRAM_BOT_TOKEN"),
BOLTBOT_RECEIPT_BACKEND: process.env.BOLTBOT_RECEIPT_BACKEND ?? "eigenda",
NODE_ENV_PUBLIC: "production",
};
if (process.env.EIGENDA_PROXY_URL) {
envVars.EIGENDA_PROXY_URL = process.env.EIGENDA_PROXY_URL;
}
console.log(`Deploying ${appName} to EigenCompute (${environment})...`);
const ecloudEnv = { ...process.env, ECLOUD_PRIVATE_KEY: privateKey };
console.log("[1/3] Building Docker image...");
execFileSync("docker", [
"build", "-t", `${appName}:latest`,
"-f", "extensions/boltbot/deploy/Dockerfile", ".",
], { cwd: projectRoot, stdio: "inherit" });
console.log("[2/3] Deploying to EigenCompute TEE...");
const envFlags = Object.entries(envVars).flatMap(([k, v]) => ["--env", `${k}=${v}`]);
execFileSync("npx", [
"@layr-labs/ecloud-cli", "compute", "app", "deploy",
"--name", appName,
"--instance-type", instanceType,
"--environment", environment,
"--dockerfile", "extensions/boltbot/deploy/Dockerfile",
...envFlags,
], { cwd: projectRoot, stdio: "inherit", env: ecloudEnv });
console.log("[3/3] Fetching deployment info...");
execFileSync("npx", [
"@layr-labs/ecloud-cli", "compute", "app", "info",
"--name", appName,
], { cwd: projectRoot, stdio: "inherit", env: ecloudEnv });
console.log("\nDone. Next: ecloud compute app configure tls");
}
main();