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/**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