Extract adapter registry across CLI, server, and UI
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>
This commit is contained in:
9
ui/src/adapters/http/build-config.ts
Normal file
9
ui/src/adapters/http/build-config.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import type { CreateConfigValues } from "../../components/AgentConfigForm";
|
||||
|
||||
export function buildHttpConfig(v: CreateConfigValues): Record<string, unknown> {
|
||||
const ac: Record<string, unknown> = {};
|
||||
if (v.url) ac.url = v.url;
|
||||
ac.method = "POST";
|
||||
ac.timeoutMs = 15000;
|
||||
return ac;
|
||||
}
|
||||
38
ui/src/adapters/http/config-fields.tsx
Normal file
38
ui/src/adapters/http/config-fields.tsx
Normal file
@@ -0,0 +1,38 @@
|
||||
import type { AdapterConfigFieldsProps } from "../types";
|
||||
import {
|
||||
Field,
|
||||
DraftInput,
|
||||
help,
|
||||
} from "../../components/agent-config-primitives";
|
||||
|
||||
const inputClass =
|
||||
"w-full rounded-md border border-border px-2.5 py-1.5 bg-transparent outline-none text-sm font-mono placeholder:text-muted-foreground/40";
|
||||
|
||||
export function HttpConfigFields({
|
||||
isCreate,
|
||||
values,
|
||||
set,
|
||||
config,
|
||||
eff,
|
||||
mark,
|
||||
}: AdapterConfigFieldsProps) {
|
||||
return (
|
||||
<Field label="Webhook URL" hint={help.webhookUrl}>
|
||||
<DraftInput
|
||||
value={
|
||||
isCreate
|
||||
? values!.url
|
||||
: eff("adapterConfig", "url", String(config.url ?? ""))
|
||||
}
|
||||
onCommit={(v) =>
|
||||
isCreate
|
||||
? set!({ url: v })
|
||||
: mark("adapterConfig", "url", v || undefined)
|
||||
}
|
||||
immediate
|
||||
className={inputClass}
|
||||
placeholder="https://..."
|
||||
/>
|
||||
</Field>
|
||||
);
|
||||
}
|
||||
12
ui/src/adapters/http/index.ts
Normal file
12
ui/src/adapters/http/index.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
import type { UIAdapterModule } from "../types";
|
||||
import { parseHttpStdoutLine } from "./parse-stdout";
|
||||
import { HttpConfigFields } from "./config-fields";
|
||||
import { buildHttpConfig } from "./build-config";
|
||||
|
||||
export const httpUIAdapter: UIAdapterModule = {
|
||||
type: "http",
|
||||
label: "HTTP Webhook",
|
||||
parseStdoutLine: parseHttpStdoutLine,
|
||||
ConfigFields: HttpConfigFields,
|
||||
buildAdapterConfig: buildHttpConfig,
|
||||
};
|
||||
5
ui/src/adapters/http/parse-stdout.ts
Normal file
5
ui/src/adapters/http/parse-stdout.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import type { TranscriptEntry } from "../types";
|
||||
|
||||
export function parseHttpStdoutLine(line: string, ts: string): TranscriptEntry[] {
|
||||
return [{ kind: "stdout", ts, text: line }];
|
||||
}
|
||||
Reference in New Issue
Block a user