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
- Confirm the endpoint provider is 'slack' before calling this method
- Set the Slack bot token in configuration/env so the runtime is constructed with slackReceiptBotToken
- Restart/rebuild the runtime after adding the token so it is picked up
- 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
- Set the Slack bot token (xoxb-) in env before starting endpoints
- Pair Slack receipt work only with slack-provider runtimes
- Alert on endpoints whose provider is slack but whose runtime lacks a bot token
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
- GitHub receipt runtime unavailable
- ${provider} inventory failed: ${message}
- Slack inventory failed: ${body.error ?? "unknown error"}
- file publication receipt capture was called for a non-Slack
- file publication receipt capture is unavailable
AI-assisted analysis of paperclipai/paperclip@01ad858492 (2026-09-10).
Data as JSON: /api/errors/c1a024e86e88d10b.
Report an issue: GitHub.