Skip to content
Merged
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
c8c3482
Add support for flexpane API
vegeris Apr 8, 2025
a3f8922
feat-work-objects: version bump for types pkg (#2229)
vegeris Apr 9, 2025
dde54aa
Update
vegeris Apr 9, 2025
5813ae6
feat-work-objects: version bump 2 for the types pkg (#2234)
vegeris Apr 10, 2025
6892aef
feat-work-objects: version bump for the web-api pkg (#2232)
vegeris Apr 10, 2025
9e8988b
Merge branch 'main' of https://github.com/slackapi/node-slack-sdk int…
vegeris Aug 22, 2025
c3cef1f
update
vegeris Sep 8, 2025
67cc8b6
Merge branch 'main' of https://github.com/slackapi/node-slack-sdk int…
vegeris Sep 10, 2025
da092d5
update payload object, entity.presentDetails inputs, test, event
vegeris Sep 10, 2025
d4231dd
Merge branch 'main' of https://github.com/slackapi/node-slack-sdk int…
vegeris Sep 12, 2025
d889e07
feat-work-objects: beta version for the types pkg (#2366)
vegeris Sep 12, 2025
e6bd2ac
lint
vegeris Sep 12, 2025
c54c9b3
feat-work-objects: beta version for the web-api pkg (#2367)
vegeris Sep 12, 2025
24ecda6
Update entity metadata definitions
vegeris Oct 9, 2025
ba79b81
Merge branch 'main' of https://github.com/slackapi/node-slack-sdk int…
vegeris Oct 9, 2025
02e5360
feat-work-objects: beta version for the types pkg (#2404)
vegeris Oct 9, 2025
b983ca5
update test
vegeris Oct 9, 2025
8201026
feat-work-objects: beta version for the web-api pkg (#2405)
vegeris Oct 9, 2025
e4284e3
update schema
vegeris Oct 15, 2025
bb49dd5
feat-work-objects: beta version for the types pkg (#2406)
vegeris Oct 15, 2025
480cb1f
feat-work-objects: beta version for the web-api pkg (#2407)
vegeris Oct 15, 2025
c4992f6
Update URL in packages/web-api/src/types/request/chat.ts
vegeris Oct 16, 2025
d2a9d93
Update URL in packages/web-api/src/types/request/entity.ts
vegeris Oct 16, 2025
c4cb46c
alphabetical order
vegeris Oct 16, 2025
ec18401
update comments to jsdoc format
vegeris Oct 16, 2025
6f56034
update schema
vegeris Oct 16, 2025
eeef76d
feat-work-objects: beta version for the types pkg (#2408)
vegeris Oct 16, 2025
a44d4b3
whoops
vegeris Oct 16, 2025
1d4325b
feat-work-objects: version bump for the web-api pkg (#2409)
vegeris Oct 16, 2025
019cfd3
update comment
vegeris Oct 22, 2025
fae7b17
mv EntityAndEventMessageMetadata
vegeris Oct 22, 2025
a2eaa71
rename types for unfurls and metadata param of chat.unfurl
vegeris Oct 22, 2025
26e3aa5
biome fix
vegeris Oct 22, 2025
4eaeed8
make cli-test dependency versions exact
vegeris Oct 22, 2025
6d2ebc4
Revert "make cli-test dependency versions exact"
vegeris Oct 22, 2025
a9c5d4e
Merge branch 'main' of https://github.com/slackapi/node-slack-sdk int…
vegeris Oct 22, 2025
c0cc1f6
rm types pkg updates
vegeris Oct 23, 2025
d974164
feat-work-objects: version bump for the web-api pkg (#2416)
vegeris Oct 23, 2025
9b5ecf1
Merge branch 'main' of https://github.com/slackapi/node-slack-sdk int…
vegeris Oct 23, 2025
5c174bd
update types dependency and reset web-api package version
vegeris Oct 23, 2025
de9e02a
Merge branch 'main' of https://github.com/slackapi/node-slack-sdk int…
vegeris Oct 23, 2025
3ae9720
Update packages/web-api/package.json
vegeris Oct 23, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/types/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@slack/types",
"version": "2.17.0",
"version": "2.17.0-featWorkObjectsBeta.3",
"description": "Shared type definitions for the Node Slack SDK",
"author": "Slack Technologies, LLC",
"license": "MIT",
Expand Down
20 changes: 20 additions & 0 deletions packages/types/src/events/entity-details-requested.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
export interface EntityDetailsRequestedEvent {
type: 'entity_details_requested';
user: string;
trigger_id: string;
link: {
url: string;
domain: string;
};
entity_url: string;
app_unfurl_url?: string;
user_locale: string;
event_ts: string;
external_ref?: {
id: string;
type?: string;
};
message_ts?: string;
thread_ts?: string;
channel?: string;
}
2 changes: 2 additions & 0 deletions packages/types/src/events/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import type {
import type { DNDUpdatedEvent, DNDUpdatedUserEvent } from './dnd';
import type { EmailDomainChangedEvent } from './email';
import type { EmojiChangedEvent } from './emoji';
import type { EntityDetailsRequestedEvent } from './entity-details-requested';
import type {
FileChangeEvent,
FileCommentDeletedEvent,
Expand Down Expand Up @@ -144,6 +145,7 @@ export type SlackEvent =
| DNDUpdatedUserEvent
| EmailDomainChangedEvent
| EmojiChangedEvent
| EntityDetailsRequestedEvent
| FileChangeEvent
| FileCommentDeletedEvent
| FileCreatedEvent
Expand Down
292 changes: 291 additions & 1 deletion packages/types/src/message-metadata.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
import type { Option, PlainTextElement, SlackFile } from './block-kit/composition-objects';

// ------------------------------
// Event metadata
// ------------------------------

/**
* @description Application-specific data to attach to Slack message.
* @description Application-specific event data to attach to a Slack message.
* @see {@link https://docs.slack.dev/messaging/message-metadata Using Metadata}
* @see {@link https://docs.slack.dev/messaging/message-metadata Metadata Payload Structure}
*/
Expand All @@ -20,3 +26,287 @@ export interface MessageMetadata {
export interface MessageMetadataEventPayloadObject {
[key: string]: string | number | boolean;
}

// ------------------------------
// Work object metadata
// ------------------------------

/**
* @description Application-specific entity and/or event data to attach to a Slack message.
* Provide 'entities' to set work object entity metadata.
* Provide 'event_type' and 'event_payload' to set event metadata.
*/
export interface EntityAndEventMessageMetadata extends Partial<MessageMetadata> {
Comment thread
vegeris marked this conversation as resolved.
Outdated
/**
* @description An array of work object entities.
*/
entities?: EntityMetadata[];
}

/**
* @description Metadata that represents a work object entity.
*/
export interface EntityMetadata {
/**
* @description Entity type.
*/
entity_type: EntityType | string;
/**
* @description Schema for the given entity type.
*/
entity_payload: {
attributes: EntityAttributes;
fields?: ContentItemEntityFields | FileEntityFields | IncidentEntityFields | TaskEntityFields;
custom_fields?: EntityCustomField[];
slack_file?: FileEntitySlackFile;
display_order?: string[];
actions?: {
primary_actions?: EntityActionButton[];
overflow_actions?: EntityActionButton[];
};
};
/**
* @description Reference (and optional type) used to identify an entity within the developer's system.
*/
external_ref: ExternalRef;
/**
* @description URL used to identify an entity within the developer's system.
*/
url: string;

/**
* @description The exact URL posted in the source message. Required in metadata passed to `chat.unfurl`.
*/
app_unfurl_url?: string;
}

export interface ExternalRef {
id: string;
type?: string;
}

export enum EntityType {
Task = 'slack#/entities/task',
File = 'slack#/entities/file',
Item = 'slack#/entities/item',
Incident = 'slack#/entities/incident',
ContentItem = 'slack#/entities/content_item',
}

export interface FileEntitySlackFile {
id: string;
type?: string;
}

export interface EntityAttributes {
title: {
text: string;
edit?: EntityEditSupport;
};
display_type?: string;
display_id?: string;
product_icon?: EntityIconField;
product_name?: string;
locale?: string;
full_size_preview?: EntityFullSizePreview;
metadata_last_modified?: number;
}

export interface EntityIconField {
alt_text: string;
url?: string;
slack_file?: {
id?: string;
url?: string;
};
}

export interface EntityEditSupport {
enabled: boolean;
placeholder?: PlainTextElement;
hint?: PlainTextElement;
optional?: boolean;
select?: {
current_value?: string;
current_values?: string[];
static_options?: Option[];
fetch_options_dynamically?: boolean;
min_query_length?: number;
};
number?: {
is_decimal_allowed?: boolean;
min_value?: number;
max_value?: number;
};
text?: {
min_length?: number;
max_length?: number;
};
}

export interface EntityFullSizePreview {
is_supported: boolean;
preview_url?: string;
mime_type?: string;
error?: {
code: string;
message?: string;
};
}

export interface FileEntityFields {
preview?: EntityImageField;
created_by?: EntityTypedField;
date_created?: EntityTimestampField;
date_updated?: EntityTimestampField;
last_modified_by?: EntityTypedField;
file_size?: EntityStringField;
mime_type?: EntityStringField;
full_size_preview?: EntityFullSizePreview;
}

export interface TaskEntityFields {
description?: EntityStringField;
created_by?: EntityTypedField;
date_created?: EntityTimestampField;
date_updated?: EntityTimestampField;
assignee?: EntityTypedField;
status?: EntityStringField;
due_date?: EntityTypedField;
priority?: EntityStringField;
}

export interface IncidentEntityFields {
status?: EntityStringField;
priority?: EntityStringField;
urgency?: EntityStringField;
created_by?: EntityTypedField;
assigned_to?: EntityTypedField;
date_created?: EntityTimestampField;
date_updated?: EntityTimestampField;
description?: EntityStringField;
service?: EntityStringField;
}

export interface ContentItemEntityFields {
preview?: EntityImageField;
description?: EntityStringField;
created_by?: EntityTypedField;
date_created?: EntityTimestampField;
date_updated?: EntityTimestampField;
last_modified_by?: EntityTypedField;
}

export interface EntityArrayItemField extends Omit<EntityTypedField, 'type'> {
type?: string;
}

export interface EntityTypedField {
type: string;
label?: string;
value?: string | number;
link?: string;
icon?: EntityIconField;
long?: boolean;
format?: string;
image_url?: string;
slack_file?: SlackFile;
alt_text?: string;
edit?: EntityEditSupport;
tag_color?: string;
user?: EntityUserIDField | EntityUserField;
entity_ref?: EntityRefField;
}

export interface EntityStringField {
value: string;
label?: string;
format?: string;
link?: string;
icon?: EntityIconField;
long?: boolean;
type?: string;
tag_color?: string;
edit?: EntityEditSupport;
}

export interface EntityUserIDField {
user_id: string;
}

export interface EntityUserField {
text: string;
url?: string;
email?: string;
icon?: EntityIconField;
}

export interface EntityRefField {
entity_url: string;
external_ref: ExternalRef;
title: string;
display_type?: string;
icon?: EntityIconField;
}

export interface EntityTimestampField {
value: number;
label?: string;
link?: string;
icon?: EntityIconField;
type?: string;
edit?: EntityEditSupport;
}

export interface EntityImageField {
alt_text: string;
label?: string;
image_url?: string;
slack_file?: SlackFile;
title?: string;
type?: string;
}

export interface EntityCustomField {
label: string;
key: string;
type: CustomFieldType | string;
value?: string | number | EntityArrayItemField[];
link?: string;
icon?: EntityIconField;
long?: boolean;
format?: string;
image_url?: string;
slack_file?: SlackFile;
alt_text?: string;
tag_color?: string;
edit?: EntityEditSupport;
item_type?: string;
user?: EntityUserIDField | EntityUserField;
entity_ref?: EntityRefField;
}

export enum CustomFieldType {
Integer = 'integer',
String = 'string',
Array = 'array',
Date = 'slack#/types/date',
Timestamp = 'slack#/types/timestamp',
Image = 'slack#/types/image',
ChannelId = 'slack#/types/channel_id',
User = 'slack#/types/user',
EntityRef = 'slack#/types/entity_ref',
}

export interface EntityActionButton {
text: string;
action_id: string;
value?: string;
style?: string;
url?: string;
accessibility_label?: string;
processing_state?: {
enabled: boolean;
interstitial_text?: string;
};
}
4 changes: 2 additions & 2 deletions packages/web-api/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@slack/web-api",
"version": "7.11.0",
"version": "7.11.0-featWorkObjectsBeta.3",
"description": "Official library for using the Slack Platform's Web API",
"author": "Slack Technologies, LLC",
"license": "MIT",
Expand Down Expand Up @@ -49,7 +49,7 @@
},
"dependencies": {
"@slack/logger": "^4.0.0",
"@slack/types": "^2.17.0",
"@slack/types": "2.17.0-featWorkObjectsBeta.3",
"@types/node": ">=18.0.0",
"@types/retry": "0.12.0",
"axios": "^1.11.0",
Expand Down
14 changes: 14 additions & 0 deletions packages/web-api/src/methods.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ import type {
DndSetSnoozeArguments,
DndTeamInfoArguments,
EmojiListArguments,
EntityPresentDetailsArguments,
FilesCommentsDeleteArguments,
FilesCompleteUploadExternalArguments,
FilesDeleteArguments,
Expand Down Expand Up @@ -437,6 +438,7 @@ import type {
DndSetSnoozeResponse,
DndTeamInfoResponse,
EmojiListResponse,
EntityPresentDetailsResponse,
FilesCommentsDeleteResponse,
FilesCompleteUploadExternalResponse,
FilesDeleteResponse,
Expand Down Expand Up @@ -1879,6 +1881,18 @@ export abstract class Methods extends EventEmitter<WebClientEvent> {
list: bindApiCallWithOptionalArgument<EmojiListArguments, EmojiListResponse>(this, 'emoji.list'),
};

public readonly entity = {
/**
* @description
* Provide information about the entity to be displayed in the flexpane.
* A link to the API documentation will be added when this API is publicly released.
*/
presentDetails: bindApiCall<EntityPresentDetailsArguments, EntityPresentDetailsResponse>(
this,
'entity.presentDetails',
),
};

public readonly files = {
/**
* @description Finishes an upload started with {@link https://docs.slack.dev/reference/methods/files.getUploadURLExternal `files.getUploadURLExternal`}.
Expand Down
Loading