@robinpath/slack
Advanced tools
| import type { ModuleAdapter } from "@robinpath/core"; | ||
| declare const SlackModule: ModuleAdapter; | ||
| export default SlackModule; | ||
| export { SlackModule }; | ||
| export { SlackFunctions, SlackFunctionMetadata, SlackModuleMetadata, SlackCredentialTypes, } from "./slack.js"; | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AASrD,QAAA,MAAM,WAAW,EAAE,aAQlB,CAAC;AAEF,eAAe,WAAW,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC"} |
| import { SlackFunctions, SlackFunctionMetadata, SlackModuleMetadata, SlackCredentialTypes, configureSlack, } from "./slack.js"; | ||
| const SlackModule = { | ||
| name: "slack", | ||
| functions: SlackFunctions, | ||
| functionMetadata: SlackFunctionMetadata, | ||
| moduleMetadata: SlackModuleMetadata, | ||
| credentialTypes: SlackCredentialTypes, | ||
| configure: configureSlack, | ||
| global: false, | ||
| }; | ||
| export default SlackModule; | ||
| export { SlackModule }; | ||
| export { SlackFunctions, SlackFunctionMetadata, SlackModuleMetadata, SlackCredentialTypes, } from "./slack.js"; | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,GAAkB;IACjC,IAAI,EAAE,OAAO;IACb,SAAS,EAAE,cAAc;IACzB,gBAAgB,EAAE,qBAAqB;IACvC,cAAc,EAAE,mBAAmB;IACnC,eAAe,EAAE,oBAAoB;IACrC,SAAS,EAAE,cAAc;IACzB,MAAM,EAAE,KAAK;CACd,CAAC;AAEF,eAAe,WAAW,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC"} |
| /** | ||
| * RobinPath Slack Module (Node port) | ||
| * | ||
| * Slack integration via the Web API and Incoming Webhooks. Mirror of | ||
| * packages/php/slack/src/index.php for the WordPress plugin; shares the | ||
| * same credential contract, metadata shape, and error taxonomy so the | ||
| * visual editor can render both identically. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every Web-API | ||
| * handler takes a credential slug as its first argument; the module | ||
| * resolves the stored bot token (`xoxb-…`) at call time via the injected | ||
| * ModuleHost. `sendWebhook` takes a literal webhook URL instead — the URL | ||
| * is the secret, so store it in a `slack_webhook` credential and resolve | ||
| * via `credential.field` if you want it scrubbed from logs. | ||
| * | ||
| * Credential types declared by this module: | ||
| * - slack_bot_token : { token, workspace? } → Bearer auth on api.slack.com | ||
| * - slack_webhook : { url } → Posted to as-is | ||
| */ | ||
| import type { BuiltinHandler, CredentialTypeSchema, FunctionMetadata, ModuleHost, ModuleMetadata } from "@robinpath/core"; | ||
| export declare function configureSlack(h: ModuleHost): void; | ||
| export declare const SlackFunctions: Record<string, BuiltinHandler>; | ||
| export declare const SlackCredentialTypes: CredentialTypeSchema[]; | ||
| export declare const SlackFunctionMetadata: Record<string, FunctionMetadata>; | ||
| export declare const SlackModuleMetadata: ModuleMetadata; | ||
| //# sourceMappingURL=slack.d.ts.map |
| {"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,cAAc,EAEf,MAAM,iBAAiB,CAAC;AAgBzB,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,CAElD;AA+cD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAazD,CAAC;AAIF,eAAO,MAAM,oBAAoB,EAAE,oBAAoB,EA4CtD,CAAC;AA6GF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CA2elE,CAAC;AAIF,eAAO,MAAM,mBAAmB,EAAE,cA4CjC,CAAC"} |
+1007
| /** | ||
| * RobinPath Slack Module (Node port) | ||
| * | ||
| * Slack integration via the Web API and Incoming Webhooks. Mirror of | ||
| * packages/php/slack/src/index.php for the WordPress plugin; shares the | ||
| * same credential contract, metadata shape, and error taxonomy so the | ||
| * visual editor can render both identically. | ||
| * | ||
| * Authentication uses the RobinPath credential vault. Every Web-API | ||
| * handler takes a credential slug as its first argument; the module | ||
| * resolves the stored bot token (`xoxb-…`) at call time via the injected | ||
| * ModuleHost. `sendWebhook` takes a literal webhook URL instead — the URL | ||
| * is the secret, so store it in a `slack_webhook` credential and resolve | ||
| * via `credential.field` if you want it scrubbed from logs. | ||
| * | ||
| * Credential types declared by this module: | ||
| * - slack_bot_token : { token, workspace? } → Bearer auth on api.slack.com | ||
| * - slack_webhook : { url } → Posted to as-is | ||
| */ | ||
| import { readFileSync } from "node:fs"; | ||
| // ── Module-local state (populated by configure hook) ──────────────────── | ||
| const state = {}; | ||
| function host() { | ||
| if (!state.host) { | ||
| throw new Error("Slack module not initialized. Pass the adapter to rp.registerModule() via loadModule so its configure() hook runs first."); | ||
| } | ||
| return state.host; | ||
| } | ||
| export function configureSlack(h) { | ||
| state.host = h; | ||
| } | ||
| // ── Constants ────────────────────────────────────────────────────────── | ||
| const API_BASE = "https://slack.com/api/"; | ||
| const CREDENTIAL_TYPE = "slack_bot_token"; | ||
| const WEBHOOK_CREDENTIAL_TYPE = "slack_webhook"; | ||
| function errorReturn(error, code, extra = {}) { | ||
| return { error, code, ...extra }; | ||
| } | ||
| // ── Credential resolver ──────────────────────────────────────────────── | ||
| async function resolveToken(credentialSlug) { | ||
| if (!credentialSlug) { | ||
| return errorReturn("Credential slug is required.", "credential_not_found"); | ||
| } | ||
| let fields; | ||
| try { | ||
| fields = await host().credentials.get(credentialSlug); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "credential_not_found"); | ||
| } | ||
| if (!fields) { | ||
| return errorReturn(`Credential '${credentialSlug}' not found.`, "credential_not_found"); | ||
| } | ||
| const token = String(fields.token ?? ""); | ||
| if (!token) { | ||
| return errorReturn(`Credential '${credentialSlug}' has no \`token\` field.`, "token_missing"); | ||
| } | ||
| return { token }; | ||
| } | ||
| // ── HTTP helpers ─────────────────────────────────────────────────────── | ||
| /** | ||
| * POST to the Slack Web API and normalize the response. | ||
| * | ||
| * Slack quirk: non-2xx responses are rare — most errors come back as | ||
| * HTTP 200 with `{ok: false, error: '…'}`. We check both. | ||
| */ | ||
| async function callSlackApi(credentialSlug, method, body, contentType = "json") { | ||
| const resolved = await resolveToken(credentialSlug); | ||
| if ("error" in resolved) | ||
| return resolved; | ||
| const init = { | ||
| method: "POST", | ||
| headers: { | ||
| Authorization: `Bearer ${resolved.token}`, | ||
| "Content-Type": contentType === "json" | ||
| ? "application/json; charset=utf-8" | ||
| : "application/x-www-form-urlencoded", | ||
| }, | ||
| }; | ||
| if (contentType === "json") { | ||
| init.body = JSON.stringify(body); | ||
| } | ||
| else { | ||
| const params = new URLSearchParams(); | ||
| for (const [k, v] of Object.entries(body)) { | ||
| if (v === undefined || v === null) | ||
| continue; | ||
| params.set(k, typeof v === "string" ? v : String(v)); | ||
| } | ||
| init.body = params.toString(); | ||
| } | ||
| let response; | ||
| try { | ||
| response = await fetch(`${API_BASE}${method}`, init); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const raw = await response.text(); | ||
| let decoded; | ||
| try { | ||
| decoded = raw ? JSON.parse(raw) : null; | ||
| } | ||
| catch { | ||
| decoded = null; | ||
| } | ||
| if (!decoded || typeof decoded !== "object") { | ||
| return errorReturn(`Slack returned non-JSON for ${method}: ${raw.slice(0, 200)}`, "transport", { status: response.status }); | ||
| } | ||
| const body_ = decoded; | ||
| if (!body_.ok) { | ||
| const slackErr = String(body_.error ?? "unknown_error"); | ||
| return { | ||
| ...body_, | ||
| error: `Slack ${method} failed: ${slackErr}`, | ||
| code: "slack_error", | ||
| slack_error: slackErr, | ||
| status: response.status, | ||
| }; | ||
| } | ||
| return body_; | ||
| } | ||
| // ── Build chat.postMessage body from channel/text/options ────────────── | ||
| function buildMessageBody(channel, text, opts) { | ||
| const body = { | ||
| channel, | ||
| text, | ||
| }; | ||
| // Map our camelCase option names to Slack's snake_case fields. | ||
| const map = { | ||
| blocks: "blocks", | ||
| attachments: "attachments", | ||
| unfurlLinks: "unfurl_links", | ||
| unfurlMedia: "unfurl_media", | ||
| iconEmoji: "icon_emoji", | ||
| iconUrl: "icon_url", | ||
| username: "username", | ||
| threadTs: "thread_ts", | ||
| replyBroadcast: "reply_broadcast", | ||
| parse: "parse", | ||
| linkNames: "link_names", | ||
| mrkdwn: "mrkdwn", | ||
| }; | ||
| for (const [opt, api] of Object.entries(map)) { | ||
| if (opts[opt] !== undefined) | ||
| body[api] = opts[opt]; | ||
| } | ||
| return body; | ||
| } | ||
| // ── Handlers ─────────────────────────────────────────────────────────── | ||
| const send = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const channel = String(args[1] ?? ""); | ||
| const text = String(args[2] ?? ""); | ||
| const opts = (args[3] && typeof args[3] === "object" ? args[3] : {}); | ||
| if (!channel) { | ||
| return errorReturn("Channel is required.", "channel_missing"); | ||
| } | ||
| const body = buildMessageBody(channel, text, opts); | ||
| return (await callSlackApi(cred, "chat.postMessage", body)); | ||
| }; | ||
| const sendWebhook = async (args) => { | ||
| const url = String(args[0] ?? ""); | ||
| const text = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| if (!url) { | ||
| return errorReturn("Webhook URL is required.", "webhook_url_missing"); | ||
| } | ||
| const body = { text }; | ||
| const map = { | ||
| username: "username", | ||
| iconEmoji: "icon_emoji", | ||
| iconUrl: "icon_url", | ||
| blocks: "blocks", | ||
| attachments: "attachments", | ||
| }; | ||
| for (const [opt, api] of Object.entries(map)) { | ||
| if (opts[opt] !== undefined) | ||
| body[api] = opts[opt]; | ||
| } | ||
| let response; | ||
| try { | ||
| response = await fetch(url, { | ||
| method: "POST", | ||
| headers: { "Content-Type": "application/json" }, | ||
| body: JSON.stringify(body), | ||
| }); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(e instanceof Error ? e.message : String(e), "transport"); | ||
| } | ||
| const rawBody = await response.text(); | ||
| return { | ||
| ok: response.status >= 200 && response.status < 300, | ||
| status: response.status, | ||
| body: rawBody, | ||
| }; | ||
| }; | ||
| const reply = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const channel = String(args[1] ?? ""); | ||
| const ts = String(args[2] ?? ""); | ||
| const text = String(args[3] ?? ""); | ||
| const opts = (args[4] && typeof args[4] === "object" ? args[4] : {}); | ||
| if (!ts) { | ||
| return errorReturn("Parent message ts is required.", "ts_missing"); | ||
| } | ||
| const merged = { ...opts, threadTs: ts }; | ||
| const body = buildMessageBody(channel, text, merged); | ||
| return (await callSlackApi(cred, "chat.postMessage", body)); | ||
| }; | ||
| const updateMessage = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const channel = String(args[1] ?? ""); | ||
| const ts = String(args[2] ?? ""); | ||
| const text = String(args[3] ?? ""); | ||
| const opts = (args[4] && typeof args[4] === "object" ? args[4] : {}); | ||
| const body = buildMessageBody(channel, text, opts); | ||
| body.ts = ts; | ||
| return (await callSlackApi(cred, "chat.update", body)); | ||
| }; | ||
| const deleteMessage = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const channel = String(args[1] ?? ""); | ||
| const ts = String(args[2] ?? ""); | ||
| return (await callSlackApi(cred, "chat.delete", { | ||
| channel, | ||
| ts, | ||
| })); | ||
| }; | ||
| const react = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const channel = String(args[1] ?? ""); | ||
| const ts = String(args[2] ?? ""); | ||
| let emoji = String(args[3] ?? ""); | ||
| // Accept :thumbsup: or thumbsup. | ||
| emoji = emoji.replace(/^:|:$/g, ""); | ||
| return (await callSlackApi(cred, "reactions.add", { | ||
| channel, | ||
| timestamp: ts, | ||
| name: emoji, | ||
| })); | ||
| }; | ||
| const upload = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const channels = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| // Resolve content source — one of content, base64, or path. | ||
| let content = null; | ||
| if (typeof opts.content === "string") { | ||
| content = opts.content; | ||
| } | ||
| else if (typeof opts.base64 === "string") { | ||
| try { | ||
| content = Buffer.from(opts.base64, "base64"); | ||
| } | ||
| catch { | ||
| return errorReturn("Invalid base64 in `base64` option.", "no_source"); | ||
| } | ||
| } | ||
| else if (typeof opts.path === "string") { | ||
| try { | ||
| content = readFileSync(opts.path); | ||
| } | ||
| catch (e) { | ||
| return errorReturn(`Cannot read file at ${opts.path}: ${e instanceof Error ? e.message : String(e)}`, "read_error"); | ||
| } | ||
| } | ||
| if (content === null) { | ||
| return errorReturn("One of `content`, `base64`, or `path` is required.", "no_source"); | ||
| } | ||
| const body = { | ||
| channels, | ||
| content: Buffer.isBuffer(content) ? content.toString("binary") : content, | ||
| }; | ||
| const map = { | ||
| filename: "filename", | ||
| filetype: "filetype", | ||
| title: "title", | ||
| initialComment: "initial_comment", | ||
| threadTs: "thread_ts", | ||
| }; | ||
| for (const [opt, api] of Object.entries(map)) { | ||
| if (opts[opt] !== undefined) | ||
| body[api] = String(opts[opt]); | ||
| } | ||
| // files.upload uses application/x-www-form-urlencoded. | ||
| return (await callSlackApi(cred, "files.upload", body, "form")); | ||
| }; | ||
| const listChannels = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const opts = (args[1] && typeof args[1] === "object" ? args[1] : {}); | ||
| const body = { | ||
| types: opts.types !== undefined | ||
| ? String(opts.types) | ||
| : "public_channel,private_channel", | ||
| exclude_archived: opts.excludeArchived !== undefined ? Boolean(opts.excludeArchived) : true, | ||
| limit: opts.limit !== undefined | ||
| ? Math.max(1, Math.min(1000, Number(opts.limit) | 0)) | ||
| : 200, | ||
| }; | ||
| const result = await callSlackApi(cred, "conversations.list", body); | ||
| if ("error" in result) | ||
| return result; | ||
| const channels = Array.isArray(result.channels) ? result.channels : []; | ||
| return channels.map((ch) => { | ||
| const c = (ch && typeof ch === "object" ? ch : {}); | ||
| return { | ||
| id: String(c.id ?? ""), | ||
| name: String(c.name ?? ""), | ||
| is_private: Boolean(c.is_private ?? false), | ||
| is_archived: Boolean(c.is_archived ?? false), | ||
| num_members: Number(c.num_members ?? 0) | 0, | ||
| }; | ||
| }); | ||
| }; | ||
| const getHistory = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const channel = String(args[1] ?? ""); | ||
| const opts = (args[2] && typeof args[2] === "object" ? args[2] : {}); | ||
| const body = { channel }; | ||
| if (opts.limit !== undefined) { | ||
| body.limit = Math.max(1, Math.min(1000, Number(opts.limit) | 0)); | ||
| } | ||
| if (opts.oldest !== undefined) | ||
| body.oldest = String(opts.oldest); | ||
| if (opts.latest !== undefined) | ||
| body.latest = String(opts.latest); | ||
| if (opts.inclusive !== undefined) | ||
| body.inclusive = Boolean(opts.inclusive); | ||
| const result = await callSlackApi(cred, "conversations.history", body); | ||
| if ("error" in result) | ||
| return result; | ||
| return (Array.isArray(result.messages) ? result.messages : []); | ||
| }; | ||
| const createChannel = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const name = String(args[1] ?? ""); | ||
| const isPrivate = Boolean(args[2] ?? false); | ||
| return (await callSlackApi(cred, "conversations.create", { | ||
| name, | ||
| is_private: isPrivate, | ||
| })); | ||
| }; | ||
| const userInfo = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const userId = String(args[1] ?? ""); | ||
| const result = await callSlackApi(cred, "users.info", { user: userId }); | ||
| if ("error" in result) | ||
| return result; | ||
| return (result.user && typeof result.user === "object" | ||
| ? result.user | ||
| : result); | ||
| }; | ||
| const setStatus = async (args) => { | ||
| const cred = String(args[0] ?? ""); | ||
| const text = String(args[1] ?? ""); | ||
| const emoji = args[2] !== undefined ? String(args[2]) : ""; | ||
| const expiration = args[3] !== undefined ? Number(args[3]) | 0 : 0; | ||
| return (await callSlackApi(cred, "users.profile.set", { | ||
| profile: JSON.stringify({ | ||
| status_text: text, | ||
| status_emoji: emoji, | ||
| status_expiration: expiration, | ||
| }), | ||
| })); | ||
| }; | ||
| // ── Exports: functions map ───────────────────────────────────────────── | ||
| export const SlackFunctions = { | ||
| send, | ||
| sendWebhook, | ||
| reply, | ||
| updateMessage, | ||
| deleteMessage, | ||
| react, | ||
| upload, | ||
| listChannels, | ||
| getHistory, | ||
| createChannel, | ||
| userInfo, | ||
| setStatus, | ||
| }; | ||
| // ── Exports: credential types ────────────────────────────────────────── | ||
| export const SlackCredentialTypes = [ | ||
| { | ||
| slug: CREDENTIAL_TYPE, | ||
| title: "Slack Bot Token", | ||
| icon: "slack", | ||
| fields: [ | ||
| { | ||
| name: "token", | ||
| title: "Bot User OAuth Token", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "xoxb-...", | ||
| description: 'Find under "OAuth & Permissions" in your Slack app settings. Starts with xoxb-.', | ||
| pattern: "^xox[abp]-", | ||
| }, | ||
| { | ||
| name: "workspace", | ||
| title: "Workspace", | ||
| type: "text", | ||
| required: false, | ||
| placeholder: "acme", | ||
| description: "Optional label — purely informational, used in audit logs.", | ||
| }, | ||
| ], | ||
| }, | ||
| { | ||
| slug: WEBHOOK_CREDENTIAL_TYPE, | ||
| title: "Slack Incoming Webhook", | ||
| icon: "slack", | ||
| fields: [ | ||
| { | ||
| name: "url", | ||
| title: "Webhook URL", | ||
| type: "password", | ||
| required: true, | ||
| placeholder: "https://hooks.slack.com/services/T.../B.../...", | ||
| description: 'Created under "Incoming Webhooks" in your Slack app settings. The URL itself is the secret.', | ||
| pattern: "^https://hooks\\.slack\\.com/services/.+", | ||
| }, | ||
| ], | ||
| }, | ||
| ]; | ||
| // ── Shared parameter descriptors ─────────────────────────────────────── | ||
| const credentialParam = { | ||
| name: "credential", | ||
| title: "Credential", | ||
| description: "Slug of a saved `slack_bot_token` credential. The bot token is decrypted at call time and never appears in logs.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "my_slack_bot", | ||
| resource: { | ||
| type: "credential", | ||
| listFn: "credential.list", | ||
| modes: ["list", "expression"], | ||
| searchable: true, | ||
| filter: { type: CREDENTIAL_TYPE }, | ||
| }, | ||
| }; | ||
| const channelParam = { | ||
| name: "channel", | ||
| title: "Channel", | ||
| description: "Channel ID (`C0123…`), DM ID (`D0123…`), or `#general`-style name. The bot must be a member.", | ||
| dataType: "string", | ||
| formInputType: "resource", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "#general", | ||
| resource: { | ||
| type: "slack_channel", | ||
| listFn: "slack.listChannels", | ||
| modes: ["list", "byId", "expression"], | ||
| searchable: true, | ||
| }, | ||
| }; | ||
| const textParam = { | ||
| name: "text", | ||
| title: "Text", | ||
| description: "Message text. Supports Slack mrkdwn (asterisks for bold, backticks for code, `<@U…>` for mentions).", | ||
| dataType: "string", | ||
| formInputType: "textarea", | ||
| required: true, | ||
| allowExpression: true, | ||
| rows: 4, | ||
| placeholder: "Hello :wave:", | ||
| }; | ||
| const messageOptionsParam = { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Extra message fields. Recognized keys:\n blocks : Block Kit array (overrides plain text rendering)\n attachments : Legacy attachments array\n unfurlLinks : bool — unfurl links into previews\n unfurlMedia : bool — unfurl image/video links\n iconEmoji : :emoji: to use as the message icon\n iconUrl : URL to use as the message icon\n username : Override the bot display name\n threadTs : ts of the parent message (turns this into a thread reply)\n replyBroadcast : bool — also post the thread reply to the channel\n parse : 'none' | 'full'\n linkNames : bool — auto-link channel/user names", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| advanced: true, | ||
| }; | ||
| const tsParam = { | ||
| name: "ts", | ||
| title: "Message timestamp", | ||
| description: "The `ts` of the target message (returned by slack.send). Slack uses these as message IDs.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "1700000000.000100", | ||
| }; | ||
| const slackResponseSchema = { | ||
| type: "object", | ||
| properties: { | ||
| ok: { type: "bool", description: "Slack-side success flag" }, | ||
| channel: { type: "string" }, | ||
| ts: { type: "string" }, | ||
| message: { type: "object" }, | ||
| error: { | ||
| type: "string", | ||
| description: "Module error (transport, missing credential)", | ||
| }, | ||
| slack_error: { | ||
| type: "string", | ||
| description: "Slack-side error code (e.g. channel_not_found)", | ||
| }, | ||
| }, | ||
| }; | ||
| const commonErrors = { | ||
| credential_not_found: "No credential with that slug exists in the vault.", | ||
| token_missing: "The credential exists but does not have a `token` field.", | ||
| transport: "Network failure calling slack.com — see error message.", | ||
| slack_error: "Slack returned ok:false — see slack_error code (e.g. channel_not_found, not_in_channel).", | ||
| }; | ||
| // ── Exports: function metadata ───────────────────────────────────────── | ||
| export const SlackFunctionMetadata = { | ||
| // ── Messages ────────────────────────────────────────────────────── | ||
| send: { | ||
| title: "Send message", | ||
| summary: "Post a message to a channel or DM", | ||
| description: "Calls `chat.postMessage`. The credential's bot must be in the target channel for non-public channels.", | ||
| group: "message", | ||
| action: "write", | ||
| icon: "send", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["slack", "send", "message", "notify"], | ||
| parameters: [credentialParam, channelParam, textParam, messageOptionsParam], | ||
| returnType: "object", | ||
| returnDescription: "Slack chat.postMessage response: { ok, channel, ts, message }.", | ||
| returnSchema: slackResponseSchema, | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Notify #ops on form submission", | ||
| code: 'slack.send "my_slack_bot" "#ops" "New form submission from {{ form.email }}"', | ||
| }, | ||
| { | ||
| title: "With Block Kit", | ||
| code: 'slack.send "my_slack_bot" "#general" "Build done" {\n blocks: [\n {type: "section", text: {type: "mrkdwn", text: "*Build #42* succeeded"}}\n ]\n}', | ||
| }, | ||
| ], | ||
| example: 'slack.send "my_slack_bot" "#general" "Hello :wave:"', | ||
| }, | ||
| sendWebhook: { | ||
| title: "Send via Incoming Webhook", | ||
| summary: "Post a message using an Incoming Webhook URL (no bot token needed)", | ||
| description: "Posts to the supplied webhook URL. Faster to set up than a bot token — but the URL is the secret, store it in a `slack_webhook` credential and resolve via `credential.field` if you don't want it in your script source.", | ||
| group: "webhook", | ||
| action: "write", | ||
| icon: "webhook", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["slack", "webhook", "incoming"], | ||
| parameters: [ | ||
| { | ||
| name: "webhookUrl", | ||
| title: "Webhook URL", | ||
| description: "Full Incoming Webhook URL (https://hooks.slack.com/services/…).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "https://hooks.slack.com/services/T…/B…/…", | ||
| validation: { pattern: "^https://hooks\\.slack\\.com/services/.+" }, | ||
| }, | ||
| textParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Extra fields. Recognized:\n username : override display name\n iconEmoji : :emoji: icon\n iconUrl : URL icon\n blocks : Block Kit array\n attachments : legacy attachments", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 5, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "{ ok: bool, status: int, body: string }", | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Quick alert", | ||
| code: 'slack.sendWebhook "https://hooks.slack.com/services/T.../B.../..." "Deploy complete"', | ||
| }, | ||
| ], | ||
| example: 'slack.sendWebhook "https://hooks.slack.com/services/..." "Hello"', | ||
| }, | ||
| reply: { | ||
| title: "Reply in thread", | ||
| summary: "Post a threaded reply to an existing message", | ||
| description: "Convenience wrapper around `send` that sets `thread_ts`. Use the `replyBroadcast` option to also post to the channel.", | ||
| group: "message", | ||
| action: "write", | ||
| icon: "reply", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["slack", "reply", "thread"], | ||
| parameters: [ | ||
| credentialParam, | ||
| channelParam, | ||
| { | ||
| ...tsParam, | ||
| title: "Parent message ts", | ||
| description: "`ts` of the message you are replying to (the head of the thread).", | ||
| }, | ||
| textParam, | ||
| { | ||
| ...messageOptionsParam, | ||
| description: "Same as `slack.send`. `threadTs` is set automatically — overriding it here is supported but unusual.", | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnSchema: slackResponseSchema, | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Thread reply", | ||
| code: 'slack.reply "my_slack_bot" "#ops" "1700000000.000100" "Acknowledged."', | ||
| }, | ||
| ], | ||
| example: 'slack.reply "my_slack_bot" "#ops" "1700.0001" "ack"', | ||
| }, | ||
| updateMessage: { | ||
| title: "Update message", | ||
| summary: "Edit the text or blocks of an existing message", | ||
| description: "Calls `chat.update`. Only messages posted by the same bot can be edited.", | ||
| group: "message", | ||
| action: "write", | ||
| icon: "edit-3", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["slack", "edit", "update"], | ||
| parameters: [ | ||
| credentialParam, | ||
| channelParam, | ||
| tsParam, | ||
| textParam, | ||
| messageOptionsParam, | ||
| ], | ||
| returnType: "object", | ||
| returnSchema: slackResponseSchema, | ||
| errors: commonErrors, | ||
| examples: [ | ||
| { | ||
| title: "Edit a status message", | ||
| code: 'slack.updateMessage "my_slack_bot" "#general" "1700.0001" "Build now PASSING ✓"', | ||
| }, | ||
| ], | ||
| example: 'slack.updateMessage "my_slack_bot" "#general" "1700.0001" "Updated"', | ||
| }, | ||
| deleteMessage: { | ||
| title: "Delete message", | ||
| summary: "Delete a message your bot posted", | ||
| description: "Calls `chat.delete`. Bots can only delete their own messages unless granted special scopes.", | ||
| group: "message", | ||
| action: "delete", | ||
| icon: "trash-2", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["slack", "delete"], | ||
| parameters: [credentialParam, channelParam, tsParam], | ||
| returnType: "object", | ||
| returnSchema: slackResponseSchema, | ||
| errors: commonErrors, | ||
| example: 'slack.deleteMessage "my_slack_bot" "#general" "1700.0001"', | ||
| }, | ||
| react: { | ||
| title: "Add reaction", | ||
| summary: "Add an emoji reaction to a message", | ||
| description: "Calls `reactions.add`. Use the bare emoji name without colons (e.g. `thumbsup`, not `:thumbsup:`).", | ||
| group: "message", | ||
| action: "write", | ||
| icon: "smile", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["slack", "reaction", "emoji"], | ||
| parameters: [ | ||
| credentialParam, | ||
| channelParam, | ||
| tsParam, | ||
| { | ||
| name: "emoji", | ||
| title: "Emoji name", | ||
| description: "Emoji shortcode without colons. E.g. `thumbsup`, `tada`, `eyes`.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "thumbsup", | ||
| validation: { pattern: "^[a-z0-9_+-]+$" }, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnSchema: slackResponseSchema, | ||
| errors: commonErrors, | ||
| example: 'slack.react "my_slack_bot" "#ops" "1700.0001" "white_check_mark"', | ||
| }, | ||
| // ── Files ───────────────────────────────────────────────────────── | ||
| upload: { | ||
| title: "Upload file", | ||
| summary: "Upload a file (or text snippet) to one or more channels", | ||
| description: "Calls `files.upload`. Pass either a base64-encoded `content` string, a raw `text` snippet, or a server-side `path` to read from disk.", | ||
| group: "files", | ||
| action: "upload", | ||
| icon: "upload", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["slack", "file", "upload"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "channels", | ||
| title: "Channels", | ||
| description: "Comma-separated list of channel IDs/names to share the file in.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "#general,#ops", | ||
| }, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "File source + metadata. Provide ONE of:\n content : raw text content (snippet)\n base64 : base64-encoded binary file content\n path : server-side absolute path to read\n\nPlus optional:\n filename : name shown in Slack\n filetype : Slack filetype slug (text, json, csv, png, …)\n title : title displayed above the file\n initialComment : message accompanying the file\n threadTs : post into a thread", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: true, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 6, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "Slack files.upload response with file metadata.", | ||
| errors: { | ||
| ...commonErrors, | ||
| no_source: "Must provide one of: content, base64, or path.", | ||
| read_error: "Could not read the file at `path`.", | ||
| }, | ||
| examples: [ | ||
| { | ||
| title: "Upload a CSV snippet", | ||
| code: 'slack.upload "my_slack_bot" "#reports" {\n filename: "report.csv",\n filetype: "csv",\n content: "name,total\\nada,42",\n initialComment: "Today\'s numbers"\n}', | ||
| }, | ||
| ], | ||
| example: 'slack.upload "my_slack_bot" "#reports" {filename: "x.txt", content: "hi"}', | ||
| }, | ||
| // ── Channels ────────────────────────────────────────────────────── | ||
| listChannels: { | ||
| title: "List channels", | ||
| summary: "List public + private channels the bot can see", | ||
| description: "Calls `conversations.list`. Returns a normalized array of `{id, name, is_private, is_archived, num_members}`.", | ||
| group: "channels", | ||
| action: "query", | ||
| icon: "list", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["slack", "channels", "list"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n types : comma-separated 'public_channel,private_channel,mpim,im' (default 'public_channel,private_channel')\n excludeArchived : bool (default true)\n limit : int 1-1000 (default 200)", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "array", | ||
| returnDescription: "Array of channel objects: { id, name, is_private, is_archived, num_members }.", | ||
| errors: commonErrors, | ||
| example: 'slack.listChannels "my_slack_bot"', | ||
| }, | ||
| getHistory: { | ||
| title: "Get channel history", | ||
| summary: "Read recent messages from a channel", | ||
| description: "Calls `conversations.history`. Returns the most recent messages first.", | ||
| group: "channels", | ||
| action: "query", | ||
| icon: "message-square", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["slack", "history", "messages"], | ||
| parameters: [ | ||
| credentialParam, | ||
| channelParam, | ||
| { | ||
| name: "options", | ||
| title: "Options", | ||
| description: "Recognized keys:\n limit : int 1-1000 (default 100)\n oldest : ts — only messages after this\n latest : ts — only messages before this\n inclusive : bool", | ||
| dataType: "object", | ||
| formInputType: "json", | ||
| required: false, | ||
| allowExpression: true, | ||
| language: "json", | ||
| rows: 4, | ||
| advanced: true, | ||
| }, | ||
| ], | ||
| returnType: "array", | ||
| returnDescription: "Array of message objects.", | ||
| errors: commonErrors, | ||
| example: 'slack.getHistory "my_slack_bot" "#ops" {limit: 20}', | ||
| }, | ||
| createChannel: { | ||
| title: "Create channel", | ||
| summary: "Create a new channel", | ||
| description: "Calls `conversations.create`. Bot needs `channels:manage` (public) or `groups:write` (private).", | ||
| group: "channels", | ||
| action: "write", | ||
| icon: "folder-plus", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: false, | ||
| since: "1.0.0", | ||
| tags: ["slack", "channel", "create"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "name", | ||
| title: "Channel name", | ||
| description: "Lowercase, no spaces or special chars. Slack will auto-prepend # for the response.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "project-launch", | ||
| validation: { pattern: "^[a-z0-9_-]+$", maxLength: 80 }, | ||
| }, | ||
| { | ||
| name: "isPrivate", | ||
| title: "Private channel", | ||
| description: "Create as a private channel.", | ||
| dataType: "boolean", | ||
| formInputType: "checkbox", | ||
| required: false, | ||
| defaultValue: false, | ||
| allowExpression: true, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| returnDescription: "Slack channel object.", | ||
| errors: { | ||
| ...commonErrors, | ||
| name_taken: "A channel with that name already exists.", | ||
| }, | ||
| example: 'slack.createChannel "my_slack_bot" "alerts"', | ||
| }, | ||
| // ── Users ───────────────────────────────────────────────────────── | ||
| userInfo: { | ||
| title: "Get user info", | ||
| summary: "Look up a user by Slack ID", | ||
| description: "Calls `users.info`. Returns the full Slack user object (real_name, profile, tz, etc.).", | ||
| group: "users", | ||
| action: "read", | ||
| icon: "user", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["slack", "user", "lookup"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "userId", | ||
| title: "User ID", | ||
| description: "Slack user ID (`U…`).", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "U0123ABCD", | ||
| validation: { pattern: "^[UW][A-Z0-9]+$" }, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| errors: { | ||
| ...commonErrors, | ||
| user_not_found: "No user with that ID exists in this workspace.", | ||
| }, | ||
| example: 'slack.userInfo "my_slack_bot" "U0123ABCD"', | ||
| }, | ||
| setStatus: { | ||
| title: "Set status", | ||
| summary: "Set the bot user's status text and emoji", | ||
| description: "Calls `users.profile.set` with the status_text/emoji/expiration fields. Affects the *bot user*, not workspace members.", | ||
| group: "users", | ||
| action: "write", | ||
| icon: "circle-dot", | ||
| capability: "manage_options", | ||
| sideEffects: ["makes_http_call"], | ||
| idempotent: true, | ||
| since: "1.0.0", | ||
| tags: ["slack", "status", "profile"], | ||
| parameters: [ | ||
| credentialParam, | ||
| { | ||
| name: "text", | ||
| title: "Status text", | ||
| description: "Short status text (≤100 chars). Empty string clears the status.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: true, | ||
| allowExpression: true, | ||
| placeholder: "Out for lunch", | ||
| validation: { maxLength: 100 }, | ||
| }, | ||
| { | ||
| name: "emoji", | ||
| title: "Status emoji", | ||
| description: "Emoji shortcode with colons. E.g. `:taco:`.", | ||
| dataType: "string", | ||
| formInputType: "text", | ||
| required: false, | ||
| allowExpression: true, | ||
| placeholder: ":taco:", | ||
| }, | ||
| { | ||
| name: "expiration", | ||
| title: "Expiration", | ||
| description: "Unix timestamp when the status auto-clears. 0 = never.", | ||
| dataType: "number", | ||
| formInputType: "number", | ||
| required: false, | ||
| defaultValue: 0, | ||
| allowExpression: true, | ||
| validation: { min: 0 }, | ||
| }, | ||
| ], | ||
| returnType: "object", | ||
| errors: commonErrors, | ||
| example: 'slack.setStatus "my_slack_bot" "Heads down" ":no_bell:" 0', | ||
| }, | ||
| }; | ||
| // ── Exports: module metadata ─────────────────────────────────────────── | ||
| export const SlackModuleMetadata = { | ||
| slug: "slack", | ||
| title: "Slack", | ||
| summary: "Send messages, react, upload files, and manage channels via the Slack Web API + Incoming Webhooks", | ||
| description: "Full Slack integration. Bot-token operations require a saved `slack_bot_token` credential; webhook posts can use a `slack_webhook` credential or a literal URL.\n\nEvery method returns the parsed Slack response object so downstream nodes can read message timestamps, channel IDs, etc. directly. Errors are returned as `{error: '...', slack_error?: '...'}` rather than thrown.", | ||
| category: "communication", | ||
| icon: "icon.svg", | ||
| color: "#4A154B", | ||
| version: "0.2.0", | ||
| docsUrl: "https://docs.robinpath.com/modules/slack", | ||
| status: "stable", | ||
| requires: [], | ||
| minNodeVersion: "18.0.0", | ||
| credentialsType: CREDENTIAL_TYPE, | ||
| operationGroups: { | ||
| message: { | ||
| title: "Messages", | ||
| description: "Send, edit, delete, and react to messages.", | ||
| order: 1, | ||
| }, | ||
| webhook: { | ||
| title: "Webhooks", | ||
| description: "Post via Incoming Webhooks (no bot token needed).", | ||
| order: 2, | ||
| }, | ||
| files: { | ||
| title: "Files", | ||
| description: "Upload files to channels and DMs.", | ||
| order: 3, | ||
| }, | ||
| channels: { | ||
| title: "Channels", | ||
| description: "List, read history of, and create channels.", | ||
| order: 4, | ||
| }, | ||
| users: { | ||
| title: "Users", | ||
| description: "Look up users and manage your own profile.", | ||
| order: 5, | ||
| }, | ||
| }, | ||
| methods: Object.keys(SlackFunctions), | ||
| }; | ||
| //# sourceMappingURL=slack.js.map |
| {"version":3,"file":"slack.js","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"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"} |
+16
-7
| { | ||
| "name": "@robinpath/slack", | ||
| "version": "0.1.1", | ||
| "version": "0.3.0", | ||
| "publishConfig": { | ||
@@ -23,6 +23,6 @@ "access": "public" | ||
| "peerDependencies": { | ||
| "@robinpath/core": ">=0.20.0" | ||
| "@robinpath/core": ">=0.40.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@robinpath/core": "^0.30.1", | ||
| "@robinpath/core": "^0.40.0", | ||
| "typescript": "^5.6.0" | ||
@@ -35,3 +35,6 @@ }, | ||
| "api", | ||
| "webhook" | ||
| "webhook", | ||
| "chat", | ||
| "notification", | ||
| "bot" | ||
| ], | ||
@@ -41,7 +44,13 @@ "license": "MIT", | ||
| "category": "messaging", | ||
| "type": "integration", | ||
| "auth": "bearer-token", | ||
| "type": "module", | ||
| "auth": "credential-vault", | ||
| "functionCount": 12, | ||
| "baseUrl": "https://slack.com" | ||
| "baseUrl": "https://slack.com", | ||
| "language": "nodejs", | ||
| "platforms": [ | ||
| "cloud", | ||
| "cli", | ||
| "desktop" | ||
| ] | ||
| } | ||
| } |
+1
-1
@@ -22,3 +22,3 @@ # @robinpath/slack | ||
| ```bash | ||
| npm install @robinpath/slack | ||
| robinpath add @robinpath/slack | ||
| ``` | ||
@@ -25,0 +25,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Empty package
Supply chain riskPackage does not contain any code. It may be removed, is name squatting, or the result of a faulty package publish.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
74916
1476.18%10
400%1053
Infinity%2
100%3
50%