Refactor monolithic heartbeat service, AgentConfigForm, and CLI heartbeat-run into a proper adapter registry pattern. Each adapter type (process, claude-local, codex-local, http) gets its own module with server-side execution logic, CLI invocation, and UI config form. Significantly reduces file sizes and enables adding new adapters without touching core code. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import type { AdapterExecutionContext, AdapterExecutionResult } from "../types.js";
|
|
import { asString, asNumber, parseObject } from "../utils.js";
|
|
|
|
export async function execute(ctx: AdapterExecutionContext): Promise<AdapterExecutionResult> {
|
|
const { config, runId, agent, context } = ctx;
|
|
const url = asString(config.url, "");
|
|
if (!url) throw new Error("HTTP adapter missing url");
|
|
|
|
const method = asString(config.method, "POST");
|
|
const timeoutMs = asNumber(config.timeoutMs, 15000);
|
|
const headers = parseObject(config.headers) as Record<string, string>;
|
|
const payloadTemplate = parseObject(config.payloadTemplate);
|
|
const body = { ...payloadTemplate, agentId: agent.id, runId, context };
|
|
|
|
const controller = new AbortController();
|
|
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
|
|
try {
|
|
const res = await fetch(url, {
|
|
method,
|
|
headers: {
|
|
"content-type": "application/json",
|
|
...headers,
|
|
},
|
|
body: JSON.stringify(body),
|
|
signal: controller.signal,
|
|
});
|
|
|
|
if (!res.ok) {
|
|
throw new Error(`HTTP invoke failed with status ${res.status}`);
|
|
}
|
|
|
|
return {
|
|
exitCode: 0,
|
|
signal: null,
|
|
timedOut: false,
|
|
summary: `HTTP ${method} ${url}`,
|
|
};
|
|
} finally {
|
|
clearTimeout(timer);
|
|
}
|
|
}
|