{"record":{"id":"7dd4eba8d3cc4081","repo":"different-ai/openwork","slug":"this-install-link-returned-incomplete-setup-detail","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/install-screen.tsx","lineNumber":171,"sourceCode":"  };\n}\n\nasync function fetchInstallConfig(token: string | null) {\n  const path = token ? `/v1/install-config?token=${encodeURIComponent(token)}` : \"/v1/me/install-config\";\n  const { response, payload } = await requestJson(\n    path,\n    { method: \"GET\" },\n    12000,\n  );\n  if (!response.ok) {\n    if (!token && response.status === 401) {\n      throw new Error(\"Sign in to your Den portal to install OpenWork.\");\n    }\n    throw new Error(getInstallConfigErrorMessage(payload, response.status));\n  }\n  const parsed = parseInstallConfig(payload);\n  if (!parsed) {\n    throw new Error(\"This install link returned incomplete setup details.\");\n  }\n  return parsed;\n}\n\nfunction installHref(config: InstallConfig, platform: InstallPlatform, token: string | null) {\n  return token\n    ? buildInstallDownloadHref(config.apiUrl, platform, token)\n    : buildAuthenticatedInstallDownloadHref(config.apiUrl, platform);\n}\n\ntype StepState = \"complete\" | \"active\" | \"pending\";\n\nconst STEP_BADGE: Record<StepState, string> = {\n  complete: \"bg-emerald-50 text-emerald-600\",\n  active: \"bg-[#101828] text-white\",\n  pending: \"bg-slate-100 text-slate-400\",\n};\n","sourceCodeStart":153,"sourceCodeEnd":189,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/ee/apps/den-web/app/(den)/_components/install-screen.tsx#L153-L189","documentation":"After a successful /v1/install-config response, fetchInstallConfig runs parseInstallConfig on the payload. If the payload does not validate into an InstallConfig (missing required fields), it throws \"This install link returned incomplete setup details.\" The server replied 2xx but with a body the client considers incomplete.","triggerScenarios":"Server returns 200 with a JSON payload missing required install-config fields (e.g. no API URL, platform assets, or config sections the parser requires).","commonSituations":"Den server and web client version skew (new/old schema fields); a proxy or error page returning 200 with HTML; server-side feature flag returning a partial config.","solutions":["Log/inspect the raw payload and compare against parseInstallConfig's required fields to see what is missing.","Update the Den server (or web client) so both sides agree on the install-config schema.","Retry later if the server was mid-deploy; if persistent, report the server returning invalid install-config."],"exampleFix":"// before: server omits apiUrl -> parse fails\n{ \"platforms\": { ... } }\n// after: server includes all required fields\n{ \"apiUrl\": \"https://den.example.com\", \"platforms\": { ... } }","handlingStrategy":"type-guard","validationCode":"function isInstallConfig(p) {\n  return typeof p === \"object\" && p !== null &&\n    typeof p.apiUrl === \"string\" && p.apiUrl.length > 0 &&\n    typeof p.platforms === \"object\" && p.platforms !== null;\n}","typeGuard":"function isInstallConfig(p) {\n  return typeof p === \"object\" && p !== null && \"apiUrl\" in p && typeof p.apiUrl === \"string\";\n}","tryCatchPattern":"try {\n  const config = await fetchInstallConfig(token);\n} catch (err) {\n  if (err.message === \"This install link returned incomplete setup details.\") {\n    // server/client schema mismatch: show a 'contact admin / retry' state\n  } else throw err;\n}","preventionTips":["Keep Den server and web client versions in lockstep (shared schema/types).","Zod-validate install-config on the server before responding 200.","Log raw payloads when parse fails to spot proxies returning HTML with 200."],"tags":["validation","schema","install","den"],"backgroundTag":"schema-validation-failed","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}