different-ai/openwork · error
This install link returned incomplete setup details.
Error message
This install link returned incomplete setup details.
What it means
join-org-success.tsx throws this when a valid install-link config response comes back (HTTP ok) but `installerApiUrlFromConfig(payload)` cannot extract an installer API URL from it. The config payload is structurally complete enough to be accepted, yet lacks the field needed to build a download link. It guards the UI against rendering a broken installer download.
Source
Thrown at ee/apps/den-web/app/(den)/_components/join-org-success.tsx:168
try {
const installPageUrl = await createOrganizationInstallLink(organizationId, false);
const token = installTokenFromPageUrl(installPageUrl);
if (!token) {
throw new Error("The install link response was incomplete.");
}
const { response, payload } = await requestJson(
`/v1/install-config?token=${encodeURIComponent(token)}`,
{ method: "GET" },
12000,
);
if (!response.ok) {
throw new Error(getInstallConfigErrorMessage(payload, response.status));
}
const apiUrl = installerApiUrlFromConfig(payload);
if (!apiUrl) {
throw new Error("This install link returned incomplete setup details.");
}
const platform = detectedInstallPlatform(detected) ?? "mac-arm64";
const href = buildInstallDownloadHref(apiUrl, platform, token);
setDownloadHref(href);
startInstallerDownload(href);
} catch (error) {
setActionError(error instanceof Error ? error.message : "Could not prepare your download.");
} finally {
setInstallBusy(false);
}
}
async function handleReturnToOpenWork() {
setHandoffBusy(true);
setActionError(null);
try {View on GitHub (pinned to 2b7df46e8a)
Solutions
- Inspect the raw config response payload (network tab) and confirm the installer API URL field is present and non-empty
- Upgrade/fix the Den server so the install-config endpoint includes the installer API URL
- Invalidate any cached config response (CDN/service worker) and retry the install link
- Regenerate the install link so a fresh config is issued
Example fix
// before
const apiUrl = installerApiUrlFromConfig(payload);
if (!apiUrl) {
throw new Error("This install link returned incomplete setup details.");
}
// after
const apiUrl = installerApiUrlFromConfig(payload) ?? process.env.NEXT_PUBLIC_INSTALLER_API_URL;
if (!apiUrl) {
throw new Error("This install link returned incomplete setup details.");
} Defensive patterns
Strategy: validation
Validate before calling
const res = await fetch(configUrl);
const payload = await res.json();
if (res.ok && !installerApiUrlFromConfig(payload)) {
console.warn("Install config missing installer API URL; regenerate the install link.");
} Type guard
function hasInstallerApiUrl(p: unknown): p is { installerApiUrl: string } {
return typeof p === "object" && p !== null && "installerApiUrl" in p && typeof (p as { installerApiUrl: unknown }).installerApiUrl === "string" && (p as { installerApiUrl: string }).installerApiUrl.length > 0;
} Try / catch
try {
const apiUrl = installerApiUrlFromConfig(payload);
if (!apiUrl) throw new Error("This install link returned incomplete setup details.");
} catch (err) {
showErrorWithRetry("Install setup details are incomplete. Regenerate your install link or contact your admin.", err);
} Prevention
- Add a contract test asserting the install-config response includes the installer API URL
- Version the install-config endpoint so clients reject unknown shapes explicitly
- Cache-bust config responses so stale stripped payloads are not served
- Surface the raw payload in dev builds to speed up diagnosis
When it happens
Trigger: GET of the install-link config returns 2xx but the payload is missing or has an empty/invalid installer API URL field (e.g. server returns `{}` or a config without the API URL property).
Common situations: Server deployed with an older config schema that omits the installer API URL; a proxy/CDN caching a stripped-down response; org's install link created before the API-URL field existed; misconfigured Den server not advertising its installer endpoint.
Related errors
- Organization was created, but no slug was returned.
- No OpenWork link was returned.
- Failed to load organizations.
- Failed to create organization.
- Could not prepare an OpenWork link (${response.status}).
AI-assisted analysis of different-ai/openwork@2b7df46e8a (2026-09-01).
Data as JSON: /api/errors/3af350983ef05a0c.
Report an issue: GitHub.