@assistant-ui/react-generative-ui 0.0.21 → 0.0.22

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.
Files changed (189) hide show
  1. package/LICENSE +1 -1
  2. package/dist/JSONGenerativeUI.client.d.ts.map +1 -1
  3. package/dist/JSONGenerativeUI.client.js +30 -13
  4. package/dist/JSONGenerativeUI.client.js.map +1 -1
  5. package/dist/RadioGroupScope.d.ts +6 -0
  6. package/dist/RadioGroupScope.d.ts.map +1 -0
  7. package/dist/RadioGroupScope.js +25 -0
  8. package/dist/RadioGroupScope.js.map +1 -0
  9. package/dist/a2ui/BindingContext.d.ts +11 -0
  10. package/dist/a2ui/BindingContext.d.ts.map +1 -0
  11. package/dist/a2ui/BindingContext.js +12 -0
  12. package/dist/a2ui/BindingContext.js.map +1 -0
  13. package/dist/a2ui/PresentRenderer.d.ts +11 -0
  14. package/dist/a2ui/PresentRenderer.d.ts.map +1 -0
  15. package/dist/a2ui/PresentRenderer.js +39 -0
  16. package/dist/a2ui/PresentRenderer.js.map +1 -0
  17. package/dist/a2ui/convert.d.ts +6 -0
  18. package/dist/a2ui/convert.d.ts.map +1 -1
  19. package/dist/a2ui/convert.js +344 -83
  20. package/dist/a2ui/convert.js.map +1 -1
  21. package/dist/a2ui/dataModel.d.ts +9 -0
  22. package/dist/a2ui/dataModel.d.ts.map +1 -0
  23. package/dist/a2ui/dataModel.js +44 -0
  24. package/dist/a2ui/dataModel.js.map +1 -0
  25. package/dist/a2ui/reducer.d.ts +5 -0
  26. package/dist/a2ui/reducer.d.ts.map +1 -1
  27. package/dist/a2ui/reducer.js +3 -3
  28. package/dist/a2ui/reducer.js.map +1 -1
  29. package/dist/a2ui/types.d.ts +8 -2
  30. package/dist/a2ui/types.d.ts.map +1 -1
  31. package/dist/a2ui/types.js.map +1 -1
  32. package/dist/a2ui/valueFunctions.d.ts +16 -0
  33. package/dist/a2ui/valueFunctions.d.ts.map +1 -0
  34. package/dist/a2ui/valueFunctions.js +332 -0
  35. package/dist/a2ui/valueFunctions.js.map +1 -0
  36. package/dist/actionRegistry.d.ts +1 -1
  37. package/dist/actionRegistry.js.map +1 -1
  38. package/dist/answeredValues.d.ts +16 -0
  39. package/dist/answeredValues.d.ts.map +1 -0
  40. package/dist/answeredValues.js +37 -0
  41. package/dist/answeredValues.js.map +1 -0
  42. package/dist/constants.d.ts +2 -0
  43. package/dist/constants.d.ts.map +1 -1
  44. package/dist/constants.js +3 -1
  45. package/dist/constants.js.map +1 -1
  46. package/dist/fieldReferences.d.ts +9 -0
  47. package/dist/fieldReferences.d.ts.map +1 -0
  48. package/dist/fieldReferences.js +53 -0
  49. package/dist/fieldReferences.js.map +1 -0
  50. package/dist/generativeUIToJSX.js +3 -3
  51. package/dist/generativeUIToJSX.js.map +1 -1
  52. package/dist/index.js +2 -2
  53. package/dist/index.server.js +2 -2
  54. package/dist/index.shared.js +2 -2
  55. package/dist/ir.d.ts +1 -1
  56. package/dist/ir.js.map +1 -1
  57. package/dist/renderGenerativeUI.d.ts.map +1 -1
  58. package/dist/renderGenerativeUI.js +12 -1
  59. package/dist/renderGenerativeUI.js.map +1 -1
  60. package/dist/slack/constants.d.ts +2 -0
  61. package/dist/slack/constants.d.ts.map +1 -1
  62. package/dist/slack/constants.js +3 -1
  63. package/dist/slack/constants.js.map +1 -1
  64. package/dist/slack/decodeBlockAction.d.ts +3 -1
  65. package/dist/slack/decodeBlockAction.d.ts.map +1 -1
  66. package/dist/slack/decodeBlockAction.js +58 -7
  67. package/dist/slack/decodeBlockAction.js.map +1 -1
  68. package/dist/slack/fromSlackBlocks.d.ts.map +1 -1
  69. package/dist/slack/fromSlackBlocks.js +20 -3
  70. package/dist/slack/fromSlackBlocks.js.map +1 -1
  71. package/dist/slack/toSlackBlocks.d.ts.map +1 -1
  72. package/dist/slack/toSlackBlocks.js +187 -19
  73. package/dist/slack/toSlackBlocks.js.map +1 -1
  74. package/dist/slack/types.d.ts +4 -0
  75. package/dist/slack/types.d.ts.map +1 -1
  76. package/dist/teams/constants.d.ts +1 -1
  77. package/dist/teams/constants.d.ts.map +1 -1
  78. package/dist/teams/constants.js +1 -1
  79. package/dist/teams/constants.js.map +1 -1
  80. package/dist/teams/decodeSubmitData.d.ts +4 -0
  81. package/dist/teams/decodeSubmitData.d.ts.map +1 -1
  82. package/dist/teams/decodeSubmitData.js +6 -1
  83. package/dist/teams/decodeSubmitData.js.map +1 -1
  84. package/dist/teams/toAdaptiveCard.d.ts +5 -4
  85. package/dist/teams/toAdaptiveCard.d.ts.map +1 -1
  86. package/dist/teams/toAdaptiveCard.js +56 -17
  87. package/dist/teams/toAdaptiveCard.js.map +1 -1
  88. package/dist/teams/types.d.ts +4 -1
  89. package/dist/teams/types.d.ts.map +1 -1
  90. package/dist/vocabulary/alert.d.ts +9 -2
  91. package/dist/vocabulary/alert.d.ts.map +1 -1
  92. package/dist/vocabulary/alert.js +116 -19
  93. package/dist/vocabulary/alert.js.map +1 -1
  94. package/dist/vocabulary/collectFormValues.d.ts +2 -1
  95. package/dist/vocabulary/collectFormValues.d.ts.map +1 -1
  96. package/dist/vocabulary/collectFormValues.js +10 -3
  97. package/dist/vocabulary/collectFormValues.js.map +1 -1
  98. package/dist/vocabulary/data.d.ts +22 -5
  99. package/dist/vocabulary/data.d.ts.map +1 -1
  100. package/dist/vocabulary/data.js +278 -83
  101. package/dist/vocabulary/data.js.map +1 -1
  102. package/dist/vocabulary/dispatch.d.ts +3 -2
  103. package/dist/vocabulary/dispatch.d.ts.map +1 -1
  104. package/dist/vocabulary/dispatch.js +33 -4
  105. package/dist/vocabulary/dispatch.js.map +1 -1
  106. package/dist/vocabulary/fact.d.ts +8 -1
  107. package/dist/vocabulary/fact.d.ts.map +1 -1
  108. package/dist/vocabulary/fact.js +37 -11
  109. package/dist/vocabulary/fact.js.map +1 -1
  110. package/dist/vocabulary/form.d.ts.map +1 -1
  111. package/dist/vocabulary/form.js +3 -3
  112. package/dist/vocabulary/form.js.map +1 -1
  113. package/dist/vocabulary/formatValue.d.ts +7 -0
  114. package/dist/vocabulary/formatValue.d.ts.map +1 -0
  115. package/dist/vocabulary/formatValue.js +76 -0
  116. package/dist/vocabulary/formatValue.js.map +1 -0
  117. package/dist/vocabulary/icon.d.ts +1 -1
  118. package/dist/vocabulary/interactive.d.ts +137 -8
  119. package/dist/vocabulary/interactive.d.ts.map +1 -1
  120. package/dist/vocabulary/interactive.js +404 -103
  121. package/dist/vocabulary/interactive.js.map +1 -1
  122. package/dist/vocabulary/layout.d.ts.map +1 -1
  123. package/dist/vocabulary/layout.js +4 -4
  124. package/dist/vocabulary/layout.js.map +1 -1
  125. package/dist/vocabulary/list.js +2 -2
  126. package/dist/vocabulary/list.js.map +1 -1
  127. package/dist/vocabulary/text.d.ts +1 -1
  128. package/package.json +6 -3
  129. package/src/JSONGenerativeUI.client.tsx +84 -40
  130. package/src/JSONGenerativeUI.test.tsx +964 -68
  131. package/src/RadioGroupScope.server.test.tsx +24 -0
  132. package/src/RadioGroupScope.tsx +34 -0
  133. package/src/a2ui/BindingContext.ts +26 -0
  134. package/src/a2ui/PresentRenderer.tsx +83 -0
  135. package/src/a2ui/convert.test.ts +1795 -179
  136. package/src/a2ui/convert.ts +629 -132
  137. package/src/a2ui/dataModel.ts +69 -0
  138. package/src/a2ui/reducer.test.ts +35 -0
  139. package/src/a2ui/reducer.ts +5 -4
  140. package/src/a2ui/types.ts +9 -2
  141. package/src/a2ui/valueFunctions.test.ts +271 -0
  142. package/src/a2ui/valueFunctions.ts +523 -0
  143. package/src/actionRegistry.ts +1 -1
  144. package/src/answeredValues.test.ts +33 -0
  145. package/src/answeredValues.tsx +70 -0
  146. package/src/constants.ts +4 -0
  147. package/src/fieldReferences.test.ts +66 -0
  148. package/src/fieldReferences.ts +83 -0
  149. package/src/generativeUIToJSX.test.ts +18 -0
  150. package/src/generativeUIToJSX.ts +4 -6
  151. package/src/index.server.test.ts +106 -0
  152. package/src/ir.ts +1 -1
  153. package/src/renderGenerativeUI.test.tsx +14 -5
  154. package/src/renderGenerativeUI.tsx +30 -1
  155. package/src/slack/a2uiSlack.test.ts +198 -0
  156. package/src/slack/constants.ts +3 -0
  157. package/src/slack/decodeBlockAction.test.ts +98 -0
  158. package/src/slack/decodeBlockAction.ts +110 -17
  159. package/src/slack/fromSlackBlocks.test.ts +222 -3
  160. package/src/slack/fromSlackBlocks.ts +53 -2
  161. package/src/slack/toSlackBlocks.test.ts +682 -3
  162. package/src/slack/toSlackBlocks.ts +374 -23
  163. package/src/slack/types.ts +4 -0
  164. package/src/teams/constants.ts +1 -1
  165. package/src/teams/decodeSubmitData.test.ts +33 -0
  166. package/src/teams/decodeSubmitData.ts +9 -1
  167. package/src/teams/toAdaptiveCard.test.ts +219 -0
  168. package/src/teams/toAdaptiveCard.ts +93 -19
  169. package/src/teams/types.ts +4 -1
  170. package/src/vocabulary/alert.test.tsx +288 -7
  171. package/src/vocabulary/alert.tsx +168 -26
  172. package/src/vocabulary/collectFormValues.test.ts +28 -1
  173. package/src/vocabulary/collectFormValues.ts +25 -5
  174. package/src/vocabulary/data.test.tsx +248 -6
  175. package/src/vocabulary/data.tsx +398 -100
  176. package/src/vocabulary/dispatch.ts +63 -2
  177. package/src/vocabulary/fact.test.tsx +67 -0
  178. package/src/vocabulary/fact.tsx +40 -9
  179. package/src/vocabulary/form.tsx +7 -2
  180. package/src/vocabulary/formatValue.test.ts +72 -0
  181. package/src/vocabulary/formatValue.ts +127 -0
  182. package/src/vocabulary/index.test.ts +2 -0
  183. package/src/vocabulary/interactive.dispatch.test.tsx +167 -79
  184. package/src/vocabulary/interactive.dom.test.tsx +1699 -0
  185. package/src/vocabulary/interactive.test.tsx +60 -4
  186. package/src/vocabulary/interactive.tsx +770 -151
  187. package/src/vocabulary/layout.test.tsx +6 -4
  188. package/src/vocabulary/layout.tsx +13 -2
  189. package/src/vocabulary/list.tsx +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"toSlackBlocks.js","names":[],"sources":["../../src/slack/toSlackBlocks.ts"],"sourcesContent":["import {\n MAX_TRAVERSAL_DEPTH,\n boundSpec,\n clampReasonDetail,\n} from \"../convert/boundSpec\";\nimport { copyBounded } from \"../convert/copyBounded\";\nimport { isElement } from \"../convert/isElement\";\nimport { takeRun } from \"../convert/takeRun\";\nimport {\n normalizeSpec,\n type NormalizedUIElement,\n type NormalizedUINode,\n} from \"../ir\";\nimport {\n ACTION_ID_CAP,\n ACTIONS_ELEMENT_CAP,\n ALERT_TEXT_CAP,\n BUTTON_VALUE_CAP,\n CARD_ACTIONS_CAP,\n CARD_BODY_CAP,\n CARD_SUBTEXT_CAP,\n CARD_TITLE_CAP,\n CAROUSEL_CARD_CAP,\n CAROUSEL_CARD_MIN,\n CONTEXT_ELEMENT_CAP,\n CONTEXT_TEXT_CAP,\n DATA_TABLE_CHAR_BUDGET,\n DATA_TABLE_COLUMN_CAP,\n DATA_TABLE_ROW_CAP,\n FACT_FIELD_CAP,\n FACT_FIELD_TEXT_CAP,\n HEADER_TEXT_CAP,\n INPUT_LABEL_CAP,\n INTERACTIVE_TEXT_CAP,\n MARKDOWN_TEXT_BUDGET,\n MESSAGE_BLOCK_CAP,\n MODAL_BLOCK_CAP,\n PLACEHOLDER_TEXT_CAP,\n RADIO_OPTION_CAP,\n SECTION_TEXT_CAP,\n SELECT_OPTION_CAP,\n buildAlertBlock,\n buildAlertFallback,\n buildBlockBudgetNote,\n buildCardBlock,\n buildCarouselBlock,\n buildDataTableBlock,\n} from \"./constants\";\nimport type {\n SlackActionElement,\n SlackBlock,\n SlackButtonElement,\n SlackCardBlock,\n SlackConversionWarning,\n SlackDataTableCell,\n SlackImageBlock,\n SlackOption,\n SlackPlainText,\n SlackTextObject,\n SlackBlocksResult,\n ToSlackBlocksOptions,\n} from \"./types\";\n\ntype ConversionContext = {\n readonly blockCap: number;\n readonly surface: \"message\" | \"modal\";\n readonly warnings: SlackConversionWarning[];\n markdownCharacters: number;\n markdownExhausted: boolean;\n dataTableCharacters: number;\n};\n\nconst INTERACTIVE_TYPES = new Set([\n \"Button\",\n \"Select\",\n \"DatePicker\",\n \"Checkbox\",\n \"RadioGroup\",\n]);\n\n/**\n * Types whose control disappears when a card is reshaped to text. `Input` and\n * `Form` are not in {@link INTERACTIVE_TYPES} because they emit their own\n * block rather than an actions element, but a reshape loses them the same way,\n * and a `Form` gets a Submit button whether or not it carries an action.\n */\nconst CONTROL_TYPES = new Set([...INTERACTIVE_TYPES, \"Input\", \"Form\"]);\n\nconst DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst asString = (value: unknown): string =>\n typeof value === \"string\" ? value : \"\";\n\nconst warn = (\n context: ConversionContext,\n code: SlackConversionWarning[\"code\"],\n component: string,\n detail: string,\n) => {\n context.warnings.push({ code, component, detail });\n};\n\nconst clampText = (\n value: string,\n cap: number,\n component: string,\n field: string,\n context: ConversionContext,\n): string => {\n if (value.length <= cap) return value;\n warn(\n context,\n \"clamped\",\n component,\n `${field} was clamped to ${cap} characters.`,\n );\n return value.slice(0, cap);\n};\n\nconst asActionId = (\n action: unknown,\n component: string,\n context: ConversionContext,\n): string =>\n clampText(\n isRecord(action) && typeof action[\"type\"] === \"string\"\n ? action[\"type\"]\n : \"action\",\n ACTION_ID_CAP,\n component,\n \"action_id\",\n context,\n );\n\nconst plainText = (text: string): SlackPlainText => ({\n type: \"plain_text\",\n text,\n});\n\nconst actionValue = (action: unknown): string | undefined => {\n if (!isRecord(action)) return undefined;\n const { type: _type, ...payload } = action;\n if (Object.keys(payload).length === 0) return undefined;\n try {\n const serialized = JSON.stringify(payload);\n return serialized === \"{}\" ? undefined : serialized;\n } catch {\n return undefined;\n }\n};\n\nconst buttonElement = (\n label: string,\n buttonStyle: unknown,\n action: unknown,\n component: string,\n context: ConversionContext,\n): SlackButtonElement => {\n const serializedValue = actionValue(action);\n let value = serializedValue;\n if (value !== undefined && value.length > BUTTON_VALUE_CAP) {\n warn(\n context,\n \"dropped\",\n component,\n \"value was dropped because the action payload was too large to round-trip.\",\n );\n value = undefined;\n }\n const style =\n buttonStyle === \"primary\" || buttonStyle === \"danger\"\n ? buttonStyle\n : undefined;\n return {\n type: \"button\",\n text: plainText(\n clampText(label, INTERACTIVE_TEXT_CAP, component, \"label\", context),\n ),\n action_id: asActionId(action, component, context),\n ...(value !== undefined ? { value } : {}),\n ...(style !== undefined ? { style } : {}),\n };\n};\n\nconst optionFrom = (\n value: unknown,\n component: string,\n context: ConversionContext,\n): SlackOption | undefined => {\n if (\n !isRecord(value) ||\n typeof value[\"label\"] !== \"string\" ||\n typeof value[\"value\"] !== \"string\"\n ) {\n return undefined;\n }\n return {\n text: plainText(\n clampText(\n value[\"label\"],\n INTERACTIVE_TEXT_CAP,\n component,\n \"option label\",\n context,\n ),\n ),\n value: value[\"value\"],\n };\n};\n\nconst warnDroppedOptions = (\n kept: number,\n taken: number,\n component: string,\n context: ConversionContext,\n) => {\n const dropped = taken - kept;\n if (dropped === 0) return;\n warn(\n context,\n \"dropped\",\n component,\n `${dropped} ${dropped === 1 ? \"option was\" : \"options were\"} dropped for want of a string label and value.`,\n );\n};\n\nconst toActionElement = (\n element: NormalizedUIElement,\n context: ConversionContext,\n): SlackActionElement | undefined => {\n const { props, action } = element;\n switch (element.type) {\n case \"Button\":\n return buttonElement(\n asString(props[\"label\"]),\n props[\"buttonStyle\"],\n action,\n \"Button\",\n context,\n );\n case \"Select\": {\n const rawOptions = Array.isArray(props[\"options\"])\n ? props[\"options\"]\n : [];\n const { items: takenOptions, truncated } = copyBounded(\n rawOptions,\n SELECT_OPTION_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"Select\",\n `options were clamped to ${SELECT_OPTION_CAP} entries.`,\n );\n }\n const options = takenOptions\n .map((option) => optionFrom(option, \"Select\", context))\n .filter((option): option is SlackOption => option !== undefined);\n warnDroppedOptions(\n options.length,\n takenOptions.length,\n \"Select\",\n context,\n );\n const placeholder = clampText(\n asString(props[\"placeholder\"]),\n PLACEHOLDER_TEXT_CAP,\n \"Select\",\n \"placeholder\",\n context,\n );\n return {\n type: \"static_select\",\n action_id: asActionId(action, \"Select\", context),\n options,\n ...(placeholder ? { placeholder: plainText(placeholder) } : {}),\n };\n }\n case \"DatePicker\": {\n const rawDate = asString(props[\"value\"]);\n const initialDate = DATE_PATTERN.test(rawDate) ? rawDate : undefined;\n if (rawDate && initialDate === undefined) {\n warn(\n context,\n \"dropped\",\n \"DatePicker\",\n \"value did not match the YYYY-MM-DD format and was dropped.\",\n );\n }\n return {\n type: \"datepicker\",\n action_id: asActionId(action, \"DatePicker\", context),\n ...(initialDate !== undefined ? { initial_date: initialDate } : {}),\n };\n }\n case \"Checkbox\": {\n const label = clampText(\n asString(props[\"label\"]),\n INTERACTIVE_TEXT_CAP,\n \"Checkbox\",\n \"label\",\n context,\n );\n const name = asString(props[\"name\"]);\n const option: SlackOption = {\n text: plainText(label),\n value: name || label,\n };\n return {\n type: \"checkboxes\",\n action_id: asActionId(action, \"Checkbox\", context),\n options: [option],\n ...(props[\"defaultChecked\"] === true\n ? { initial_options: [option] }\n : {}),\n };\n }\n case \"RadioGroup\": {\n const rawOptions = Array.isArray(props[\"options\"])\n ? props[\"options\"]\n : [];\n const { items: takenOptions, truncated } = copyBounded(\n rawOptions,\n RADIO_OPTION_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"RadioGroup\",\n `options were clamped to ${RADIO_OPTION_CAP} entries.`,\n );\n }\n const options = takenOptions\n .map((option) => optionFrom(option, \"RadioGroup\", context))\n .filter((option): option is SlackOption => option !== undefined);\n warnDroppedOptions(\n options.length,\n takenOptions.length,\n \"RadioGroup\",\n context,\n );\n const selectedValue =\n typeof props[\"value\"] === \"string\"\n ? props[\"value\"]\n : asString(props[\"defaultValue\"]);\n const initialOption = options.find(\n (option) => option.value === selectedValue,\n );\n return {\n type: \"radio_buttons\",\n action_id: asActionId(action, \"RadioGroup\", context),\n options,\n ...(initialOption !== undefined\n ? { initial_option: initialOption }\n : {}),\n };\n }\n default:\n return undefined;\n }\n};\n\nconst normalizedList = (\n node: NormalizedUINode | undefined,\n): NormalizedUINode[] => {\n if (node === undefined || node === null) return [];\n if (!Array.isArray(node)) return [node];\n return node.flatMap((child) => normalizedList(child));\n};\n\nconst convertFacts = (\n facts: readonly NormalizedUIElement[],\n context: ConversionContext,\n): SlackBlock[] => {\n const fields = facts.map((fact) => {\n const label = asString(fact.props[\"label\"]);\n const value = asString(fact.props[\"value\"]);\n return {\n type: \"mrkdwn\" as const,\n text: clampText(\n `*${label}*\\n${value}`,\n FACT_FIELD_TEXT_CAP,\n \"Fact\",\n \"field\",\n context,\n ),\n };\n });\n const blocks: SlackBlock[] = [];\n for (let index = 0; index < fields.length; index += FACT_FIELD_CAP) {\n blocks.push({\n type: \"section\",\n fields: fields.slice(index, index + FACT_FIELD_CAP),\n });\n }\n return blocks;\n};\n\nconst convertActions = (\n elements: readonly NormalizedUIElement[],\n context: ConversionContext,\n): SlackBlock[] => {\n const converted = elements\n .map((element) => toActionElement(element, context))\n .filter((element): element is SlackActionElement => element !== undefined);\n const blocks: SlackBlock[] = [];\n for (let index = 0; index < converted.length; index += ACTIONS_ELEMENT_CAP) {\n blocks.push({\n type: \"actions\",\n elements: converted.slice(index, index + ACTIONS_ELEMENT_CAP),\n });\n }\n return blocks;\n};\n\nconst cardActionButtons = (\n props: Readonly<Record<string, unknown>>,\n context: ConversionContext,\n): SlackButtonElement[] => {\n const buttons: SlackButtonElement[] = [];\n for (const key of [\"confirm\", \"cancel\"] as const) {\n const footer = props[key];\n if (!isRecord(footer)) continue;\n buttons.push(\n buttonElement(\n asString(footer[\"label\"]),\n key === \"confirm\" ? \"primary\" : undefined,\n footer[\"$action\"],\n \"Card\",\n context,\n ),\n );\n }\n return buttons;\n};\n\nconst cardTitleText = (\n props: Readonly<Record<string, unknown>>,\n context: ConversionContext,\n): string | undefined => {\n const rawTitle = asString(props[\"title\"]);\n return rawTitle\n ? clampText(rawTitle, CARD_TITLE_CAP, \"Card\", \"title\", context)\n : undefined;\n};\n\nconst isCardNoOp = (node: NormalizedUINode): boolean =>\n isElement(node) && (node.type === \"Spacer\" || node.type === \"Icon\");\n\nconst collectText = (\n node: NormalizedUINode | undefined,\n depth: number,\n): string[] => {\n if (node === undefined || node === null || depth > MAX_TRAVERSAL_DEPTH) {\n return [];\n }\n if (typeof node === \"string\" || typeof node === \"number\") {\n return [String(node)];\n }\n if (Array.isArray(node)) {\n return node.flatMap((child) => collectText(child, depth + 1));\n }\n const element = node as NormalizedUIElement;\n const own = [\"text\", \"value\", \"label\", \"title\", \"description\"]\n .map((key) => element.props[key])\n .filter((value): value is string => typeof value === \"string\");\n return [...own, ...collectText(element.children, depth + 1)];\n};\n\ntype CardFields = {\n readonly heroImage: SlackImageBlock | undefined;\n readonly bodyRaw: string | undefined;\n readonly subtextRaw: string | undefined;\n readonly leftover: readonly NormalizedUINode[];\n};\n\n/**\n * Scans a card's children for the pieces the native card block shape can\n * carry (a hero image, body text, and subtext), each taken from the first\n * matching child. Anything left over means the card cannot map cleanly onto\n * the native shape.\n */\nconst extractCardFields = (element: NormalizedUIElement): CardFields => {\n const children = normalizedList(element.children);\n let heroImage: SlackImageBlock | undefined;\n let bodyRaw: string | undefined;\n let subtextRaw: string | undefined;\n const leftover: NormalizedUINode[] = [];\n for (const child of children) {\n if (heroImage === undefined && isElement(child) && child.type === \"Image\") {\n heroImage = {\n type: \"image\",\n image_url: asString(child.props[\"src\"]),\n alt_text: asString(child.props[\"alt\"]),\n };\n continue;\n }\n if (\n bodyRaw === undefined &&\n isElement(child) &&\n (child.type === \"Text\" || child.type === \"Markdown\")\n ) {\n bodyRaw = asString(child.props[\"value\"]);\n continue;\n }\n if (\n subtextRaw === undefined &&\n isElement(child) &&\n child.type === \"Caption\"\n ) {\n subtextRaw = asString(child.props[\"value\"]);\n continue;\n }\n if (isCardNoOp(child)) continue;\n leftover.push(child);\n }\n return { heroImage, bodyRaw, subtextRaw, leftover };\n};\n\n/** Assembles a native card block, clamping its body and subtext text. */\nconst assembleCleanCard = (\n titleText: string | undefined,\n fields: CardFields,\n buttons: readonly SlackButtonElement[],\n context: ConversionContext,\n): SlackCardBlock => {\n const body: SlackTextObject | undefined =\n fields.bodyRaw !== undefined\n ? {\n type: \"mrkdwn\",\n text: clampText(\n fields.bodyRaw,\n CARD_BODY_CAP,\n \"Card\",\n \"body\",\n context,\n ),\n }\n : undefined;\n const subtext: SlackTextObject | undefined =\n fields.subtextRaw !== undefined\n ? {\n type: \"mrkdwn\",\n text: clampText(\n fields.subtextRaw,\n CARD_SUBTEXT_CAP,\n \"Card\",\n \"subtext\",\n context,\n ),\n }\n : undefined;\n const { items: boundedButtons, truncated } = copyBounded(\n buttons,\n CARD_ACTIONS_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"Card\",\n `actions were clamped to ${CARD_ACTIONS_CAP} entries.`,\n );\n }\n return buildCardBlock({\n ...(fields.heroImage !== undefined ? { heroImage: fields.heroImage } : {}),\n ...(titleText !== undefined\n ? { title: { type: \"mrkdwn\", text: titleText } }\n : {}),\n ...(body !== undefined ? { body } : {}),\n ...(subtext !== undefined ? { subtext } : {}),\n ...(boundedButtons.length > 0 ? { actions: boundedButtons } : {}),\n });\n};\n\n/**\n * A card requires at least one of `hero_image`, `title`, `body`, or `actions`\n * (see {@link SlackCardBlock}); a card with none of them is not a valid\n * native block and must be dropped instead of emitted.\n */\nconst isEmptyCard = (card: SlackCardBlock): boolean =>\n card.hero_image === undefined &&\n card.title === undefined &&\n card.body === undefined &&\n (card.actions === undefined || card.actions.length === 0);\n\nconst convertCard = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] => {\n const titleText = cardTitleText(element.props, context);\n const fields = extractCardFields(element);\n const buttons = cardActionButtons(element.props, context);\n\n if (fields.leftover.length > 0) {\n warn(\n context,\n \"fallback\",\n \"Card\",\n \"A card with content beyond hero_image, body, subtext, and actions was rendered inline.\",\n );\n return [\n ...(titleText\n ? [{ type: \"header\" as const, text: plainText(titleText) }]\n : []),\n ...convertSequence(element.children, context, depth + 1),\n ...(buttons.length > 0\n ? [{ type: \"actions\" as const, elements: buttons }]\n : []),\n ];\n }\n const card = assembleCleanCard(titleText, fields, buttons, context);\n if (isEmptyCard(card)) {\n warn(\n context,\n \"dropped\",\n \"Card\",\n \"A card with none of hero_image, title, body, or actions was dropped.\",\n );\n return [];\n }\n return [card];\n};\n\n/** The content kinds a reshaped carousel card cannot carry, in report order. */\nconst LOST_CONTENT_KINDS = [\"images\", \"tables\", \"charts\", \"controls\"] as const;\n\nconst listPhrase = (items: readonly string[]): string =>\n items.length <= 1\n ? (items[0] ?? \"\")\n : `${items.slice(0, -1).join(\", \")} and ${items[items.length - 1]}`;\n\n/**\n * Collects the kinds of content a reshape drops, walking the same tree\n * {@link collectText} does so a node nested below the top level counts too.\n * These are exactly the pieces text cannot represent: an image has no text, a\n * table and a chart carry theirs in array props, and a control is behavior,\n * whether or not it carries an action of its own. An `$action` counts only on\n * a node that renders a control from it, since a `Box` or a `Row` carrying one\n * renders no control on the clean path either.\n */\nconst scanLostContent = (\n node: NormalizedUINode | undefined,\n into: Set<string>,\n depth: number,\n): void => {\n if (depth > MAX_TRAVERSAL_DEPTH) return;\n if (Array.isArray(node)) {\n for (const child of node) scanLostContent(child, into, depth + 1);\n return;\n }\n if (node === undefined || !isElement(node)) return;\n if (\n CONTROL_TYPES.has(node.type) ||\n (node.type === \"ListViewItem\" && isRecord(node.action)) ||\n (node.type === \"Card\" &&\n (isRecord(node.props[\"confirm\"]) || isRecord(node.props[\"cancel\"])))\n ) {\n into.add(\"controls\");\n }\n if (node.type === \"Image\") into.add(\"images\");\n if (node.type === \"Table\") into.add(\"tables\");\n if (node.type === \"Chart\") into.add(\"charts\");\n scanLostContent(node.children, into, depth + 1);\n};\n\n/**\n * Degrades a card that cannot map cleanly into a title-and-body card block.\n * A carousel cannot fall back to a block sequence like a standalone card can,\n * so the card is reshaped to the two text fields the block has. Text reachable\n * by {@link collectText} survives at any depth; an image, a table, a chart,\n * and a control do not, and are reported separately from the reshape itself.\n */\nconst degradeCard = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackCardBlock => {\n const rawTitle = asString(element.props[\"title\"]);\n const textChunks = collectText(element.children, depth + 1);\n const titleSource = rawTitle || textChunks[0] || \"\";\n const bodyChunks = rawTitle ? textChunks : textChunks.slice(1);\n const titleText = clampText(\n titleSource,\n CARD_TITLE_CAP,\n \"Card\",\n \"title\",\n context,\n );\n const bodyText = clampText(\n bodyChunks.join(\"\\n\"),\n CARD_BODY_CAP,\n \"Card\",\n \"body\",\n context,\n );\n warn(\n context,\n \"fallback\",\n \"Card\",\n \"A card inside a carousel was reshaped to title and body.\",\n );\n const lostKinds = new Set<string>();\n if (isRecord(element.props[\"confirm\"]) || isRecord(element.props[\"cancel\"])) {\n lostKinds.add(\"controls\");\n }\n scanLostContent(element.children, lostKinds, depth + 1);\n const lost = LOST_CONTENT_KINDS.filter((kind) => lostKinds.has(kind));\n if (lost.length > 0) {\n warn(\n context,\n \"dropped\",\n \"Card\",\n `A reshaped carousel card's ${listPhrase(lost)} were dropped.`,\n );\n }\n return buildCardBlock({\n ...(titleText ? { title: { type: \"mrkdwn\", text: titleText } } : {}),\n ...(bodyText ? { body: { type: \"mrkdwn\", text: bodyText } } : {}),\n });\n};\n\nconst convertCarouselCard = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackCardBlock | undefined => {\n const fields = extractCardFields(element);\n const card =\n fields.leftover.length === 0\n ? assembleCleanCard(\n cardTitleText(element.props, context),\n fields,\n cardActionButtons(element.props, context),\n context,\n )\n : degradeCard(element, context, depth);\n if (isEmptyCard(card)) {\n warn(\n context,\n \"dropped\",\n \"Card\",\n \"A card with none of hero_image, title, body, or actions was dropped.\",\n );\n return undefined;\n }\n return card;\n};\n\nconst isBadgeOrCaption = (\n node: NormalizedUINode,\n): node is NormalizedUIElement =>\n isElement(node) && (node.type === \"Badge\" || node.type === \"Caption\");\n\nconst contextRow = (\n element: NormalizedUIElement,\n context: ConversionContext,\n): SlackBlock[] | undefined => {\n const allChildren = normalizedList(element.children);\n const children = allChildren.filter(isBadgeOrCaption);\n if (allChildren.length === 0 || children.length !== allChildren.length) {\n return undefined;\n }\n const { items: boundedChildren, truncated } = copyBounded(\n children,\n CONTEXT_ELEMENT_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"Row\",\n `context elements were clamped to ${CONTEXT_ELEMENT_CAP} entries.`,\n );\n }\n return [\n {\n type: \"context\",\n elements: boundedChildren.map((child) => ({\n type: \"mrkdwn\",\n text: clampText(\n asString(child.props[\"value\"]),\n CONTEXT_TEXT_CAP,\n child.type,\n \"value\",\n context,\n ),\n })),\n },\n ];\n};\n\nconst convertListItem = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock => {\n const text = clampText(\n collectText(element.children, depth + 1).join(\"\\n\"),\n SECTION_TEXT_CAP,\n \"ListViewItem\",\n \"text\",\n context,\n );\n const accessory = isRecord(element.action)\n ? buttonElement(\"Open\", undefined, element.action, \"ListViewItem\", context)\n : undefined;\n return {\n type: \"section\",\n text: { type: \"mrkdwn\", text },\n ...(accessory !== undefined ? { accessory } : {}),\n };\n};\n\n/**\n * Converts a child whose output is thrown away, and reports whether anything\n * was lost with it. A scratch context keeps the throwaway out of the shared\n * markdown and data-table budgets that surviving blocks still need; only its\n * `dropped` warnings are forwarded, because those describe the tree the caller\n * wrote, while a clamp or a fallback would describe content never delivered.\n */\nconst discardedChild = (\n child: NormalizedUINode,\n context: ConversionContext,\n depth: number,\n): boolean => {\n const scratch: ConversionContext = { ...context, warnings: [] };\n const produced = convertSequence(child, scratch, depth).length > 0;\n const lost = scratch.warnings.filter((warning) => warning.code === \"dropped\");\n context.warnings.push(...lost);\n return produced || lost.length > 0;\n};\n\nconst convertListView = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] => {\n const items: NormalizedUIElement[] = [];\n let discarded = 0;\n for (const child of normalizedList(element.children)) {\n if (isElement(child) && child.type === \"ListViewItem\") {\n items.push(child);\n continue;\n }\n if (discardedChild(child, context, depth + 1)) discarded += 1;\n }\n if (discarded > 0) {\n warn(\n context,\n \"dropped\",\n \"ListView\",\n `${discarded} non-item ${discarded === 1 ? \"child was\" : \"children were\"} dropped.`,\n );\n }\n return items.flatMap((item, index) => [\n ...(index > 0 ? [{ type: \"divider\" as const }] : []),\n convertListItem(item, context, depth + 1),\n ]);\n};\n\nconst convertCarousel = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] => {\n const cardChildren: NormalizedUIElement[] = [];\n let droppedCards = 0;\n for (const child of normalizedList(element.children)) {\n if (isElement(child) && child.type === \"Card\") {\n cardChildren.push(child);\n continue;\n }\n if (discardedChild(child, context, depth + 1)) droppedCards += 1;\n }\n if (droppedCards > 0) {\n warn(\n context,\n \"dropped\",\n \"Carousel\",\n `${droppedCards} non-card ${droppedCards === 1 ? \"child was\" : \"children were\"} dropped.`,\n );\n }\n const { items: boundedCards, truncated } = copyBounded(\n cardChildren,\n CAROUSEL_CARD_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"Carousel\",\n `cards were clamped to ${CAROUSEL_CARD_CAP} entries.`,\n );\n }\n const cards = boundedCards\n .map((card) => convertCarouselCard(card, context, depth + 1))\n .filter((card): card is SlackCardBlock => card !== undefined);\n if (cards.length < CAROUSEL_CARD_MIN) {\n warn(\n context,\n \"dropped\",\n \"Carousel\",\n \"A carousel without renderable cards was dropped.\",\n );\n return [];\n }\n return [buildCarouselBlock(cards)];\n};\n\nconst toDataTableCell = (value: unknown): SlackDataTableCell | undefined => {\n if (typeof value === \"number\") {\n return { type: \"raw_number\", text: String(value) };\n }\n if (typeof value === \"string\" || typeof value === \"boolean\") {\n return { type: \"raw_text\", text: String(value) };\n }\n return undefined;\n};\n\nconst rowCharacters = (row: readonly SlackDataTableCell[]): number =>\n row.reduce((sum, cell) => sum + cell.text.length, 0);\n\nconst convertTable = (\n element: NormalizedUIElement,\n context: ConversionContext,\n): SlackBlock[] => {\n const rawColumns = Array.isArray(element.props[\"columns\"])\n ? element.props[\"columns\"]\n : [];\n const rawRows = Array.isArray(element.props[\"rows\"])\n ? element.props[\"rows\"]\n : [];\n const { items: takenColumns, truncated: columnsTruncated } = copyBounded(\n rawColumns,\n DATA_TABLE_COLUMN_CAP,\n );\n const { items: takenRows, truncated: rowsTruncated } = copyBounded(\n rawRows,\n DATA_TABLE_ROW_CAP,\n );\n if (columnsTruncated) {\n warn(\n context,\n \"clamped\",\n \"Table\",\n `columns were clamped to ${DATA_TABLE_COLUMN_CAP} entries.`,\n );\n }\n if (rowsTruncated) {\n warn(\n context,\n \"clamped\",\n \"Table\",\n `rows were clamped to ${DATA_TABLE_ROW_CAP} entries.`,\n );\n }\n\n const unlabeled = takenColumns.filter(\n (column) => !isRecord(column) || typeof column[\"label\"] !== \"string\",\n ).length;\n if (unlabeled > 0) {\n warn(\n context,\n \"dropped\",\n \"Table\",\n `${unlabeled} column ${unlabeled === 1 ? \"header was\" : \"headers were\"} left blank for want of a string label.`,\n );\n }\n const columnHeaderRow: SlackDataTableCell[] = takenColumns.map((column) => ({\n type: \"raw_text\" as const,\n text: isRecord(column) ? asString(column[\"label\"]) : \"\",\n }));\n const dataRows: SlackDataTableCell[][] = takenRows.map((row) =>\n (Array.isArray(row)\n ? copyBounded(row, DATA_TABLE_COLUMN_CAP).items\n : []\n ).map(\n (value) =>\n toDataTableCell(value) ?? { type: \"raw_text\" as const, text: \"\" },\n ),\n );\n const width = Math.max(\n columnHeaderRow.length,\n 0,\n ...dataRows.map((row) => row.length),\n );\n const padRow = (row: SlackDataTableCell[]): SlackDataTableCell[] =>\n row.length >= width\n ? row\n : [\n ...row,\n ...Array.from({ length: width - row.length }, () => ({\n type: \"raw_text\" as const,\n text: \"\",\n })),\n ];\n const headerRow = padRow(columnHeaderRow);\n\n const headerCharacters = rowCharacters(headerRow);\n if (context.dataTableCharacters + headerCharacters > DATA_TABLE_CHAR_BUDGET) {\n warn(\n context,\n \"dropped\",\n \"Table\",\n `the table was dropped because its header row exceeds the ${DATA_TABLE_CHAR_BUDGET}-character table budget.`,\n );\n return [];\n }\n\n const kept: SlackDataTableCell[][] = [headerRow];\n let tableCharacters = headerCharacters;\n let budgetClamped = false;\n for (const row of dataRows.map(padRow)) {\n const chars = rowCharacters(row);\n if (\n context.dataTableCharacters + tableCharacters + chars >\n DATA_TABLE_CHAR_BUDGET\n ) {\n budgetClamped = true;\n break;\n }\n kept.push(row);\n tableCharacters += chars;\n }\n context.dataTableCharacters += tableCharacters;\n if (budgetClamped) {\n warn(\n context,\n \"clamped\",\n \"Table\",\n `rows were clamped to fit the ${DATA_TABLE_CHAR_BUDGET}-character table budget.`,\n );\n }\n\n return [buildDataTableBlock(kept)];\n};\n\nconst convertElement = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] => {\n const { props } = element;\n switch (element.type) {\n case \"Header\":\n return [\n {\n type: \"header\",\n text: plainText(\n clampText(\n asString(props[\"text\"]),\n HEADER_TEXT_CAP,\n \"Header\",\n \"text\",\n context,\n ),\n ),\n },\n ];\n case \"Text\":\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampText(\n asString(props[\"value\"]),\n SECTION_TEXT_CAP,\n \"Text\",\n \"value\",\n context,\n ),\n },\n },\n ];\n case \"Caption\":\n case \"Badge\":\n return [\n {\n type: \"context\",\n elements: [\n {\n type: \"mrkdwn\",\n text: clampText(\n asString(props[\"value\"]),\n CONTEXT_TEXT_CAP,\n element.type,\n \"value\",\n context,\n ),\n },\n ],\n },\n ];\n case \"Fact\":\n return convertFacts([element], context);\n case \"Image\":\n return [\n {\n type: \"image\",\n image_url: asString(props[\"src\"]),\n alt_text: asString(props[\"alt\"]),\n },\n ];\n case \"Divider\":\n return [{ type: \"divider\" }];\n case \"Button\":\n case \"Select\":\n case \"DatePicker\":\n case \"Checkbox\":\n case \"RadioGroup\":\n return convertActions([element], context);\n case \"Input\": {\n const label = clampText(\n asString(props[\"label\"]),\n INPUT_LABEL_CAP,\n \"Input\",\n \"label\",\n context,\n );\n const placeholder = clampText(\n asString(props[\"placeholder\"]),\n PLACEHOLDER_TEXT_CAP,\n \"Input\",\n \"placeholder\",\n context,\n );\n return [\n {\n type: \"input\",\n label: plainText(label),\n element: {\n type: \"plain_text_input\",\n action_id: asActionId(element.action, \"Input\", context),\n ...(props[\"multiline\"] === true ? { multiline: true } : {}),\n ...(placeholder ? { placeholder: plainText(placeholder) } : {}),\n },\n },\n ];\n }\n case \"Alert\": {\n const tone =\n props[\"tone\"] === \"success\" ||\n props[\"tone\"] === \"warning\" ||\n props[\"tone\"] === \"danger\"\n ? props[\"tone\"]\n : \"info\";\n const titleText = asString(props[\"title\"]);\n const description = asString(props[\"description\"]);\n if (context.surface === \"modal\") {\n const combined = [titleText, description].filter(Boolean).join(\"\\n\");\n return [\n buildAlertBlock(\n clampText(combined, ALERT_TEXT_CAP, \"Alert\", \"text\", context),\n tone,\n ),\n ];\n }\n warn(\n context,\n \"fallback\",\n \"Alert\",\n \"Alert was rendered with message-surface fallback blocks.\",\n );\n return [\n ...buildAlertFallback(\n titleText,\n clampText(\n description,\n SECTION_TEXT_CAP,\n \"Alert\",\n \"description\",\n context,\n ),\n tone,\n ),\n ];\n }\n case \"Card\":\n return convertCard(element, context, depth);\n case \"Carousel\":\n return convertCarousel(element, context, depth);\n case \"Col\":\n case \"Box\":\n return convertSequence(element.children, context, depth + 1);\n case \"Row\":\n return (\n contextRow(element, context) ??\n convertSequence(element.children, context, depth + 1)\n );\n case \"Spacer\":\n case \"Icon\":\n return [];\n case \"Table\":\n return convertTable(element, context);\n case \"Markdown\": {\n const value = asString(props[\"value\"]);\n if (\n !context.markdownExhausted &&\n context.markdownCharacters + value.length <= MARKDOWN_TEXT_BUDGET\n ) {\n context.markdownCharacters += value.length;\n return [{ type: \"markdown\", text: value }];\n }\n context.markdownExhausted = true;\n warn(\n context,\n \"fallback\",\n \"Markdown\",\n `The ${MARKDOWN_TEXT_BUDGET}-character markdown budget was exceeded.`,\n );\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampText(\n value,\n SECTION_TEXT_CAP,\n \"Markdown\",\n \"fallback text\",\n context,\n ),\n },\n },\n ];\n }\n case \"Chart\":\n warn(\n context,\n \"dropped\",\n \"Chart\",\n \"Chart was replaced by a Slack omission note.\",\n );\n return [\n {\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: \"Chart omitted on Slack.\" }],\n },\n ];\n case \"ListView\":\n return convertListView(element, context, depth);\n case \"ListViewItem\":\n return [convertListItem(element, context, depth)];\n case \"Form\":\n return [\n ...convertSequence(element.children, context, depth + 1),\n {\n type: \"actions\",\n elements: [\n buttonElement(\"Submit\", \"primary\", element.action, \"Form\", context),\n ],\n },\n ];\n default:\n warn(\n context,\n \"dropped\",\n element.type,\n \"Unknown component type was dropped.\",\n );\n return [];\n }\n};\n\nfunction convertSequence(\n node: NormalizedUINode | undefined,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] {\n if (node === undefined || node === null || depth > MAX_TRAVERSAL_DEPTH) {\n return [];\n }\n const nodes = Array.isArray(node) ? node : [node];\n const blocks: SlackBlock[] = [];\n for (let index = 0; index < nodes.length;) {\n const current = nodes[index];\n if (current === undefined || current === null) {\n index += 1;\n continue;\n }\n if (isElement(current) && current.type === \"Fact\") {\n const { run: facts, next } = takeRun(\n nodes,\n index,\n (candidate) => candidate.type === \"Fact\",\n );\n index = next;\n blocks.push(...convertFacts(facts, context));\n continue;\n }\n if (isElement(current) && INTERACTIVE_TYPES.has(current.type)) {\n const { run: controls, next } = takeRun(nodes, index, (candidate) =>\n INTERACTIVE_TYPES.has(candidate.type),\n );\n index = next;\n blocks.push(...convertActions(controls, context));\n continue;\n }\n if (typeof current === \"string\" || typeof current === \"number\") {\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampText(\n String(current),\n SECTION_TEXT_CAP,\n \"Text\",\n \"value\",\n context,\n ),\n },\n });\n } else if (Array.isArray(current)) {\n blocks.push(...convertSequence(current, context, depth + 1));\n } else {\n blocks.push(\n ...convertElement(current as NormalizedUIElement, context, depth + 1),\n );\n }\n index += 1;\n }\n return blocks;\n}\n\n/** Converts a generative-UI tree into Slack Block Kit JSON and downgrade warnings. */\nexport function toSlackBlocks(\n node: unknown,\n options?: ToSlackBlocksOptions,\n): SlackBlocksResult {\n const surface = options?.surface === \"modal\" ? \"modal\" : \"message\";\n const context: ConversionContext = {\n blockCap: surface === \"modal\" ? MODAL_BLOCK_CAP : MESSAGE_BLOCK_CAP,\n surface,\n warnings: [],\n markdownCharacters: 0,\n markdownExhausted: false,\n dataTableCharacters: 0,\n };\n try {\n const bounded = boundSpec(node, (reason) =>\n warn(context, \"clamped\", \"Root\", clampReasonDetail(reason)),\n );\n const { root } = normalizeSpec(bounded as never);\n const converted = convertSequence(root, context, 0);\n if (converted.length <= context.blockCap) {\n return { blocks: converted, warnings: context.warnings };\n }\n const kept = converted.slice(0, context.blockCap - 1);\n const omitted = converted.length - kept.length;\n warn(\n context,\n \"clamped\",\n \"Root\",\n `${omitted} ${omitted === 1 ? \"block was\" : \"blocks were\"} omitted.`,\n );\n return {\n blocks: [...kept, buildBlockBudgetNote(omitted)],\n warnings: context.warnings,\n };\n } catch {\n return {\n blocks: [],\n warnings: [\n {\n code: \"dropped\",\n component: \"Root\",\n detail: \"Input could not be converted.\",\n },\n ],\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"toSlackBlocks.js","names":[],"sources":["../../src/slack/toSlackBlocks.ts"],"sourcesContent":["import {\n MAX_TRAVERSAL_DEPTH,\n boundSpec,\n clampReasonDetail,\n} from \"../convert/boundSpec\";\nimport { copyBounded } from \"../convert/copyBounded\";\nimport { isElement } from \"../convert/isElement\";\nimport { takeRun } from \"../convert/takeRun\";\nimport {\n normalizeSpec,\n type NormalizedUIElement,\n type NormalizedUINode,\n} from \"../ir\";\nimport {\n factTrend,\n formatFactDelta,\n formatValue,\n} from \"../vocabulary/formatValue\";\nimport {\n ACTION_ID_CAP,\n ACTIONS_ELEMENT_CAP,\n ALERT_TEXT_CAP,\n BUTTON_VALUE_CAP,\n CARD_ACTIONS_CAP,\n CARD_BODY_CAP,\n CARD_SUBTEXT_CAP,\n CARD_TITLE_CAP,\n CAROUSEL_CARD_CAP,\n CAROUSEL_CARD_MIN,\n CHECKBOX_OPTION_CAP,\n CONTEXT_ELEMENT_CAP,\n CONTEXT_TEXT_CAP,\n DATA_TABLE_CHAR_BUDGET,\n DATA_TABLE_COLUMN_CAP,\n DATA_TABLE_ROW_CAP,\n FACT_FIELD_CAP,\n FACT_FIELD_TEXT_CAP,\n HEADER_TEXT_CAP,\n INPUT_LABEL_CAP,\n INTERACTIVE_TEXT_CAP,\n MARKDOWN_TEXT_BUDGET,\n MESSAGE_BLOCK_CAP,\n MODAL_BLOCK_CAP,\n PLACEHOLDER_TEXT_CAP,\n RADIO_OPTION_CAP,\n SECTION_TEXT_CAP,\n SELECT_OPTION_CAP,\n buildAlertBlock,\n buildAlertFallback,\n buildBlockBudgetNote,\n buildCardBlock,\n buildCarouselBlock,\n buildDataTableBlock,\n} from \"./constants\";\nimport type {\n SlackActionElement,\n SlackBlock,\n SlackButtonElement,\n SlackCardBlock,\n SlackConversionWarning,\n SlackDataTableCell,\n SlackImageBlock,\n SlackOption,\n SlackPlainText,\n SlackTextObject,\n SlackBlocksResult,\n ToSlackBlocksOptions,\n} from \"./types\";\n\ntype ConversionContext = {\n readonly blockCap: number;\n readonly surface: \"message\" | \"modal\";\n readonly warnings: SlackConversionWarning[];\n readonly omittedPasswordNames: Set<string>;\n fieldBlockIdSequence: number;\n markdownCharacters: number;\n markdownExhausted: boolean;\n dataTableCharacters: number;\n};\n\ntype FieldMapping = {\n readonly actionId: string;\n readonly name: string;\n readonly component: string;\n};\n\nconst SLACK_BLOCK_ID_CAP = 255;\n\nconst INTERACTIVE_TYPES = new Set([\n \"Button\",\n \"Select\",\n \"DatePicker\",\n \"Checkbox\",\n \"CheckboxGroup\",\n \"RadioGroup\",\n]);\n\n/**\n * Types whose control disappears when a card is reshaped to text. `Input` and\n * `Form` are not in {@link INTERACTIVE_TYPES} because they emit their own\n * block rather than an actions element, but a reshape loses them the same way,\n * and a `Form` gets a Submit button whether or not it carries an action.\n */\nconst CONTROL_TYPES = new Set([\n ...INTERACTIVE_TYPES,\n \"Input\",\n \"Slider\",\n \"Form\",\n]);\n\nconst DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst asString = (value: unknown): string =>\n typeof value === \"string\" ? value : \"\";\n\nconst asFiniteNumber = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n\nconst warn = (\n context: ConversionContext,\n code: SlackConversionWarning[\"code\"],\n component: string,\n detail: string,\n) => {\n context.warnings.push({ code, component, detail });\n};\n\nconst clampText = (\n value: string,\n cap: number,\n component: string,\n field: string,\n context: ConversionContext,\n): string => {\n if (value.length <= cap) return value;\n warn(\n context,\n \"clamped\",\n component,\n `${field} was clamped to ${cap} characters.`,\n );\n return value.slice(0, cap);\n};\n\nconst asActionId = (\n action: unknown,\n component: string,\n context: ConversionContext,\n): string =>\n clampText(\n isRecord(action) && typeof action[\"type\"] === \"string\"\n ? action[\"type\"]\n : \"action\",\n ACTION_ID_CAP,\n component,\n \"action_id\",\n context,\n );\n\nconst plainText = (text: string): SlackPlainText => ({\n type: \"plain_text\",\n text,\n});\n\nconst serializeFieldBlockId = (\n sequence: number,\n fields: readonly FieldMapping[],\n): string =>\n `aui:${sequence}:${JSON.stringify(\n fields.map(({ actionId, name, component }) =>\n component === \"Checkbox\"\n ? [actionId, name, \"Checkbox\"]\n : [actionId, name],\n ),\n )}`;\n\nconst fieldBlockId = (\n fields: readonly FieldMapping[],\n context: ConversionContext,\n): string | undefined => {\n if (fields.length === 0) return undefined;\n const sequence = context.fieldBlockIdSequence++;\n const blockId = serializeFieldBlockId(sequence, fields);\n if (blockId.length <= SLACK_BLOCK_ID_CAP) return blockId;\n for (const field of fields) {\n warn(\n context,\n \"dropped\",\n field.component,\n \"name could not be mapped because its Slack block_id exceeded 255 characters.\",\n );\n }\n return undefined;\n};\n\nconst collectOmittedPasswordNames = (\n node: NormalizedUINode,\n names: Set<string>,\n depth = 0,\n): void => {\n if (depth > MAX_TRAVERSAL_DEPTH) return;\n if (Array.isArray(node)) {\n for (const child of node) {\n collectOmittedPasswordNames(child, names, depth + 1);\n }\n } else if (isElement(node)) {\n if (\n node.type === \"Input\" &&\n node.props[\"inputType\"] === \"password\" &&\n typeof node.props[\"name\"] === \"string\"\n ) {\n names.add(node.props[\"name\"]);\n }\n if (node.children !== undefined) {\n collectOmittedPasswordNames(node.children, names, depth + 1);\n }\n }\n};\n\nconst withoutOmittedPasswordFallbacks = (\n value: unknown,\n names: ReadonlySet<string>,\n depth = 0,\n): unknown => {\n if (depth > MAX_TRAVERSAL_DEPTH) {\n throw new RangeError(\"Action payload nests too deeply to sanitize.\");\n }\n if (Array.isArray(value)) {\n return value.map((item) =>\n withoutOmittedPasswordFallbacks(item, names, depth + 1),\n );\n }\n if (!isRecord(value)) return value;\n if (\n typeof value[\"$field\"] === \"string\" &&\n names.has(value[\"$field\"]) &&\n Object.keys(value).every((key) => key === \"$field\" || key === \"fallback\")\n ) {\n return { $field: value[\"$field\"] };\n }\n return Object.fromEntries(\n Object.entries(value).map(([key, item]) => [\n key,\n withoutOmittedPasswordFallbacks(item, names, depth + 1),\n ]),\n );\n};\n\nconst actionValue = (\n action: unknown,\n context: ConversionContext,\n): string | undefined => {\n if (!isRecord(action)) return undefined;\n const { type: _type, ...payload } = action;\n if (Object.keys(payload).length === 0) return undefined;\n const serialized = JSON.stringify(\n context.omittedPasswordNames.size === 0\n ? payload\n : withoutOmittedPasswordFallbacks(payload, context.omittedPasswordNames),\n );\n return serialized === \"{}\" ? undefined : serialized;\n};\n\nconst buttonElement = (\n label: string,\n buttonStyle: unknown,\n action: unknown,\n component: string,\n context: ConversionContext,\n): SlackButtonElement => {\n let value: string | undefined;\n try {\n value = actionValue(action, context);\n } catch {\n warn(\n context,\n \"dropped\",\n component,\n \"value was dropped because the action payload could not be serialized.\",\n );\n }\n if (value !== undefined && value.length > BUTTON_VALUE_CAP) {\n warn(\n context,\n \"dropped\",\n component,\n \"value was dropped because the action payload was too large to round-trip.\",\n );\n value = undefined;\n }\n const style =\n buttonStyle === \"primary\" || buttonStyle === \"danger\"\n ? buttonStyle\n : undefined;\n return {\n type: \"button\",\n text: plainText(\n clampText(label, INTERACTIVE_TEXT_CAP, component, \"label\", context),\n ),\n action_id: asActionId(action, component, context),\n ...(value !== undefined ? { value } : {}),\n ...(style !== undefined ? { style } : {}),\n };\n};\n\nconst optionFrom = (\n value: unknown,\n component: string,\n context: ConversionContext,\n): SlackOption | undefined => {\n if (\n !isRecord(value) ||\n typeof value[\"label\"] !== \"string\" ||\n typeof value[\"value\"] !== \"string\"\n ) {\n return undefined;\n }\n const description = asString(value[\"description\"]);\n return {\n text: plainText(\n clampText(\n value[\"label\"],\n INTERACTIVE_TEXT_CAP,\n component,\n \"option label\",\n context,\n ),\n ),\n value: value[\"value\"],\n ...(description\n ? {\n description: plainText(\n clampText(\n description,\n INTERACTIVE_TEXT_CAP,\n component,\n \"option description\",\n context,\n ),\n ),\n }\n : {}),\n } as SlackOption;\n};\n\nconst warnDroppedOptions = (\n kept: number,\n taken: number,\n component: string,\n context: ConversionContext,\n) => {\n const dropped = taken - kept;\n if (dropped === 0) return;\n warn(\n context,\n \"dropped\",\n component,\n `${dropped} ${dropped === 1 ? \"option was\" : \"options were\"} dropped for want of a string label and value.`,\n );\n};\n\nconst toActionElement = (\n element: NormalizedUIElement,\n context: ConversionContext,\n): SlackActionElement | undefined => {\n const { props, action } = element;\n switch (element.type) {\n case \"Button\":\n return buttonElement(\n asString(props[\"label\"]),\n props[\"buttonStyle\"],\n action,\n \"Button\",\n context,\n );\n case \"Select\": {\n const rawOptions = Array.isArray(props[\"options\"])\n ? props[\"options\"]\n : [];\n const { items: takenOptions, truncated } = copyBounded(\n rawOptions,\n SELECT_OPTION_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"Select\",\n `options were clamped to ${SELECT_OPTION_CAP} entries.`,\n );\n }\n const options = takenOptions\n .map((option) => optionFrom(option, \"Select\", context))\n .filter((option): option is SlackOption => option !== undefined);\n warnDroppedOptions(\n options.length,\n takenOptions.length,\n \"Select\",\n context,\n );\n const placeholder = clampText(\n asString(props[\"placeholder\"]),\n PLACEHOLDER_TEXT_CAP,\n \"Select\",\n \"placeholder\",\n context,\n );\n const defaultValue = props[\"defaultValue\"];\n const initialOption =\n typeof defaultValue === \"string\"\n ? options.find((option) => option.value === defaultValue)\n : undefined;\n return {\n type: \"static_select\",\n action_id: asActionId(action, \"Select\", context),\n options,\n ...(initialOption !== undefined\n ? { initial_option: initialOption }\n : {}),\n ...(placeholder ? { placeholder: plainText(placeholder) } : {}),\n };\n }\n case \"DatePicker\": {\n const rawDate = asString(props[\"value\"]);\n const initialDate = DATE_PATTERN.test(rawDate) ? rawDate : undefined;\n if (rawDate && initialDate === undefined) {\n warn(\n context,\n \"dropped\",\n \"DatePicker\",\n \"value did not match the YYYY-MM-DD format and was dropped.\",\n );\n }\n return {\n type: \"datepicker\",\n action_id: asActionId(action, \"DatePicker\", context),\n ...(initialDate !== undefined ? { initial_date: initialDate } : {}),\n };\n }\n case \"Checkbox\": {\n const label = clampText(\n asString(props[\"label\"]),\n INTERACTIVE_TEXT_CAP,\n \"Checkbox\",\n \"label\",\n context,\n );\n const name = asString(props[\"name\"]);\n const option: SlackOption = {\n text: plainText(label),\n value: name || label,\n };\n return {\n type: \"checkboxes\",\n action_id: asActionId(action, \"Checkbox\", context),\n options: [option],\n ...(props[\"defaultChecked\"] === true\n ? { initial_options: [option] }\n : {}),\n };\n }\n case \"CheckboxGroup\": {\n const rawOptions = Array.isArray(props[\"options\"])\n ? props[\"options\"]\n : [];\n const { items: takenOptions, truncated } = copyBounded(\n rawOptions,\n CHECKBOX_OPTION_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"CheckboxGroup\",\n `options were clamped to ${CHECKBOX_OPTION_CAP} entries.`,\n );\n }\n const options = takenOptions\n .map((option) => optionFrom(option, \"CheckboxGroup\", context))\n .filter((option): option is SlackOption => option !== undefined);\n warnDroppedOptions(\n options.length,\n takenOptions.length,\n \"CheckboxGroup\",\n context,\n );\n const defaultValue = Array.isArray(props[\"defaultValue\"])\n ? props[\"defaultValue\"]\n : [];\n const initialOptions = options.filter((option) =>\n defaultValue.includes(option.value),\n );\n return {\n type: \"checkboxes\",\n action_id: asActionId(action, \"CheckboxGroup\", context),\n options,\n ...(initialOptions.length > 0\n ? { initial_options: initialOptions }\n : {}),\n };\n }\n case \"RadioGroup\": {\n const rawOptions = Array.isArray(props[\"options\"])\n ? props[\"options\"]\n : [];\n const { items: takenOptions, truncated } = copyBounded(\n rawOptions,\n RADIO_OPTION_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"RadioGroup\",\n `options were clamped to ${RADIO_OPTION_CAP} entries.`,\n );\n }\n const options = takenOptions\n .map((option) => optionFrom(option, \"RadioGroup\", context))\n .filter((option): option is SlackOption => option !== undefined);\n warnDroppedOptions(\n options.length,\n takenOptions.length,\n \"RadioGroup\",\n context,\n );\n const selectedValue =\n typeof props[\"value\"] === \"string\"\n ? props[\"value\"]\n : asString(props[\"defaultValue\"]);\n const initialOption = options.find(\n (option) => option.value === selectedValue,\n );\n return {\n type: \"radio_buttons\",\n action_id: asActionId(action, \"RadioGroup\", context),\n options,\n ...(initialOption !== undefined\n ? { initial_option: initialOption }\n : {}),\n };\n }\n default:\n return undefined;\n }\n};\n\nconst normalizedList = (\n node: NormalizedUINode | undefined,\n): NormalizedUINode[] => {\n if (node === undefined || node === null) return [];\n if (!Array.isArray(node)) return [node];\n return node.flatMap((child) => normalizedList(child));\n};\n\nconst convertFacts = (\n facts: readonly NormalizedUIElement[],\n context: ConversionContext,\n): SlackBlock[] => {\n const fields = facts.map((fact) => {\n const label = asString(fact.props[\"label\"]);\n const value = asString(fact.props[\"value\"]);\n const delta = fact.props[\"delta\"];\n const deltaText =\n typeof delta === \"string\"\n ? formatFactDelta(delta, factTrend(delta, fact.props[\"trend\"]))\n : undefined;\n return {\n type: \"mrkdwn\" as const,\n text: clampText(\n `*${label}*\\n${deltaText === undefined ? value : `${value} (${deltaText})`}`,\n FACT_FIELD_TEXT_CAP,\n \"Fact\",\n \"field\",\n context,\n ),\n };\n });\n const blocks: SlackBlock[] = [];\n for (let index = 0; index < fields.length; index += FACT_FIELD_CAP) {\n blocks.push({\n type: \"section\",\n fields: fields.slice(index, index + FACT_FIELD_CAP),\n });\n }\n return blocks;\n};\n\nconst convertActions = (\n elements: readonly NormalizedUIElement[],\n context: ConversionContext,\n): SlackBlock[] => {\n const converted = elements\n .map((source) => ({\n source,\n element: toActionElement(source, context),\n }))\n .filter(\n (\n entry,\n ): entry is {\n readonly source: NormalizedUIElement;\n readonly element: SlackActionElement;\n } => entry.element !== undefined,\n );\n const blocks: SlackBlock[] = [];\n const groups: (typeof converted)[] = [];\n let group: typeof converted = [];\n let actionIds = new Set<string>();\n const hasFieldName = (entry: (typeof converted)[number]): boolean => {\n const name = entry.source.props[\"name\"];\n return typeof name === \"string\" && name.length > 0;\n };\n const fieldsFor = (entries: typeof converted): FieldMapping[] =>\n entries.flatMap(({ source, element }) => {\n const name = source.props[\"name\"];\n return typeof name === \"string\" && name.length > 0\n ? [{ actionId: element.action_id, name, component: source.type }]\n : [];\n });\n for (const entry of converted) {\n const repeatedMappedActionId =\n actionIds.has(entry.element.action_id) &&\n (hasFieldName(entry) ||\n group.some(\n (candidate) =>\n candidate.element.action_id === entry.element.action_id &&\n hasFieldName(candidate),\n ));\n if (group.length === ACTIONS_ELEMENT_CAP || repeatedMappedActionId) {\n groups.push(group);\n group = [];\n actionIds = new Set();\n }\n group.push(entry);\n actionIds.add(entry.element.action_id);\n }\n if (group.length > 0) groups.push(group);\n const mappedGroups: (typeof converted)[] = [];\n let nextSequence = context.fieldBlockIdSequence;\n for (const entries of groups) {\n let current: typeof converted = [];\n for (const entry of entries) {\n const candidate = [...current, entry];\n const fields = fieldsFor(candidate);\n const blockId =\n fields.length > 0\n ? serializeFieldBlockId(nextSequence, fields)\n : undefined;\n if (\n current.length > 0 &&\n fields.length > fieldsFor(current).length &&\n blockId !== undefined &&\n blockId.length > SLACK_BLOCK_ID_CAP\n ) {\n mappedGroups.push(current);\n if (fieldsFor(current).length > 0) nextSequence += 1;\n current = [entry];\n } else {\n current = candidate;\n }\n }\n if (current.length > 0) {\n mappedGroups.push(current);\n if (fieldsFor(current).length > 0) nextSequence += 1;\n }\n }\n for (const group of mappedGroups) {\n const fields = fieldsFor(group);\n const blockId = fieldBlockId(fields, context);\n blocks.push({\n type: \"actions\",\n ...(blockId !== undefined ? { block_id: blockId } : {}),\n elements: group.map(({ element }) => element),\n });\n }\n return blocks;\n};\n\nconst cardActionButtons = (\n props: Readonly<Record<string, unknown>>,\n context: ConversionContext,\n): SlackButtonElement[] => {\n const buttons: SlackButtonElement[] = [];\n for (const key of [\"confirm\", \"cancel\"] as const) {\n const footer = props[key];\n if (!isRecord(footer)) continue;\n buttons.push(\n buttonElement(\n asString(footer[\"label\"]),\n key === \"confirm\" ? \"primary\" : undefined,\n footer[\"$action\"],\n \"Card\",\n context,\n ),\n );\n }\n return buttons;\n};\n\nconst cardTitleText = (\n props: Readonly<Record<string, unknown>>,\n context: ConversionContext,\n): string | undefined => {\n const rawTitle = asString(props[\"title\"]);\n return rawTitle\n ? clampText(rawTitle, CARD_TITLE_CAP, \"Card\", \"title\", context)\n : undefined;\n};\n\nconst isCardNoOp = (node: NormalizedUINode): boolean =>\n isElement(node) && (node.type === \"Spacer\" || node.type === \"Icon\");\n\nconst collectText = (\n node: NormalizedUINode | undefined,\n depth: number,\n): string[] => {\n if (node === undefined || node === null || depth > MAX_TRAVERSAL_DEPTH) {\n return [];\n }\n if (typeof node === \"string\" || typeof node === \"number\") {\n return [String(node)];\n }\n if (Array.isArray(node)) {\n return node.flatMap((child) => collectText(child, depth + 1));\n }\n const element = node as NormalizedUIElement;\n const own = [\"text\", \"value\", \"label\", \"title\", \"description\"]\n .map((key) => element.props[key])\n .filter((value): value is string => typeof value === \"string\");\n return [...own, ...collectText(element.children, depth + 1)];\n};\n\ntype CardFields = {\n readonly heroImage: SlackImageBlock | undefined;\n readonly bodyRaw: string | undefined;\n readonly subtextRaw: string | undefined;\n readonly leftover: readonly NormalizedUINode[];\n};\n\n/**\n * Scans a card's children for the pieces the native card block shape can\n * carry (a hero image, body text, and subtext), each taken from the first\n * matching child. Anything left over means the card cannot map cleanly onto\n * the native shape.\n */\nconst extractCardFields = (element: NormalizedUIElement): CardFields => {\n const children = normalizedList(element.children);\n let heroImage: SlackImageBlock | undefined;\n let bodyRaw: string | undefined;\n let subtextRaw: string | undefined;\n const leftover: NormalizedUINode[] = [];\n for (const child of children) {\n if (heroImage === undefined && isElement(child) && child.type === \"Image\") {\n heroImage = {\n type: \"image\",\n image_url: asString(child.props[\"src\"]),\n alt_text: asString(child.props[\"alt\"]),\n };\n continue;\n }\n if (\n bodyRaw === undefined &&\n isElement(child) &&\n (child.type === \"Text\" || child.type === \"Markdown\")\n ) {\n bodyRaw = asString(child.props[\"value\"]);\n continue;\n }\n if (\n subtextRaw === undefined &&\n isElement(child) &&\n child.type === \"Caption\"\n ) {\n subtextRaw = asString(child.props[\"value\"]);\n continue;\n }\n if (isCardNoOp(child)) continue;\n leftover.push(child);\n }\n return { heroImage, bodyRaw, subtextRaw, leftover };\n};\n\n/** Assembles a native card block, clamping its body and subtext text. */\nconst assembleCleanCard = (\n titleText: string | undefined,\n fields: CardFields,\n buttons: readonly SlackButtonElement[],\n context: ConversionContext,\n): SlackCardBlock => {\n const body: SlackTextObject | undefined =\n fields.bodyRaw !== undefined\n ? {\n type: \"mrkdwn\",\n text: clampText(\n fields.bodyRaw,\n CARD_BODY_CAP,\n \"Card\",\n \"body\",\n context,\n ),\n }\n : undefined;\n const subtext: SlackTextObject | undefined =\n fields.subtextRaw !== undefined\n ? {\n type: \"mrkdwn\",\n text: clampText(\n fields.subtextRaw,\n CARD_SUBTEXT_CAP,\n \"Card\",\n \"subtext\",\n context,\n ),\n }\n : undefined;\n const { items: boundedButtons, truncated } = copyBounded(\n buttons,\n CARD_ACTIONS_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"Card\",\n `actions were clamped to ${CARD_ACTIONS_CAP} entries.`,\n );\n }\n return buildCardBlock({\n ...(fields.heroImage !== undefined ? { heroImage: fields.heroImage } : {}),\n ...(titleText !== undefined\n ? { title: { type: \"mrkdwn\", text: titleText } }\n : {}),\n ...(body !== undefined ? { body } : {}),\n ...(subtext !== undefined ? { subtext } : {}),\n ...(boundedButtons.length > 0 ? { actions: boundedButtons } : {}),\n });\n};\n\n/**\n * A card requires at least one of `hero_image`, `title`, `body`, or `actions`\n * (see {@link SlackCardBlock}); a card with none of them is not a valid\n * native block and must be dropped instead of emitted.\n */\nconst isEmptyCard = (card: SlackCardBlock): boolean =>\n card.hero_image === undefined &&\n card.title === undefined &&\n card.body === undefined &&\n (card.actions === undefined || card.actions.length === 0);\n\nconst convertCard = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] => {\n const titleText = cardTitleText(element.props, context);\n const fields = extractCardFields(element);\n const buttons = cardActionButtons(element.props, context);\n\n if (fields.leftover.length > 0) {\n warn(\n context,\n \"fallback\",\n \"Card\",\n \"A card with content beyond hero_image, body, subtext, and actions was rendered inline.\",\n );\n return [\n ...(titleText\n ? [{ type: \"header\" as const, text: plainText(titleText) }]\n : []),\n ...convertSequence(element.children, context, depth + 1),\n ...(buttons.length > 0\n ? [{ type: \"actions\" as const, elements: buttons }]\n : []),\n ];\n }\n const card = assembleCleanCard(titleText, fields, buttons, context);\n if (isEmptyCard(card)) {\n warn(\n context,\n \"dropped\",\n \"Card\",\n \"A card with none of hero_image, title, body, or actions was dropped.\",\n );\n return [];\n }\n return [card];\n};\n\n/** The content kinds a reshaped carousel card cannot carry, in report order. */\nconst LOST_CONTENT_KINDS = [\"images\", \"tables\", \"charts\", \"controls\"] as const;\n\nconst listPhrase = (items: readonly string[]): string =>\n items.length <= 1\n ? (items[0] ?? \"\")\n : `${items.slice(0, -1).join(\", \")} and ${items[items.length - 1]}`;\n\n/**\n * Collects the kinds of content a reshape drops, walking the same tree\n * {@link collectText} does so a node nested below the top level counts too.\n * These are exactly the pieces text cannot represent: an image has no text, a\n * table and a chart carry theirs in array props, and a control is behavior,\n * whether or not it carries an action of its own. An `$action` counts only on\n * a node that renders a control from it, since a `Box` or a `Row` carrying one\n * renders no control on the clean path either.\n */\nconst scanLostContent = (\n node: NormalizedUINode | undefined,\n into: Set<string>,\n depth: number,\n): void => {\n if (depth > MAX_TRAVERSAL_DEPTH) return;\n if (Array.isArray(node)) {\n for (const child of node) scanLostContent(child, into, depth + 1);\n return;\n }\n if (node === undefined || !isElement(node)) return;\n if (\n CONTROL_TYPES.has(node.type) ||\n (node.type === \"ListViewItem\" && isRecord(node.action)) ||\n (node.type === \"Card\" &&\n (isRecord(node.props[\"confirm\"]) || isRecord(node.props[\"cancel\"])))\n ) {\n into.add(\"controls\");\n }\n if (node.type === \"Image\") into.add(\"images\");\n if (node.type === \"Table\") into.add(\"tables\");\n if (node.type === \"Chart\") into.add(\"charts\");\n scanLostContent(node.children, into, depth + 1);\n};\n\n/**\n * Degrades a card that cannot map cleanly into a title-and-body card block.\n * A carousel cannot fall back to a block sequence like a standalone card can,\n * so the card is reshaped to the two text fields the block has. Text reachable\n * by {@link collectText} survives at any depth; an image, a table, a chart,\n * and a control do not, and are reported separately from the reshape itself.\n */\nconst degradeCard = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackCardBlock => {\n const rawTitle = asString(element.props[\"title\"]);\n const textChunks = collectText(element.children, depth + 1);\n const titleSource = rawTitle || textChunks[0] || \"\";\n const bodyChunks = rawTitle ? textChunks : textChunks.slice(1);\n const titleText = clampText(\n titleSource,\n CARD_TITLE_CAP,\n \"Card\",\n \"title\",\n context,\n );\n const bodyText = clampText(\n bodyChunks.join(\"\\n\"),\n CARD_BODY_CAP,\n \"Card\",\n \"body\",\n context,\n );\n warn(\n context,\n \"fallback\",\n \"Card\",\n \"A card inside a carousel was reshaped to title and body.\",\n );\n const lostKinds = new Set<string>();\n if (isRecord(element.props[\"confirm\"]) || isRecord(element.props[\"cancel\"])) {\n lostKinds.add(\"controls\");\n }\n scanLostContent(element.children, lostKinds, depth + 1);\n const lost = LOST_CONTENT_KINDS.filter((kind) => lostKinds.has(kind));\n if (lost.length > 0) {\n warn(\n context,\n \"dropped\",\n \"Card\",\n `A reshaped carousel card's ${listPhrase(lost)} were dropped.`,\n );\n }\n return buildCardBlock({\n ...(titleText ? { title: { type: \"mrkdwn\", text: titleText } } : {}),\n ...(bodyText ? { body: { type: \"mrkdwn\", text: bodyText } } : {}),\n });\n};\n\nconst convertCarouselCard = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackCardBlock | undefined => {\n const fields = extractCardFields(element);\n const card =\n fields.leftover.length === 0\n ? assembleCleanCard(\n cardTitleText(element.props, context),\n fields,\n cardActionButtons(element.props, context),\n context,\n )\n : degradeCard(element, context, depth);\n if (isEmptyCard(card)) {\n warn(\n context,\n \"dropped\",\n \"Card\",\n \"A card with none of hero_image, title, body, or actions was dropped.\",\n );\n return undefined;\n }\n return card;\n};\n\nconst isBadgeOrCaption = (\n node: NormalizedUINode,\n): node is NormalizedUIElement =>\n isElement(node) && (node.type === \"Badge\" || node.type === \"Caption\");\n\nconst contextRow = (\n element: NormalizedUIElement,\n context: ConversionContext,\n): SlackBlock[] | undefined => {\n const allChildren = normalizedList(element.children);\n const children = allChildren.filter(isBadgeOrCaption);\n if (allChildren.length === 0 || children.length !== allChildren.length) {\n return undefined;\n }\n const { items: boundedChildren, truncated } = copyBounded(\n children,\n CONTEXT_ELEMENT_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"Row\",\n `context elements were clamped to ${CONTEXT_ELEMENT_CAP} entries.`,\n );\n }\n return [\n {\n type: \"context\",\n elements: boundedChildren.map((child) => ({\n type: \"mrkdwn\",\n text: clampText(\n asString(child.props[\"value\"]),\n CONTEXT_TEXT_CAP,\n child.type,\n \"value\",\n context,\n ),\n })),\n },\n ];\n};\n\nconst convertListItem = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock => {\n const text = clampText(\n collectText(element.children, depth + 1).join(\"\\n\"),\n SECTION_TEXT_CAP,\n \"ListViewItem\",\n \"text\",\n context,\n );\n const accessory = isRecord(element.action)\n ? buttonElement(\"Open\", undefined, element.action, \"ListViewItem\", context)\n : undefined;\n return {\n type: \"section\",\n text: { type: \"mrkdwn\", text },\n ...(accessory !== undefined ? { accessory } : {}),\n };\n};\n\n/**\n * Converts a child whose output is thrown away, and reports whether anything\n * was lost with it. A scratch context keeps the throwaway out of the shared\n * markdown and data-table budgets that surviving blocks still need; only its\n * `dropped` warnings are forwarded, because those describe the tree the caller\n * wrote, while a clamp or a fallback would describe content never delivered.\n */\nconst discardedChild = (\n child: NormalizedUINode,\n context: ConversionContext,\n depth: number,\n): boolean => {\n const scratch: ConversionContext = { ...context, warnings: [] };\n const produced = convertSequence(child, scratch, depth).length > 0;\n const lost = scratch.warnings.filter((warning) => warning.code === \"dropped\");\n context.warnings.push(...lost);\n return produced || lost.length > 0;\n};\n\nconst convertListView = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] => {\n const items: NormalizedUIElement[] = [];\n let discarded = 0;\n for (const child of normalizedList(element.children)) {\n if (isElement(child) && child.type === \"ListViewItem\") {\n items.push(child);\n continue;\n }\n if (discardedChild(child, context, depth + 1)) discarded += 1;\n }\n if (discarded > 0) {\n warn(\n context,\n \"dropped\",\n \"ListView\",\n `${discarded} non-item ${discarded === 1 ? \"child was\" : \"children were\"} dropped.`,\n );\n }\n return items.flatMap((item, index) => [\n ...(index > 0 ? [{ type: \"divider\" as const }] : []),\n convertListItem(item, context, depth + 1),\n ]);\n};\n\nconst convertCarousel = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] => {\n const cardChildren: NormalizedUIElement[] = [];\n let droppedCards = 0;\n for (const child of normalizedList(element.children)) {\n if (isElement(child) && child.type === \"Card\") {\n cardChildren.push(child);\n continue;\n }\n if (discardedChild(child, context, depth + 1)) droppedCards += 1;\n }\n if (droppedCards > 0) {\n warn(\n context,\n \"dropped\",\n \"Carousel\",\n `${droppedCards} non-card ${droppedCards === 1 ? \"child was\" : \"children were\"} dropped.`,\n );\n }\n const { items: boundedCards, truncated } = copyBounded(\n cardChildren,\n CAROUSEL_CARD_CAP,\n );\n if (truncated) {\n warn(\n context,\n \"clamped\",\n \"Carousel\",\n `cards were clamped to ${CAROUSEL_CARD_CAP} entries.`,\n );\n }\n const cards = boundedCards\n .map((card) => convertCarouselCard(card, context, depth + 1))\n .filter((card): card is SlackCardBlock => card !== undefined);\n if (cards.length < CAROUSEL_CARD_MIN) {\n warn(\n context,\n \"dropped\",\n \"Carousel\",\n \"A carousel without renderable cards was dropped.\",\n );\n return [];\n }\n return [buildCarouselBlock(cards)];\n};\n\nconst toDataTableCell = (\n value: unknown,\n format: unknown,\n): SlackDataTableCell | undefined => {\n if (typeof value === \"number\" && format === undefined) {\n return { type: \"raw_number\", text: String(value) };\n }\n if (typeof value === \"string\" || typeof value === \"boolean\") {\n return { type: \"raw_text\", text: formatValue(value, format) };\n }\n if (typeof value === \"number\") {\n return { type: \"raw_text\", text: formatValue(value, format) };\n }\n return undefined;\n};\n\nconst rowCharacters = (row: readonly SlackDataTableCell[]): number =>\n row.reduce((sum, cell) => sum + cell.text.length, 0);\n\nconst convertTable = (\n element: NormalizedUIElement,\n context: ConversionContext,\n): SlackBlock[] => {\n const rawColumns = Array.isArray(element.props[\"columns\"])\n ? element.props[\"columns\"]\n : [];\n const rawRows = Array.isArray(element.props[\"rows\"])\n ? element.props[\"rows\"]\n : [];\n const { items: takenColumns, truncated: columnsTruncated } = copyBounded(\n rawColumns,\n DATA_TABLE_COLUMN_CAP,\n );\n const { items: takenRows, truncated: rowsTruncated } = copyBounded(\n rawRows,\n DATA_TABLE_ROW_CAP,\n );\n if (columnsTruncated) {\n warn(\n context,\n \"clamped\",\n \"Table\",\n `columns were clamped to ${DATA_TABLE_COLUMN_CAP} entries.`,\n );\n }\n if (rowsTruncated) {\n warn(\n context,\n \"clamped\",\n \"Table\",\n `rows were clamped to ${DATA_TABLE_ROW_CAP} entries.`,\n );\n }\n\n const unlabeled = takenColumns.filter(\n (column) => !isRecord(column) || typeof column[\"label\"] !== \"string\",\n ).length;\n if (unlabeled > 0) {\n warn(\n context,\n \"dropped\",\n \"Table\",\n `${unlabeled} column ${unlabeled === 1 ? \"header was\" : \"headers were\"} left blank for want of a string label.`,\n );\n }\n const columnHeaderRow: SlackDataTableCell[] = takenColumns.map((column) => ({\n type: \"raw_text\" as const,\n text: isRecord(column) ? asString(column[\"label\"]) : \"\",\n }));\n const dataRows: SlackDataTableCell[][] = takenRows.map((row) =>\n (Array.isArray(row)\n ? copyBounded(row, DATA_TABLE_COLUMN_CAP).items\n : []\n ).map(\n (value, index) =>\n toDataTableCell(\n value,\n isRecord(takenColumns[index])\n ? takenColumns[index][\"format\"]\n : undefined,\n ) ?? { type: \"raw_text\" as const, text: \"\" },\n ),\n );\n const width = Math.max(\n columnHeaderRow.length,\n 0,\n ...dataRows.map((row) => row.length),\n );\n const padRow = (row: SlackDataTableCell[]): SlackDataTableCell[] =>\n row.length >= width\n ? row\n : [\n ...row,\n ...Array.from({ length: width - row.length }, () => ({\n type: \"raw_text\" as const,\n text: \"\",\n })),\n ];\n const headerRow = padRow(columnHeaderRow);\n\n const headerCharacters = rowCharacters(headerRow);\n if (context.dataTableCharacters + headerCharacters > DATA_TABLE_CHAR_BUDGET) {\n warn(\n context,\n \"dropped\",\n \"Table\",\n `the table was dropped because its header row exceeds the ${DATA_TABLE_CHAR_BUDGET}-character table budget.`,\n );\n return [];\n }\n\n const kept: SlackDataTableCell[][] = [headerRow];\n let tableCharacters = headerCharacters;\n let budgetClamped = false;\n for (const row of dataRows.map(padRow)) {\n const chars = rowCharacters(row);\n if (\n context.dataTableCharacters + tableCharacters + chars >\n DATA_TABLE_CHAR_BUDGET\n ) {\n budgetClamped = true;\n break;\n }\n kept.push(row);\n tableCharacters += chars;\n }\n context.dataTableCharacters += tableCharacters;\n if (budgetClamped) {\n warn(\n context,\n \"clamped\",\n \"Table\",\n `rows were clamped to fit the ${DATA_TABLE_CHAR_BUDGET}-character table budget.`,\n );\n }\n\n return [buildDataTableBlock(kept)];\n};\n\nconst convertElement = (\n element: NormalizedUIElement,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] => {\n const { props } = element;\n switch (element.type) {\n case \"Header\":\n return [\n {\n type: \"header\",\n text: plainText(\n clampText(\n asString(props[\"text\"]),\n HEADER_TEXT_CAP,\n \"Header\",\n \"text\",\n context,\n ),\n ),\n },\n ];\n case \"Text\":\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampText(\n asString(props[\"value\"]),\n SECTION_TEXT_CAP,\n \"Text\",\n \"value\",\n context,\n ),\n },\n },\n ];\n case \"Caption\":\n case \"Badge\":\n return [\n {\n type: \"context\",\n elements: [\n {\n type: \"mrkdwn\",\n text: clampText(\n asString(props[\"value\"]),\n CONTEXT_TEXT_CAP,\n element.type,\n \"value\",\n context,\n ),\n },\n ],\n },\n ];\n case \"Fact\":\n return convertFacts([element], context);\n case \"Image\":\n return [\n {\n type: \"image\",\n image_url: asString(props[\"src\"]),\n alt_text: asString(props[\"alt\"]),\n },\n ];\n case \"Divider\":\n return [{ type: \"divider\" }];\n case \"Button\":\n case \"Select\":\n case \"DatePicker\":\n case \"Checkbox\":\n case \"CheckboxGroup\":\n case \"RadioGroup\":\n return convertActions([element], context);\n case \"Slider\": {\n const label = clampText(\n asString(props[\"label\"]),\n INPUT_LABEL_CAP,\n \"Slider\",\n \"label\",\n context,\n );\n const min = asFiniteNumber(props[\"min\"]);\n const max = asFiniteNumber(props[\"max\"]);\n const step = asFiniteNumber(props[\"step\"]);\n const defaultValue = asFiniteNumber(props[\"defaultValue\"]);\n const actionId = asActionId(element.action, \"Slider\", context);\n const name = props[\"name\"];\n const blockId = fieldBlockId(\n typeof name === \"string\" && name.length > 0\n ? [{ actionId, name, component: \"Slider\" }]\n : [],\n context,\n );\n return [\n {\n type: \"input\",\n ...(blockId !== undefined ? { block_id: blockId } : {}),\n label: plainText(label),\n element: {\n type: \"number_input\",\n action_id: actionId,\n ...(min !== undefined ? { min_value: min } : {}),\n ...(max !== undefined ? { max_value: max } : {}),\n ...(defaultValue !== undefined\n ? { initial_value: defaultValue }\n : {}),\n ...([step, min, max, defaultValue].some(\n (value) => value !== undefined && !Number.isInteger(value),\n )\n ? { is_decimal_allowed: true }\n : {}),\n },\n } as unknown as SlackBlock,\n ];\n }\n case \"Input\": {\n if (props[\"inputType\"] === \"password\") {\n warn(\n context,\n \"dropped\",\n \"Input\",\n \"Password input was replaced by a Slack omission note.\",\n );\n return [\n {\n type: \"context\",\n elements: [\n { type: \"mrkdwn\", text: \"Password input omitted on Slack.\" },\n ],\n },\n ];\n }\n const label = clampText(\n asString(props[\"label\"]),\n INPUT_LABEL_CAP,\n \"Input\",\n \"label\",\n context,\n );\n const placeholder = clampText(\n asString(props[\"placeholder\"]),\n PLACEHOLDER_TEXT_CAP,\n \"Input\",\n \"placeholder\",\n context,\n );\n const actionId = asActionId(element.action, \"Input\", context);\n const name = props[\"name\"];\n const blockId = fieldBlockId(\n typeof name === \"string\" && name.length > 0\n ? [{ actionId, name, component: \"Input\" }]\n : [],\n context,\n );\n const defaultValue = props[\"defaultValue\"];\n return [\n {\n type: \"input\",\n ...(blockId !== undefined ? { block_id: blockId } : {}),\n label: plainText(label),\n element: {\n type: \"plain_text_input\",\n action_id: actionId,\n ...(props[\"multiline\"] === true &&\n (props[\"inputType\"] === undefined || props[\"inputType\"] === \"text\")\n ? { multiline: true }\n : {}),\n ...(typeof defaultValue === \"string\" && defaultValue\n ? { initial_value: defaultValue }\n : {}),\n ...(placeholder ? { placeholder: plainText(placeholder) } : {}),\n },\n },\n ];\n }\n case \"Alert\": {\n const tone =\n props[\"tone\"] === \"success\" ||\n props[\"tone\"] === \"warning\" ||\n props[\"tone\"] === \"danger\"\n ? props[\"tone\"]\n : \"info\";\n const titleText = asString(props[\"title\"]);\n const description = asString(props[\"description\"]);\n if (context.surface === \"modal\") {\n const combined = [titleText, description].filter(Boolean).join(\"\\n\");\n return [\n buildAlertBlock(\n clampText(combined, ALERT_TEXT_CAP, \"Alert\", \"text\", context),\n tone,\n ),\n ];\n }\n warn(\n context,\n \"fallback\",\n \"Alert\",\n \"Alert was rendered with message-surface fallback blocks.\",\n );\n return [\n ...buildAlertFallback(\n titleText,\n clampText(\n description,\n SECTION_TEXT_CAP,\n \"Alert\",\n \"description\",\n context,\n ),\n tone,\n ),\n ];\n }\n case \"Card\":\n return convertCard(element, context, depth);\n case \"Carousel\":\n return convertCarousel(element, context, depth);\n case \"Col\":\n case \"Box\":\n return convertSequence(element.children, context, depth + 1);\n case \"Row\":\n return (\n contextRow(element, context) ??\n convertSequence(element.children, context, depth + 1)\n );\n case \"Spacer\":\n case \"Icon\":\n return [];\n case \"Table\":\n return convertTable(element, context);\n case \"Markdown\": {\n const value = asString(props[\"value\"]);\n if (\n !context.markdownExhausted &&\n context.markdownCharacters + value.length <= MARKDOWN_TEXT_BUDGET\n ) {\n context.markdownCharacters += value.length;\n return [{ type: \"markdown\", text: value }];\n }\n context.markdownExhausted = true;\n warn(\n context,\n \"fallback\",\n \"Markdown\",\n `The ${MARKDOWN_TEXT_BUDGET}-character markdown budget was exceeded.`,\n );\n return [\n {\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampText(\n value,\n SECTION_TEXT_CAP,\n \"Markdown\",\n \"fallback text\",\n context,\n ),\n },\n },\n ];\n }\n case \"Chart\":\n warn(\n context,\n \"dropped\",\n \"Chart\",\n \"Chart was replaced by a Slack omission note.\",\n );\n return [\n {\n type: \"context\",\n elements: [{ type: \"mrkdwn\", text: \"Chart omitted on Slack.\" }],\n },\n ];\n case \"ListView\":\n return convertListView(element, context, depth);\n case \"ListViewItem\":\n return [convertListItem(element, context, depth)];\n case \"Form\":\n return [\n ...convertSequence(element.children, context, depth + 1),\n {\n type: \"actions\",\n elements: [\n buttonElement(\"Submit\", \"primary\", element.action, \"Form\", context),\n ],\n },\n ];\n default:\n warn(\n context,\n \"dropped\",\n element.type,\n \"Unknown component type was dropped.\",\n );\n return [];\n }\n};\n\nfunction convertSequence(\n node: NormalizedUINode | undefined,\n context: ConversionContext,\n depth: number,\n): SlackBlock[] {\n if (node === undefined || node === null || depth > MAX_TRAVERSAL_DEPTH) {\n return [];\n }\n const nodes = Array.isArray(node) ? node : [node];\n const blocks: SlackBlock[] = [];\n for (let index = 0; index < nodes.length;) {\n const current = nodes[index];\n if (current === undefined || current === null) {\n index += 1;\n continue;\n }\n if (isElement(current) && current.type === \"Fact\") {\n const { run: facts, next } = takeRun(\n nodes,\n index,\n (candidate) => candidate.type === \"Fact\",\n );\n index = next;\n blocks.push(...convertFacts(facts, context));\n continue;\n }\n if (isElement(current) && INTERACTIVE_TYPES.has(current.type)) {\n const { run: controls, next } = takeRun(nodes, index, (candidate) =>\n INTERACTIVE_TYPES.has(candidate.type),\n );\n index = next;\n blocks.push(...convertActions(controls, context));\n continue;\n }\n if (typeof current === \"string\" || typeof current === \"number\") {\n blocks.push({\n type: \"section\",\n text: {\n type: \"mrkdwn\",\n text: clampText(\n String(current),\n SECTION_TEXT_CAP,\n \"Text\",\n \"value\",\n context,\n ),\n },\n });\n } else if (Array.isArray(current)) {\n blocks.push(...convertSequence(current, context, depth + 1));\n } else {\n blocks.push(\n ...convertElement(current as NormalizedUIElement, context, depth + 1),\n );\n }\n index += 1;\n }\n return blocks;\n}\n\n/** Converts a generative-UI tree into Slack Block Kit JSON and downgrade warnings. */\nexport function toSlackBlocks(\n node: unknown,\n options?: ToSlackBlocksOptions,\n): SlackBlocksResult {\n const surface = options?.surface === \"modal\" ? \"modal\" : \"message\";\n const context: ConversionContext = {\n blockCap: surface === \"modal\" ? MODAL_BLOCK_CAP : MESSAGE_BLOCK_CAP,\n surface,\n warnings: [],\n omittedPasswordNames: new Set(),\n fieldBlockIdSequence: 0,\n markdownCharacters: 0,\n markdownExhausted: false,\n dataTableCharacters: 0,\n };\n try {\n const bounded = boundSpec(node, (reason) =>\n warn(context, \"clamped\", \"Root\", clampReasonDetail(reason)),\n );\n const { root } = normalizeSpec(bounded as never);\n collectOmittedPasswordNames(root, context.omittedPasswordNames);\n const converted = convertSequence(root, context, 0);\n if (converted.length <= context.blockCap) {\n return { blocks: converted, warnings: context.warnings };\n }\n const kept = converted.slice(0, context.blockCap - 1);\n const omitted = converted.length - kept.length;\n warn(\n context,\n \"clamped\",\n \"Root\",\n `${omitted} ${omitted === 1 ? \"block was\" : \"blocks were\"} omitted.`,\n );\n return {\n blocks: [...kept, buildBlockBudgetNote(omitted)],\n warnings: context.warnings,\n };\n } catch {\n return {\n blocks: [],\n warnings: [\n {\n code: \"dropped\",\n component: \"Root\",\n detail: \"Input could not be converted.\",\n },\n ],\n };\n }\n}\n"],"mappings":"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"}
