paperclipai/paperclip · error

Slack receipt runtime unavailable

Error message

Slack receipt runtime unavailable

What it means

applySlackReceiptReaction applies a Slack receipt reaction using the Slack bot token captured on the runtime. The wrapper throws 'Slack receipt runtime unavailable' when the runtime's provider is not 'slack' or no slackReceiptBotToken was provided at construction. It prevents Slack-specific mutations from running on runtimes lacking Slack credentials.

Source

Thrown at server/src/services/chat-sdk-runtime.ts:2789

  ) {
    if (this.provider !== "github" || !this.githubReceiptApp)
      throw new Error("GitHub receipt runtime unavailable");
    return applyGitHubReceiptReaction(
      this.adapter,
      this.githubReceiptApp.appId,
      this.githubReceiptApp.installationId,
      input,
      assertCurrent,
      fetchImpl,
    );
  }

  async applySlackReceiptReaction(
    input: SlackReceiptMutation,
    fetchImpl?: typeof globalThis.fetch,
  ): Promise<void> {
    if (this.provider !== "slack" || !this.slackReceiptBotToken)
      throw new Error("Slack receipt runtime unavailable");
    await applySlackReceiptReaction(
      { ...input, botToken: this.slackReceiptBotToken },
      fetchImpl,
    );
  }

  async sendTelegramCallbackNotice(
    receipt: TelegramCallbackReceipt,
    text: string,
    fetchImpl?: typeof globalThis.fetch,
  ): Promise<{ id: string; threadId: string }> {
    if (
      this.provider !== "telegram" ||
      !this.telegramEphemeralBotToken ||
      receipt.companyId !== this.companyId ||
      receipt.endpointId !== this.endpointId
    ) {
      throw Object.assign(

View on GitHub (pinned to 01ad858492)

Solutions

  1. Confirm the endpoint provider is 'slack' before calling this method
  2. Set the Slack bot token in configuration/env so the runtime is constructed with slackReceiptBotToken
  3. Restart/rebuild the runtime after adding the token so it is picked up
  4. Route the mutation to the Slack runtime instance instead of a non-Slack one

Example fix

// before
await runtime.applySlackReceiptReaction(input);
// after
if (runtime.provider === 'slack') {
  await runtime.applySlackReceiptReaction(input);
}
Defensive patterns

Strategy: validation

Validate before calling

if (runtime.provider !== 'slack' || !runtime.slackReceiptBotToken) throw new Error('Slack receipt requires slack runtime with bot token');

Type guard

const canApplySlackReceipt = (r: ChatSdkRuntime): boolean => r.provider === 'slack';

Try / catch

try { await runtime.applySlackReceiptReaction(input); } catch (e) { if ((e as Error).message === 'Slack receipt runtime unavailable') { /* skip receipt or reconfigure runtime */ } else throw e; }

Prevention

When it happens

Trigger: Calling applySlackReceiptReaction when this.provider !== 'slack', or when this.slackReceiptBotToken is null/undefined because no Slack bot token (e.g. SLACK_BOT_TOKEN / xoxb- token) was supplied to the runtime.

Common situations: Slack app not installed or bot token omitted from env; receipt worker accidentally paired with a Teams/Telegram endpoint; token rotated/removed and the runtime rebuilt without it.

Related errors


AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10). Data as JSON: /api/errors/c1a024e86e88d10b. Report an issue: GitHub.