different-ai/openwork · error · Error

Failed to update profile

Error message

Failed to update profile (${response.status}).

What it means

den-flow-provider.tsx throws this when the profile-update request (POST with JSON body, 12s timeout) returns a non-ok status, embedding the status code as the fallback message. It indicates the server rejected or failed the profile change and returned no parseable error detail.

Solutions

  1. Check the interpolated status code and the request payload in the network tab
  2. Re-authenticate if the status is 401, then re-apply the profile change
  3. Validate the submitted fields client-side (length, format) to prevent 422s
  4. Retry after confirming the Den server is healthy for 5xx responses
Defensive patterns

Strategy: try-catch

Validate before calling

const input = { name: nameInput.trim(), avatarUrl: avatarUrlInput.trim() };
if (input.name.length === 0 || input.name.length > 64 || (input.avatarUrl && !URL.canParse(input.avatarUrl))) {
  setError("Check your profile fields before saving.");
  return;
}

Try / catch

try {
  await updateProfile(input);
} catch (err) {
  const m = err.message.match(/\((\d{3})\)/);
  if (m?.[1] === "401") { await reauth(); retryUpdateProfile(input); }
  else showError("Could not save your profile. Check your fields and try again.");
}

Prevention

When it happens

Trigger: `requestJson` profile update responds with response.ok === false — e.g. 401 expired session, 403 forbidden field change, 422 invalid input (bad name/avatar payload), or 500 server error.

Common situations: Session expired while the user was editing their profile (401); user submits an invalid avatar URL or over-long name (422); server-side update conflict (409); Den server outage (5xx).

Understand the failure class

Background: "API request failed": what wrapped HTTP errors from external APIs mean and how to find the real cause — this error's family across 29 libraries.

Related errors


AI-assisted analysis of different-ai/openwork@2b7df46e8a (2026-09-01). Data as JSON: /api/errors/49520142d51bc127. Report an issue: GitHub.

Appendix: source

Thrown at ee/apps/den-web/app/(den)/_providers/den-flow-provider.tsx:1420

      window.localStorage.removeItem(LAST_WORKER_STORAGE_KEY);
      window.sessionStorage.removeItem(PENDING_SOCIAL_SIGNUP_STORAGE_KEY);
      window.sessionStorage.removeItem(PENDING_ORG_INVITATION_STORAGE_KEY);
      window.sessionStorage.removeItem(PENDING_WORKSPACE_CLAIM_STORAGE_KEY);
    }
  }

  async function updateUserProfile(input: { firstName: string; lastName: string }) {
    const { response, payload } = await requestJson(
      "/v1/me/profile",
      {
        method: "PATCH",
        body: JSON.stringify(input),
      },
      12000,
    );

    if (!response.ok) {
      throw new Error(getErrorMessage(payload, `Failed to update profile (${response.status}).`));
    }

    const nextUser = getUser(payload);
    if (!nextUser) {
      throw new Error("Profile update response did not include a user.");
    }

    setUser(nextUser);
    identifyPosthogUser(nextUser);
    return nextUser;
  }

  async function launchWorker(options: { source?: "manual" | "signup_auto"; workerNameOverride?: string } = {}) {
    if (!user) {
      setAuthError("Sign in before launching a worker.");
      return "error" as const;
    }

View on GitHub (pinned to 2b7df46e8a)