@@ -29,6 +29,7 @@ export interface SlackStaticSelectElement {
29
29
  readonly type: "static_select";
30
30
  readonly action_id: string;
31
31
  readonly options: readonly SlackOption[];
32
+ readonly initial_option?: SlackOption;
32
33
  readonly placeholder?: SlackPlainText;
33
34
  }
34
35
  /** A Slack date-picker element. */
@@ -56,6 +57,7 @@ export interface SlackPlainTextInputElement {
56
57
  readonly type: "plain_text_input";
57
58
  readonly action_id: string;
58
59
  readonly multiline?: boolean;
60
+ readonly initial_value?: string;
59
61
  readonly placeholder?: SlackPlainText;
60
62
  }
61
63
  /** An element accepted by a Slack actions block. */
@@ -90,11 +92,13 @@ export interface SlackDividerBlock {
90
92
  /** A Slack actions block. */
91
93
  export interface SlackActionsBlock {
92
94
  readonly type: "actions";
95
+ readonly block_id?: string;
93
96
  readonly elements: readonly SlackActionElement[];
94
97
  }
95
98
  /** A Slack input block. */
96
99
  export interface SlackInputBlock {
97
100
  readonly type: "input";
101
+ readonly block_id?: string;
98
102
  readonly label: SlackPlainText;
99
103
  readonly element: SlackPlainTextInputElement;
100
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/slack/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAc;AAEvC,6CAA6C;AAC7C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wEAAwE;AACxE,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,eAAe,CAAC;AAE/D,iCAAiC;AACjC,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,8BAA8B;AAC9B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;CACvC;AAED,qCAAqC;AACrC,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC;CACvC;AAED,mCAAmC;AACnC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,sCAAsC;AACtC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACnD;AAED,oCAAoC;AACpC,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC;CACvC;AAED,wCAAwC;AACxC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC;CACvC;AAED,oDAAoD;AACpD,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,wBAAwB,GACxB,sBAAsB,GACtB,sBAAsB,GACtB,wBAAwB,CAAC;AAE7B,4BAA4B;AAC5B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;CAC/B;AAED,6BAA6B;AAC7B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAC;CACzC;AAED,6BAA6B;AAC7B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,eAAe,EAAE,CAAC;CAC/C;AAED,2BAA2B;AAC3B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,6BAA6B;AAC7B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;CAC1B;AAED,6BAA6B;AAC7B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAClD;AAED,2BAA2B;AAC3B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,0BAA0B,CAAC;CAC9C;AAED,+CAA+C;AAC/C,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,kDAAkD;AAClD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,gDAAgD;AAChD,MAAM,MAAM,kBAAkB,GAC1B,yBAAyB,GACzB,2BAA2B,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;CAClD;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CAC9C;AAED,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,kBAAkB,EAAE,CAAC,EAAE,CAAC;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,8BAA8B;AAC9B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,0DAA0D;AAC1D,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,MAAM,GACN,SAAS,GACT,OAAO,GACP,SAAS,CAAC;AAEd,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;CAClC;AAED,8CAA8C;AAC9C,MAAM,MAAM,UAAU,GAClB,gBAAgB,GAChB,iBAAiB,GACjB,iBAAiB,GACjB,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,eAAe,GACf,cAAc,GACd,kBAAkB,GAClB,mBAAmB,GACnB,kBAAkB,GAClB,eAAe,CAAC;AAEpB,oDAAoD;AACpD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;CACxC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CAC7C;AAED,+GAA+G;AAC/G,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;CAC7C"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/slack/types.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,7 @@ export declare const PRIMARY_ACTION_CAP = 6;
13
13
  export declare const TABLE_ROW_CAP = 100;
14
14
  /** The maximum number of columns in a Table. */
15
15
  export declare const TABLE_COLUMN_CAP = 20;
16
- /** The maximum number of choices in a Select or RadioGroup. */
16
+ /** The maximum number of choices in a Select, RadioGroup, or CheckboxGroup. */
17
17
  export declare const CHOICE_OPTION_CAP = 100;
18
18
  /** The soft byte-count budget for a serialized card, past which a warning notes Teams' 100 KB bot message limit (the card is never truncated to fit it). */
19
19
  export declare const PAYLOAD_SOFT_CAP = 80000;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/teams/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAChB,mBAAgB;AAEjB,iIAAiI;AACjI,eAAO,MAAM,UAAU,QAAQ,CAAC;AAEhC,uDAAuD;AACvD,eAAO,MAAM,oBAAoB,uDACqB,CAAC;AAEvD,6DAA6D;AAC7D,eAAO,MAAM,uBAAuB,4CACO,CAAC;AAE5C,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,8HAA8H;AAC9H,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,kDAAkD;AAClD,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,gDAAgD;AAChD,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,4JAA4J;AAC5J,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAItC,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,CAQrE;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAE5E;AAKD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAUhE;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,iBAAiB,CAOnB"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/teams/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAChB,mBAAgB;AAEjB,iIAAiI;AACjI,eAAO,MAAM,UAAU,QAAQ,CAAC;AAEhC,uDAAuD;AACvD,eAAO,MAAM,oBAAoB,uDACqB,CAAC;AAEvD,6DAA6D;AAC7D,eAAO,MAAM,uBAAuB,4CACO,CAAC;AAE5C,6EAA6E;AAC7E,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C,8HAA8H;AAC9H,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,kDAAkD;AAClD,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,gDAAgD;AAChD,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,4JAA4J;AAC5J,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAItC,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,iBAAiB,CAQrE;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,CAE5E;AAKD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,eAAe,CAUhE;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,OAAO,EACf,IAAI,CAAC,EAAE,WAAW,GACjB,iBAAiB,CAOnB"}
@@ -13,7 +13,7 @@ const PRIMARY_ACTION_CAP = 6;
13
13
  const TABLE_ROW_CAP = 100;
14
14
  /** The maximum number of columns in a Table. */
15
15
  const TABLE_COLUMN_CAP = 20;
16
- /** The maximum number of choices in a Select or RadioGroup. */
16
+ /** The maximum number of choices in a Select, RadioGroup, or CheckboxGroup. */
17
17
  const CHOICE_OPTION_CAP = 100;
18
18
  /** The soft byte-count budget for a serialized card, past which a warning notes Teams' 100 KB bot message limit (the card is never truncated to fit it). */
19
19
  const PAYLOAD_SOFT_CAP = 8e4;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":[],"sources":["../../src/teams/constants.ts"],"sourcesContent":["import type {\n TeamsAdaptiveCard,\n TeamsCardAttachment,\n TeamsCardElement,\n TeamsSubmitAction,\n TeamsSubmitData,\n} from \"./types\";\n\n/** The Adaptive Card schema version emitted by {@link toAdaptiveCard}: the Teams desktop/web cap (mobile clients cap at 1.2). */\nexport const AC_VERSION = \"1.5\";\n\n/** The `$schema` URL stamped on every emitted card. */\nexport const ADAPTIVE_CARD_SCHEMA =\n \"http://adaptivecards.io/schemas/adaptive-card.json\";\n\n/** The `contentType` stamped on every emitted attachment. */\nexport const ATTACHMENT_CONTENT_TYPE =\n \"application/vnd.microsoft.card.adaptive\";\n\n/** The maximum number of attachments produced from a root-level Carousel. */\nexport const CAROUSEL_ATTACHMENT_CAP = 10;\n\n/** The maximum number of primary-mode actions in one ActionSet; extras are set to secondary mode instead of being dropped. */\nexport const PRIMARY_ACTION_CAP = 6;\n\n/** The maximum number of data rows in a Table. */\nexport const TABLE_ROW_CAP = 100;\n\n/** The maximum number of columns in a Table. */\nexport const TABLE_COLUMN_CAP = 20;\n\n/** The maximum number of choices in a Select or RadioGroup. */\nexport const CHOICE_OPTION_CAP = 100;\n\n/** The soft byte-count budget for a serialized card, past which a warning notes Teams' 100 KB bot message limit (the card is never truncated to fit it). */\nexport const PAYLOAD_SOFT_CAP = 80000;\n\nconst textEncoder = new TextEncoder();\n\n/** Measures the wire size of `value` in UTF-8 bytes rather than UTF-16 code units. */\nexport function utf8ByteLength(value: string): number {\n return textEncoder.encode(value).byteLength;\n}\n\n/** Builds the fixed-shape Adaptive Card envelope around a converted body. */\nexport function buildCard(body: TeamsCardElement[]): TeamsAdaptiveCard {\n return {\n $schema: ADAPTIVE_CARD_SCHEMA,\n type: \"AdaptiveCard\",\n version: AC_VERSION,\n body,\n actions: [],\n };\n}\n\n/** Wraps a card as a bot-framework message attachment. */\nexport function buildAttachment(card: TeamsAdaptiveCard): TeamsCardAttachment {\n return { contentType: ATTACHMENT_CONTENT_TYPE, content: card };\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * Nests an IR action under an `aui` key so `decodeSubmitData` can invert it\n * back out of the merged `activity.value` object a Teams bot receives,\n * alongside whatever other named inputs shared the card.\n */\nexport function buildSubmitData(action: unknown): TeamsSubmitData {\n if (!isRecord(action)) return { aui: { type: \"action\" } };\n const { type: rawType, ...payload } = action;\n const type = typeof rawType === \"string\" ? rawType : \"action\";\n return {\n aui: {\n type,\n ...(Object.keys(payload).length > 0 ? { payload } : {}),\n },\n };\n}\n\n/** Builds an Action.Submit carrying `action` in the `aui` envelope. */\nexport function buildSubmitAction(\n title: string,\n action: unknown,\n mode?: \"secondary\",\n): TeamsSubmitAction {\n return {\n type: \"Action.Submit\",\n title,\n data: buildSubmitData(action),\n ...(mode !== undefined ? { mode } : {}),\n };\n}\n"],"mappings":";;AASA,MAAa,aAAa;;AAG1B,MAAa,uBACX;;AAGF,MAAa,0BACX;;AAGF,MAAa,0BAA0B;;AAGvC,MAAa,qBAAqB;;AAGlC,MAAa,gBAAgB;;AAG7B,MAAa,mBAAmB;;AAGhC,MAAa,oBAAoB;;AAGjC,MAAa,mBAAmB;AAEhC,MAAM,cAAc,IAAI,YAAY;;AAGpC,SAAgB,eAAe,OAAuB;CACpD,OAAO,YAAY,OAAO,KAAK,CAAC,CAAC;AACnC;;AAGA,SAAgB,UAAU,MAA6C;CACrE,OAAO;EACL,SAAS;EACT,MAAM;EACN,SAAA;EACA;EACA,SAAS,CAAC;CACZ;AACF;;AAGA,SAAgB,gBAAgB,MAA8C;CAC5E,OAAO;EAAE,aAAa;EAAyB,SAAS;CAAK;AAC/D;AAEA,MAAM,YAAY,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;;;;;;AAOrE,SAAgB,gBAAgB,QAAkC;CAChE,IAAI,CAAC,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,EAAE;CACxD,MAAM,EAAE,MAAM,SAAS,GAAG,YAAY;CAEtC,OAAO,EACL,KAAK;EACH,MAHS,OAAO,YAAY,WAAW,UAAU;EAIjD,GAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;CACvD,EACF;AACF;;AAGA,SAAgB,kBACd,OACA,QACA,MACmB;CACnB,OAAO;EACL,MAAM;EACN;EACA,MAAM,gBAAgB,MAAM;EAC5B,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;CACvC;AACF"}
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../../src/teams/constants.ts"],"sourcesContent":["import type {\n TeamsAdaptiveCard,\n TeamsCardAttachment,\n TeamsCardElement,\n TeamsSubmitAction,\n TeamsSubmitData,\n} from \"./types\";\n\n/** The Adaptive Card schema version emitted by {@link toAdaptiveCard}: the Teams desktop/web cap (mobile clients cap at 1.2). */\nexport const AC_VERSION = \"1.5\";\n\n/** The `$schema` URL stamped on every emitted card. */\nexport const ADAPTIVE_CARD_SCHEMA =\n \"http://adaptivecards.io/schemas/adaptive-card.json\";\n\n/** The `contentType` stamped on every emitted attachment. */\nexport const ATTACHMENT_CONTENT_TYPE =\n \"application/vnd.microsoft.card.adaptive\";\n\n/** The maximum number of attachments produced from a root-level Carousel. */\nexport const CAROUSEL_ATTACHMENT_CAP = 10;\n\n/** The maximum number of primary-mode actions in one ActionSet; extras are set to secondary mode instead of being dropped. */\nexport const PRIMARY_ACTION_CAP = 6;\n\n/** The maximum number of data rows in a Table. */\nexport const TABLE_ROW_CAP = 100;\n\n/** The maximum number of columns in a Table. */\nexport const TABLE_COLUMN_CAP = 20;\n\n/** The maximum number of choices in a Select, RadioGroup, or CheckboxGroup. */\nexport const CHOICE_OPTION_CAP = 100;\n\n/** The soft byte-count budget for a serialized card, past which a warning notes Teams' 100 KB bot message limit (the card is never truncated to fit it). */\nexport const PAYLOAD_SOFT_CAP = 80000;\n\nconst textEncoder = new TextEncoder();\n\n/** Measures the wire size of `value` in UTF-8 bytes rather than UTF-16 code units. */\nexport function utf8ByteLength(value: string): number {\n return textEncoder.encode(value).byteLength;\n}\n\n/** Builds the fixed-shape Adaptive Card envelope around a converted body. */\nexport function buildCard(body: TeamsCardElement[]): TeamsAdaptiveCard {\n return {\n $schema: ADAPTIVE_CARD_SCHEMA,\n type: \"AdaptiveCard\",\n version: AC_VERSION,\n body,\n actions: [],\n };\n}\n\n/** Wraps a card as a bot-framework message attachment. */\nexport function buildAttachment(card: TeamsAdaptiveCard): TeamsCardAttachment {\n return { contentType: ATTACHMENT_CONTENT_TYPE, content: card };\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * Nests an IR action under an `aui` key so `decodeSubmitData` can invert it\n * back out of the merged `activity.value` object a Teams bot receives,\n * alongside whatever other named inputs shared the card.\n */\nexport function buildSubmitData(action: unknown): TeamsSubmitData {\n if (!isRecord(action)) return { aui: { type: \"action\" } };\n const { type: rawType, ...payload } = action;\n const type = typeof rawType === \"string\" ? rawType : \"action\";\n return {\n aui: {\n type,\n ...(Object.keys(payload).length > 0 ? { payload } : {}),\n },\n };\n}\n\n/** Builds an Action.Submit carrying `action` in the `aui` envelope. */\nexport function buildSubmitAction(\n title: string,\n action: unknown,\n mode?: \"secondary\",\n): TeamsSubmitAction {\n return {\n type: \"Action.Submit\",\n title,\n data: buildSubmitData(action),\n ...(mode !== undefined ? { mode } : {}),\n };\n}\n"],"mappings":";;AASA,MAAa,aAAa;;AAG1B,MAAa,uBACX;;AAGF,MAAa,0BACX;;AAGF,MAAa,0BAA0B;;AAGvC,MAAa,qBAAqB;;AAGlC,MAAa,gBAAgB;;AAG7B,MAAa,mBAAmB;;AAGhC,MAAa,oBAAoB;;AAGjC,MAAa,mBAAmB;AAEhC,MAAM,cAAc,IAAI,YAAY;;AAGpC,SAAgB,eAAe,OAAuB;CACpD,OAAO,YAAY,OAAO,KAAK,CAAC,CAAC;AACnC;;AAGA,SAAgB,UAAU,MAA6C;CACrE,OAAO;EACL,SAAS;EACT,MAAM;EACN,SAAA;EACA;EACA,SAAS,CAAC;CACZ;AACF;;AAGA,SAAgB,gBAAgB,MAA8C;CAC5E,OAAO;EAAE,aAAa;EAAyB,SAAS;CAAK;AAC/D;AAEA,MAAM,YAAY,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;;;;;;AAOrE,SAAgB,gBAAgB,QAAkC;CAChE,IAAI,CAAC,SAAS,MAAM,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,EAAE;CACxD,MAAM,EAAE,MAAM,SAAS,GAAG,YAAY;CAEtC,OAAO,EACL,KAAK;EACH,MAHS,OAAO,YAAY,WAAW,UAAU;EAIjD,GAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,IAAI,EAAE,QAAQ,IAAI,CAAC;CACvD,EACF;AACF;;AAGA,SAAgB,kBACd,OACA,QACA,MACmB;CACnB,OAAO;EACL,MAAM;EACN;EACA,MAAM,gBAAgB,MAAM;EAC5B,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;CACvC;AACF"}
@@ -5,6 +5,10 @@ import type { Action } from "../ir.js";
5
5
  * the resume action under. Adaptive Cards fold every other same-card input's
