@tightknitai/slack-block-kit-validator 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,11 @@
1
1
  /**
2
- * JSON Schema (draft 2020-12) for Slack Block Kit payloads. Validates a top-level array of blocks. Individual block, element, and composition object schemas are exposed via $defs for re-use. Compiled from https://docs.slack.dev/reference/block-kit (fetched 2026-04-16). Surface restrictions (messages vs modals vs home) and payload-level rules (e.g. cumulative 12k char markdown limit, single-table-per-message) are documented in $defs descriptions but not enforced at the per-block level.
2
+ * JSON Schema (draft 2020-12) for Slack Block Kit payloads. Validates a top-level array of blocks. Individual block, element, and composition object schemas are exposed via $defs for re-use. Compiled from https://docs.slack.dev/reference/block-kit (fetched 2026-04-16). Surface restrictions (messages vs modals vs home) and payload-level rules (e.g. cumulative 12k char markdown limit, single-table-per-message, max two data-visualization blocks per message) are documented in $defs descriptions but not enforced at the per-block level.
3
3
  */
4
4
  export type SlackBlockKitPayload = [Block, ...Block[]] | ModalView | HomeView;
5
5
  /**
6
6
  * Discriminated union of every Block Kit block type.
7
7
  */
8
- export type Block = ActionsBlock | AlertBlock | CardBlock | CarouselBlock | ContextActionsBlock | ContextBlock | DividerBlock | FileBlock | HeaderBlock | ImageBlock | InputBlock | MarkdownBlock | PlanBlock | RichTextBlock | SectionBlock | TableBlock | TaskCardBlock | VideoBlock;
8
+ export type Block = ActionsBlock | AlertBlock | CardBlock | CarouselBlock | ContainerBlock | ContextActionsBlock | ContextBlock | DataVisualizationBlock | DividerBlock | FileBlock | HeaderBlock | ImageBlock | InputBlock | MarkdownBlock | PlanBlock | RichTextBlock | SectionBlock | TableBlock | TaskCardBlock | VideoBlock;
9
9
  /**
10
10
  * Elements allowed inside an actions block.
11
11
  */
@@ -327,6 +327,11 @@ export type ImageElement = {
327
327
  alt_text: string;
328
328
  image_url?: string;
329
329
  slack_file?: SlackFileObject;
330
+ } & ImageElement1 & {
331
+ type: "image";
332
+ alt_text: string;
333
+ image_url?: string;
334
+ slack_file?: SlackFileObject;
330
335
  } & ImageElement1;
331
336
  /**
332
337
  * Reference to a Slack file. Exactly one of url or id must be provided. Supported file types: png, jpg, jpeg, gif.
@@ -349,9 +354,9 @@ export type ImageElement1 = {
349
354
  [k: string]: unknown | undefined;
350
355
  };
351
356
  /**
352
- * Elements allowed inside a context_actions block.
357
+ * A block allowed inside a container block's child_blocks array. Slack documents this set as: actions, context, divider, file, header, image, input, rich_text, section, table, video (https://docs.slack.dev/reference/block-kit/blocks/container-block). Notably excludes container itself (no nesting) and message-only chrome like card/carousel/markdown.
353
358
  */
354
- export type ContextActionsBlockElement = FeedbackButtonsElement | IconButtonElement;
359
+ export type ContainerChildBlock = ActionsBlock | ContextBlock | DividerBlock | FileBlock | HeaderBlock | ImageBlock | InputBlock | RichTextBlock | SectionBlock | TableBlock | VideoBlock;
355
360
  /**
356
361
  * Elements allowed inside a context block.
357
362
  */
@@ -366,6 +371,13 @@ export type ImageBlock = {
366
371
  slack_file?: SlackFileObject;
367
372
  title?: PlainTextObject;
368
373
  block_id?: BlockId;
374
+ } & ImageBlock1 & {
375
+ type: "image";
376
+ alt_text: string;
377
+ image_url?: string;
378
+ slack_file?: SlackFileObject;
379
+ title?: PlainTextObject;
380
+ block_id?: BlockId;
369
381
  } & ImageBlock1;
