Something went wrong. Try again.
presents omp as codex for use with chatgpt remote
Something went wrong. Try again.
10 kB · 245 lines
JavaScript
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246import { execFile } from "node:child_process";import { randomUUID } from "node:crypto";import { createConnection } from "node:net";import os from "node:os";import path from "node:path";import { promisify } from "node:util";
const execFileAsync = promisify(execFile);const PROTOCOL = { name: "prime-agent.daemon", version: 7 };let listCache = null;
export function defaultPrimeDaemonSocket() { if (process.env.PRIME_AGENT_DAEMON_SOCKET) return process.env.PRIME_AGENT_DAEMON_SOCKET; return path.join(os.tmpdir(), `prime-agent-${typeof process.getuid === "function" ? process.getuid() : "user"}`, "daemon.sock");}
function primeBin() { return process.env.OMP_CODEX_PRIME_BIN || "prime-agent";}
function attachLines(stream, onFrame) { let buffer = ""; const onData = (chunk) => { buffer += chunk.toString("utf8"); let index; while ((index = buffer.indexOf("\n")) !== -1) { const line = buffer.slice(0, index).replace(/\r$/, ""); buffer = buffer.slice(index + 1); if (!line) continue; try { onFrame(JSON.parse(line)); } catch {} } }; stream.on("data", onData); return () => stream.off("data", onData);}
async function openDaemon(timeoutMs = 1500) { const socket = createConnection(defaultPrimeDaemonSocket()); let hello; const frames = []; const waiters = []; const detach = attachLines(socket, (frame) => { if (frame.type === "daemon_hello") hello = frame; frames.push(frame); for (const waiter of [...waiters]) waiter(frame); }); await new Promise((resolve, reject) => { const timer = setTimeout(() => { socket.destroy(); reject(new Error("Prime daemon connect timed out")); }, timeoutMs); socket.once("connect", () => { clearTimeout(timer); resolve(); }); socket.once("error", (error) => { clearTimeout(timer); reject(error); }); }); const waitFor = (predicate, timeout = 3000) => { const existing = frames.find(predicate); if (existing) return Promise.resolve(existing); return new Promise((resolve, reject) => { const timer = setTimeout(() => reject(new Error("Prime daemon response timed out")), timeout); const waiter = (frame) => { if (!predicate(frame)) return; clearTimeout(timer); waiters.splice(waiters.indexOf(waiter), 1); resolve(frame); }; waiters.push(waiter); }); }; const greeting = hello || await waitFor((frame) => frame.type === "daemon_hello"); if (greeting.protocol?.name !== PROTOCOL.name || greeting.protocol?.version !== PROTOCOL.version || Number(greeting.schemaRevision || 0) < 22) { socket.destroy(); throw new Error("Unsupported Prime daemon protocol"); } const clientId = `omp-codex:${randomUUID()}`; const request = async (command, timeout = 30_000) => { const id = `daemon_${randomUUID()}`; socket.write(`${JSON.stringify({ type: "command", id, protocol: PROTOCOL, clientId, command: { ...command, id } })}\n`); const response = await waitFor((frame) => frame.id === id && (frame.type === "response" || frame.type === "command_result"), timeout); if (response.success === false || response.error) throw new Error(response.error?.message || response.error || `Prime daemon ${command.type} failed`); return response.data ?? response.result ?? response; }; return { socket, greeting, request, waitFor, frames, detach, clientId };}
export async function listPrimeAgents({ force = false } = {}) { if (!force && listCache && Date.now() - listCache.time < 500) return listCache.sessions; let sessions; try { const daemon = await openDaemon(); try { const data = await daemon.request({ type: "list", all: true }); sessions = Array.isArray(data) ? data : (data.sessions || []); } finally { daemon.detach(); daemon.socket.destroy(); } } catch { try { const { stdout } = await execFileAsync(primeBin(), ["list", "--all", "--json"], { timeout: 5000, maxBuffer: 8 * 1024 * 1024 }); const parsed = JSON.parse(stdout); sessions = Array.isArray(parsed) ? parsed : (parsed.sessions || []); } catch { sessions = []; } } listCache = { time: Date.now(), sessions }; return sessions;}
async function resolveTarget(target) { const sessions = await listPrimeAgents({ force: true }); const row = sessions.find((entry) => entry.activeSessionId === target?.activeSessionId || entry.sessionId === target?.sessionId || entry.sessionFile === target?.sessionPath || entry.id === target?.sessionId ); return row || null;}
function rowStatus(row) { const working = row.activity === "working" || row.isStreaming || row.isCompacting || row.isBashRunning || row.isRunningTools; return { idle: !working, hasPendingMessages: Number(row.sessionActions?.queuedCount || 0) > 0, activeSessionId: row.activeSessionId || null, sessionId: row.sessionId, sessionPath: row.sessionFile, model: row.model || null, reasoningEffort: row.thinkingLevel || null, raw: row, };}
export async function primeControlStatus(target) { const row = await resolveTarget(target); return row?.activeSessionId ? rowStatus(row) : null;}
function selector(value) { if (typeof value === "string") return value; if (!value) return ""; return value.selector || (value.provider && (value.id || value.model) ? `${value.provider}/${value.id || value.model}` : value.id || value.model || "");}
export async function primeControlConfigure(target, options = {}) { const row = await resolveTarget(target); if (!row) return false; const currentModel = row.model ? `${row.model.provider}/${row.model.id}` : selector(target.model); const requestedModel = selector(options.model); if (requestedModel && requestedModel !== currentModel && requestedModel !== row.model?.id) { const separator = requestedModel.indexOf("/"); if (separator <= 0 || !await daemonTargetCommand(target, (activeSessionId) => ({ type: "set_model", activeSessionId, provider: requestedModel.slice(0, separator), modelId: requestedModel.slice(separator + 1), }))) return false; } if (options.reasoningEffort && row.thinkingLevel && String(options.reasoningEffort) !== String(row.thinkingLevel)) { if (!await daemonTargetCommand(target, (activeSessionId) => ({ type: "set_thinking_level", activeSessionId, level: String(options.reasoningEffort), }))) return false; } return true;}
async function daemonTargetCommand(target, build, timeout = 30_000) { const row = await resolveTarget(target); const activeSessionId = row?.activeSessionId || null; if (!activeSessionId) return false; try { const daemon = await openDaemon(); try { await daemon.request(build(activeSessionId, row), timeout); return true; } finally { daemon.detach(); daemon.socket.destroy(); } } catch { return false; }}
export async function primeControlSend(target, message, { deliverAs = "steer" } = {}) { const viaDaemon = await daemonTargetCommand(target, (activeSessionId, row) => ({ type: deliverAs === "followUp" || deliverAs === "follow_up" ? "follow_up" : (row?.activity === "working" ? "steer" : "prompt"), activeSessionId, message, })); if (viaDaemon) return true; const row = await resolveTarget(target); const id = row?.activeSessionId || null; if (!id) return false; try { const flag = deliverAs === "followUp" || deliverAs === "follow_up" ? "--follow-up" : "--steer"; await execFileAsync(primeBin(), ["send", flag, "--json", id, message], { timeout: 10_000 }); return true; } catch { return false; }}
export async function primeControlInterrupt(target) { return daemonTargetCommand(target, (activeSessionId) => ({ type: "abort", activeSessionId }));}
export async function primeControlCompact(target) { return daemonTargetCommand(target, (activeSessionId) => ({ type: "compact", activeSessionId }), 300_000);}
export async function primeControlSubscribe(target, options = {}) { const row = await resolveTarget(target); const activeSessionId = row?.activeSessionId || null; if (!activeSessionId) return null; let daemon; try { daemon = await openDaemon(); } catch { return null; } const generation = daemon.greeting.supervisorGeneration || "prime-daemon"; let sequence = Number(options.afterSequence || 0); const streamId = generation; const onFrame = (frame) => { if (frame.type !== "session_event" || frame.activeSessionId !== activeSessionId) return; const next = Number(frame.meta?.sequence || sequence + 1); sequence = Math.max(sequence, next); options.onEvent?.({ streamId: frame.meta?.cursor?.generation || streamId, sequence: next, event: frame.event }); }; const detachEvents = attachLines(daemon.socket, onFrame); try { const resumeCursor = options.streamId && options.afterSequence != null ? { generation: options.streamId, sequence: Number(options.afterSequence) } : undefined; const attached = await daemon.request({ type: "attach", activeSessionId, capabilities: ["attach_snapshot", "event_sequence"], ...(resumeCursor ? { resumeCursor } : {}), }); const state = attached.snapshot?.state || row || {}; const status = rowStatus({ ...row, ...state }); const replay = attached.replay || {}; const handle = { streamId: attached.lastEventCursor?.generation || streamId, sequence: Number(attached.lastEventSequence || sequence), status, reset: replay.status && replay.status !== "complete", close() { detachEvents(); daemon.detach(); daemon.socket.destroy(); }, }; if (options.signal) { const close = () => handle.close(); if (options.signal.aborted) close(); else options.signal.addEventListener("abort", close, { once: true }); } daemon.socket.once("close", () => options.onDisconnect?.()); return handle; } catch { detachEvents(); daemon.detach(); daemon.socket.destroy(); return null; }}