@burdenoff/vibe-agent 2.6.0 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -162,7 +162,7 @@ function register(program) {
162
162
  } catch {
163
163
  warn("Agent not reachable. Attempting local plugin registry...");
164
164
  try {
165
- const { PluginManager } = await import("./plugin-system-x4tbwzyq.js");
165
+ const { PluginManager } = await import("./plugin-system-w2727db6.js");
166
166
  const pm = new PluginManager;
167
167
  plugins = pm.getPluginDetails() || [];
168
168
  } catch {
@@ -198,7 +198,7 @@ function register(program) {
198
198
  } catch {
199
199
  warn("Agent not reachable. Attempting local install...");
200
200
  try {
201
- const { PluginManager } = await import("./plugin-system-x4tbwzyq.js");
201
+ const { PluginManager } = await import("./plugin-system-w2727db6.js");
202
202
  const pm = new PluginManager;
203
203
  await pm.install(packageName);
204
204
  success(`Plugin "${packageName}" installed locally.`);
@@ -221,7 +221,7 @@ function register(program) {
221
221
  } catch {
222
222
  warn("Agent not reachable. Attempting local removal...");
223
223
  try {
224
- const { PluginManager } = await import("./plugin-system-x4tbwzyq.js");
224
+ const { PluginManager } = await import("./plugin-system-w2727db6.js");
225
225
  const pm = new PluginManager;
226
226
  await pm.remove(packageName);
227
227
  success(`Plugin "${packageName}" removed locally.`);
@@ -598,4 +598,4 @@ export {
598
598
  };
599
599
 
600
600
  //# debugId=77470ADF30C64CDD64756E2164756E21
601
- //# sourceMappingURL=index-wxxv9rec.js.map
601
+ //# sourceMappingURL=index-5hb62xkm.js.map
@@ -206,7 +206,8 @@ class ServiceManager {
206
206
  }
207
207
  const logFile = join(this.logsDir, `${config.name}.log`);
208
208
  const logFd = openSync(logFile, "a");
209
- const indexPath = join(import.meta.dir, "..", "index.js");
209
+ const isDist = import.meta.dir.endsWith("/dist") || import.meta.dir.includes("/dist/");
210
+ const indexPath = isDist ? join(import.meta.dir, "index.js") : join(import.meta.dir, "..", "index.ts");
210
211
  const child = Bun.spawn(["bun", "run", indexPath], {
211
212
  stdin: "ignore",
212
213
  stdout: logFd,
@@ -411,5 +412,5 @@ class ServiceManager {
411
412
 
412
413
  export { checkDependencies, installDependencies, ServiceManager };
413
414
 
414
- //# debugId=6E0629A41BAEEB3564756E2164756E21
415
- //# sourceMappingURL=index-s7ff1fj1.js.map
415
+ //# debugId=86FF4BC55E7E7DC564756E2164756E21
416
+ //# sourceMappingURL=index-f6296kqk.js.map
@@ -3,9 +3,9 @@
3
3
  "sources": ["../src/services/bootstrap.service.ts", "../src/services/service-manager.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * Bootstrap Service\n *\n * Handles dependency checking and auto-installation for the vibe agent.\n * Checks for required system tools and optionally installs them.\n *\n * Required prerequisites:\n * - bun (runtime - already present if running this code)\n * - tmux (installed via session-tmux plugin, but checked here for setup)\n * - ttyd (installed via session-tmux plugin, but checked here for setup)\n * - cloudflared (installed via tunnel-cloudflare plugin, but checked here for setup)\n */\n\nimport os from \"node:os\";\n\nimport { logger } from \"./logger.js\";\n\n// ── Types ────────────────────────────────────────────────────────────────\n\nexport interface DependencyCheck {\n name: string;\n installed: boolean;\n version?: string;\n required: boolean;\n category: \"runtime\" | \"session\" | \"tunnel\" | \"tool\";\n}\n\nexport interface SetupResult {\n success: boolean;\n installed: string[];\n failed: string[];\n skipped: string[];\n}\n\n// ── Check Functions ─────────────────────────────────────────────────────\n\nfunction checkCommand(cmd: string): { installed: boolean; version?: string } {\n try {\n const result = Bun.spawnSync([cmd, \"--version\"], {\n timeout: 5000,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n if (result.exitCode === 0) {\n const version = result.stdout.toString().trim().split(\"\\n\")[0];\n return { installed: true, version };\n }\n // Try -v fallback\n const result2 = Bun.spawnSync([cmd, \"-v\"], {\n timeout: 5000,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n if (result2.exitCode === 0) {\n const version = result2.stdout.toString().trim().split(\"\\n\")[0];\n return { installed: true, version };\n }\n return { installed: false };\n } catch {\n return { installed: false };\n }\n}\n\n/**\n * Check all dependencies and return their status.\n */\nexport function checkDependencies(): DependencyCheck[] {\n const deps: Array<{\n name: string;\n cmd: string;\n required: boolean;\n category: DependencyCheck[\"category\"];\n }> = [\n { name: \"bun\", cmd: \"bun\", required: true, category: \"runtime\" },\n { name: \"tmux\", cmd: \"tmux\", required: false, category: \"session\" },\n { name: \"ttyd\", cmd: \"ttyd\", required: false, category: \"session\" },\n {\n name: \"cloudflared\",\n cmd: \"cloudflared\",\n required: false,\n category: \"tunnel\",\n },\n ];\n\n return deps.map((dep) => {\n const { installed, version } = checkCommand(dep.cmd);\n return {\n name: dep.name,\n installed,\n version,\n required: dep.required,\n category: dep.category,\n };\n });\n}\n\n/**\n * Install missing dependencies.\n */\nexport async function installDependencies(\n deps?: string[],\n): Promise<SetupResult> {\n const platform = os.platform();\n const result: SetupResult = {\n success: true,\n installed: [],\n failed: [],\n skipped: [],\n };\n\n const checks = checkDependencies();\n const toInstall = deps\n ? checks.filter((d) => deps.includes(d.name) && !d.installed)\n : checks.filter((d) => !d.installed);\n\n for (const dep of toInstall) {\n try {\n logger.info(\"bootstrap\", `Installing ${dep.name}...`);\n\n if (dep.name === \"tmux\") {\n await installTmux(platform);\n } else if (dep.name === \"ttyd\") {\n await installTtyd(platform);\n } else if (dep.name === \"cloudflared\") {\n await installCloudflared(platform);\n } else {\n result.skipped.push(dep.name);\n continue;\n }\n\n // Verify installation\n const check = checkCommand(dep.name);\n if (check.installed) {\n result.installed.push(dep.name);\n logger.info(\n \"bootstrap\",\n `Successfully installed ${dep.name}: ${check.version}`,\n );\n } else {\n result.failed.push(dep.name);\n result.success = false;\n logger.error(\n \"bootstrap\",\n `Failed to install ${dep.name}: command not found after install`,\n );\n }\n } catch (err) {\n result.failed.push(dep.name);\n result.success = false;\n logger.error(\"bootstrap\", `Failed to install ${dep.name}: ${err}`);\n }\n }\n\n return result;\n}\n\n// ── Platform-Specific Installers ────────────────────────────────────────\n\nasync function installTmux(platform: string): Promise<void> {\n if (platform === \"darwin\") {\n const r = Bun.spawnSync([\"brew\", \"install\", \"tmux\"], {\n timeout: 120_000,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n if (r.exitCode !== 0) throw new Error(r.stderr.toString());\n } else if (platform === \"linux\") {\n const apt = Bun.spawnSync([\"sudo\", \"apt-get\", \"install\", \"-y\", \"tmux\"], {\n timeout: 120_000,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n if (apt.exitCode !== 0) {\n const yum = Bun.spawnSync([\"sudo\", \"yum\", \"install\", \"-y\", \"tmux\"], {\n timeout: 120_000,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n if (yum.exitCode !== 0) throw new Error(yum.stderr.toString());\n }\n } else {\n throw new Error(`Unsupported platform for tmux: ${platform}`);\n }\n}\n\nasync function installTtyd(platform: string): Promise<void> {\n if (platform === \"darwin\") {\n const r = Bun.spawnSync([\"brew\", \"install\", \"ttyd\"], {\n timeout: 120_000,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n if (r.exitCode !== 0) throw new Error(r.stderr.toString());\n } else if (platform === \"linux\") {\n const snap = Bun.spawnSync(\n [\"sudo\", \"snap\", \"install\", \"ttyd\", \"--classic\"],\n { timeout: 120_000, stdout: \"pipe\", stderr: \"pipe\" },\n );\n if (snap.exitCode !== 0) {\n // Try direct download\n const arch = os.arch() === \"x64\" ? \"x86_64\" : os.arch();\n const curl = Bun.spawnSync(\n [\n \"sh\",\n \"-c\",\n `curl -sLo /tmp/ttyd https://github.com/tsl0922/ttyd/releases/latest/download/ttyd.${arch} && sudo install /tmp/ttyd /usr/local/bin/ttyd`,\n ],\n { timeout: 120_000, stdout: \"pipe\", stderr: \"pipe\" },\n );\n if (curl.exitCode !== 0) throw new Error(curl.stderr.toString());\n }\n } else {\n throw new Error(`Unsupported platform for ttyd: ${platform}`);\n }\n}\n\nasync function installCloudflared(platform: string): Promise<void> {\n if (platform === \"darwin\") {\n const r = Bun.spawnSync([\"brew\", \"install\", \"cloudflared\"], {\n timeout: 120_000,\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n if (r.exitCode !== 0) throw new Error(r.stderr.toString());\n } else if (platform === \"linux\") {\n const arch = os.arch();\n let archStr = \"amd64\";\n if (arch === \"arm64\" || (arch as string) === \"aarch64\") archStr = \"arm64\";\n else if (arch === \"arm\") archStr = \"arm\";\n\n const r = Bun.spawnSync(\n [\n \"sh\",\n \"-c\",\n `curl -sLo /tmp/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-${archStr} && sudo install /tmp/cloudflared /usr/local/bin/cloudflared`,\n ],\n { timeout: 120_000, stdout: \"pipe\", stderr: \"pipe\" },\n );\n if (r.exitCode !== 0) throw new Error(r.stderr.toString());\n } else {\n throw new Error(`Unsupported platform for cloudflared: ${platform}`);\n }\n}\n",
6
- "/**\n * Service Manager\n *\n * Manages multiple agent instances as background daemon processes.\n * Handles start, stop, restart, kill, status, and log operations.\n *\n * Process registry persisted at ~/.vibecontrols/agents.json\n * Logs written to ~/.vibecontrols/logs/{name}.log\n */\n\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n openSync,\n closeSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nimport type { AgentConfig } from \"./agent.service.js\";\n\nexport interface ProcessInfo {\n name: string;\n pid: number;\n port: number;\n config: AgentConfig;\n startTime: string;\n status: \"running\" | \"stopped\" | \"unknown\";\n}\n\nexport interface LogOptions {\n follow: boolean;\n tail: number;\n}\n\nexport class ServiceManager {\n private registryPath: string;\n private logsDir: string;\n\n constructor() {\n const configDir = join(homedir(), \".vibecontrols\");\n this.registryPath = join(configDir, \"agents.json\");\n this.logsDir = join(configDir, \"logs\");\n\n mkdirSync(configDir, { recursive: true });\n mkdirSync(this.logsDir, { recursive: true });\n }\n\n async startDaemon(config: AgentConfig): Promise<void> {\n // Check if already running\n const existing = await this.findProcessByName(config.name);\n if (existing && existing.status === \"running\") {\n console.log(\n `⚠️ Agent '${config.name}' is already running on port ${existing.port}`,\n );\n return;\n }\n\n // Create log file FD for direct redirect\n const logFile = join(this.logsDir, `${config.name}.log`);\n const logFd = openSync(logFile, \"a\");\n\n // Spawn the process using bun\n // index.js lives alongside this compiled file in dist/\n const indexPath = join(import.meta.dir, \"..\", \"index.js\");\n const child = Bun.spawn([\"bun\", \"run\", indexPath], {\n stdin: \"ignore\",\n stdout: logFd,\n stderr: logFd,\n env: {\n ...process.env,\n PORT: config.port.toString(),\n DB_PATH: config.dbPath,\n NODE_ENV: \"production\",\n },\n });\n\n closeSync(logFd);\n\n // Wait for process to start\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n const isRunning = await this.isProcessRunning(child.pid);\n if (!isRunning) {\n throw new Error(`Failed to start agent '${config.name}'`);\n }\n\n await this.saveProcessInfo(config.name, child.pid, config);\n console.log(\n `🚀 Agent '${config.name}' started (PID: ${child.pid}, Port: ${config.port})`,\n );\n }\n\n async stop(name: string): Promise<void> {\n const agentProcess = await this.findProcessByName(name);\n if (!agentProcess || agentProcess.status !== \"running\") {\n console.log(`⚠️ Agent '${name}' is not running`);\n return;\n }\n\n try {\n process.kill(agentProcess.pid, \"SIGTERM\");\n await new Promise((resolve) => setTimeout(resolve, 3000));\n\n const stillRunning = await this.isProcessRunning(agentProcess.pid);\n if (stillRunning) {\n process.kill(agentProcess.pid, \"SIGKILL\");\n }\n\n await this.updateProcessStatus(name, \"stopped\");\n console.log(`✅ Agent '${name}' stopped`);\n } catch (err) {\n throw new Error(`Failed to stop agent '${name}': ${err}`, { cause: err });\n }\n }\n\n async restart(name: string, config: AgentConfig): Promise<void> {\n const existing = await this.findProcessByName(name);\n if (existing && existing.status === \"running\") {\n await this.stop(name);\n }\n await this.startDaemon(config);\n console.log(`🔄 Agent '${name}' restarted`);\n }\n\n async kill(name: string): Promise<void> {\n const agentProcess = await this.findProcessByName(name);\n if (!agentProcess || agentProcess.status !== \"running\") {\n console.log(`⚠️ Agent '${name}' is not running`);\n return;\n }\n\n await this.killProcessTree(agentProcess.pid);\n await this.updateProcessStatus(name, \"stopped\");\n console.log(`💀 Agent '${name}' killed`);\n }\n\n async getStatus(name: string): Promise<ProcessInfo | null> {\n return this.findProcessByName(name);\n }\n\n async getStatusAll(): Promise<ProcessInfo[]> {\n const registry = this.loadRegistry();\n const processes: ProcessInfo[] = [];\n\n for (const processInfo of registry) {\n const isRunning = await this.isProcessRunning(processInfo.pid);\n processes.push({\n ...processInfo,\n status: isRunning ? \"running\" : \"stopped\",\n });\n }\n\n return processes;\n }\n\n async listInstances(): Promise<ProcessInfo[]> {\n return this.getStatusAll();\n }\n\n async showLogs(name: string, options: LogOptions): Promise<void> {\n const logFile = join(this.logsDir, `${name}.log`);\n\n if (!existsSync(logFile)) {\n console.log(`No logs found for agent '${name}'`);\n return;\n }\n\n if (options.follow) {\n const tail = Bun.spawn(\n [\"tail\", \"-f\", \"-n\", options.tail.toString(), logFile],\n { stdout: \"pipe\", stderr: \"pipe\" },\n );\n\n // Pipe stdout and stderr to process\n (async () => {\n for await (const chunk of tail.stdout as ReadableStream) {\n process.stdout.write(chunk);\n }\n })();\n (async () => {\n for await (const chunk of tail.stderr as ReadableStream) {\n process.stderr.write(chunk);\n }\n })();\n\n process.on(\"SIGINT\", () => {\n tail.kill();\n process.exit(0);\n });\n } else {\n try {\n const proc = Bun.spawnSync(\n [\"tail\", \"-n\", options.tail.toString(), logFile],\n { stdout: \"pipe\", stderr: \"pipe\" },\n );\n console.log(proc.stdout.toString());\n } catch (err) {\n console.error(\"Failed to read logs:\", err);\n }\n }\n }\n\n async checkHealth(\n name: string,\n ): Promise<{ healthy: boolean; details: unknown }> {\n const proc = await this.findProcessByName(name);\n\n if (!proc || proc.status !== \"running\") {\n return { healthy: false, details: { error: \"Process not running\" } };\n }\n\n try {\n const response = await fetch(`http://localhost:${proc.port}/health`);\n const data = await response.json();\n return { healthy: response.ok, details: data };\n } catch (err) {\n return {\n healthy: false,\n details: {\n error: \"Health check failed\",\n message: (err as Error).message,\n },\n };\n }\n }\n\n async setConfig(key: string, value: string): Promise<void> {\n const configFile = join(homedir(), \".vibecontrols\", \"config.json\");\n let config: Record<string, unknown> = {};\n if (existsSync(configFile)) {\n config = JSON.parse(readFileSync(configFile, \"utf8\"));\n }\n config[key] = value;\n writeFileSync(configFile, JSON.stringify(config, null, 2));\n }\n\n async getConfig(key?: string): Promise<unknown> {\n const configFile = join(homedir(), \".vibecontrols\", \"config.json\");\n if (!existsSync(configFile)) return key ? undefined : {};\n const config = JSON.parse(readFileSync(configFile, \"utf8\"));\n return key ? config[key] : config;\n }\n\n // ── Private Helpers ───────────────────────────────────────────────\n\n private loadRegistry(): ProcessInfo[] {\n if (!existsSync(this.registryPath)) return [];\n try {\n return JSON.parse(readFileSync(this.registryPath, \"utf8\"));\n } catch {\n return [];\n }\n }\n\n private saveRegistry(processes: ProcessInfo[]): void {\n writeFileSync(this.registryPath, JSON.stringify(processes, null, 2));\n }\n\n private async saveProcessInfo(\n name: string,\n pid: number,\n config: AgentConfig,\n ): Promise<void> {\n const registry = this.loadRegistry();\n const filtered = registry.filter((p) => p.name !== name);\n filtered.push({\n name,\n pid,\n port: config.port,\n config,\n startTime: new Date().toISOString(),\n status: \"running\",\n });\n this.saveRegistry(filtered);\n }\n\n private async updateProcessStatus(\n name: string,\n status: \"running\" | \"stopped\" | \"unknown\",\n ): Promise<void> {\n const registry = this.loadRegistry();\n const proc = registry.find((p) => p.name === name);\n if (proc) {\n proc.status = status;\n this.saveRegistry(registry);\n }\n }\n\n private async findProcessByName(name: string): Promise<ProcessInfo | null> {\n const registry = this.loadRegistry();\n const proc = registry.find((p) => p.name === name);\n if (!proc) return null;\n const isRunning = await this.isProcessRunning(proc.pid);\n proc.status = isRunning ? \"running\" : \"stopped\";\n return proc;\n }\n\n private async isProcessRunning(pid: number): Promise<boolean> {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n }\n\n private async killProcessTree(pid: number): Promise<void> {\n try {\n // Kill process group\n process.kill(-pid, \"SIGKILL\");\n } catch {\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n // Process already dead\n }\n }\n }\n}\n"
6
+ "/**\n * Service Manager\n *\n * Manages multiple agent instances as background daemon processes.\n * Handles start, stop, restart, kill, status, and log operations.\n *\n * Process registry persisted at ~/.vibecontrols/agents.json\n * Logs written to ~/.vibecontrols/logs/{name}.log\n */\n\nimport {\n existsSync,\n readFileSync,\n writeFileSync,\n mkdirSync,\n openSync,\n closeSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nimport type { AgentConfig } from \"./agent.service.js\";\n\nexport interface ProcessInfo {\n name: string;\n pid: number;\n port: number;\n config: AgentConfig;\n startTime: string;\n status: \"running\" | \"stopped\" | \"unknown\";\n}\n\nexport interface LogOptions {\n follow: boolean;\n tail: number;\n}\n\nexport class ServiceManager {\n private registryPath: string;\n private logsDir: string;\n\n constructor() {\n const configDir = join(homedir(), \".vibecontrols\");\n this.registryPath = join(configDir, \"agents.json\");\n this.logsDir = join(configDir, \"logs\");\n\n mkdirSync(configDir, { recursive: true });\n mkdirSync(this.logsDir, { recursive: true });\n }\n\n async startDaemon(config: AgentConfig): Promise<void> {\n // Check if already running\n const existing = await this.findProcessByName(config.name);\n if (existing && existing.status === \"running\") {\n console.log(\n `⚠️ Agent '${config.name}' is already running on port ${existing.port}`,\n );\n return;\n }\n\n // Create log file FD for direct redirect\n const logFile = join(this.logsDir, `${config.name}.log`);\n const logFd = openSync(logFile, \"a\");\n\n // Spawn the process using bun\n // In production (dist/), import.meta.dir already points to dist/ where index.js lives.\n // In dev (src/services/), we resolve to src/index.ts via \"../index.ts\".\n const isDist =\n import.meta.dir.endsWith(\"/dist\") || import.meta.dir.includes(\"/dist/\");\n const indexPath = isDist\n ? join(import.meta.dir, \"index.js\")\n : join(import.meta.dir, \"..\", \"index.ts\");\n const child = Bun.spawn([\"bun\", \"run\", indexPath], {\n stdin: \"ignore\",\n stdout: logFd,\n stderr: logFd,\n env: {\n ...process.env,\n PORT: config.port.toString(),\n DB_PATH: config.dbPath,\n NODE_ENV: \"production\",\n },\n });\n\n closeSync(logFd);\n\n // Wait for process to start\n await new Promise((resolve) => setTimeout(resolve, 2000));\n\n const isRunning = await this.isProcessRunning(child.pid);\n if (!isRunning) {\n throw new Error(`Failed to start agent '${config.name}'`);\n }\n\n await this.saveProcessInfo(config.name, child.pid, config);\n console.log(\n `🚀 Agent '${config.name}' started (PID: ${child.pid}, Port: ${config.port})`,\n );\n }\n\n async stop(name: string): Promise<void> {\n const agentProcess = await this.findProcessByName(name);\n if (!agentProcess || agentProcess.status !== \"running\") {\n console.log(`⚠️ Agent '${name}' is not running`);\n return;\n }\n\n try {\n process.kill(agentProcess.pid, \"SIGTERM\");\n await new Promise((resolve) => setTimeout(resolve, 3000));\n\n const stillRunning = await this.isProcessRunning(agentProcess.pid);\n if (stillRunning) {\n process.kill(agentProcess.pid, \"SIGKILL\");\n }\n\n await this.updateProcessStatus(name, \"stopped\");\n console.log(`✅ Agent '${name}' stopped`);\n } catch (err) {\n throw new Error(`Failed to stop agent '${name}': ${err}`, { cause: err });\n }\n }\n\n async restart(name: string, config: AgentConfig): Promise<void> {\n const existing = await this.findProcessByName(name);\n if (existing && existing.status === \"running\") {\n await this.stop(name);\n }\n await this.startDaemon(config);\n console.log(`🔄 Agent '${name}' restarted`);\n }\n\n async kill(name: string): Promise<void> {\n const agentProcess = await this.findProcessByName(name);\n if (!agentProcess || agentProcess.status !== \"running\") {\n console.log(`⚠️ Agent '${name}' is not running`);\n return;\n }\n\n await this.killProcessTree(agentProcess.pid);\n await this.updateProcessStatus(name, \"stopped\");\n console.log(`💀 Agent '${name}' killed`);\n }\n\n async getStatus(name: string): Promise<ProcessInfo | null> {\n return this.findProcessByName(name);\n }\n\n async getStatusAll(): Promise<ProcessInfo[]> {\n const registry = this.loadRegistry();\n const processes: ProcessInfo[] = [];\n\n for (const processInfo of registry) {\n const isRunning = await this.isProcessRunning(processInfo.pid);\n processes.push({\n ...processInfo,\n status: isRunning ? \"running\" : \"stopped\",\n });\n }\n\n return processes;\n }\n\n async listInstances(): Promise<ProcessInfo[]> {\n return this.getStatusAll();\n }\n\n async showLogs(name: string, options: LogOptions): Promise<void> {\n const logFile = join(this.logsDir, `${name}.log`);\n\n if (!existsSync(logFile)) {\n console.log(`No logs found for agent '${name}'`);\n return;\n }\n\n if (options.follow) {\n const tail = Bun.spawn(\n [\"tail\", \"-f\", \"-n\", options.tail.toString(), logFile],\n { stdout: \"pipe\", stderr: \"pipe\" },\n );\n\n // Pipe stdout and stderr to process\n (async () => {\n for await (const chunk of tail.stdout as ReadableStream) {\n process.stdout.write(chunk);\n }\n })();\n (async () => {\n for await (const chunk of tail.stderr as ReadableStream) {\n process.stderr.write(chunk);\n }\n })();\n\n process.on(\"SIGINT\", () => {\n tail.kill();\n process.exit(0);\n });\n } else {\n try {\n const proc = Bun.spawnSync(\n [\"tail\", \"-n\", options.tail.toString(), logFile],\n { stdout: \"pipe\", stderr: \"pipe\" },\n );\n console.log(proc.stdout.toString());\n } catch (err) {\n console.error(\"Failed to read logs:\", err);\n }\n }\n }\n\n async checkHealth(\n name: string,\n ): Promise<{ healthy: boolean; details: unknown }> {\n const proc = await this.findProcessByName(name);\n\n if (!proc || proc.status !== \"running\") {\n return { healthy: false, details: { error: \"Process not running\" } };\n }\n\n try {\n const response = await fetch(`http://localhost:${proc.port}/health`);\n const data = await response.json();\n return { healthy: response.ok, details: data };\n } catch (err) {\n return {\n healthy: false,\n details: {\n error: \"Health check failed\",\n message: (err as Error).message,\n },\n };\n }\n }\n\n async setConfig(key: string, value: string): Promise<void> {\n const configFile = join(homedir(), \".vibecontrols\", \"config.json\");\n let config: Record<string, unknown> = {};\n if (existsSync(configFile)) {\n config = JSON.parse(readFileSync(configFile, \"utf8\"));\n }\n config[key] = value;\n writeFileSync(configFile, JSON.stringify(config, null, 2));\n }\n\n async getConfig(key?: string): Promise<unknown> {\n const configFile = join(homedir(), \".vibecontrols\", \"config.json\");\n if (!existsSync(configFile)) return key ? undefined : {};\n const config = JSON.parse(readFileSync(configFile, \"utf8\"));\n return key ? config[key] : config;\n }\n\n // ── Private Helpers ───────────────────────────────────────────────\n\n private loadRegistry(): ProcessInfo[] {\n if (!existsSync(this.registryPath)) return [];\n try {\n return JSON.parse(readFileSync(this.registryPath, \"utf8\"));\n } catch {\n return [];\n }\n }\n\n private saveRegistry(processes: ProcessInfo[]): void {\n writeFileSync(this.registryPath, JSON.stringify(processes, null, 2));\n }\n\n private async saveProcessInfo(\n name: string,\n pid: number,\n config: AgentConfig,\n ): Promise<void> {\n const registry = this.loadRegistry();\n const filtered = registry.filter((p) => p.name !== name);\n filtered.push({\n name,\n pid,\n port: config.port,\n config,\n startTime: new Date().toISOString(),\n status: \"running\",\n });\n this.saveRegistry(filtered);\n }\n\n private async updateProcessStatus(\n name: string,\n status: \"running\" | \"stopped\" | \"unknown\",\n ): Promise<void> {\n const registry = this.loadRegistry();\n const proc = registry.find((p) => p.name === name);\n if (proc) {\n proc.status = status;\n this.saveRegistry(registry);\n }\n }\n\n private async findProcessByName(name: string): Promise<ProcessInfo | null> {\n const registry = this.loadRegistry();\n const proc = registry.find((p) => p.name === name);\n if (!proc) return null;\n const isRunning = await this.isProcessRunning(proc.pid);\n proc.status = isRunning ? \"running\" : \"stopped\";\n return proc;\n }\n\n private async isProcessRunning(pid: number): Promise<boolean> {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\n }\n\n private async killProcessTree(pid: number): Promise<void> {\n try {\n // Kill process group\n process.kill(-pid, \"SIGKILL\");\n } catch {\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n // Process already dead\n }\n }\n }\n}\n"
7
7
  ],
8
- "mappings": "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",
9
- "debugId": "6E0629A41BAEEB3564756E2164756E21",
8
+ "mappings": "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",
9
+ "debugId": "86FF4BC55E7E7DC564756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -6,8 +6,10 @@ import {
6
6
  ServiceManager,
7
7
  checkDependencies,
8
8
  installDependencies
9
- } from "./index-s7ff1fj1.js";
10
- import"./index-88ym10cs.js";
9
+ } from "./index-f6296kqk.js";
10
+ import {
11
+ logger
12
+ } from "./index-88ym10cs.js";
11
13
  import {
12
14
  Elysia,
13
15
  t
@@ -124,6 +126,9 @@ function createRoutes(deps) {
124
126
  if (body.workspaceId) {
125
127
  db.setConfig("gateway-auth:workspaceId", body.workspaceId);
126
128
  }
129
+ if (body.agentRecordId) {
130
+ db.setConfig("gateway-auth:agentRecordId", body.agentRecordId);
131
+ }
127
132
  return { success: true, message: "Gateway auth configured" };
128
133
  } catch (err) {
129
134
  set.status = 500;
@@ -142,7 +147,8 @@ function createRoutes(deps) {
142
147
  appClientSecret: t.Optional(t.String()),
143
148
  clientId: t.Optional(t.String()),
144
149
  clientSecret: t.Optional(t.String()),
145
- workspaceId: t.Optional(t.String())
150
+ workspaceId: t.Optional(t.String()),
151
+ agentRecordId: t.Optional(t.String())
146
152
  })
147
153
  }).get("/gateway-auth", () => {
148
154
  const config = gatewayClient.getConfig();
@@ -493,23 +499,169 @@ function registerCommands(program, _hostServices) {
493
499
  register7(program);
494
500
  }
495
501
 
502
+ // src/plugins/agent/auto-report.ts
503
+ import os2 from "os";
504
+ import { readFileSync as readFileSync2 } from "fs";
505
+ import { join as join2, dirname } from "path";
506
+ import { fileURLToPath } from "url";
507
+ var MAX_RETRIES = 10;
508
+ var RETRY_INTERVAL_MS = 3000;
509
+ var LOG_SOURCE = "auto-report";
510
+ var REGISTER_AGENT_MUTATION = `
511
+ mutation RegisterVibecontrolsAgent($input: RegisterVibecontrolsAgentInput!) {
512
+ registerVibecontrolsAgent(input: $input) {
513
+ id
514
+ name
515
+ hostname
516
+ tunnelUrl
517
+ tunnelStatus
518
+ }
519
+ }
520
+ `;
521
+ var UPDATE_AGENT_MUTATION = `
522
+ mutation UpdateVibecontrolsAgent($id: ID!, $input: UpdateVibecontrolsAgentInput!) {
523
+ updateVibecontrolsAgent(id: $id, input: $input) {
524
+ id
525
+ tunnelUrl
526
+ tunnelStatus
527
+ agentApiKey
528
+ }
529
+ }
530
+ `;
531
+ function getAgentVersion2() {
532
+ try {
533
+ const __dirname2 = dirname(fileURLToPath(import.meta.url));
534
+ const pkgPath = join2(__dirname2, "..", "..", "package.json");
535
+ const pkg = JSON.parse(readFileSync2(pkgPath, "utf8"));
536
+ return pkg.version || "0.0.0";
537
+ } catch {
538
+ return "0.0.0";
539
+ }
540
+ }
541
+ async function waitForTunnelUrl(serviceRegistry) {
542
+ for (let attempt = 1;attempt <= MAX_RETRIES; attempt++) {
543
+ const tunnelProvider = serviceRegistry.getProvider("tunnel");
544
+ if (tunnelProvider) {
545
+ const url = await tunnelProvider.getActiveTunnelUrl();
546
+ if (url) {
547
+ logger.debug(LOG_SOURCE, `Tunnel URL available on attempt ${attempt}: ${url}`);
548
+ return url;
549
+ }
550
+ }
551
+ if (attempt < MAX_RETRIES) {
552
+ logger.debug(LOG_SOURCE, `Tunnel URL not ready, retrying in ${RETRY_INTERVAL_MS / 1000}s (attempt ${attempt}/${MAX_RETRIES})`);
553
+ await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL_MS));
554
+ }
555
+ }
556
+ logger.warn(LOG_SOURCE, `Tunnel URL not available after ${MAX_RETRIES} attempts`);
557
+ return null;
558
+ }
559
+ async function autoReportToBackend(db, serviceRegistry, apiKey) {
560
+ if (!gatewayClient.isConfigured()) {
561
+ logger.debug(LOG_SOURCE, "Gateway auth not configured \u2014 skipping auto-report");
562
+ return;
563
+ }
564
+ const workspaceId = db.getConfig("gateway-auth:workspaceId");
565
+ if (!workspaceId) {
566
+ logger.warn(LOG_SOURCE, "No workspaceId configured \u2014 skipping auto-report. " + "Configure via POST /api/agent/gateway-auth with workspaceId.");
567
+ return;
568
+ }
569
+ logger.info(LOG_SOURCE, "Starting auto-report to backend...");
570
+ try {
571
+ const tunnelUrl = await waitForTunnelUrl(serviceRegistry);
572
+ const hostname2 = os2.hostname();
573
+ const platform2 = os2.platform();
574
+ const arch2 = os2.arch();
575
+ const version = getAgentVersion2();
576
+ const agentRecordId = db.getConfig("gateway-auth:agentRecordId");
577
+ if (agentRecordId) {
578
+ logger.info(LOG_SOURCE, `Updating agent record ${agentRecordId} via workspace gateway`);
579
+ const result2 = await gatewayClient.workspaceQuery(UPDATE_AGENT_MUTATION, {
580
+ id: agentRecordId,
581
+ input: {
582
+ tunnelUrl: tunnelUrl || null,
583
+ tunnelStatus: tunnelUrl ? "CONNECTED" : "DISCONNECTED",
584
+ agentApiKey: apiKey,
585
+ agentVersion: version,
586
+ platform: `${platform2}/${arch2}`
587
+ }
588
+ });
589
+ if (result2.errors?.length) {
590
+ logger.warn(LOG_SOURCE, "Update mutation returned errors", {
591
+ errors: result2.errors.map((e) => e.message)
592
+ });
593
+ } else {
594
+ logger.info(LOG_SOURCE, "Agent record updated successfully", {
595
+ agentRecordId,
596
+ tunnelUrl
597
+ });
598
+ return;
599
+ }
600
+ }
601
+ logger.info(LOG_SOURCE, `Registering agent via workspace gateway (hostname: ${hostname2})`);
602
+ const result = await gatewayClient.workspaceQuery(REGISTER_AGENT_MUTATION, {
603
+ input: {
604
+ name: hostname2,
605
+ hostname: hostname2,
606
+ platform: `${platform2}/${arch2}`,
607
+ agentVersion: version,
608
+ tunnelUrl: tunnelUrl || null,
609
+ tunnelStatus: tunnelUrl ? "CONNECTED" : "DISCONNECTED",
610
+ agentApiKey: apiKey,
611
+ workspaceId
612
+ }
613
+ });
614
+ if (result.errors?.length) {
615
+ logger.error(LOG_SOURCE, "Register mutation failed", {
616
+ errors: result.errors.map((e) => e.message)
617
+ });
618
+ return;
619
+ }
620
+ const data = result.data;
621
+ const registeredId = data?.registerVibecontrolsAgent?.id;
622
+ if (registeredId) {
623
+ db.setConfig("gateway-auth:agentRecordId", registeredId);
624
+ logger.info(LOG_SOURCE, "Agent registered successfully", {
625
+ agentRecordId: registeredId,
626
+ name: data?.registerVibecontrolsAgent?.name,
627
+ tunnelUrl
628
+ });
629
+ }
630
+ } catch (err) {
631
+ logger.error(LOG_SOURCE, `Auto-report failed: ${err instanceof Error ? err.message : String(err)}`);
632
+ }
633
+ }
634
+
496
635
  // src/plugins/agent/index.ts
636
+ var capturedDb = null;
637
+ var capturedApiKey = null;
497
638
  var vibePlugin = {
498
639
  name: "agent",
499
- version: "2.2.0",
500
- description: "Core agent identity, system info, setup, and gateway authentication",
640
+ version: "2.3.0",
641
+ description: "Core agent identity, system info, setup, gateway authentication, and auto-report",
501
642
  tags: ["backend", "cli"],
502
643
  cliCommand: "agent",
503
644
  apiPrefix: "/api/agent",
504
645
  publicPaths: ["/identity", "/api-key", "/tunnel"],
505
- createRoutes: (deps) => createRoutes(deps),
646
+ createRoutes: (deps) => {
647
+ capturedDb = deps.db;
648
+ capturedApiKey = process.env.API_KEY || "vibecontrols-agent-secret-key";
649
+ return createRoutes(deps);
650
+ },
506
651
  onCliSetup: async (program, hostServices) => {
507
652
  registerCommands(program, hostServices);
653
+ },
654
+ onServerReady: async (_app, hostServices) => {
655
+ if (capturedDb) {
656
+ autoReportToBackend(capturedDb, hostServices.serviceRegistry, capturedApiKey || "unknown").catch((err) => {
657
+ hostServices.logger.warn("agent-plugin", `Auto-report background task failed: ${err}`);
658
+ });
659
+ }
508
660
  }
509
661
  };
510
662
  export {
511
663
  vibePlugin
512
664
  };
513
665
 
514
- //# debugId=9AE6B13FD3CF2B6664756E2164756E21
515
- //# sourceMappingURL=index-tjymws9j.js.map
666
+ //# debugId=FB296CA280CCBCD464756E2164756E21
667
+ //# sourceMappingURL=index-ftbphe7j.js.map
@@ -0,0 +1,20 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/plugins/agent/routes.ts", "../src/cli/commands/health.cmd.ts", "../src/cli/commands/info.cmd.ts", "../src/cli/commands/key.cmd.ts", "../src/cli/commands/system.cmd.ts", "../src/cli/commands/status.cmd.ts", "../src/cli/commands/url.cmd.ts", "../src/cli/commands/gateway-auth.cmd.ts", "../src/plugins/agent/commands.ts", "../src/plugins/agent/auto-report.ts", "../src/plugins/agent/index.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Agent Plugin — Routes\n *\n * Core agent endpoints for identity, API key, setup, config, system info,\n * and gateway authentication.\n *\n * Adapted from src/routes/agent.routes.ts for the plugin architecture.\n * The plugin router adds the \"/api/agent\" prefix — this factory returns\n * a bare Elysia instance with no prefix.\n *\n * Endpoints:\n * GET /identity — Agent identity (machineId, platform, etc.)\n * GET /api-key — Get the current API key\n * GET /tunnel — Get agent tunnel URL (from tunnel provider)\n * POST /tunnel/start — Start the agent tunnel\n * POST /tunnel/stop — Stop the agent tunnel\n * GET /setup/check — Check dependency status\n * POST /setup/install — Install missing dependencies\n * POST /gateway-auth — Configure gateway credentials\n * GET /gateway-auth — Get gateway config (without secret)\n * GET /version — Agent version info\n * GET /system — System information\n * GET /status — Agent status\n * GET /url — Get the active API URL (tunnel or local)\n */\n\nimport { Elysia, t } from \"elysia\";\nimport os from \"node:os\";\nimport { join } from \"node:path\";\nimport { readFileSync } from \"node:fs\";\n\nimport type { PluginRouteDeps } from \"../../core/types.js\";\nimport type { TunnelProvider } from \"../../core/providers/tunnel.provider.js\";\nimport {\n checkDependencies,\n installDependencies,\n} from \"../../services/bootstrap.service.js\";\nimport { gatewayClient } from \"../../services/gateway-client.js\";\n\n// ── Machine ID ──────────────────────────────────────────────────────────\n\nfunction getMachineId(): string {\n const hostname = os.hostname();\n const platform = os.platform();\n const arch = os.arch();\n const hasher = new Bun.CryptoHasher(\"sha256\");\n hasher.update(`${hostname}-${platform}-${arch}`);\n return hasher.digest(\"hex\").substring(0, 16);\n}\n\n// ── Version ─────────────────────────────────────────────────────────────\n\nfunction getAgentVersion(): string {\n try {\n const pkgPath = join(import.meta.dir, \"..\", \"..\", \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n return (pkg.version as string) || \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\n// ── Routes ──────────────────────────────────────────────────────────────\n\nexport function createRoutes(deps: PluginRouteDeps) {\n const { db, serviceRegistry } = deps;\n const version = getAgentVersion();\n const machineId = getMachineId();\n\n return (\n new Elysia()\n // Identity (auth-exempt)\n .get(\"/identity\", () => ({\n machineId,\n hostname: os.hostname(),\n platform: os.platform(),\n arch: os.arch(),\n version,\n uptime: process.uptime(),\n }))\n\n // API key (auth-exempt)\n .get(\"/api-key\", (ctx) => ({\n apiKey:\n (ctx as unknown as Record<string, string>).apiKey ??\n (ctx.store as Record<string, string>).apiKey ??\n \"unknown\",\n }))\n\n // Tunnel URL (auth-exempt — used by backend for probing)\n .get(\"/tunnel\", async () => {\n const tunnelProvider =\n serviceRegistry.getProvider<TunnelProvider>(\"tunnel\");\n if (!tunnelProvider) {\n return { tunnelUrl: null, message: \"No tunnel provider registered\" };\n }\n const url = await tunnelProvider.getActiveTunnelUrl();\n return { tunnelUrl: url };\n })\n\n // Start agent tunnel\n .post(\"/tunnel/start\", async ({ set }) => {\n const tunnelProvider =\n serviceRegistry.getProvider<TunnelProvider>(\"tunnel\");\n if (!tunnelProvider) {\n set.status = 400;\n return { error: \"No tunnel provider registered\" };\n }\n const port = parseInt(process.env.PORT || \"3005\");\n const tunnel = await tunnelProvider.start({ port, name: \"agent\" });\n return { success: true, tunnel };\n })\n\n // Stop agent tunnel\n .post(\"/tunnel/stop\", async ({ set }) => {\n const tunnelProvider =\n serviceRegistry.getProvider<TunnelProvider>(\"tunnel\");\n if (!tunnelProvider) {\n set.status = 400;\n return { error: \"No tunnel provider registered\" };\n }\n const tunnels = await tunnelProvider.list();\n const agentTunnel = tunnels.find((t) => t.metadata?.isAgent);\n if (agentTunnel) {\n await tunnelProvider.stop(agentTunnel.id);\n }\n return { success: true };\n })\n\n // Setup check\n .get(\"/setup/check\", () => {\n const deps = checkDependencies();\n const allInstalled = deps\n .filter((d) => d.required)\n .every((d) => d.installed);\n return { ready: allInstalled, dependencies: deps };\n })\n\n // Setup install\n .post(\"/setup/install\", async () => {\n const result = await installDependencies();\n return result;\n })\n\n // Gateway auth — configure\n .post(\n \"/gateway-auth\",\n async ({ body, set }) => {\n try {\n gatewayClient.configure({\n globalGatewayUrl:\n body.tenantApiUrl || body.globalGatewayUrl || \"\",\n workspaceGatewayUrl:\n body.workspacesApiUrl || body.workspaceGatewayUrl,\n clientId: body.appClientId || body.clientId || \"\",\n clientSecret: body.appClientSecret || body.clientSecret || \"\",\n });\n\n // Persist credentials\n if (body.appClientId || body.clientId) {\n db.setConfig(\n \"gateway-auth:clientId\",\n body.appClientId || body.clientId || \"\",\n );\n }\n if (body.appClientSecret || body.clientSecret) {\n db.setConfig(\n \"gateway-auth:clientSecret\",\n body.appClientSecret || body.clientSecret || \"\",\n );\n }\n if (body.workspacesApiUrl || body.workspaceGatewayUrl) {\n db.setConfig(\n \"gateway-auth:workspaceGatewayUrl\",\n body.workspacesApiUrl || body.workspaceGatewayUrl || \"\",\n );\n }\n if (body.tenantApiUrl || body.globalGatewayUrl) {\n db.setConfig(\n \"gateway-auth:globalGatewayUrl\",\n body.tenantApiUrl || body.globalGatewayUrl || \"\",\n );\n }\n if (body.workspaceId) {\n db.setConfig(\"gateway-auth:workspaceId\", body.workspaceId);\n }\n if (body.agentRecordId) {\n db.setConfig(\"gateway-auth:agentRecordId\", body.agentRecordId);\n }\n\n return { success: true, message: \"Gateway auth configured\" };\n } catch (err) {\n set.status = 500;\n return {\n error: \"Failed to configure gateway auth\",\n message: String(err),\n };\n }\n },\n {\n body: t.Object({\n workspacesApiUrl: t.Optional(t.String()),\n tenantApiUrl: t.Optional(t.String()),\n globalGatewayUrl: t.Optional(t.String()),\n workspaceGatewayUrl: t.Optional(t.String()),\n appClientId: t.Optional(t.String()),\n appClientSecret: t.Optional(t.String()),\n clientId: t.Optional(t.String()),\n clientSecret: t.Optional(t.String()),\n workspaceId: t.Optional(t.String()),\n agentRecordId: t.Optional(t.String()),\n }),\n },\n )\n\n // Gateway auth — get config (without secret)\n .get(\"/gateway-auth\", () => {\n const config = gatewayClient.getConfig();\n return { configured: gatewayClient.isConfigured(), config };\n })\n\n // Version\n .get(\"/version\", () => ({\n version,\n runtime: \"bun\",\n runtimeVersion: typeof Bun !== \"undefined\" ? Bun.version : \"unknown\",\n }))\n\n // System info\n .get(\"/system\", () => ({\n hostname: os.hostname(),\n platform: os.platform(),\n arch: os.arch(),\n release: os.release(),\n cpus: os.cpus().length,\n totalMemory: os.totalmem(),\n freeMemory: os.freemem(),\n uptime: os.uptime(),\n bunVersion: typeof Bun !== \"undefined\" ? Bun.version : undefined,\n agentVersion: version,\n homeDir: os.homedir(),\n cwd: process.cwd(),\n environment: process.env.NODE_ENV || \"production\",\n }))\n\n // Agent status\n .get(\"/status\", () => ({\n status: \"online\",\n timestamp: new Date().toISOString(),\n version,\n providers: serviceRegistry.listProviders(),\n services: serviceRegistry.listServices(),\n }))\n\n // Get active URL (tunnel URL or local URL)\n .get(\"/url\", async () => {\n const tunnelProvider =\n serviceRegistry.getProvider<TunnelProvider>(\"tunnel\");\n const tunnelUrl = tunnelProvider\n ? await tunnelProvider.getActiveTunnelUrl()\n : null;\n const localUrl = `http://localhost:${process.env.PORT || 3005}`;\n return {\n url: tunnelUrl || localUrl,\n tunnelUrl,\n localUrl,\n source: tunnelUrl ? \"tunnel\" : \"local\",\n };\n })\n );\n}\n",
6
+ "import { Command } from \"commander\";\nimport {\n success,\n info,\n fail,\n header,\n kv,\n blank,\n colors,\n icons,\n formatStatus,\n getAgentUrl,\n apiGet,\n} from \"../utils/index.js\";\nimport { ServiceManager } from \"../../services/service-manager.js\";\n\nconst DEFAULT_AGENT_URL = \"http://localhost:3005\";\n\ninterface HealthResponse {\n status: string;\n uptime?: number;\n version?: string;\n timestamp?: string;\n checks?: Record<string, { status: string; message?: string }>;\n}\n\ninterface HealthCheckResult {\n healthy: boolean;\n details: {\n status?: string;\n uptime?: number;\n checks?: Record<string, { status: string; message?: string }>;\n [key: string]: unknown;\n };\n}\n\nexport function register(program: Command): void {\n program\n .command(\"health\")\n .description(\"Check health of a VibeControls agent instance\")\n .option(\"-n, --name <name>\", \"Agent instance name\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (opts) => {\n try {\n header(\"Agent Health\");\n blank();\n\n if (opts.name) {\n // Use service manager for named instance health check\n const serviceManager = new ServiceManager();\n\n const result = (await serviceManager.checkHealth(\n opts.name,\n )) as HealthCheckResult;\n\n if (!result.healthy) {\n fail(`Agent instance ${colors.bold(opts.name)} is not responding.`);\n return;\n }\n\n const details = result.details;\n kv(\"Instance\", opts.name);\n kv(\"Status\", formatStatus(details.status ?? \"healthy\"));\n\n if (details.uptime !== undefined) {\n kv(\"Uptime\", `${details.uptime}s`);\n }\n\n if (details.checks) {\n blank();\n info(`${icons.info} Health checks:`);\n for (const [name, check] of Object.entries(details.checks)) {\n const icon =\n check.status === \"healthy\" ? icons.success : icons.error;\n kv(` ${icon} ${name}`, formatStatus(check.status));\n }\n }\n } else {\n // Use HTTP endpoint for URL-based health check\n const agentUrl = getAgentUrl(opts);\n\n const data = await apiGet<HealthResponse>(agentUrl, \"/health\");\n\n kv(\"URL\", agentUrl);\n kv(\"Status\", formatStatus(data.status));\n\n if (data.version) {\n kv(\"Version\", data.version);\n }\n\n if (data.uptime !== undefined) {\n kv(\"Uptime\", `${data.uptime}s`);\n }\n\n if (data.timestamp) {\n kv(\"Timestamp\", data.timestamp);\n }\n\n if (data.checks) {\n blank();\n info(`${icons.info} Health checks:`);\n for (const [name, check] of Object.entries(data.checks)) {\n const icon =\n check.status === \"healthy\" ? icons.success : icons.error;\n kv(` ${icon} ${name}`, formatStatus(check.status));\n }\n }\n }\n\n blank();\n success(`${icons.success} Agent is healthy.`);\n } catch (err: any) {\n fail(`Health check failed: ${err.message}`);\n }\n });\n}\n",
7
+ "import { Command } from \"commander\";\nimport { platform, arch, release, hostname, cpus, totalmem } from \"node:os\";\nimport {\n info,\n fail,\n header,\n kv,\n blank,\n colors,\n icons,\n formatBytes,\n getAgentUrl,\n apiGet,\n} from \"../utils/index.js\";\n\nconst DEFAULT_AGENT_URL = \"http://localhost:3005\";\n\ninterface VersionResponse {\n version: string;\n build?: string;\n commit?: string;\n nodeVersion?: string;\n bunVersion?: string;\n}\n\nexport function register(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show local and remote VibeControls agent information\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (opts) => {\n try {\n header(\"VibeControls Agent Info\");\n blank();\n\n // Local system info\n info(`${icons.info} Local System`);\n kv(\"Hostname\", hostname());\n kv(\"Platform\", `${platform()} ${arch()}`);\n kv(\"OS Release\", release());\n kv(\"CPUs\", String(cpus().length));\n kv(\"Total Memory\", formatBytes(totalmem()));\n kv(\"Node.js\", process.version);\n\n if (process.versions.bun) {\n kv(\"Bun\", process.versions.bun);\n }\n\n blank();\n\n // Remote agent info\n const agentUrl = getAgentUrl(opts);\n\n try {\n const data = await apiGet<VersionResponse>(\n agentUrl,\n \"/api/agent/version\",\n );\n\n info(`${icons.info} Remote Agent`);\n kv(\"URL\", agentUrl);\n kv(\"Version\", colors.bold(data.version));\n\n if (data.build) {\n kv(\"Build\", data.build);\n }\n\n if (data.commit) {\n kv(\"Commit\", data.commit);\n }\n\n if (data.nodeVersion) {\n kv(\"Node.js (remote)\", data.nodeVersion);\n }\n\n if (data.bunVersion) {\n kv(\"Bun (remote)\", data.bunVersion);\n }\n } catch {\n info(`${icons.info} Remote Agent`);\n kv(\"URL\", agentUrl);\n kv(\"Status\", colors.dim(\"not reachable\"));\n }\n\n blank();\n } catch (err: any) {\n fail(`Failed to get info: ${err.message}`);\n }\n });\n}\n",
8
+ "import { Command } from \"commander\";\nimport {\n fail,\n header,\n kv,\n blank,\n colors,\n getAgentUrl,\n apiGet,\n} from \"../utils/index.js\";\n\nconst DEFAULT_AGENT_URL = \"http://localhost:3005\";\n\ninterface ApiKeyResponse {\n apiKey: string;\n}\n\nexport function register(program: Command): void {\n program\n .command(\"key\")\n .description(\"Get the API key for a running VibeControls agent\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (opts) => {\n try {\n const agentUrl = getAgentUrl(opts);\n\n header(\"Agent API Key\");\n blank();\n\n const data = await apiGet<ApiKeyResponse>(\n agentUrl,\n \"/api/agent/api-key\",\n );\n\n kv(\"API Key\", colors.bold(data.apiKey));\n blank();\n } catch (err: any) {\n fail(`Failed to get API key: ${err.message}`);\n }\n });\n}\n",
9
+ "import { Command } from \"commander\";\nimport {\n info,\n fail,\n header,\n kv,\n blank,\n colors,\n icons,\n formatBytes,\n formatDuration,\n getAgentUrl,\n apiGet,\n} from \"../utils/index.js\";\n\nconst DEFAULT_AGENT_URL = \"http://localhost:3005\";\n\ninterface SystemResponse {\n hostname: string;\n platform: string;\n arch: string;\n release: string;\n cpus: number;\n totalMemory: number;\n freeMemory: number;\n uptime: number;\n bunVersion?: string;\n agentVersion: string;\n homeDir: string;\n cwd: string;\n environment?: string;\n}\n\nexport function register(program: Command): void {\n program\n .command(\"system\")\n .description(\"Show system information for a running VibeControls agent\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (opts) => {\n try {\n const agentUrl = getAgentUrl(opts);\n\n header(\"Agent System Information\");\n blank();\n\n const data = await apiGet<SystemResponse>(\n agentUrl,\n \"/api/agent/system\",\n );\n\n // Agent info\n info(`${icons.info} Agent`);\n kv(\"Version\", colors.bold(data.agentVersion));\n if (data.bunVersion) {\n kv(\"Bun\", data.bunVersion);\n }\n if (data.environment) {\n kv(\"Environment\", data.environment);\n }\n kv(\"Uptime\", formatDuration(data.uptime));\n blank();\n\n // Platform info\n info(`${icons.info} Platform`);\n kv(\"OS\", `${data.platform} ${data.arch}`);\n kv(\"Hostname\", data.hostname);\n kv(\"Release\", data.release);\n blank();\n\n // Resources\n info(`${icons.info} Resources`);\n kv(\"CPUs\", String(data.cpus));\n kv(\"Total Memory\", formatBytes(data.totalMemory));\n kv(\"Free Memory\", formatBytes(data.freeMemory));\n blank();\n\n // Paths\n info(`${icons.info} Paths`);\n kv(\"Home\", data.homeDir);\n kv(\"CWD\", data.cwd);\n blank();\n } catch (err: any) {\n fail(`Failed to get system info: ${err.message}`);\n }\n });\n}\n",
10
+ "import { Command } from \"commander\";\nimport {\n info,\n fail,\n header,\n kv,\n blank,\n colors,\n icons,\n formatStatus,\n timeAgo,\n formatTable,\n} from \"../utils/index.js\";\nimport { ServiceManager } from \"../../services/service-manager.js\";\n\nexport function register(program: Command): void {\n program\n .command(\"status\")\n .description(\"Show status of VibeControls agent instance(s)\")\n .option(\"-n, --name <name>\", \"Agent instance name\")\n .action(async (opts) => {\n try {\n const serviceManager = new ServiceManager();\n\n if (opts.name) {\n // Show individual instance status\n header(`Agent Status: ${opts.name}`);\n blank();\n\n const instance = await serviceManager.getStatus(opts.name);\n\n if (!instance) {\n fail(`Agent instance ${colors.bold(opts.name)} not found.`);\n return;\n }\n\n kv(\"Name\", instance.name);\n kv(\"Status\", formatStatus(instance.status));\n kv(\"PID\", instance.pid ? String(instance.pid) : colors.dim(\"n/a\"));\n kv(\"Port\", instance.port ? String(instance.port) : colors.dim(\"n/a\"));\n kv(\"Host\", instance.config?.host || colors.dim(\"n/a\"));\n kv(\"Database\", instance.config?.dbPath || colors.dim(\"n/a\"));\n\n if (instance.startTime) {\n kv(\"Started\", timeAgo(instance.startTime));\n }\n\n blank();\n } else {\n // Show all instances\n header(\"Agent Instances\");\n blank();\n\n const instances = await serviceManager.listInstances();\n\n if (!instances || instances.length === 0) {\n info(`${icons.info} No agent instances found.`);\n info(`Run ${colors.bold(\"vibe start\")} to start an agent.`);\n return;\n }\n\n const rows = instances.map((inst) => ({\n Name: inst.name,\n Status: formatStatus(inst.status),\n PID: inst.pid || \"-\",\n Port: inst.port || \"-\",\n Started: inst.startTime ? timeAgo(inst.startTime) : \"-\",\n }));\n\n formatTable(rows);\n\n blank();\n info(\n `${icons.info} ${instances.length} instance(s) found. Use ${colors.bold(\"vibe status -n <name>\")} for details.`,\n );\n }\n } catch (err: any) {\n fail(`Failed to get status: ${err.message}`);\n }\n });\n}\n",
11
+ "import { Command } from \"commander\";\nimport {\n info,\n fail,\n header,\n kv,\n blank,\n colors,\n icons,\n getAgentUrl,\n apiGet,\n} from \"../utils/index.js\";\n\nconst DEFAULT_AGENT_URL = \"http://localhost:3005\";\n\ninterface UrlResponse {\n url: string;\n tunnelUrl?: string;\n localUrl: string;\n isTunnel: boolean;\n}\n\nexport function register(program: Command): void {\n program\n .command(\"url\")\n .description(\"Show the active URL for a running VibeControls agent\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (opts) => {\n try {\n const agentUrl = getAgentUrl(opts);\n\n header(\"Agent URL\");\n blank();\n\n const data = await apiGet<UrlResponse>(agentUrl, \"/api/agent/url\");\n\n kv(\"Active URL\", colors.bold(data.url));\n kv(\"Local URL\", data.localUrl);\n\n if (data.tunnelUrl) {\n kv(\"Tunnel URL\", colors.cyan(data.tunnelUrl));\n }\n\n kv(\n \"Mode\",\n data.isTunnel\n ? `${icons.running} Tunnel active`\n : `${icons.info} Local only`,\n );\n\n blank();\n\n if (data.isTunnel) {\n info(\n `${icons.info} Agent is accessible via tunnel at ${colors.bold(data.tunnelUrl!)}`,\n );\n } else {\n info(\n `${icons.info} Agent is running locally at ${colors.bold(data.localUrl)}`,\n );\n }\n } catch (err: any) {\n fail(`Failed to get URL: ${err.message}`);\n }\n });\n}\n",
12
+ "import { Command } from \"commander\";\nimport {\n success,\n info,\n fail,\n header,\n kv,\n blank,\n colors,\n icons,\n getAgentUrl,\n apiGet,\n apiPost,\n} from \"../utils/index.js\";\n\nconst DEFAULT_AGENT_URL = \"http://localhost:3005\";\n\ninterface GatewayAuthStatusResponse {\n configured: boolean;\n globalUrl?: string;\n workspaceUrl?: string;\n clientId?: string;\n authenticated: boolean;\n tokenExpiresAt?: string;\n}\n\ninterface GatewayAuthConfigureResponse {\n success: boolean;\n message: string;\n}\n\nexport function register(program: Command): void {\n const gatewayAuth = program\n .command(\"gateway-auth\")\n .description(\"Manage gateway authentication for VibeControls agent\");\n\n gatewayAuth\n .command(\"configure\")\n .description(\"Configure gateway authentication credentials\")\n .requiredOption(\"--global-url <url>\", \"Global gateway URL\")\n .requiredOption(\"--workspace-url <url>\", \"Workspace gateway URL\")\n .requiredOption(\"--client-id <id>\", \"OAuth client ID\")\n .requiredOption(\"--client-secret <secret>\", \"OAuth client secret\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (opts) => {\n try {\n const agentUrl = getAgentUrl(opts);\n\n header(\"Configure Gateway Authentication\");\n blank();\n\n info(`${icons.info} Sending gateway auth configuration...`);\n blank();\n\n const data = await apiPost<GatewayAuthConfigureResponse>(\n agentUrl,\n \"/api/agent/gateway-auth\",\n {\n globalUrl: opts.globalUrl,\n workspaceUrl: opts.workspaceUrl,\n clientId: opts.clientId,\n clientSecret: opts.clientSecret,\n },\n );\n\n if (data.success) {\n success(\n `${icons.success} Gateway authentication configured successfully.`,\n );\n blank();\n kv(\"Global URL\", opts.globalUrl);\n kv(\"Workspace URL\", opts.workspaceUrl);\n kv(\"Client ID\", opts.clientId);\n kv(\"Client Secret\", colors.dim(\"********\"));\n } else {\n fail(data.message || \"Failed to configure gateway authentication.\");\n }\n\n blank();\n } catch (err: any) {\n fail(`Failed to configure gateway auth: ${err.message}`);\n }\n });\n\n gatewayAuth\n .command(\"status\")\n .description(\"Check gateway authentication status\")\n .option(\"--agent-url <url>\", \"Agent URL\", DEFAULT_AGENT_URL)\n .action(async (opts) => {\n try {\n const agentUrl = getAgentUrl(opts);\n\n header(\"Gateway Authentication Status\");\n blank();\n\n const data = await apiGet<GatewayAuthStatusResponse>(\n agentUrl,\n \"/api/agent/gateway-auth\",\n );\n\n kv(\n \"Configured\",\n data.configured\n ? `${icons.success} ${colors.green(\"Yes\")}`\n : `${icons.error} ${colors.red(\"No\")}`,\n );\n\n if (data.configured) {\n kv(\"Global URL\", data.globalUrl || colors.dim(\"n/a\"));\n kv(\"Workspace URL\", data.workspaceUrl || colors.dim(\"n/a\"));\n kv(\"Client ID\", data.clientId || colors.dim(\"n/a\"));\n kv(\n \"Authenticated\",\n data.authenticated\n ? `${icons.success} ${colors.green(\"Yes\")}`\n : `${icons.error} ${colors.red(\"No\")}`,\n );\n\n if (data.tokenExpiresAt) {\n kv(\"Token Expires\", data.tokenExpiresAt);\n }\n } else {\n blank();\n info(\n `${icons.info} Run ${colors.bold(\"vibe gateway-auth configure\")} to set up gateway authentication.`,\n );\n }\n\n blank();\n } catch (err: any) {\n fail(`Failed to get gateway auth status: ${err.message}`);\n }\n });\n}\n",
13
+ "/**\n * Agent Plugin — CLI Commands\n *\n * Consolidates the core agent CLI commands by re-exporting the existing\n * register functions from the individual command files. The plugin's\n * onCliSetup hook calls registerCommands() to wire them into Commander.\n *\n * Commands: health, info, key, system, status, url, gateway-auth\n */\n\nimport type { Command } from \"commander\";\nimport type { HostServices } from \"../../core/plugin-system.js\";\n\n// Re-export individual command registrations\nimport { register as registerHealth } from \"../../cli/commands/health.cmd.js\";\nimport { register as registerInfo } from \"../../cli/commands/info.cmd.js\";\nimport { register as registerKey } from \"../../cli/commands/key.cmd.js\";\nimport { register as registerSystem } from \"../../cli/commands/system.cmd.js\";\nimport { register as registerStatus } from \"../../cli/commands/status.cmd.js\";\nimport { register as registerUrl } from \"../../cli/commands/url.cmd.js\";\nimport { register as registerGatewayAuth } from \"../../cli/commands/gateway-auth.cmd.js\";\n\nexport function registerCommands(\n program: Command,\n _hostServices: HostServices,\n): void {\n registerHealth(program);\n registerInfo(program);\n registerKey(program);\n registerSystem(program);\n registerStatus(program);\n registerUrl(program);\n registerGatewayAuth(program);\n}\n",
14
+ "/**\n * Auto-Report — Push agent details to backend after startup\n *\n * When gateway auth (OAuth2) is configured, automatically reports the\n * agent's tunnel URL, API key, hostname, platform, and version to the\n * backend via the `registerVibecontrolsAgent` mutation (upsert by hostname).\n *\n * This runs as a non-blocking background task from the `onServerReady` hook.\n * Retries are needed because the tunnel may not be ready immediately at\n * server start (Cloudflare tunnel starts in an external plugin).\n */\n\nimport os from \"node:os\";\nimport { readFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport { gatewayClient } from \"../../services/gateway-client.js\";\nimport { logger } from \"../../services/logger.js\";\nimport type { ServiceRegistry } from \"../../core/service-registry.js\";\nimport type { TunnelProvider } from \"../../core/providers/tunnel.provider.js\";\nimport type { AgentDatabase } from \"../../db/database.js\";\n\n// ── Constants ────────────────────────────────────────────────────────────\n\nconst MAX_RETRIES = 10;\nconst RETRY_INTERVAL_MS = 3_000;\nconst LOG_SOURCE = \"auto-report\";\n\n// ── GraphQL Mutations ────────────────────────────────────────────────────\n\nconst REGISTER_AGENT_MUTATION = `\n mutation RegisterVibecontrolsAgent($input: RegisterVibecontrolsAgentInput!) {\n registerVibecontrolsAgent(input: $input) {\n id\n name\n hostname\n tunnelUrl\n tunnelStatus\n }\n }\n`;\n\nconst UPDATE_AGENT_MUTATION = `\n mutation UpdateVibecontrolsAgent($id: ID!, $input: UpdateVibecontrolsAgentInput!) {\n updateVibecontrolsAgent(id: $id, input: $input) {\n id\n tunnelUrl\n tunnelStatus\n agentApiKey\n }\n }\n`;\n\n// ── Helpers ──────────────────────────────────────────────────────────────\n\nfunction getAgentVersion(): string {\n try {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const pkgPath = join(__dirname, \"..\", \"..\", \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as Record<\n string,\n unknown\n >;\n return (pkg.version as string) || \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nasync function waitForTunnelUrl(\n serviceRegistry: ServiceRegistry,\n): Promise<string | null> {\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n const tunnelProvider =\n serviceRegistry.getProvider<TunnelProvider>(\"tunnel\");\n if (tunnelProvider) {\n const url = await tunnelProvider.getActiveTunnelUrl();\n if (url) {\n logger.debug(\n LOG_SOURCE,\n `Tunnel URL available on attempt ${attempt}: ${url}`,\n );\n return url;\n }\n }\n\n if (attempt < MAX_RETRIES) {\n logger.debug(\n LOG_SOURCE,\n `Tunnel URL not ready, retrying in ${RETRY_INTERVAL_MS / 1000}s (attempt ${attempt}/${MAX_RETRIES})`,\n );\n await new Promise((resolve) => setTimeout(resolve, RETRY_INTERVAL_MS));\n }\n }\n\n logger.warn(\n LOG_SOURCE,\n `Tunnel URL not available after ${MAX_RETRIES} attempts`,\n );\n return null;\n}\n\n// ── Main Export ──────────────────────────────────────────────────────────\n\n/**\n * Auto-report agent details to the backend.\n * Called from the agent plugin's `onServerReady` hook.\n * Non-blocking — errors are logged but do not crash the agent.\n */\nexport async function autoReportToBackend(\n db: AgentDatabase,\n serviceRegistry: ServiceRegistry,\n apiKey: string,\n): Promise<void> {\n // Gate: only report if gateway auth is configured\n if (!gatewayClient.isConfigured()) {\n logger.debug(\n LOG_SOURCE,\n \"Gateway auth not configured — skipping auto-report\",\n );\n return;\n }\n\n const workspaceId = db.getConfig(\"gateway-auth:workspaceId\");\n if (!workspaceId) {\n logger.warn(\n LOG_SOURCE,\n \"No workspaceId configured — skipping auto-report. \" +\n \"Configure via POST /api/agent/gateway-auth with workspaceId.\",\n );\n return;\n }\n\n logger.info(LOG_SOURCE, \"Starting auto-report to backend...\");\n\n try {\n // Wait for tunnel URL (retries)\n const tunnelUrl = await waitForTunnelUrl(serviceRegistry);\n\n const hostname = os.hostname();\n const platform = os.platform();\n const arch = os.arch();\n const version = getAgentVersion();\n const agentRecordId = db.getConfig(\"gateway-auth:agentRecordId\");\n\n if (agentRecordId) {\n // We have a known backend record ID — use targeted update\n logger.info(\n LOG_SOURCE,\n `Updating agent record ${agentRecordId} via workspace gateway`,\n );\n\n const result = await gatewayClient.workspaceQuery(UPDATE_AGENT_MUTATION, {\n id: agentRecordId,\n input: {\n tunnelUrl: tunnelUrl || null,\n tunnelStatus: tunnelUrl ? \"CONNECTED\" : \"DISCONNECTED\",\n agentApiKey: apiKey,\n agentVersion: version,\n platform: `${platform}/${arch}`,\n },\n });\n\n if (result.errors?.length) {\n logger.warn(LOG_SOURCE, \"Update mutation returned errors\", {\n errors: result.errors.map((e) => e.message),\n });\n // Fall through to try register instead\n } else {\n logger.info(LOG_SOURCE, \"Agent record updated successfully\", {\n agentRecordId,\n tunnelUrl,\n });\n return;\n }\n }\n\n // No agentRecordId or update failed — use register (upsert by hostname)\n logger.info(\n LOG_SOURCE,\n `Registering agent via workspace gateway (hostname: ${hostname})`,\n );\n\n const result = await gatewayClient.workspaceQuery(REGISTER_AGENT_MUTATION, {\n input: {\n name: hostname,\n hostname,\n platform: `${platform}/${arch}`,\n agentVersion: version,\n tunnelUrl: tunnelUrl || null,\n tunnelStatus: tunnelUrl ? \"CONNECTED\" : \"DISCONNECTED\",\n agentApiKey: apiKey,\n workspaceId,\n },\n });\n\n if (result.errors?.length) {\n logger.error(LOG_SOURCE, \"Register mutation failed\", {\n errors: result.errors.map((e) => e.message),\n });\n return;\n }\n\n const data = result.data as\n | {\n registerVibecontrolsAgent?: { id: string; name: string };\n }\n | undefined;\n\n const registeredId = data?.registerVibecontrolsAgent?.id;\n if (registeredId) {\n // Persist the record ID for future targeted updates\n db.setConfig(\"gateway-auth:agentRecordId\", registeredId);\n logger.info(LOG_SOURCE, \"Agent registered successfully\", {\n agentRecordId: registeredId,\n name: data?.registerVibecontrolsAgent?.name,\n tunnelUrl,\n });\n }\n } catch (err) {\n logger.error(\n LOG_SOURCE,\n `Auto-report failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n",
15
+ "/**\n * Agent Plugin — Entry Point\n *\n * Core plugin providing agent identity, system information, dependency\n * setup, and gateway authentication. Always loaded as part of the\n * built-in plugin set.\n *\n * Lifecycle:\n * createRoutes → captures db reference\n * onServerReady → triggers auto-report to backend (if gateway auth configured)\n */\n\nimport type { VibePlugin } from \"../../core/plugin-system.js\";\nimport type { PluginRouteDeps } from \"../../core/types.js\";\nimport type { AgentDatabase } from \"../../db/database.js\";\nimport { createRoutes } from \"./routes.js\";\nimport { registerCommands } from \"./commands.js\";\nimport { autoReportToBackend } from \"./auto-report.js\";\n\n// Captured from createRoutes deps — used by onServerReady\nlet capturedDb: AgentDatabase | null = null;\nlet capturedApiKey: string | null = null;\n\nexport const vibePlugin: VibePlugin = {\n name: \"agent\",\n version: \"2.3.0\",\n description:\n \"Core agent identity, system info, setup, gateway authentication, and auto-report\",\n tags: [\"backend\", \"cli\"],\n cliCommand: \"agent\",\n apiPrefix: \"/api/agent\",\n publicPaths: [\"/identity\", \"/api-key\", \"/tunnel\"],\n\n createRoutes: (deps: PluginRouteDeps) => {\n capturedDb = deps.db;\n // Store the API key so auto-report can send it to backend\n capturedApiKey = process.env.API_KEY || \"vibecontrols-agent-secret-key\";\n return createRoutes(deps);\n },\n\n onCliSetup: async (program, hostServices) => {\n registerCommands(program, hostServices);\n },\n\n onServerReady: async (_app, hostServices) => {\n // Fire-and-forget: auto-report agent details to backend\n // This is non-blocking so the server doesn't wait for it\n if (capturedDb) {\n autoReportToBackend(\n capturedDb,\n hostServices.serviceRegistry,\n capturedApiKey || \"unknown\",\n ).catch((err) => {\n hostServices.logger.warn(\n \"agent-plugin\",\n `Auto-report background task failed: ${err}`,\n );\n });\n }\n },\n};\n"
16
+ ],
17
+ "mappings": "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",
18
+ "debugId": "FB296CA280CCBCD464756E2164756E21",
19
+ "names": []
20
+ }
package/dist/index.js CHANGED
@@ -9,8 +9,8 @@ import"./index-wr0mkm57.js";
9
9
  import"./index-g8dczzvv.js";
10
10
  import {
11
11
  createApp
12
- } from "./app-6d1xq46v.js";
13
- import"./plugin-system-x4tbwzyq.js";
12
+ } from "./app-7xd13pn3.js";
13
+ import"./plugin-system-w2727db6.js";
14
14
 
15
15
  // src/index.ts
16
16
  if (typeof Bun === "undefined") {
@@ -3,7 +3,7 @@ import"./index-g8dczzvv.js";
3
3
 
4
4
  // package.json
5
5
  var name = "@burdenoff/vibe-agent";
6
- var version = "2.6.0";
6
+ var version = "2.7.1";
7
7
  var main = "./dist/index.js";
8
8
  var type = "module";
9
9
  var bin = {
@@ -134,5 +134,5 @@ export {
134
134
  author
135
135
  };
136
136
 
137
- //# debugId=5863818052E0872D64756E2164756E21
138
- //# sourceMappingURL=package-4andgzzt.js.map
137
+ //# debugId=CF5F37FA4C0A09C664756E2164756E21
138
+ //# sourceMappingURL=package-a1mt704j.js.map
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "5863818052E0872D64756E2164756E21",
7
+ "debugId": "CF5F37FA4C0A09C664756E2164756E21",
8
8
  "names": []
9
9
  }
@@ -64,7 +64,7 @@ class PluginManager {
64
64
  }
65
65
  async loadCorePlugins() {
66
66
  const coreModules = await Promise.allSettled([
67
- import("./index-tjymws9j.js"),
67
+ import("./index-ftbphe7j.js"),
68
68
  import("./index-rdm6e3rr.js"),
69
69
  import("./index-4nsdre0j.js"),
70
70
  import("./index-3rjnbp97.js"),
@@ -74,7 +74,7 @@ class PluginManager {
74
74
  import("./index-6vry08rz.js"),
75
75
  import("./index-wmvkjcjj.js"),
76
76
  import("./index-30p492yv.js"),
77
- import("./index-wxxv9rec.js"),
77
+ import("./index-5hb62xkm.js"),
78
78
  import("./index-hefqxwht.js"),
79
79
  import("./index-a9g7hbj9.js")
80
80
  ]);
@@ -504,4 +504,4 @@ class PluginManager {
504
504
  export { PluginManager };
505
505
 
506
506
  //# debugId=8DD2577C7DC4CE6B64756E2164756E21
507
- //# sourceMappingURL=plugin-system-x4tbwzyq.js.map
507
+ //# sourceMappingURL=plugin-system-w2727db6.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/vibe-agent",
3
- "version": "2.6.0",
3
+ "version": "2.7.1",
4
4
  "main": "./dist/index.js",
5
5
  "type": "module",
6
6
  "bin": {