{"record":{"id":"3af350983ef05a0c","repo":"different-ai/openwork","slug":"this-install-link-returned-incomplete-setup-detail-3af350","errorCode":null,"errorMessage":"This install link returned incomplete setup details.","messagePattern":"This install link returned incomplete setup details\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"ee/apps/den-web/app/(den)/_components/join-org-success.tsx","lineNumber":168,"sourceCode":"    try {\n      const installPageUrl = await createOrganizationInstallLink(organizationId, false);\n      const token = installTokenFromPageUrl(installPageUrl);\n      if (!token) {\n        throw new Error(\"The install link response was incomplete.\");\n      }\n\n      const { response, payload } = await requestJson(\n        `/v1/install-config?token=${encodeURIComponent(token)}`,\n        { method: \"GET\" },\n        12000,\n      );\n      if (!response.ok) {\n        throw new Error(getInstallConfigErrorMessage(payload, response.status));\n      }\n\n      const apiUrl = installerApiUrlFromConfig(payload);\n      if (!apiUrl) {\n        throw new Error(\"This install link returned incomplete setup details.\");\n      }\n\n      const platform = detectedInstallPlatform(detected) ?? \"mac-arm64\";\n      const href = buildInstallDownloadHref(apiUrl, platform, token);\n      setDownloadHref(href);\n      startInstallerDownload(href);\n    } catch (error) {\n      setActionError(error instanceof Error ? error.message : \"Could not prepare your download.\");\n    } finally {\n      setInstallBusy(false);\n    }\n  }\n\n  async function handleReturnToOpenWork() {\n    setHandoffBusy(true);\n    setActionError(null);\n\n    try {","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/ee/apps/den-web/app/(den)/_components/join-org-success.tsx#L150-L186","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","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"],"exampleFix":"// before\nconst apiUrl = installerApiUrlFromConfig(payload);\nif (!apiUrl) {\n  throw new Error(\"This install link returned incomplete setup details.\");\n}\n// after\nconst apiUrl = installerApiUrlFromConfig(payload) ?? process.env.NEXT_PUBLIC_INSTALLER_API_URL;\nif (!apiUrl) {\n  throw new Error(\"This install link returned incomplete setup details.\");\n}","handlingStrategy":"validation","validationCode":"const res = await fetch(configUrl);\nconst payload = await res.json();\nif (res.ok && !installerApiUrlFromConfig(payload)) {\n  console.warn(\"Install config missing installer API URL; regenerate the install link.\");\n}","typeGuard":"function hasInstallerApiUrl(p: unknown): p is { installerApiUrl: string } {\n  return typeof p === \"object\" && p !== null && \"installerApiUrl\" in p && typeof (p as { installerApiUrl: unknown }).installerApiUrl === \"string\" && (p as { installerApiUrl: string }).installerApiUrl.length > 0;\n}","tryCatchPattern":"try {\n  const apiUrl = installerApiUrlFromConfig(payload);\n  if (!apiUrl) throw new Error(\"This install link returned incomplete setup details.\");\n} catch (err) {\n  showErrorWithRetry(\"Install setup details are incomplete. Regenerate your install link or contact your admin.\", err);\n}","preventionTips":["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"],"tags":["http","api-response","den-web","install-link"],"backgroundTag":"api-response-missing-field","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}