SPB Git

spb/khaelor Public

KHAELOR — a terminal-native autonomous engineering agent powered by Anthropic.

TypeScript 82.9% HTML 14.9% CSS 1.1% JavaScript 0.7%
1.5 KB · 57 lines typescript
Raw Blame History
1/**2 * KHAELOR3 * File: src/daemon/client.ts4 * Description: Control-socket client — status/goals/approvals/stop requests against a running khaelord (v2 design §7.3).5 *6 * Author: Simon-Pierre Boucher7 * Contact: contact@spboucher.ai8 */910import { connect } from "node:net";11import { join } from "node:path";1213/** One JSON-line request/response round-trip on the daemon's unix socket. */14export function daemonRequest(15  daemonDir: string,16  request: Record<string, unknown>,17  timeoutMs = 3_000,18): Promise<Record<string, unknown>> {19  const socketPath = join(daemonDir, "daemon.sock");20  return new Promise((resolve, reject) => {21    const socket = connect(socketPath);22    const timer = setTimeout(() => {23      socket.destroy();24      reject(new Error("daemon did not respond"));25    }, timeoutMs);26    let buffer = "";27    socket.on("connect", () => {28      socket.write(`${JSON.stringify(request)}\n`);29    });30    socket.on("data", (chunk) => {31      buffer += chunk.toString("utf8");32    });33    socket.on("end", () => {34      clearTimeout(timer);35      try {36        resolve(JSON.parse(buffer.trim()) as Record<string, unknown>);37      } catch {38        reject(new Error(`invalid daemon response: ${buffer.slice(0, 200)}`));39      }40    });41    socket.on("error", (error) => {42      clearTimeout(timer);43      reject(error);44    });45  });46}4748/** True when the recorded pid is alive. */49export function pidAlive(pid: number): boolean {50  try {51    process.kill(pid, 0);52    return true;53  } catch {54    return false;55  }56}57