{"record":{"id":"cf0e53a19fc7d898","repo":"different-ai/openwork","slug":"invalid-worker-token-payload","errorCode":"invalid_worker_token_payload","errorMessage":"Worker token response was missing token values.","messagePattern":"Worker token response was missing token values\\.","errorType":"error_code","errorClass":"DenApiError","httpStatus":500,"severity":"error","filePath":"apps/app/src/app/lib/den.ts","lineNumber":3114,"sourceCode":"        body: { scopes: [\"mcp:read\", \"mcp:write\"] },\n      });\n      const minted = parseDenMcpToken(payload);\n      if (!minted) {\n        throw new DenApiError(500, \"invalid_mcp_token_payload\", \"MCP token response was missing required values.\");\n      }\n      return minted;\n    },\n\n    async getWorkerTokens(workerId: string, orgId: string): Promise<DenWorkerTokens> {\n      const payload = await requestJson<unknown>(baseUrls, `/v1/workers/${encodeURIComponent(workerId)}/tokens`, {\n        method: \"POST\",\n        token,\n        organizationId: orgId,\n        body: {},\n      });\n      const tokens = getWorkerTokens(payload);\n      if (!tokens) {\n        throw new DenApiError(500, \"invalid_worker_token_payload\", \"Worker token response was missing token values.\");\n      }\n      return tokens;\n    },\n\n    async getCloudInstance(orgId: string): Promise<DenCloudInstance> {\n      const payload = await requestJson<unknown>(baseUrls, \"/v1/cloud/instance\", {\n        method: \"GET\",\n        token,\n        organizationId: orgId,\n      });\n      const instance = parseCloudInstance(payload);\n      if (!instance) {\n        throw new DenApiError(500, \"invalid_cloud_instance_payload\", \"Cloud instance response was invalid.\");\n      }\n      return instance;\n    },\n\n    async retryCloudInstance(orgId: string): Promise<DenCloudInstance> {","sourceCodeStart":3096,"sourceCodeEnd":3132,"githubUrl":"https://github.com/different-ai/openwork/blob/2b7df46e8ae1517d64c896c7793d2d52ec845669/apps/app/src/app/lib/den.ts#L3096-L3132","documentation":"getWorkerTokens POSTs to /v1/workers/:workerId/tokens and validates the payload with getWorkerTokens. If the response lacks the required token values, a 500 DenApiError with code \"invalid_worker_token_payload\" is thrown, guaranteeing callers receive complete DenWorkerTokens.","triggerScenarios":"The worker token endpoint returns 2xx but the body omits token fields — unknown/expired workerId accepted oddly, server schema drift, or a non-Den server on the configured baseUrl.","commonSituations":"Worker was deregistered server-side while the client still holds its id, self-hosted Den running an older API shape, or proxy interference.","solutions":["Verify the workerId is still registered; re-provision the worker if not","Log the raw payload and compare with the expected DenWorkerTokens shape","Align server/client versions","Re-authenticate and retry once in case of transient server state"],"exampleFix":"// before\nconst tokens = await client.getWorkerTokens(workerId, orgId);\nstartWorker(tokens);\n// after\ntry { startWorker(await client.getWorkerTokens(workerId, orgId)); }\ncatch (err) {\n  if (err instanceof DenApiError && err.code === \"invalid_worker_token_payload\") await reprovisionWorker(workerId, orgId);\n  else throw err;\n}","handlingStrategy":"type-guard","validationCode":"if (!workerId) throw new Error(\"workerId is required\");\nif (!orgId) throw new Error(\"An organization id is required to fetch worker tokens\");","typeGuard":"const isDenWorkerTokens = (t: unknown): t is DenWorkerTokens =>\n  typeof t === \"object\" && t !== null && \"token\" in t && typeof (t as { token: unknown }).token === \"string\";","tryCatchPattern":"try {\n  tokens = await client.getWorkerTokens(workerId, orgId);\n} catch (err) {\n  if (err instanceof DenApiError && err.code === \"invalid_worker_token_payload\") {\n    await reprovisionWorker(workerId, orgId);\n    tokens = await client.getWorkerTokens(workerId, orgId);\n  } else throw err;\n}","preventionTips":["Verify the worker is still registered before requesting its tokens","Re-provision the worker when token responses look incomplete","Keep self-hosted Den servers on a version matching the client's worker-token schema","Log raw payloads on failure to catch schema drift early"],"tags":["schema-validation","workers","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"}