feat: add claw backend adapter

This commit is contained in:
kris
2026-04-03 01:36:29 +08:00
parent 8daaea01fd
commit 39b576cc42
23 changed files with 1212 additions and 23 deletions

View File

@@ -378,6 +378,7 @@ export interface ProjectAgentControls {
modelOverride?: string;
reasoningEffortOverride?: ReasoningEffort;
promptOverride?: string;
backendOverride?: "claw-runtime";
updatedAt: string;
}
@@ -1715,6 +1716,16 @@ function parseReasoningEffortOverride(value: unknown) {
return { kind: "set" as const, value };
}
function parseBackendOverride(value: unknown) {
if (value === undefined || value === null) {
return { kind: "clear" as const };
}
if (value !== "claw-runtime") {
return { kind: "invalid" as const };
}
return { kind: "set" as const, value: "claw-runtime" as const };
}
function normalizeStringSet(values: string[]) {
return dedupeStrings(values.map((value) => value.trim()).filter(Boolean)).sort((a, b) => a.localeCompare(b));
}
@@ -2144,8 +2155,9 @@ function normalizeProjectAgentControls(
? raw.reasoningEffortOverride
: undefined;
const promptOverride = trimToDefined(raw?.promptOverride);
const backendOverride = raw?.backendOverride === "claw-runtime" ? raw.backendOverride : undefined;
if (!modelOverride && !reasoningEffortOverride && !promptOverride) {
if (!modelOverride && !reasoningEffortOverride && !promptOverride && !backendOverride) {
return undefined;
}
@@ -2153,6 +2165,7 @@ function normalizeProjectAgentControls(
modelOverride,
reasoningEffortOverride,
promptOverride,
backendOverride,
updatedAt: raw?.updatedAt ?? nowIso(),
};
}
@@ -3610,6 +3623,7 @@ export async function updateProjectAgentControls(
modelOverride?: unknown;
reasoningEffortOverride?: unknown;
promptOverride?: unknown;
backendOverride?: unknown;
},
account?: string,
) {
@@ -3626,6 +3640,9 @@ export async function updateProjectAgentControls(
const promptOverrideInput = Object.prototype.hasOwnProperty.call(payload, "promptOverride")
? parseControlTextOverride(payload.promptOverride)
: { kind: "preserve" as const };
const backendOverrideInput = Object.prototype.hasOwnProperty.call(payload, "backendOverride")
? parseBackendOverride(payload.backendOverride)
: { kind: "preserve" as const };
if (modelOverrideInput.kind === "invalid") {
throw new Error("INVALID_MODEL_OVERRIDE");
}
@@ -3635,6 +3652,9 @@ export async function updateProjectAgentControls(
if (promptOverrideInput.kind === "invalid") {
throw new Error("INVALID_PROMPT_OVERRIDE");
}
if (backendOverrideInput.kind === "invalid") {
throw new Error("INVALID_BACKEND_OVERRIDE");
}
return mutateStateIfChanged((state) => {
const project = state.projects.find((item) => item.id === projectId);
@@ -3661,14 +3681,22 @@ export async function updateProjectAgentControls(
: promptOverrideInput.kind === "clear"
? undefined
: currentControls?.promptOverride;
const backendOverride =
backendOverrideInput.kind === "set"
? backendOverrideInput.value
: backendOverrideInput.kind === "clear"
? undefined
: currentControls?.backendOverride;
const currentModelOverride = currentControls?.modelOverride;
const currentReasoningEffortOverride = currentControls?.reasoningEffortOverride;
const currentPromptOverride = currentControls?.promptOverride;
const currentBackendOverride = currentControls?.backendOverride;
if (
currentModelOverride === modelOverride &&
currentReasoningEffortOverride === reasoningEffortOverride &&
currentPromptOverride === promptOverride
currentPromptOverride === promptOverride &&
currentBackendOverride === backendOverride
) {
return { result: currentControls, changed: false };
}
@@ -3677,6 +3705,7 @@ export async function updateProjectAgentControls(
modelOverride,
reasoningEffortOverride,
promptOverride,
backendOverride,
updatedAt: nowIso(),
} satisfies ProjectAgentControls;
const normalizedControls = normalizeProjectAgentControls(nextControls) ?? null;