{"version":3,"sources":["jsdelivr-header.js","/npm/claude-api-slack@1.0.28/src/index.ts","/npm/claude-api-slack@1.0.28/src/types.ts"],"names":[],"mappings":"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","file":"/npm/claude-api-slack@1.0.28/build/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/claude-api-slack@1.0.28/build/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { WebClient } from '@slack/web-api'\nimport delay from 'delay'\nimport { v4 as uuidv4 } from 'uuid'\nimport pTimeout from 'p-timeout'\nimport * as types from './types'\n\nconst DAY_MS = 1000 * 60 * 60 * 24\nconst TYPING = '_Typing…_'\nconst WAIT_MS = 1000 * 15\n\nfunction dat() {\n  return new Date()\n    .getTime()\n}\n\nfunction str(json: Object) {\n  return JSON.stringify(json)\n}\n\n\n\nclass Authenticator {\n  private debug?: boolean\n\n  private bot?: string\n  private token?: string\n  private channelTs = new Map<string, string>()\n  private client?: WebClient\n\n  constructor(token: string, bot: string, debug: boolean = false) {\n    this.bot = bot\n    this.token = token\n    this.client = new WebClient( this.token )\n    this.debug = debug\n  }\n\n   async oauth2(clientId: string, clientSecret: string): Promise<string> {\n    const result = await this.client.oauth.v2.exchange({\n      client_id: clientId,\n      client_secret: clientSecret\n    })\n    // TODO -\n    console.log(result)\n    return 'ok'\n  }\n\n\n  async newChannel(name: string): Promise<string> {\n    const conversations = await this.client?.conversations.list({ limit: 2000 })\n    if (!conversations?.ok) {\n      const error = new types.ClaudeError(conversations?.error)\n      error.statusCode = 5001\n      error.statusText = 'method `conversations.list` error.'\n      throw error\n    }\n\n    const conversation = conversations?.channels?.find(it => it.name === name)\n    if (conversation) {\n      return conversation.id\n    }\n\n    const result = await this.client?.conversations.create({ name })\n\n    if (result.ok) {\n      this._joinChannel(result.channel.id, this.bot, name)\n      return result.channel.id\n    }\n\n    const error = new types.ClaudeError(result.error)\n    error.statusCode = 5002\n    error.statusText = 'method `conversations.create` error.'\n    throw error\n  }\n\n  private async _joinChannel(channel: string, users: string, name: string) {\n    const result = await this.client?.conversations.invite({ channel, users })\n    if (!result.ok) {\n      await this._deleteChannel(channel, name)\n      const error = new types.ClaudeError(result.error)\n      error.statusCode = 5003\n      error.statusText = 'method `conversations.invite` error.'\n      throw error\n    }\n  }\n\n  private async _deleteChannel(channel: string, name: string) {\n    const result = await this.client?.conversations.rename({\n      channel, name: name + dat()\n    })\n    if (result.ok) {\n      await this.client?.conversations.leave({ channel })\n    }\n  }\n\n\n  async sendMessage(opt: {\n    text: string,\n    channel: string\n    conversationId?: string\n    onMessage?: (partialResponse: types.ChatResponse) => void,\n    timeoutMs?: number,\n    retry?: number\n  }): Promise<types.ChatResponse> {\n    const {\n      text,\n      channel,\n      conversationId = uuidv4(),\n      onMessage,\n      timeoutMs,\n      retry = 3\n    } = opt\n\n    let ts = this.channelTs.get(conversationId)\n    if (this.debug) {\n      console.log('claude-api mthod `sendMessage` current thread_ts: ', ts)\n    }\n\n    let result = null, retryCount = 0, currTime = 0\n\n    const reply = async () => {\n      currTime = dat()\n      result = await this.client?.chat.postMessage({\n        text: `<@${this.bot}>\\n${text}`,\n        thread_ts: ts,\n        channel\n      })\n\n      if (!this.channelTs.has(conversationId)) {\n        this.channelTs.set(conversationId, result.ts)\n        ts = result.ts\n      }\n    }\n\n    await reply()\n\n    const responseP = new Promise<types.ChatResponse>(async (resolve, reject) => {\n      let resultMessage = '', limit = 1\n\n      const repliesTimeout = async (needRetry: boolean = false): Promise<boolean> => {\n        if (currTime + WAIT_MS < dat()) {\n          if (needRetry && (retry > retryCount)) {\n            retryCount ++\n            await reply()\n            return false\n          }\n          const errorMessage = `method \\`conversations.replies\\` ${WAIT_MS}'ms timeout error.`\n          const error = new types.ClaudeError(errorMessage)\n          error.statusCode = 5004\n          error.statusText = 'method `conversations.replies` timeout error'\n          reject(error)\n          return true\n        } else return false\n      }\n\n      while (1) {\n        const partialResponse = await this.client?.conversations.replies({ channel, ts, limit })\n        if (!partialResponse.ok) {\n          if (await repliesTimeout()) {\n            return\n          }\n          await delay(500)\n          continue\n        }\n\n        if (this.debug) {\n          console.log('claude-api mthod `sendMessage` partialResponse', partialResponse.messages)\n        }\n\n        const messages = partialResponse.messages.filter(it => result.message.bot_id !== it.bot_id)\n        const message = messages[messages.length - limit]\n\n        if (message) {\n          if (message.metadata?.event_type) {\n            if (await repliesTimeout()) return\n            limit = 2\n            await delay(500)\n            continue\n          }\n\n          if (message.text) resultMessage = message.text\n          if (onMessage && message.text !== TYPING) {\n            onMessage({\n              text: message.text?.replace(TYPING, ''),\n              conversationId,\n              channel\n            })\n          }\n          if (!message.text || !message.text.endsWith(TYPING)) {\n            break\n          }\n        } else if (await repliesTimeout(/* needRetry */true)) {\n          return\n        }\n        await delay(500)\n      }\n\n      resolve({\n        text: resultMessage,\n        conversationId,\n        channel\n      })\n    })\n\n\n    if (timeoutMs) {\n      return pTimeout(responseP, {\n        milliseconds: timeoutMs,\n        message: 'ClaudeAI timed out waiting for response: ' + timeoutMs + \"'ms.\"\n      })\n    } else {\n      return responseP\n    }\n\n  }\n}\n\nexport { Authenticator }","export class ClaudeError extends Error {\n  statusCode?: number\n  statusText?: string\n  originalError?: Error\n}\n\nexport type ChatResponse = {\n  text: string\n  channel: string\n  conversationId?: string\n}"]}