feat: gate claw runtime selection by availability

This commit is contained in:
kris
2026-04-03 02:11:41 +08:00
parent 6c999fb951
commit 8e2350e89d
19 changed files with 564 additions and 123 deletions

View File

@@ -24,6 +24,13 @@ type MemoryDraft = {
sourceMessageId: string;
};
type ClawAvailability = {
status: "disabled" | "misconfigured" | "ready";
selectable: boolean;
reason: string;
reasonLabel: string;
};
const memoryScopeOptions: Array<{ value: MasterMemoryScope; label: string }> = [
{ value: "global", label: "通用记忆" },
{ value: "project", label: "项目记忆" },
@@ -145,6 +152,7 @@ export function MasterAgentPromptMemoryClient({
promptPolicy,
userPrompt,
projectControls,
clawAvailability,
globalMemories,
projectMemories,
anchors,
@@ -153,6 +161,7 @@ export function MasterAgentPromptMemoryClient({
promptPolicy: MasterAgentPromptPolicy | null;
userPrompt: UserMasterPrompt | null;
projectControls: ProjectAgentControls | null;
clawAvailability: ClawAvailability;
globalMemories: MasterAgentMemory[];
projectMemories: MasterAgentMemory[];
anchors: MasterAgentChatPageAnchors;
@@ -167,8 +176,10 @@ export function MasterAgentPromptMemoryClient({
projectControls?.reasoningEffortOverride ?? "",
);
const [promptOverride, setPromptOverride] = useState(projectControls?.promptOverride ?? "");
const storedClawOverrideUnavailable =
projectControls?.backendOverride === "claw-runtime" && !clawAvailability.selectable;
const [backendOverride, setBackendOverride] = useState(
projectControls?.backendOverride === "claw-runtime" ? "claw-runtime" : "",
projectControls?.backendOverride === "claw-runtime" && clawAvailability.selectable ? "claw-runtime" : "",
);
const [newMemory, setNewMemory] = useState<MemoryDraft>(makeNewMemoryDraft());
const [memoryDrafts, setMemoryDrafts] = useState<Record<string, MemoryDraft>>(() => {
@@ -185,9 +196,14 @@ export function MasterAgentPromptMemoryClient({
globalPrompt.trim() ? `【管理员全局主提示词】\n${globalPrompt.trim()}` : null,
userPromptContent.trim() ? `【用户私有主提示词】\n${userPromptContent.trim()}` : null,
promptOverride.trim() ? `【当前对话附加提示词】\n${promptOverride.trim()}` : null,
backendOverride.trim()
? `【执行后端】\n${backendOverride.trim()}`
: storedClawOverrideUnavailable
? "【执行后端】\n默认Claw Runtime 当前不可用,运行时会自动回退)"
: null,
].filter(Boolean);
return sections.length > 0 ? sections.join("\n\n") : "当前还没有组合后的提示词内容。";
}, [globalPrompt, userPromptContent, promptOverride]);
}, [backendOverride, globalPrompt, promptOverride, storedClawOverrideUnavailable, userPromptContent]);
function updateMemoryDraft(memoryId: string, updater: (draft: MemoryDraft) => MemoryDraft) {
setMemoryDrafts((current) => ({
@@ -441,10 +457,21 @@ export function MasterAgentPromptMemoryClient({
className="w-full rounded-xl border border-[#E5E5EA] bg-[#F7F8FA] px-3 py-2 text-[13px] text-[#111111] outline-none"
>
<option value=""></option>
<option value="claw-runtime">Claw Runtime</option>
{clawAvailability.selectable ? <option value="claw-runtime">Claw Runtime</option> : null}
</select>
</label>
</div>
{!clawAvailability.selectable ? (
<div className="rounded-2xl border border-[#F4C7C3] bg-[#FFF7F6] px-4 py-3 text-[12px] leading-6 text-[#B54708]">
<div className="font-semibold text-[#912018]">Claw Runtime </div>
<div>{clawAvailability.reasonLabel}</div>
{storedClawOverrideUnavailable ? (
<div className="mt-1 text-[#912018]">
Claw Runtime退
</div>
) : null}
</div>
) : null}
<TextArea
label="当前对话附加提示词"
value={promptOverride}