107 lines
3.5 KiB
TypeScript
107 lines
3.5 KiB
TypeScript
import { defaultAgentWorkflowUiConfig } from "@/lib/agents/workflow-ui-config";
|
||
import type {
|
||
AgentWorkflowComposerContext,
|
||
AgentWorkflowStepKey,
|
||
AgentWorkflowUiConfig,
|
||
} from "@/types/agent";
|
||
|
||
export interface AgentWorkflowInputsValue {
|
||
primarySku: string;
|
||
secondarySku: string;
|
||
brand: string;
|
||
store: string;
|
||
}
|
||
|
||
export function buildAgentWorkflowComposerContext(params: {
|
||
config?: AgentWorkflowUiConfig | null;
|
||
inputs: AgentWorkflowInputsValue;
|
||
selections: Partial<Record<AgentWorkflowStepKey, string>>;
|
||
}): AgentWorkflowComposerContext | null {
|
||
const config = params.config || defaultAgentWorkflowUiConfig;
|
||
const steps = Array.isArray(config.steps) ? config.steps : [];
|
||
const selections = steps
|
||
.filter((step) => step.enabled !== false)
|
||
.map((step) => {
|
||
const selectedKey = params.selections[step.key];
|
||
if (!selectedKey) return null;
|
||
const option = (step.options || []).find(
|
||
(item) => item.key === selectedKey && item.enabled !== false
|
||
);
|
||
if (!option) return null;
|
||
return {
|
||
stepKey: step.key,
|
||
stepTitle: step.title,
|
||
optionKey: option.key,
|
||
optionName: option.buttonName,
|
||
promptFragment: option.promptFragment || option.buttonName,
|
||
};
|
||
})
|
||
.filter(Boolean) as AgentWorkflowComposerContext["selections"];
|
||
|
||
const summaryParts: string[] = [];
|
||
if (params.inputs.primarySku.trim()) {
|
||
summaryParts.push(`主SKU:${params.inputs.primarySku.trim()}`);
|
||
}
|
||
if (params.inputs.secondarySku.trim()) {
|
||
summaryParts.push(`搭配SKU:${params.inputs.secondarySku.trim()}`);
|
||
}
|
||
if (params.inputs.brand.trim()) {
|
||
summaryParts.push(`品牌:${params.inputs.brand.trim()}`);
|
||
}
|
||
if (params.inputs.store.trim()) {
|
||
summaryParts.push(`店铺:${params.inputs.store.trim()}`);
|
||
}
|
||
selections.forEach((item) => {
|
||
summaryParts.push(`${item.stepTitle}:${item.optionName}`);
|
||
});
|
||
|
||
if (summaryParts.length === 0) {
|
||
return null;
|
||
}
|
||
|
||
const promptLines: string[] = [];
|
||
if (params.inputs.primarySku.trim()) {
|
||
promptLines.push(`主SKU:${params.inputs.primarySku.trim()}`);
|
||
}
|
||
if (params.inputs.secondarySku.trim()) {
|
||
promptLines.push(`搭配SKU:${params.inputs.secondarySku.trim()}`);
|
||
}
|
||
if (params.inputs.brand.trim()) {
|
||
promptLines.push(`品牌:${params.inputs.brand.trim()}`);
|
||
}
|
||
if (params.inputs.store.trim()) {
|
||
promptLines.push(`店铺:${params.inputs.store.trim()}`);
|
||
}
|
||
selections.forEach((item) => {
|
||
promptLines.push(`${item.stepTitle}:${item.promptFragment || item.optionName}`);
|
||
});
|
||
|
||
return {
|
||
primarySku: params.inputs.primarySku.trim() || undefined,
|
||
secondarySku: params.inputs.secondarySku.trim() || undefined,
|
||
brand: params.inputs.brand.trim() || undefined,
|
||
store: params.inputs.store.trim() || undefined,
|
||
selections,
|
||
summaryText: summaryParts.join(" / "),
|
||
promptText: promptLines.join("\n"),
|
||
};
|
||
}
|
||
|
||
export function getAgentWorkflowProgress(params: {
|
||
config?: AgentWorkflowUiConfig | null;
|
||
selections: Partial<Record<AgentWorkflowStepKey, string>>;
|
||
}) {
|
||
const config = params.config || defaultAgentWorkflowUiConfig;
|
||
const enabledSteps = (config.steps || []).filter((step) => step.enabled !== false);
|
||
const completedSteps = enabledSteps.filter((step) => {
|
||
const value = params.selections[step.key];
|
||
return Boolean(String(value || "").trim());
|
||
});
|
||
|
||
return {
|
||
total: enabledSteps.length,
|
||
completed: completedSteps.length,
|
||
isComplete: enabledSteps.length > 0 && completedSteps.length === enabledSteps.length,
|
||
};
|
||
}
|