6
6
  * value into the same submit object keyed by its `id`, so every top-level key
7
7
  * besides `aui` is collected into `$input` (omitted when there are none).
8
+ * Each `{ "$field": name }` reference inside the payload resolves to the
9
+ * same-card input value with that id, as the string Adaptive Cards submitted,
10
+ * and a reference with no such input resolves to its `fallback`, or is dropped
11
+ * without one.
8
12
  * `aui` is reserved for the envelope: `toAdaptiveCard` renames any input
9
13
  * whose id would collide to an unused id derived from it before encoding, so
10
14
  * a same-card input value can never land on this key. `$input` and `type`
@@ -1 +1 @@
1
- {"version":3,"file":"decodeSubmitData.d.ts","sourceRoot":"","sources":["../../src/teams/decodeSubmitData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAc;AAKpC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAgCnE"}
1
+ {"version":3,"file":"decodeSubmitData.d.ts","sourceRoot":"","sources":["../../src/teams/decodeSubmitData.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAc;AAKpC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAmCnE"}
@@ -1,3 +1,4 @@
1
+ import { resolveFieldReferences } from "../fieldReferences.js";
1
2
  //#region src/teams/decodeSubmitData.ts
2
3
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
3
4
  /**
@@ -6,6 +7,10 @@ const isRecord = (value) => typeof value === "object" && value !== null && !Arra
6
7
  * the resume action under. Adaptive Cards fold every other same-card input's
7
8
  * value into the same submit object keyed by its `id`, so every top-level key
8
9
  * besides `aui` is collected into `$input` (omitted when there are none).
10
+ * Each `{ "$field": name }` reference inside the payload resolves to the
11
+ * same-card input value with that id, as the string Adaptive Cards submitted,
12
+ * and a reference with no such input resolves to its `fallback`, or is dropped
13
+ * without one.
9
14
  * `aui` is reserved for the envelope: `toAdaptiveCard` renames any input
10
15
  * whose id would collide to an unused id derived from it before encoding, so
11
16
  * a same-card input value can never land on this key. `$input` and `type`
@@ -30,7 +35,7 @@ function decodeSubmitData(value) {
30
35
  const inputEntries = Object.entries(value).filter(([key]) => key !== "aui");
31
36
  const input = inputEntries.length > 0 ? Object.fromEntries(inputEntries) : void 0;
32
37
  return {
33
- ...Object.fromEntries(payloadEntries),
38
+ ...resolveFieldReferences(Object.fromEntries(payloadEntries), input ?? {}),
34
39
  type,
35
40
  ...input !== void 0 ? { $input: input } : {}
36
41
  };
@@ -1 +1 @@
1
- {"version":3,"file":"decodeSubmitData.js","names":[],"sources":["../../src/teams/decodeSubmitData.ts"],"sourcesContent":["import type { Action } from \"../ir\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * Decodes the merged `activity.value` object a Teams bot receives on\n * Action.Submit, inverting the `aui` envelope {@link buildSubmitAction} nests\n * the resume action under. Adaptive Cards fold every other same-card input's\n * value into the same submit object keyed by its `id`, so every top-level key\n * besides `aui` is collected into `$input` (omitted when there are none).\n * `aui` is reserved for the envelope: `toAdaptiveCard` renames any input\n * whose id would collide to an unused id derived from it before encoding, so\n * a same-card input value can never land on this key. `$input` and `type`\n * are reserved on the way out: a `$input` key inside the envelope payload is\n * dropped so the slot only ever reflects same-card input values, and the\n * envelope's own `type` wins over a payload key of the same name. Every\n * collected key (in `payload` or `$input`) is kept as an own data property of\n * the returned object, even a `__proto__` or `constructor` key, since the\n * object is always built by spreading and `Object.fromEntries` rather than by\n * keyed assignment. Envelope keys are read as own properties only, so\n * prototype-inherited `aui`, `type`, or `payload` values never dispatch.\n * Returns `undefined` for a missing or malformed `aui` envelope; never throws.\n */\nexport function decodeSubmitData(value: unknown): Action | undefined {\n try {\n if (!isRecord(value) || !Object.hasOwn(value, \"aui\")) return undefined;\n const aui = value[\"aui\"];\n if (\n !isRecord(aui) ||\n !Object.hasOwn(aui, \"type\") ||\n typeof aui[\"type\"] !== \"string\"\n ) {\n return undefined;\n }\n const type = aui[\"type\"];\n\n const payload =\n Object.hasOwn(aui, \"payload\") && isRecord(aui[\"payload\"])\n ? aui[\"payload\"]\n : {};\n const payloadEntries = Object.entries(payload).filter(\n ([key]) => key !== \"$input\",\n );\n const inputEntries = Object.entries(value).filter(([key]) => key !== \"aui\");\n const input =\n inputEntries.length > 0 ? Object.fromEntries(inputEntries) : undefined;\n\n return {\n ...Object.fromEntries(payloadEntries),\n type,\n ...(input !== undefined ? { $input: input } : {}),\n };\n } catch {\n return undefined;\n }\n}\n"],"mappings":";AAEA,MAAM,YAAY,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;;;;;;;;;;;;;;;;;;;;AAqBrE,SAAgB,iBAAiB,OAAoC;CACnE,IAAI;EACF,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,OAAO,OAAO,KAAK,GAAG,OAAO,KAAA;EAC7D,MAAM,MAAM,MAAM;EAClB,IACE,CAAC,SAAS,GAAG,KACb,CAAC,OAAO,OAAO,KAAK,MAAM,KAC1B,OAAO,IAAI,YAAY,UAEvB;EAEF,MAAM,OAAO,IAAI;EAEjB,MAAM,UACJ,OAAO,OAAO,KAAK,SAAS,KAAK,SAAS,IAAI,UAAU,IACpD,IAAI,aACJ,CAAC;EACP,MAAM,iBAAiB,OAAO,QAAQ,OAAO,CAAC,CAAC,QAC5C,CAAC,SAAS,QAAQ,QACrB;EACA,MAAM,eAAe,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,QAAQ,KAAK;EAC1E,MAAM,QACJ,aAAa,SAAS,IAAI,OAAO,YAAY,YAAY,IAAI,KAAA;EAE/D,OAAO;GACL,GAAG,OAAO,YAAY,cAAc;GACpC;GACA,GAAI,UAAU,KAAA,IAAY,EAAE,QAAQ,MAAM,IAAI,CAAC;EACjD;CACF,QAAQ;EACN;CACF;AACF"}
1
+ {"version":3,"file":"decodeSubmitData.js","names":[],"sources":["../../src/teams/decodeSubmitData.ts"],"sourcesContent":["import { resolveFieldReferences } from \"../fieldReferences\";\nimport type { Action } from \"../ir\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\n/**\n * Decodes the merged `activity.value` object a Teams bot receives on\n * Action.Submit, inverting the `aui` envelope {@link buildSubmitAction} nests\n * the resume action under. Adaptive Cards fold every other same-card input's\n * value into the same submit object keyed by its `id`, so every top-level key\n * besides `aui` is collected into `$input` (omitted when there are none).\n * Each `{ \"$field\": name }` reference inside the payload resolves to the\n * same-card input value with that id, as the string Adaptive Cards submitted,\n * and a reference with no such input resolves to its `fallback`, or is dropped\n * without one.\n * `aui` is reserved for the envelope: `toAdaptiveCard` renames any input\n * whose id would collide to an unused id derived from it before encoding, so\n * a same-card input value can never land on this key. `$input` and `type`\n * are reserved on the way out: a `$input` key inside the envelope payload is\n * dropped so the slot only ever reflects same-card input values, and the\n * envelope's own `type` wins over a payload key of the same name. Every\n * collected key (in `payload` or `$input`) is kept as an own data property of\n * the returned object, even a `__proto__` or `constructor` key, since the\n * object is always built by spreading and `Object.fromEntries` rather than by\n * keyed assignment. Envelope keys are read as own properties only, so\n * prototype-inherited `aui`, `type`, or `payload` values never dispatch.\n * Returns `undefined` for a missing or malformed `aui` envelope; never throws.\n */\nexport function decodeSubmitData(value: unknown): Action | undefined {\n try {\n if (!isRecord(value) || !Object.hasOwn(value, \"aui\")) return undefined;\n const aui = value[\"aui\"];\n if (\n !isRecord(aui) ||\n !Object.hasOwn(aui, \"type\") ||\n typeof aui[\"type\"] !== \"string\"\n ) {\n return undefined;\n }\n const type = aui[\"type\"];\n\n const payload =\n Object.hasOwn(aui, \"payload\") && isRecord(aui[\"payload\"])\n ? aui[\"payload\"]\n : {};\n const payloadEntries = Object.entries(payload).filter(\n ([key]) => key !== \"$input\",\n );\n const inputEntries = Object.entries(value).filter(([key]) => key !== \"aui\");\n const input =\n inputEntries.length > 0 ? Object.fromEntries(inputEntries) : undefined;\n\n return {\n ...(resolveFieldReferences(\n Object.fromEntries(payloadEntries),\n input ?? {},\n ) as Record<string, unknown>),\n type,\n ...(input !== undefined ? { $input: input } : {}),\n };\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;AAGA,MAAM,YAAY,UAChB,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;;;;;;;;;;;;;;;;;;;;;;;;AAyBrE,SAAgB,iBAAiB,OAAoC;CACnE,IAAI;EACF,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,OAAO,OAAO,OAAO,KAAK,GAAG,OAAO,KAAA;EAC7D,MAAM,MAAM,MAAM;EAClB,IACE,CAAC,SAAS,GAAG,KACb,CAAC,OAAO,OAAO,KAAK,MAAM,KAC1B,OAAO,IAAI,YAAY,UAEvB;EAEF,MAAM,OAAO,IAAI;EAEjB,MAAM,UACJ,OAAO,OAAO,KAAK,SAAS,KAAK,SAAS,IAAI,UAAU,IACpD,IAAI,aACJ,CAAC;EACP,MAAM,iBAAiB,OAAO,QAAQ,OAAO,CAAC,CAAC,QAC5C,CAAC,SAAS,QAAQ,QACrB;EACA,MAAM,eAAe,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,QAAQ,KAAK;EAC1E,MAAM,QACJ,aAAa,SAAS,IAAI,OAAO,YAAY,YAAY,IAAI,KAAA;EAE/D,OAAO;GACL,GAAI,uBACF,OAAO,YAAY,cAAc,GACjC,SAAS,CAAC,CACZ;GACA;GACA,GAAI,UAAU,KAAA,IAAY,EAAE,QAAQ,MAAM,IAAI,CAAC;EACjD;CACF,QAAQ;EACN;CACF;AACF"}
@@ -35,10 +35,11 @@ export declare function convertRootToCard(root: NormalizedUINode | readonly Norm
35
35
  * Converts a generative-ui tree into a Microsoft Teams Adaptive Card and
36
36
  * non-fatal conversion warnings. Sizes, weights, and colors map to Adaptive
37
37
  * Card's semantic enums rather than raw values. An Input/Select/RadioGroup/
38
- * Checkbox/DatePicker whose id would be the reserved {@link RESERVED_INPUT_ID}
39
- * is renamed with a warning (see `decodeSubmitData`). Never throws: an
40
- * unknown `$type` is skipped with a "dropped" warning, and a malformed input
41
- * resolves to an empty card plus a "dropped" warning instead of throwing.
38
+ * CheckboxGroup/Checkbox/Slider/DatePicker whose id would be the reserved
39
+ * {@link RESERVED_INPUT_ID} is renamed with a warning (see `decodeSubmitData`).
40
+ * Never throws: an unknown `$type` is skipped with a "dropped" warning, and a
41
+ * malformed input resolves to an empty card plus a "dropped" warning instead
42
+ * of throwing.
42
43
  */
43
44
  export declare function toAdaptiveCard(node: unknown, _options?: ToAdaptiveCardOptions): AdaptiveCardResult;
44
45
  //# sourceMappingURL=toAdaptiveCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toAdaptiveCard.d.ts","sourceRoot":"","sources":["../../src/teams/toAdaptiveCard.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,iBAAc;AAWf,OAAO,KAAK,EACV,kBAAkB,EAElB,iBAAiB,EACjB,gBAAgB,EAIhB,sBAAsB,EAQtB,qBAAqB,EACtB,mBAAgB;AAEjB,iFAAiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IAC5C,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC3B;AAwUD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,gBAAgB,EACvB,SAAS,iBAAiB,EAC1B,OAAO,MAAM,KACZ,OAUF,CAAC;AAEF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,gBAAgB,EAAE,CAuRpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAClC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,gBAAgB,EAAE,CA6DpB;AAED,wHAAwH;AACxH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,GAAG,SAAS,gBAAgB,EAAE,EACpD,OAAO,EAAE,iBAAiB,GACzB,iBAAiB,CAcnB;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,kBAAkB,CAuBpB"}
1
+ {"version":3,"file":"toAdaptiveCard.d.ts","sourceRoot":"","sources":["../../src/teams/toAdaptiveCard.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,iBAAc;AAgBf,OAAO,KAAK,EACV,kBAAkB,EAElB,iBAAiB,EACjB,gBAAgB,EAIhB,sBAAsB,EAQtB,qBAAqB,EACtB,mBAAgB;AAEjB,iFAAiF;AACjF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IAC5C,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC3B;AA4VD;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,gBAAgB,EACvB,SAAS,iBAAiB,EAC1B,OAAO,MAAM,KACZ,OAUF,CAAC;AAEF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,mBAAmB,EAC5B,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,gBAAgB,EAAE,CAuUpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAClC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,GACZ,gBAAgB,EAAE,CA6DpB;AAED,wHAAwH;AACxH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,GAAG,SAAS,gBAAgB,EAAE,EACpD,OAAO,EAAE,iBAAiB,GACzB,iBAAiB,CAcnB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,QAAQ,CAAC,EAAE,qBAAqB,GAC/B,kBAAkB,CAuBpB"}