{"record":{"id":"6354b6cfadde6c23","repo":"different-ai/openwork","slug":"invalid-app-version-payload","errorCode":"invalid_app_version_payload","errorMessage":"App version response was missing version details.","messagePattern":"App version response was missing version details\\.","errorType":"error_code","errorClass":"DenApiError","httpStatus":500,"severity":"warning","filePath":"apps/app/src/app/lib/den.ts","lineNumber":2974,"sourceCode":"    async getSession(): Promise<DenUser> {\n      const payload = await requestJson<unknown>(baseUrls, \"/v1/me\", {\n        method: \"GET\",\n        token,\n      });\n      const user = getUser(payload);\n      if (!user) {\n        throw new DenApiError(500, \"invalid_session_payload\", \"Session response did not include a user.\");\n      }\n      return user;\n    },\n\n    async getAppVersionMetadata(): Promise<DenAppVersionMetadata> {\n      const payload = await requestJson<unknown>(baseUrls, \"/v1/app-version\", {\n        method: \"GET\",\n      });\n      const appVersionMetadata = getDenAppVersionMetadata(payload);\n      if (!appVersionMetadata) {\n        throw new DenApiError(500, \"invalid_app_version_payload\", \"App version response was missing version details.\");\n      }\n      return appVersionMetadata;\n    },\n\n    async getDesktopConfig(orgId?: string | null): Promise<DenDesktopConfig> {\n      const payload = await requestJson<unknown>(baseUrls, \"/v1/me/desktop-config\", {\n        method: \"GET\",\n        token,\n        organizationId: orgId,\n      });\n      return normalizeDenDesktopConfig(payload);\n    },\n\n    async getResourceSnapshot(orgId?: string | null): Promise<DenResourceSnapshot> {\n      const payload = await requestJson<unknown>(baseUrls, \"/v1/resources\", {\n        method: \"GET\",\n        token,\n        organizationId: orgId,","sourceCodeStart":2956,"sourceCodeEnd":2992,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/apps/app/src/app/lib/den.ts#L2956-L2992","documentation":"getAppVersionMetadata fetches /v1/app-version and runs getDenAppVersionMetadata to normalize the payload. If the response lacks version details, a 500 DenApiError with code \"invalid_app_version_payload\" is thrown. It exists so the app never treats a malformed version response as valid metadata.","triggerScenarios":"GET /v1/app-version returns 2xx but the body is missing version fields — wrong server, outdated server build, or a proxy substituting the response.","commonSituations":"Self-hosted Den deployments running an older version without the app-version endpoint payload, or load balancer health pages returning 200 with HTML.","solutions":["Confirm the Den server version supports /v1/app-version with the expected fields","Log the raw payload to diagnose the shape mismatch","Fix baseUrl misconfiguration pointing at the wrong host","Skip/downgrade version-check UX when metadata is unavailable"],"exampleFix":"// before\nconst meta = await client.getAppVersionMetadata();\nshowUpdateBanner(meta);\n// after\ntry {\n  const meta = await client.getAppVersionMetadata();\n  showUpdateBanner(meta);\n} catch (err) {\n  if (err instanceof DenApiError && err.code === \"invalid_app_version_payload\") return; // skip version check\n  throw err;\n}","handlingStrategy":"fallback","validationCode":"const res = await fetch(`${baseUrl}/v1/app-version`);\nif (!res.ok || !(res.headers.get(\"content-type\") ?? \"\").includes(\"application/json\")) skipVersionCheck();","typeGuard":"const hasVersionDetails = (v: unknown): v is DenAppVersionMetadata =>\n  typeof v === \"object\" && v !== null && \"version\" in v && typeof (v as { version: unknown }).version === \"string\";","tryCatchPattern":"let meta: DenAppVersionMetadata | null = null;\ntry { meta = await client.getAppVersionMetadata(); }\ncatch (err) {\n  if (err instanceof DenApiError && err.code === \"invalid_app_version_payload\") meta = null;\n  else throw err;\n}\nif (meta) showUpdateBanner(meta);","preventionTips":["Treat app-version metadata as optional; degrade gracefully when absent","Pin self-hosted Den servers to a version that returns the full app-version payload","Log the raw payload once to detect server/client schema drift early"],"tags":["schema-validation","versioning","den-cloud","api"],"backgroundTag":"schema-validation-failed","analyzedSha":"2b7df46e8ae1517d64c896c7793d2d52ec845669","analyzedAt":"2026-09-01T07:59:23.713Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}