370
382
  export type ImageBlock1 = {
371
383
  [k: string]: unknown | undefined;
@@ -409,6 +421,28 @@ export type SectionBlock = SectionBlock1 & {
409
421
  ];
410
422
  accessory?: SectionAccessoryElement;
411
423
  expand?: boolean;
424
+ } & SectionBlock1 & {
425
+ type: "section";
426
+ text?: TextObject;
427
+ block_id?: BlockId;
428
+ /**
429
+ * @minItems 1
430
+ * @maxItems 10
431
+ */
432
+ fields?: [TextObject] | [TextObject, TextObject] | [TextObject, TextObject, TextObject] | [TextObject, TextObject, TextObject, TextObject] | [TextObject, TextObject, TextObject, TextObject, TextObject] | [TextObject, TextObject, TextObject, TextObject, TextObject, TextObject] | [TextObject, TextObject, TextObject, TextObject, TextObject, TextObject, TextObject] | [TextObject, TextObject, TextObject, TextObject, TextObject, TextObject, TextObject, TextObject] | [TextObject, TextObject, TextObject, TextObject, TextObject, TextObject, TextObject, TextObject, TextObject] | [
433
+ TextObject,
434
+ TextObject,
435
+ TextObject,
436
+ TextObject,
437
+ TextObject,
438
+ TextObject,
439
+ TextObject,
440
+ TextObject,
441
+ TextObject,
442
+ TextObject
443
+ ];
444
+ accessory?: SectionAccessoryElement;
445
+ expand?: boolean;
412
446
  };
