Add OpenCode provider integration and strict model selection

This commit is contained in:
Konan69
2026-03-05 15:24:20 +01:00
parent c7c96feef7
commit 6a101e0da1
55 changed files with 2225 additions and 104 deletions

View File

@@ -55,14 +55,21 @@ export function NewAgentDialog() {
enabled: !!selectedCompanyId && newAgentOpen,
});
const { data: adapterModels } = useQuery({
queryKey: ["adapter-models", configValues.adapterType],
queryFn: () => agentsApi.adapterModels(configValues.adapterType),
enabled: newAgentOpen,
const {
data: adapterModels,
error: adapterModelsError,
} = useQuery({
queryKey:
selectedCompanyId
? queryKeys.agents.adapterModels(selectedCompanyId, configValues.adapterType)
: ["agents", "none", "adapter-models", configValues.adapterType],
queryFn: () => agentsApi.adapterModels(selectedCompanyId!, configValues.adapterType),
enabled: Boolean(selectedCompanyId) && newAgentOpen,
});
const isFirstAgent = !agents || agents.length === 0;
const effectiveRole = isFirstAgent ? "ceo" : role;
const [formError, setFormError] = useState<string | null>(null);
// Auto-fill for CEO
useEffect(() => {
@@ -82,6 +89,9 @@ export function NewAgentDialog() {
closeNewAgent();
navigate(agentUrl(result.agent));
},
onError: (error) => {
setFormError(error instanceof Error ? error.message : "Failed to create agent");
},
});
function reset() {
@@ -91,6 +101,7 @@ export function NewAgentDialog() {
setReportsTo("");
setConfigValues(defaultCreateValues);
setExpanded(true);
setFormError(null);
}
function buildAdapterConfig() {
@@ -100,6 +111,31 @@ export function NewAgentDialog() {
function handleSubmit() {
if (!selectedCompanyId || !name.trim()) return;
setFormError(null);
if (configValues.adapterType === "opencode_local") {
const selectedModel = configValues.model.trim();
if (!selectedModel) {
setFormError("OpenCode requires an explicit model in provider/model format.");
return;
}
if (adapterModelsError) {
setFormError(
adapterModelsError instanceof Error
? adapterModelsError.message
: "Failed to load OpenCode models.",
);
return;
}
const discovered = adapterModels ?? [];
if (!discovered.some((entry) => entry.id === selectedModel)) {
setFormError(
discovered.length === 0
? "No OpenCode models discovered. Run `opencode models` and authenticate providers."
: `Configured OpenCode model is unavailable: ${selectedModel}`,
);
return;
}
}
createAgent.mutate({
name: name.trim(),
role: effectiveRole,
@@ -281,6 +317,11 @@ export function NewAgentDialog() {
<span className="text-xs text-muted-foreground">
{isFirstAgent ? "This will be the CEO" : ""}
</span>
</div>
{formError && (
<div className="px-4 pb-2 text-xs text-destructive">{formError}</div>
)}
<div className="flex items-center justify-end px-4 pb-3">
<Button
size="sm"
disabled={!name.trim() || createAgent.isPending}