feat: gate claw runtime selection by availability
This commit is contained in:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user