mastra-ai/mastra · error

App manifest update failed: ${errorDetails}

Error message

App manifest update failed: ${errorDetails}

What it means

updateApp pushes a new manifest to Slack via the app manifest API. On ok:false it builds errorDetails from data.error plus any field-level validation errors (pointer/message pairs) and throws.

Source

Thrown at channels/slack/src/client.ts:258

        'Content-Type': 'application/json',
        Authorization: `Bearer ${this.#token}`,
      },
      body: JSON.stringify({ app_id: appId, manifest }),
      signal: AbortSignal.timeout(SLACK_API_TIMEOUT_MS),
    });

    const data = (await response.json()) as {
      ok: boolean;
      error?: string;
      errors?: Array<{ message: string; pointer: string }>;
    };

    if (!data.ok) {
      let errorDetails = data.error ?? 'unknown_error';
      if (data.errors?.length) {
        errorDetails += ': ' + data.errors.map(e => `${e.pointer}: ${e.message}`).join(', ');
      }
      throw new Error(`App manifest update failed: ${errorDetails}`);
    }
  }

  /**
   * Set the app icon via undocumented apps.icon.set API.
   */
  async setAppIcon(appId: string, imageData: ArrayBuffer): Promise<void> {
    await this.rotateToken();

    const formData = new FormData();
    formData.append('app_id', appId);
    formData.append('image', new Blob([imageData], { type: 'image/png' }), 'icon.png');

    const response = await fetch(`${SLACK_API_BASE}/apps.icon.set`, {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${this.#token}`,
      },

View on GitHub (pinned to 75dd419e61)

Solutions

  1. Read errorDetails — fix the manifest fields identified by the pointer/message pairs in your channel configuration
  2. Refresh app configuration tokens from https://api.slack.com/apps and retry the update
  3. Align your stored channel config with a manifest that Slack accepts, then let drift check re-run

Example fix

// before
manifest.settings.event_subscriptions = { request_url: 'http://bad' }; // validation error
// after
manifest.settings.event_subscriptions = { request_url: 'https://myapp.example.com/api/slack/events' };
Defensive patterns

Strategy: validation

Validate before calling

function manifestUpdateSafe(m: SlackAppManifest): boolean {
  return !!(m.display_information?.name && m.settings &&
    (!m.oauth_config?.redirect_urls || m.oauth_config.redirect_urls.every(u => u.startsWith('https://'))));
}
if (!manifestUpdateSafe(manifest)) throw new Error('manifest will fail Slack validation');

Try / catch

try {
  await client.updateApp(appId, manifest);
} catch (e) {
  const msg = (e as Error).message;
  if (msg.startsWith('App manifest update failed:')) {
    // parse pointer/message details from msg, fix config, retry
  } else throw e;
}

Prevention

When it happens

Trigger: updateApp() (invoked from config drift checks like #checkConfigDrift) receives { ok: false } from Slack — manifest validation failure, invalid/insufficient app config token, or unknown error.

Common situations: Config drift reconciliation pushing a manifest Slack rejects (invalid field values); app config token lacking update permissions; editing channel config to values Slack disallows.

Related errors


AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30). Data as JSON: /api/errors/8113fc7474d2be2b. Report an issue: GitHub.