diff --git a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx index b3d9cab9d4..6afbe1484c 100644 --- a/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx +++ b/apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/tool-input.tsx @@ -557,7 +557,7 @@ function FileUploadSyncWrapper({ ) } -function ChannelSelectorSyncWrapper({ +function SlackSelectorSyncWrapper({ blockId, paramId, value, @@ -565,6 +565,7 @@ function ChannelSelectorSyncWrapper({ uiComponent, disabled, previewContextValues, + selectorType, }: { blockId: string paramId: string @@ -573,6 +574,7 @@ function ChannelSelectorSyncWrapper({ uiComponent: any disabled: boolean previewContextValues?: Record + selectorType: 'channel-selector' | 'user-selector' }) { return ( @@ -580,7 +582,7 @@ function ChannelSelectorSyncWrapper({ blockId={blockId} subBlock={{ id: paramId, - type: 'channel-selector' as const, + type: selectorType, title: paramId, serviceId: uiComponent.serviceId, placeholder: uiComponent.placeholder, @@ -1952,7 +1954,7 @@ export function ToolInput({ case 'channel-selector': return ( - + ) + + case 'user-selector': + return ( + ) diff --git a/apps/sim/lib/environment/utils.ts b/apps/sim/lib/environment/utils.ts index 8e56e264e3..ecff2660a2 100644 --- a/apps/sim/lib/environment/utils.ts +++ b/apps/sim/lib/environment/utils.ts @@ -143,6 +143,7 @@ export async function ensureBlockEnvVarsResolvable( options: { requestId?: string } = {} ): Promise { const requestId = options.requestId + const envVarPattern = createEnvVarPattern() await Promise.all( Object.values(blocks).map(async (block) => { const subBlocks = block.subBlocks ?? {} @@ -157,7 +158,6 @@ export async function ensureBlockEnvVarsResolvable( return } - const envVarPattern = createEnvVarPattern() const matches = value.match(envVarPattern) if (!matches) { return diff --git a/apps/sim/tools/slack/message.ts b/apps/sim/tools/slack/message.ts index d8c9e36b87..1e1d3b0c9d 100644 --- a/apps/sim/tools/slack/message.ts +++ b/apps/sim/tools/slack/message.ts @@ -20,6 +20,12 @@ export const slackMessageTool: ToolConfig { + const isDM = params.destinationType === 'dm' return { accessToken: params.accessToken || params.botToken, - channel: params.channel, - userId: params.userId, + channel: isDM ? undefined : params.channel, + userId: isDM ? params.dmUserId : params.userId, text: params.text, thread_ts: params.thread_ts || undefined, files: params.files || null, diff --git a/apps/sim/tools/slack/message_reader.ts b/apps/sim/tools/slack/message_reader.ts index b7bdc258f0..3170409239 100644 --- a/apps/sim/tools/slack/message_reader.ts +++ b/apps/sim/tools/slack/message_reader.ts @@ -23,6 +23,12 @@ export const slackMessageReaderTool: ToolConfig< visibility: 'user-only', description: 'Authentication method: oauth or bot_token', }, + destinationType: { + type: 'string', + required: false, + visibility: 'user-only', + description: 'Destination type: channel or dm', + }, botToken: { type: 'string', required: false, @@ -41,11 +47,11 @@ export const slackMessageReaderTool: ToolConfig< visibility: 'user-only', description: 'Slack channel to read messages from (e.g., #general)', }, - userId: { + dmUserId: { type: 'string', required: false, visibility: 'user-only', - description: 'User ID for DM conversation (e.g., U1234567890)', + description: 'Target Slack user for DM conversation', }, limit: { type: 'number', @@ -73,14 +79,17 @@ export const slackMessageReaderTool: ToolConfig< headers: () => ({ 'Content-Type': 'application/json', }), - body: (params: SlackMessageReaderParams) => ({ - accessToken: params.accessToken || params.botToken, - channel: params.channel, - userId: params.userId, - limit: params.limit, - oldest: params.oldest, - latest: params.latest, - }), + body: (params: SlackMessageReaderParams) => { + const isDM = params.destinationType === 'dm' + return { + accessToken: params.accessToken || params.botToken, + channel: isDM ? undefined : params.channel, + userId: isDM ? params.dmUserId : params.userId, + limit: params.limit, + oldest: params.oldest, + latest: params.latest, + } + }, }, transformResponse: async (response: Response) => { diff --git a/apps/sim/tools/slack/types.ts b/apps/sim/tools/slack/types.ts index 4271409aa0..55dd9f7d20 100644 --- a/apps/sim/tools/slack/types.ts +++ b/apps/sim/tools/slack/types.ts @@ -7,7 +7,9 @@ export interface SlackBaseParams { } export interface SlackMessageParams extends SlackBaseParams { + destinationType?: 'channel' | 'dm' channel?: string + dmUserId?: string userId?: string text: string thread_ts?: string @@ -22,7 +24,9 @@ export interface SlackCanvasParams extends SlackBaseParams { } export interface SlackMessageReaderParams extends SlackBaseParams { + destinationType?: 'channel' | 'dm' channel?: string + dmUserId?: string userId?: string limit?: number oldest?: string