413
447
  export type SectionBlock1 = {
414
448
  [k: string]: unknown | undefined;
@@ -439,6 +473,55 @@ export type TableColumnSetting = null | {
439
473
  align?: "left" | "center" | "right";
440
474
  is_wrapped?: boolean;
441
475
  };
476
+ /**
477
+ * Elements allowed inside a context_actions block.
478
+ */
479
+ export type ContextActionsBlockElement = FeedbackButtonsElement | IconButtonElement;
480
+ /**
481
+ * The chart rendered by a data_visualization block. line/bar/area charts use series + axis_config; pie charts use segments.
482
+ */
483
+ export type DataVisualizationChart = {
484
+ type: "line" | "bar" | "area";
485
+ /**
486
+ * @minItems 1
487
+ * @maxItems 6
488
+ */
489
+ series: [DataVisualizationSeries] | [DataVisualizationSeries, DataVisualizationSeries] | [DataVisualizationSeries, DataVisualizationSeries, DataVisualizationSeries] | [DataVisualizationSeries, DataVisualizationSeries, DataVisualizationSeries, DataVisualizationSeries] | [
490
+ DataVisualizationSeries,
491
+ DataVisualizationSeries,
492
+ DataVisualizationSeries,
493
+ DataVisualizationSeries,
494
+ DataVisualizationSeries
495
+ ] | [
496
+ DataVisualizationSeries,
497
+ DataVisualizationSeries,
498
+ DataVisualizationSeries,
499
+ DataVisualizationSeries,
500
+ DataVisualizationSeries,
501
+ DataVisualizationSeries
502
+ ];
503
+ axis_config: DataVisualizationAxisConfig;
504
+ } | {
505
+ type: "pie";
506
+ /**
507
+ * @minItems 1
508
+ * @maxItems 6
509
+ */
510
+ segments: [DataVisualizationSegment] | [DataVisualizationSegment, DataVisualizationSegment] | [DataVisualizationSegment, DataVisualizationSegment, DataVisualizationSegment] | [DataVisualizationSegment, DataVisualizationSegment, DataVisualizationSegment, DataVisualizationSegment] | [
511
+ DataVisualizationSegment,
512
+ DataVisualizationSegment,
513
+ DataVisualizationSegment,
514
+ DataVisualizationSegment,
515
+ DataVisualizationSegment
516
+ ] | [
517
+ DataVisualizationSegment,
518
+ DataVisualizationSegment,
519
+ DataVisualizationSegment,
520
+ DataVisualizationSegment,
521
+ DataVisualizationSegment,
522
+ DataVisualizationSegment
523
+ ];
524
+ };
442
525
  export interface ActionsBlock {
443
526
  type: "actions";
444
527
  /**
@@ -833,47 +916,68 @@ export interface CarouselBlock {
833
916
  elements: [CardBlock] | [CardBlock, CardBlock] | [CardBlock, CardBlock, CardBlock] | [CardBlock, CardBlock, CardBlock, CardBlock] | [CardBlock, CardBlock, CardBlock, CardBlock, CardBlock] | [CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock] | [CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock] | [CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock] | [CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock] | [CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock, CardBlock];
834
917
  block_id?: BlockId;
835
918
  }
836
- export interface ContextActionsBlock {
837
- type: "context_actions";
919
+ /**
920
+ * A general-purpose wrapper that groups child blocks into a single, optionally collapsible unit with a configurable width. Messages only (https://docs.slack.dev/reference/block-kit/blocks/container-block). default_collapsed only takes effect when is_collapsible is true; the schema rejects default_collapsed: true without is_collapsible: true.
921
+ */
922
+ export interface ContainerBlock {
923
+ type: "container";
924
+ block_id?: BlockId;
925
+ title: PlainTextObject;
926
+ subtitle?: PlainTextObject;
927
+ icon?: ImageElement;
928
+ width?: "narrow" | "standard" | "wide" | "full";
929
+ is_collapsible?: boolean;
930
+ default_collapsed?: boolean;
838
931
  /**
839
932
  * @minItems 1
840
- * @maxItems 5
933
+ * @maxItems 10
841
934
  */
842
- elements: [ContextActionsBlockElement] | [ContextActionsBlockElement, ContextActionsBlockElement] | [ContextActionsBlockElement, ContextActionsBlockElement, ContextActionsBlockElement] | [ContextActionsBlockElement, ContextActionsBlockElement, ContextActionsBlockElement, ContextActionsBlockElement] | [
843
- ContextActionsBlockElement,
844
- ContextActionsBlockElement,
845
- ContextActionsBlockElement,
846
- ContextActionsBlockElement,
847
- ContextActionsBlockElement
935
+ child_blocks: [ContainerChildBlock] | [ContainerChildBlock, ContainerChildBlock] | [ContainerChildBlock, ContainerChildBlock, ContainerChildBlock] | [ContainerChildBlock, ContainerChildBlock, ContainerChildBlock, ContainerChildBlock] | [ContainerChildBlock, ContainerChildBlock, ContainerChildBlock, ContainerChildBlock, ContainerChildBlock] | [
936
+ ContainerChildBlock,
937
+ ContainerChildBlock,
938
+ ContainerChildBlock,
939
+ ContainerChildBlock,
940
+ ContainerChildBlock,
941
+ ContainerChildBlock
942
+ ] | [
943
+ ContainerChildBlock,
944
+ ContainerChildBlock,
945
+ ContainerChildBlock,
946
+ ContainerChildBlock,
947
+ ContainerChildBlock,
948
+ ContainerChildBlock,
949
+ ContainerChildBlock
950
+ ] | [
951
+ ContainerChildBlock,
952
+ ContainerChildBlock,
953
+ ContainerChildBlock,
954
+ ContainerChildBlock,
955
+ ContainerChildBlock,
956
+ ContainerChildBlock,
957
+ ContainerChildBlock,
958
+ ContainerChildBlock
959
+ ] | [
960
+ ContainerChildBlock,
961
+ ContainerChildBlock,
962
+ ContainerChildBlock,
963
+ ContainerChildBlock,
964
+ ContainerChildBlock,
965
+ ContainerChildBlock,
966
+ ContainerChildBlock,
967
+ ContainerChildBlock,
968
+ ContainerChildBlock
969
+ ] | [
970
+ ContainerChildBlock,
971
+ ContainerChildBlock,
972
+ ContainerChildBlock,
973
+ ContainerChildBlock,
974
+ ContainerChildBlock,
975
+ ContainerChildBlock,
976
+ ContainerChildBlock,
977
+ ContainerChildBlock,
978
+ ContainerChildBlock,
979
+ ContainerChildBlock
848
980
  ];
849
- block_id?: BlockId;
850
- }
851
- /**
852
- * Must be used inside a context_actions block.
853
- */
854
- export interface FeedbackButtonsElement {
855
- type: "feedback_buttons";
856
- positive_button: FeedbackButtonSubobject;
857
- negative_button: FeedbackButtonSubobject;
858
- action_id?: ActionId;
859
- }
860
- export interface FeedbackButtonSubobject {
861
- text: PlainTextObject;
862
- value: string;
863
- accessibility_label?: string;
864
- }
865
- /**
866
- * Icon button — only valid inside a context_actions block.
867
- */
868
- export interface IconButtonElement {
869
- type: "icon_button";
870
- icon: "trash";
871
- text: PlainTextObject;
872
- action_id?: ActionId;
873
- value?: string;
874
- confirm?: ConfirmObject;
875
- accessibility_label?: string;
876
- visible_to_user_ids?: string[];
877
981
  }
878
982
  export interface ContextBlock {
879
983
  type: "context";
@@ -1159,41 +1263,6 @@ export interface FileInputElement {
1159
1263
  filetypes?: [string, ...string[]];
1160
1264
  max_files?: number;
1161
1265
  }
1162
- /**
1163
- * block_id is ignored on markdown blocks. Cumulative 12,000-char limit across all markdown blocks in one payload is a payload-level rule, not enforced here.
1164
- */
1165
- export interface MarkdownBlock {
1166
- type: "markdown";
1167
- text: string;
1168
- block_id?: BlockId;
1169
- }
1170
- export interface PlanBlock {
1171
- type: "plan";
1172
- title: string | PlainTextObject;
1173
- block_id?: BlockId;
1174
- tasks?: TaskCardInlineObject[];
1175
- }
1176
- /**
1177
- * A task card as it appears inline within a plan_block tasks array — the docs' example omits the type discriminator.
1178
- */
1179
- export interface TaskCardInlineObject {
1180
- type?: "task_card";
1181
- task_id: string;
1182
- title: string;
1183
- details?: RichTextBlock;
1184
- output?: RichTextBlock;
1185
- sources?: UrlSourceElement[];
1186
- status?: "pending" | "in_progress" | "complete" | "error";
1187
- block_id?: BlockId;
1188
- }
1189
- /**
1190
- * URL source element — only valid inside a task_card block's sources array.
1191
- */
1192
- export interface UrlSourceElement {
1193
- type: "url";
1194
- url: string;
1195
- text: string;
1196
- }
1197
1266
  /**
1198
1267
  * One table per message (server-enforced via invalid_attachments / only_one_table_allowed). Up to 100 rows, up to 20 cells per row.
1199
1268
  */
@@ -1753,19 +1822,6 @@ export interface TableBlock {
1753
1822
  TableColumnSetting
1754
1823
  ];
1755
1824
  }
1756
- /**
1757
- * Standalone task_card block (also embeddable inline within plan_block).
1758
- */
1759
- export interface TaskCardBlock {
1760
- type: "task_card";
1761
- task_id: string;
1762
- title: string;
1763
- details?: RichTextBlock;
1764
- output?: RichTextBlock;
1765
- sources?: UrlSourceElement[];
1766
- status?: "pending" | "in_progress" | "complete" | "error";
1767
- block_id?: BlockId;
1768
- }
1769
1825
  /**
1770
1826
  * Requires links.embed:write OAuth scope. video_url must be in app's unfurl domains, HTTPS, embeddable, return 2xx, not point to Slack-related domains.
1771
1827
  */
@@ -1782,6 +1838,354 @@ export interface VideoBlock {
1782
1838
  title_url?: string;
1783
1839
  block_id?: BlockId;
1784
1840
  }
1841
+ export interface ContextActionsBlock {
1842
+ type: "context_actions";
1843
+ /**
1844
+ * @minItems 1
1845
+ * @maxItems 5
1846
+ */
1847
+ elements: [ContextActionsBlockElement] | [ContextActionsBlockElement, ContextActionsBlockElement] | [ContextActionsBlockElement, ContextActionsBlockElement, ContextActionsBlockElement] | [ContextActionsBlockElement, ContextActionsBlockElement, ContextActionsBlockElement, ContextActionsBlockElement] | [
1848
+ ContextActionsBlockElement,
1849
+ ContextActionsBlockElement,
1850
+ ContextActionsBlockElement,
1851
+ ContextActionsBlockElement,
1852
+ ContextActionsBlockElement
1853
+ ];
1854
+ block_id?: BlockId;
1855
+ }
1856
+ /**
1857
+ * Must be used inside a context_actions block.
1858
+ */
1859
+ export interface FeedbackButtonsElement {
1860
+ type: "feedback_buttons";
1861
+ positive_button: FeedbackButtonSubobject;
1862
+ negative_button: FeedbackButtonSubobject;
1863
+ action_id?: ActionId;
1864
+ }
1865
+ export interface FeedbackButtonSubobject {
1866
+ text: PlainTextObject;
1867
+ value: string;
1868
+ accessibility_label?: string;
1869
+ }
1870
+ /**
1871
+ * Icon button — only valid inside a context_actions block.
1872
+ */
1873
+ export interface IconButtonElement {
1874
+ type: "icon_button";
1875
+ icon: "trash";
1876
+ text: PlainTextObject;
1877
+ action_id?: ActionId;
1878
+ value?: string;
1879
+ confirm?: ConfirmObject;
1880
+ accessibility_label?: string;
1881
+ visible_to_user_ids?: string[];
1882
+ }
1883
+ /**
1884
+ * Renders data as a line, bar, area, or pie chart. Messages only (https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block). Slack renders at most two data_visualization blocks per message (enforced via the checkDataVisualizationMax helper, since JSON Schema can't count sibling blocks). Two further runtime rules are enforced via checkDataVisualizationConsistency, since they depend on sibling-field values JSON Schema can't compare: series names must be unique within a chart, and each series must contain exactly one data point per axis_config.categories label.
1885
+ */
1886
+ export interface DataVisualizationBlock {
1887
+ type: "data_visualization";
1888
+ block_id?: BlockId;
1889
+ title: string;
1890
+ chart: DataVisualizationChart;
1891
+ }
1892
+ /**
1893
+ * A named series of data points plotted on a line/bar/area chart. The name drives the chart legend and must be unique across all series in the same chart (enforced via checkDataVisualizationConsistency).
1894
+ */
1895
+ export interface DataVisualizationSeries {
1896
+ name: string;
1897
+ /**
1898
+ * @minItems 1
1899
+ * @maxItems 20
1900
+ */
1901
+ data: [DataVisualizationDataPoint] | [DataVisualizationDataPoint, DataVisualizationDataPoint] | [DataVisualizationDataPoint, DataVisualizationDataPoint, DataVisualizationDataPoint] | [DataVisualizationDataPoint, DataVisualizationDataPoint, DataVisualizationDataPoint, DataVisualizationDataPoint] | [
1902
+ DataVisualizationDataPoint,
1903
+ DataVisualizationDataPoint,
1904
+ DataVisualizationDataPoint,
1905
+ DataVisualizationDataPoint,
1906
+ DataVisualizationDataPoint
1907
+ ] | [
1908
+ DataVisualizationDataPoint,
1909
+ DataVisualizationDataPoint,
1910
+ DataVisualizationDataPoint,
1911
+ DataVisualizationDataPoint,
1912
+ DataVisualizationDataPoint,
1913
+ DataVisualizationDataPoint
1914
+ ] | [
1915
+ DataVisualizationDataPoint,
1916
+ DataVisualizationDataPoint,
1917
+ DataVisualizationDataPoint,
1918
+ DataVisualizationDataPoint,
1919
+ DataVisualizationDataPoint,
1920
+ DataVisualizationDataPoint,
1921
+ DataVisualizationDataPoint
1922
+ ] | [
1923
+ DataVisualizationDataPoint,
1924
+ DataVisualizationDataPoint,
1925
+ DataVisualizationDataPoint,
1926
+ DataVisualizationDataPoint,
1927
+ DataVisualizationDataPoint,
1928
+ DataVisualizationDataPoint,
1929
+ DataVisualizationDataPoint,
1930
+ DataVisualizationDataPoint
1931
+ ] | [
1932
+ DataVisualizationDataPoint,
1933
+ DataVisualizationDataPoint,
1934
+ DataVisualizationDataPoint,
1935
+ DataVisualizationDataPoint,
1936
+ DataVisualizationDataPoint,
1937
+ DataVisualizationDataPoint,
1938
+ DataVisualizationDataPoint,
1939
+ DataVisualizationDataPoint,
1940
+ DataVisualizationDataPoint
1941
+ ] | [
1942
+ DataVisualizationDataPoint,
1943
+ DataVisualizationDataPoint,
1944
+ DataVisualizationDataPoint,
1945
+ DataVisualizationDataPoint,
1946
+ DataVisualizationDataPoint,
1947
+ DataVisualizationDataPoint,
1948
+ DataVisualizationDataPoint,
1949
+ DataVisualizationDataPoint,
1950
+ DataVisualizationDataPoint,
1951
+ DataVisualizationDataPoint
1952
+ ] | [
1953
+ DataVisualizationDataPoint,
1954
+ DataVisualizationDataPoint,
1955
+ DataVisualizationDataPoint,
1956
+ DataVisualizationDataPoint,
1957
+ DataVisualizationDataPoint,
1958
+ DataVisualizationDataPoint,
1959
+ DataVisualizationDataPoint,
1960
+ DataVisualizationDataPoint,
1961
+ DataVisualizationDataPoint,
1962
+ DataVisualizationDataPoint,
1963
+ DataVisualizationDataPoint
1964
+ ] | [
1965
+ DataVisualizationDataPoint,
1966
+ DataVisualizationDataPoint,
1967
+ DataVisualizationDataPoint,
1968
+ DataVisualizationDataPoint,
1969
+ DataVisualizationDataPoint,
1970
+ DataVisualizationDataPoint,
1971
+ DataVisualizationDataPoint,
1972
+ DataVisualizationDataPoint,
1973
+ DataVisualizationDataPoint,
1974
+ DataVisualizationDataPoint,
1975
+ DataVisualizationDataPoint,
1976
+ DataVisualizationDataPoint
1977
+ ] | [
1978
+ DataVisualizationDataPoint,
1979
+ DataVisualizationDataPoint,
1980
+ DataVisualizationDataPoint,
1981
+ DataVisualizationDataPoint,
1982
+ DataVisualizationDataPoint,
1983
+ DataVisualizationDataPoint,
1984
+ DataVisualizationDataPoint,
1985
+ DataVisualizationDataPoint,
1986
+ DataVisualizationDataPoint,
1987
+ DataVisualizationDataPoint,
1988
+ DataVisualizationDataPoint,
1989
+ DataVisualizationDataPoint,
1990
+ DataVisualizationDataPoint
1991
+ ] | [
1992
+ DataVisualizationDataPoint,
1993
+ DataVisualizationDataPoint,
1994
+ DataVisualizationDataPoint,
1995
+ DataVisualizationDataPoint,
1996
+ DataVisualizationDataPoint,
1997
+ DataVisualizationDataPoint,
1998
+ DataVisualizationDataPoint,
1999
+ DataVisualizationDataPoint,
2000
+ DataVisualizationDataPoint,
2001
+ DataVisualizationDataPoint,
2002
+ DataVisualizationDataPoint,
2003
+ DataVisualizationDataPoint,
2004
+ DataVisualizationDataPoint,
2005
+ DataVisualizationDataPoint
2006
+ ] | [
2007
+ DataVisualizationDataPoint,
2008
+ DataVisualizationDataPoint,
2009
+ DataVisualizationDataPoint,
2010
+ DataVisualizationDataPoint,
2011
+ DataVisualizationDataPoint,
2012
+ DataVisualizationDataPoint,
2013
+ DataVisualizationDataPoint,
2014
+ DataVisualizationDataPoint,
2015
+ DataVisualizationDataPoint,
2016
+ DataVisualizationDataPoint,
2017
+ DataVisualizationDataPoint,
2018
+ DataVisualizationDataPoint,
2019
+ DataVisualizationDataPoint,
2020
+ DataVisualizationDataPoint,
2021
+ DataVisualizationDataPoint
2022
+ ] | [
2023
+ DataVisualizationDataPoint,
2024
+ DataVisualizationDataPoint,
2025
+ DataVisualizationDataPoint,
2026
+ DataVisualizationDataPoint,
2027
+ DataVisualizationDataPoint,
2028
+ DataVisualizationDataPoint,
2029
+ DataVisualizationDataPoint,
2030
+ DataVisualizationDataPoint,
2031
+ DataVisualizationDataPoint,
2032
+ DataVisualizationDataPoint,
2033
+ DataVisualizationDataPoint,
2034
+ DataVisualizationDataPoint,
2035
+ DataVisualizationDataPoint,
2036
+ DataVisualizationDataPoint,
2037
+ DataVisualizationDataPoint,
2038
+ DataVisualizationDataPoint
2039
+ ] | [
2040
+ DataVisualizationDataPoint,
2041
+ DataVisualizationDataPoint,
2042
+ DataVisualizationDataPoint,
2043
+ DataVisualizationDataPoint,
2044
+ DataVisualizationDataPoint,
2045
+ DataVisualizationDataPoint,
2046
+ DataVisualizationDataPoint,
2047
+ DataVisualizationDataPoint,
2048
+ DataVisualizationDataPoint,
2049
+ DataVisualizationDataPoint,
2050
+ DataVisualizationDataPoint,
2051
+ DataVisualizationDataPoint,
2052
+ DataVisualizationDataPoint,
2053
+ DataVisualizationDataPoint,
2054
+ DataVisualizationDataPoint,
2055
+ DataVisualizationDataPoint,
2056
+ DataVisualizationDataPoint
2057
+ ] | [
2058
+ DataVisualizationDataPoint,
2059
+ DataVisualizationDataPoint,
2060
+ DataVisualizationDataPoint,
2061
+ DataVisualizationDataPoint,
2062
+ DataVisualizationDataPoint,
2063
+ DataVisualizationDataPoint,
2064
+ DataVisualizationDataPoint,
2065
+ DataVisualizationDataPoint,
2066
+ DataVisualizationDataPoint,
2067
+ DataVisualizationDataPoint,
2068
+ DataVisualizationDataPoint,
2069
+ DataVisualizationDataPoint,
2070
+ DataVisualizationDataPoint,
2071
+ DataVisualizationDataPoint,
2072
+ DataVisualizationDataPoint,
2073
+ DataVisualizationDataPoint,
2074
+ DataVisualizationDataPoint,
2075
+ DataVisualizationDataPoint
2076
+ ] | [
2077
+ DataVisualizationDataPoint,
2078
+ DataVisualizationDataPoint,
2079
+ DataVisualizationDataPoint,
2080
+ DataVisualizationDataPoint,
2081
+ DataVisualizationDataPoint,
2082
+ DataVisualizationDataPoint,
2083
+ DataVisualizationDataPoint,
2084
+ DataVisualizationDataPoint,
2085
+ DataVisualizationDataPoint,
2086
+ DataVisualizationDataPoint,
2087
+ DataVisualizationDataPoint,
2088
+ DataVisualizationDataPoint,
2089
+ DataVisualizationDataPoint,
2090
+ DataVisualizationDataPoint,
2091
+ DataVisualizationDataPoint,
2092
+ DataVisualizationDataPoint,
2093
+ DataVisualizationDataPoint,
2094
+ DataVisualizationDataPoint,
2095
+ DataVisualizationDataPoint
2096
+ ] | [
2097
+ DataVisualizationDataPoint,
2098
+ DataVisualizationDataPoint,
2099
+ DataVisualizationDataPoint,
2100
+ DataVisualizationDataPoint,
2101
+ DataVisualizationDataPoint,
2102
+ DataVisualizationDataPoint,
2103
+ DataVisualizationDataPoint,
2104
+ DataVisualizationDataPoint,
2105
+ DataVisualizationDataPoint,
2106
+ DataVisualizationDataPoint,
2107
+ DataVisualizationDataPoint,
2108
+ DataVisualizationDataPoint,
2109
+ DataVisualizationDataPoint,
2110
+ DataVisualizationDataPoint,
2111
+ DataVisualizationDataPoint,
2112
+ DataVisualizationDataPoint,
2113
+ DataVisualizationDataPoint,
2114
+ DataVisualizationDataPoint,
2115
+ DataVisualizationDataPoint,
2116
+ DataVisualizationDataPoint
2117
+ ];
2118
+ }
2119
+ /**
2120
+ * A single point in a chart series: an x-axis label and its numeric value. The label must match one of axis_config.categories (enforced via checkDataVisualizationConsistency). Negative values are permitted — line/bar/area charts render against a zero baseline.
2121
+ */
2122
+ export interface DataVisualizationDataPoint {
2123
+ label: string;
2124
+ value: number;
2125
+ }
2126
+ /**
2127
+ * Axis configuration for cartesian (line/bar/area) charts. categories define the valid x-axis labels and their left-to-right display order.
2128
+ */
2129
+ export interface DataVisualizationAxisConfig {
2130
+ categories: string[];
2131
+ x_label?: string;
2132
+ y_label?: string;
2133
+ }
2134
+ /**
2135
+ * A single slice of a pie chart. value must be greater than 0; Slack derives the displayed percentage from each segment's value as a share of the total.
2136
+ */
2137
+ export interface DataVisualizationSegment {
2138
+ label: string;
2139
+ value: number;
2140
+ }
2141
+ /**
2142
+ * block_id is ignored on markdown blocks. Cumulative 12,000-char limit across all markdown blocks in one payload is a payload-level rule, not enforced here.
2143
+ */
2144
+ export interface MarkdownBlock {
2145
+ type: "markdown";
2146
+ text: string;
2147
+ block_id?: BlockId;
2148
+ }
2149
+ export interface PlanBlock {
2150
+ type: "plan";
2151
+ title: string | PlainTextObject;
2152
+ block_id?: BlockId;
2153
+ tasks?: TaskCardInlineObject[];
2154
+ }
2155
+ /**
2156
+ * A task card as it appears inline within a plan_block tasks array — the docs' example omits the type discriminator.
2157
+ */
2158
+ export interface TaskCardInlineObject {
2159
+ type?: "task_card";
2160
+ task_id: string;
2161
+ title: string;
2162
+ details?: RichTextBlock;
2163
+ output?: RichTextBlock;
2164
+ sources?: UrlSourceElement[];
2165
+ status?: "pending" | "in_progress" | "complete" | "error";
2166
+ block_id?: BlockId;
2167
+ }
2168
+ /**
2169
+ * URL source element — only valid inside a task_card block's sources array.
2170
+ */
2171
+ export interface UrlSourceElement {
2172
+ type: "url";
2173
+ url: string;
2174
+ text: string;
2175
+ }
2176
+ /**
2177
+ * Standalone task_card block (also embeddable inline within plan_block).
2178
+ */
2179
+ export interface TaskCardBlock {
2180
+ type: "task_card";
2181
+ task_id: string;
2182
+ title: string;
2183
+ details?: RichTextBlock;
2184
+ output?: RichTextBlock;
2185
+ sources?: UrlSourceElement[];
2186
+ status?: "pending" | "in_progress" | "complete" | "error";
2187
+ block_id?: BlockId;
2188
+ }
1785
2189
  /**
1786
2190
  * Modal view surface (views.open / views.push / views.update payload). title/submit/close text capped at 24 chars. When blocks contain any input block, submit is required (per docs).
1787
2191
  */