sipeed/picoclaw · warning

Enter and confirm the new login password.

Error message

Enter and confirm the new login password.

What it means

Validation error thrown in handleSave (web/frontend/src/components/config/config-page.tsx:302, message from i18n key pages.config.dashboard_password_required) when the dashboard password fields are dirty (launcherPasswordDirty) but the trimmed password is empty. It guards the subsequent POST /api/auth/setup call, which would otherwise send an empty password. Because dirty-flag based, it fires only after the user actually edited one of the two password inputs.

Source

Thrown at web/frontend/src/components/config/config-page.tsx:302

    } catch (err) {
      toast.error(
        err instanceof Error
          ? err.message
          : t("pages.config.factory_reset_error"),
      )
    } finally {
      setShowFactoryResetDialog(false)
    }
  }

  const handleSave = async () => {
    try {
      setSaving(true)
      const password = launcherForm.dashboardPassword.trim()
      const confirm = launcherForm.dashboardPasswordConfirm.trim()
      if (launcherPasswordDirty) {
        if (!password) {
          throw new Error(t("pages.config.dashboard_password_required"))
        }
        if (password !== confirm) {
          throw new Error(t("pages.config.dashboard_password_mismatch"))
        }
        if (Array.from(password).length < 8) {
          throw new Error(t("pages.config.dashboard_password_min_length"))
        }
      }

      if (configDirty) {
        const workspace = form.workspace.trim()
        const dmScope = form.dmScope.trim()

        if (!workspace) {
          throw new Error("Workspace path is required.")
        }
        if (!dmScope) {
          throw new Error("Session scope is required.")

View on GitHub (pinned to 49183d7e8d)

Solutions

  1. Enter a value of at least 8 characters into both the password and confirm fields
  2. If you do not intend to change the password, make both fields identical to the baseline (empty and untouched) so the dirty flag clears
  3. Re-open the page to reset dirty state, then save without touching password fields
Defensive patterns

Strategy: validation

Validate before calling

const password = launcherForm.dashboardPassword.trim()
const confirm = launcherForm.dashboardPasswordConfirm.trim()
if (launcherPasswordDirty && (!password || !confirm)) {
  setFieldError("Enter and confirm the new login password.")
  return // do not call save
}

Try / catch

try {
  await handleSave()
} catch (err) {
  // validation errors are expected user input feedback, not bugs
  if (err instanceof Error) setError(err.message)
}

Prevention

When it happens

Trigger: Typing into the confirm box only, typing then deleting the password, or entering only whitespace; save then proceeds to fail before any network call.

Common situations: User believes password is optional and only fills confirm; browser autofill marks the field dirty then clears it; user pastes whitespace by accident.

Related errors


AI-assisted analysis of sipeed/picoclaw@49183d7e8d (2026-08-15). Data as JSON: /api/errors/c00525441e451380. Report an issue: GitHub.