chat 4.5.0 → 4.7.0

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.
@@ -50,6 +50,14 @@ function Button(options) {
50
50
  value: options.value
51
51
  };
52
52
  }
53
+ function LinkButton(options) {
54
+ return {
55
+ type: "link-button",
56
+ url: options.url,
57
+ label: options.label,
58
+ style: options.style
59
+ };
60
+ }
53
61
  function Field(options) {
54
62
  return {
55
63
  type: "field",
@@ -82,6 +90,7 @@ var componentMap = /* @__PURE__ */ new Map([
82
90
  [Section, "Section"],
83
91
  [Actions, "Actions"],
84
92
  [Button, "Button"],
93
+ [LinkButton, "LinkButton"],
85
94
  [Field, "Field"],
86
95
  [Fields, "Fields"]
87
96
  ]);
@@ -109,7 +118,7 @@ function fromReactElement(element) {
109
118
  return null;
110
119
  }
111
120
  const convertedChildren = props.children ? convertChildren(props.children) : [];
112
- const isCardChild = (el) => el.type !== "card" && el.type !== "button" && el.type !== "field";
121
+ const isCardChild = (el) => el.type !== "card" && el.type !== "button" && el.type !== "link-button" && el.type !== "field";
113
122
  switch (componentName) {
114
123
  case "Card":
115
124
  return Card({
@@ -134,7 +143,7 @@ function fromReactElement(element) {
134
143
  case "Actions":
135
144
  return Actions(
136
145
  convertedChildren.filter(
137
- (c) => c.type === "button"
146
+ (c) => c.type === "button" || c.type === "link-button"
138
147
  )
139
148
  );
140
149
  case "Button": {
@@ -146,6 +155,14 @@ function fromReactElement(element) {
146
155
  value: props.value
147
156
  });
148
157
  }
158
+ case "LinkButton": {
159
+ const label = extractTextContent(props.children);
160
+ return LinkButton({
161
+ url: props.url,
162
+ label: props.label ?? label,
163
+ style: props.style
164
+ });
165
+ }
149
166
  case "Field":
150
167
  return Field({
151
168
  label: props.label,
@@ -230,7 +247,6 @@ function Modal(options) {
230
247
  submitLabel: options.submitLabel,
231
248
  closeLabel: options.closeLabel,
232
249
  notifyOnClose: options.notifyOnClose,
233
- privateMetadata: options.privateMetadata,
234
250
  children: options.children ?? []
235
251
  };
236
252
  }
@@ -307,7 +323,6 @@ function fromReactModalElement(element) {
307
323
  submitLabel: props.submitLabel,
308
324
  closeLabel: props.closeLabel,
309
325
  notifyOnClose: props.notifyOnClose,
310
- privateMetadata: props.privateMetadata,
311
326
  children: convertedChildren.filter(
312
327
  (c) => c !== null && "type" in c && (c.type === "text_input" || c.type === "select")
313
328
  )
@@ -390,7 +405,10 @@ function isTextProps(props) {
390
405
  return !("id" in props) && !("url" in props) && !("label" in props);
391
406
  }
392
407
  function isButtonProps(props) {
393
- return "id" in props && typeof props.id === "string";
408
+ return "id" in props && typeof props.id === "string" && !("url" in props);
409
+ }
410
+ function isLinkButtonProps(props) {
411
+ return "url" in props && typeof props.url === "string" && !("id" in props);
394
412
  }
395
413
  function isImageProps(props) {
396
414
  return "url" in props && typeof props.url === "string";
@@ -442,6 +460,17 @@ function resolveJSXElement(element) {
442
460
  value: props.value
443
461
  });
444
462
  }
463
+ if (type === LinkButton) {
464
+ if (!isLinkButtonProps(props)) {
465
+ throw new Error("LinkButton requires a 'url' prop");
466
+ }
467
+ const label = processedChildren.length > 0 ? String(processedChildren[0]) : props.label ?? "";
468
+ return LinkButton({
469
+ url: props.url,
470
+ label,
471
+ style: props.style
472
+ });
473
+ }
445
474
  if (type === Image) {
446
475
  if (!isImageProps(props)) {
447
476
  throw new Error("Image requires a 'url' prop");
@@ -470,7 +499,6 @@ function resolveJSXElement(element) {
470
499
  submitLabel: props.submitLabel,
471
500
  closeLabel: props.closeLabel,
472
501
  notifyOnClose: props.notifyOnClose,
473
- privateMetadata: props.privateMetadata,
474
502
  children: processedChildren
475
503
  });
476
504
  }
@@ -584,6 +612,7 @@ export {
584
612
  Section,
585
613
  Actions,
586
614
  Button,
615
+ LinkButton,
587
616
  Field,
588
617
  Fields,
589
618
  fromReactElement,
@@ -602,4 +631,4 @@ export {
602
631
  toModalElement,
603
632
  isJSX
604
633
  };
605
- //# sourceMappingURL=chunk-VJ2RPXCK.js.map
634
+ //# sourceMappingURL=chunk-TOJVXBG2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cards.ts","../src/modals.ts","../src/jsx-runtime.ts"],"sourcesContent":["/**\n * Card elements for cross-platform rich messaging.\n *\n * Provides a builder API for creating rich cards that automatically\n * convert to platform-specific formats:\n * - Slack: Block Kit\n * - Teams: Adaptive Cards\n * - Google Chat: Card v2\n *\n * Supports both function-call and JSX syntax:\n *\n * @example Function API\n * ```ts\n * import { Card, Text, Actions, Button } from \"chat\";\n *\n * await thread.post(\n * Card({\n * title: \"Order #1234\",\n * children: [\n * Text(\"Total: $50.00\"),\n * Actions([\n * Button({ id: \"approve\", label: \"Approve\", style: \"primary\" }),\n * Button({ id: \"reject\", label: \"Reject\", style: \"danger\" }),\n * ]),\n * ],\n * })\n * );\n * ```\n *\n * @example JSX API (requires jsxImportSource: \"chat\" in tsconfig)\n * ```tsx\n * /** @jsxImportSource chat *\\/\n * import { Card, Text, Actions, Button } from \"chat\";\n *\n * await thread.post(\n * <Card title=\"Order #1234\">\n * <Text>Total: $50.00</Text>\n * <Actions>\n * <Button id=\"approve\" style=\"primary\">Approve</Button>\n * <Button id=\"reject\" style=\"danger\">Reject</Button>\n * </Actions>\n * </Card>\n * );\n * ```\n */\n\n// ============================================================================\n// Card Element Types\n// ============================================================================\n\n/** Button style options */\nexport type ButtonStyle = \"primary\" | \"danger\" | \"default\";\n\n/** Text style options */\nexport type TextStyle = \"plain\" | \"bold\" | \"muted\";\n\n/** Button element for interactive actions */\nexport interface ButtonElement {\n type: \"button\";\n /** Unique action ID for callback routing */\n id: string;\n /** Button label text */\n label: string;\n /** Visual style */\n style?: ButtonStyle;\n /** Optional payload value sent with action callback */\n value?: string;\n}\n\n/** Link button element that opens a URL */\nexport interface LinkButtonElement {\n type: \"link-button\";\n /** URL to open when clicked */\n url: string;\n /** Button label text */\n label: string;\n /** Visual style */\n style?: ButtonStyle;\n}\n\n/** Text content element */\nexport interface TextElement {\n type: \"text\";\n /** Text content (supports markdown in some platforms) */\n content: string;\n /** Text style */\n style?: TextStyle;\n}\n\n/** Image element */\nexport interface ImageElement {\n type: \"image\";\n /** Image URL */\n url: string;\n /** Alt text for accessibility */\n alt?: string;\n}\n\n/** Visual divider/separator */\nexport interface DividerElement {\n type: \"divider\";\n}\n\n/** Container for action buttons */\nexport interface ActionsElement {\n type: \"actions\";\n /** Button and link button elements */\n children: (ButtonElement | LinkButtonElement)[];\n}\n\n/** Section container for grouping elements */\nexport interface SectionElement {\n type: \"section\";\n /** Section children */\n children: CardChild[];\n}\n\n/** Field for key-value display */\nexport interface FieldElement {\n type: \"field\";\n /** Field label */\n label: string;\n /** Field value */\n value: string;\n}\n\n/** Fields container for multi-column layout */\nexport interface FieldsElement {\n type: \"fields\";\n /** Field elements */\n children: FieldElement[];\n}\n\n/** Union of all card child element types */\nexport type CardChild =\n | TextElement\n | ImageElement\n | DividerElement\n | ActionsElement\n | SectionElement\n | FieldsElement;\n\n/** Union of all element types (including nested children) */\ntype AnyCardElement =\n | CardChild\n | CardElement\n | ButtonElement\n | LinkButtonElement\n | FieldElement;\n\n/** Root card element */\nexport interface CardElement {\n type: \"card\";\n /** Card title */\n title?: string;\n /** Card subtitle */\n subtitle?: string;\n /** Header image URL */\n imageUrl?: string;\n /** Card content */\n children: CardChild[];\n}\n\n/** Type guard for CardElement */\nexport function isCardElement(value: unknown): value is CardElement {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"type\" in value &&\n (value as CardElement).type === \"card\"\n );\n}\n\n// ============================================================================\n// Builder Functions\n// ============================================================================\n\n/** Options for Card */\nexport interface CardOptions {\n title?: string;\n subtitle?: string;\n imageUrl?: string;\n children?: CardChild[];\n}\n\n/**\n * Create a Card element.\n *\n * @example\n * ```ts\n * Card({\n * title: \"Welcome\",\n * children: [Text(\"Hello!\")],\n * })\n * ```\n */\nexport function Card(options: CardOptions = {}): CardElement {\n return {\n type: \"card\",\n title: options.title,\n subtitle: options.subtitle,\n imageUrl: options.imageUrl,\n children: options.children ?? [],\n };\n}\n\n/**\n * Create a Text element.\n *\n * @example\n * ```ts\n * Text(\"Hello, world!\")\n * Text(\"Important\", { style: \"bold\" })\n * ```\n */\nexport function Text(\n content: string,\n options: { style?: TextStyle } = {},\n): TextElement {\n return {\n type: \"text\",\n content,\n style: options.style,\n };\n}\n\n/**\n * Alias for Text that avoids conflicts with DOM's global Text constructor.\n * Use this when importing in environments where `Text` would conflict.\n *\n * @example\n * ```ts\n * import { CardText } from \"chat\";\n * CardText(\"Hello, world!\")\n * ```\n */\nexport const CardText = Text;\n\n/**\n * Create an Image element.\n *\n * @example\n * ```ts\n * Image({ url: \"https://example.com/image.png\", alt: \"Description\" })\n * ```\n */\nexport function Image(options: { url: string; alt?: string }): ImageElement {\n return {\n type: \"image\",\n url: options.url,\n alt: options.alt,\n };\n}\n\n/**\n * Create a Divider element.\n *\n * @example\n * ```ts\n * Divider()\n * ```\n */\nexport function Divider(): DividerElement {\n return { type: \"divider\" };\n}\n\n/**\n * Create a Section container.\n *\n * @example\n * ```ts\n * Section([\n * Text(\"Grouped content\"),\n * Image({ url: \"...\" }),\n * ])\n * ```\n */\nexport function Section(children: CardChild[]): SectionElement {\n return {\n type: \"section\",\n children,\n };\n}\n\n/**\n * Create an Actions container for buttons.\n *\n * @example\n * ```ts\n * Actions([\n * Button({ id: \"ok\", label: \"OK\" }),\n * Button({ id: \"cancel\", label: \"Cancel\" }),\n * LinkButton({ url: \"https://example.com\", label: \"Learn More\" }),\n * ])\n * ```\n */\nexport function Actions(\n children: (ButtonElement | LinkButtonElement)[],\n): ActionsElement {\n return {\n type: \"actions\",\n children,\n };\n}\n\n/** Options for Button */\nexport interface ButtonOptions {\n /** Unique action ID for callback routing */\n id: string;\n /** Button label text */\n label: string;\n /** Visual style */\n style?: ButtonStyle;\n /** Optional payload value sent with action callback */\n value?: string;\n}\n\n/**\n * Create a Button element.\n *\n * @example\n * ```ts\n * Button({ id: \"submit\", label: \"Submit\", style: \"primary\" })\n * Button({ id: \"delete\", label: \"Delete\", style: \"danger\", value: \"item-123\" })\n * ```\n */\nexport function Button(options: ButtonOptions): ButtonElement {\n return {\n type: \"button\",\n id: options.id,\n label: options.label,\n style: options.style,\n value: options.value,\n };\n}\n\n/** Options for LinkButton */\nexport interface LinkButtonOptions {\n /** URL to open when clicked */\n url: string;\n /** Button label text */\n label: string;\n /** Visual style */\n style?: ButtonStyle;\n}\n\n/**\n * Create a LinkButton element that opens a URL when clicked.\n *\n * @example\n * ```ts\n * LinkButton({ url: \"https://example.com\", label: \"View Docs\" })\n * LinkButton({ url: \"https://example.com\", label: \"Learn More\", style: \"primary\" })\n * ```\n */\nexport function LinkButton(options: LinkButtonOptions): LinkButtonElement {\n return {\n type: \"link-button\",\n url: options.url,\n label: options.label,\n style: options.style,\n };\n}\n\n/**\n * Create a Field element for key-value display.\n *\n * @example\n * ```ts\n * Field({ label: \"Status\", value: \"Active\" })\n * ```\n */\nexport function Field(options: { label: string; value: string }): FieldElement {\n return {\n type: \"field\",\n label: options.label,\n value: options.value,\n };\n}\n\n/**\n * Create a Fields container for multi-column layout.\n *\n * @example\n * ```ts\n * Fields([\n * Field({ label: \"Name\", value: \"John\" }),\n * Field({ label: \"Email\", value: \"john@example.com\" }),\n * ])\n * ```\n */\nexport function Fields(children: FieldElement[]): FieldsElement {\n return {\n type: \"fields\",\n children,\n };\n}\n\n// ============================================================================\n// React Element Support\n// ============================================================================\n\n/** React element shape (minimal typing to avoid React dependency) */\ninterface ReactElement {\n $$typeof: symbol;\n type: unknown;\n props: Record<string, unknown>;\n}\n\n/**\n * Check if a value is a React element.\n */\nfunction isReactElement(value: unknown): value is ReactElement {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const maybeElement = value as { $$typeof?: unknown };\n if (typeof maybeElement.$$typeof !== \"symbol\") {\n return false;\n }\n const symbolStr = maybeElement.$$typeof.toString();\n return (\n symbolStr.includes(\"react.element\") ||\n symbolStr.includes(\"react.transitional.element\")\n );\n}\n\n/**\n * Map of component functions to their names for React element conversion.\n */\nconst componentMap = new Map<unknown, string>([\n [Card, \"Card\"],\n [Text, \"Text\"],\n [Image, \"Image\"],\n [Divider, \"Divider\"],\n [Section, \"Section\"],\n [Actions, \"Actions\"],\n [Button, \"Button\"],\n [LinkButton, \"LinkButton\"],\n [Field, \"Field\"],\n [Fields, \"Fields\"],\n]);\n\n/**\n * Convert a React element tree to a CardElement tree.\n * This allows using React's JSX with our card components.\n *\n * @example\n * ```tsx\n * import React from \"react\";\n * import { Card, Text, fromReactElement } from \"chat\";\n *\n * const element = (\n * <Card title=\"Hello\">\n * <Text>World</Text>\n * </Card>\n * );\n *\n * const card = fromReactElement(element);\n * await thread.post(card);\n * ```\n */\nexport function fromReactElement(element: unknown): AnyCardElement | null {\n if (!isReactElement(element)) {\n // Already a card element or primitive\n if (isCardElement(element)) {\n return element;\n }\n if (typeof element === \"object\" && element !== null && \"type\" in element) {\n return element as CardChild;\n }\n return null;\n }\n\n const { type, props } = element;\n const componentName = componentMap.get(type);\n\n if (!componentName) {\n // Check if it's an HTML element (string type like \"div\", \"a\", \"span\")\n if (typeof type === \"string\") {\n throw new Error(\n `HTML element <${type}> is not supported in card elements. ` +\n `Use Card, Text, Section, Actions, Button, Fields, Field, Image, or Divider components instead.`,\n );\n }\n\n // Unknown custom component - try to extract children\n if (props.children) {\n return convertChildren(props.children)[0] ?? null;\n }\n return null;\n }\n\n // Convert children recursively\n const convertedChildren = props.children\n ? convertChildren(props.children)\n : [];\n\n // Helper to filter for CardChild elements\n const isCardChild = (el: AnyCardElement): el is CardChild =>\n el.type !== \"card\" &&\n el.type !== \"button\" &&\n el.type !== \"link-button\" &&\n el.type !== \"field\";\n\n // Call the appropriate builder function based on component type\n switch (componentName) {\n case \"Card\":\n return Card({\n title: props.title as string | undefined,\n subtitle: props.subtitle as string | undefined,\n imageUrl: props.imageUrl as string | undefined,\n children: convertedChildren.filter(isCardChild),\n });\n\n case \"Text\": {\n // JSX: <Text style=\"bold\">content</Text>\n const content = extractTextContent(props.children);\n return Text(content, { style: props.style as TextStyle | undefined });\n }\n\n case \"Image\":\n return Image({\n url: props.url as string,\n alt: props.alt as string | undefined,\n });\n\n case \"Divider\":\n return Divider();\n\n case \"Section\":\n return Section(convertedChildren.filter(isCardChild));\n\n case \"Actions\":\n return Actions(\n convertedChildren.filter(\n (c): c is ButtonElement | LinkButtonElement =>\n c.type === \"button\" || c.type === \"link-button\",\n ),\n );\n\n case \"Button\": {\n // JSX: <Button id=\"x\" style=\"primary\">Label</Button>\n const label = extractTextContent(props.children);\n return Button({\n id: props.id as string,\n label: (props.label as string | undefined) ?? label,\n style: props.style as ButtonStyle | undefined,\n value: props.value as string | undefined,\n });\n }\n\n case \"LinkButton\": {\n // JSX: <LinkButton url=\"https://...\" style=\"primary\">Label</LinkButton>\n const label = extractTextContent(props.children);\n return LinkButton({\n url: props.url as string,\n label: (props.label as string | undefined) ?? label,\n style: props.style as ButtonStyle | undefined,\n });\n }\n\n case \"Field\":\n return Field({\n label: props.label as string,\n value: props.value as string,\n });\n\n case \"Fields\":\n return Fields(\n convertedChildren.filter((c): c is FieldElement => c.type === \"field\"),\n );\n\n default:\n return null;\n }\n}\n\n/**\n * Convert React children to card elements.\n */\nfunction convertChildren(children: unknown): AnyCardElement[] {\n if (children == null) {\n return [];\n }\n\n if (Array.isArray(children)) {\n return children.flatMap(convertChildren);\n }\n\n const converted = fromReactElement(children);\n if (converted && typeof converted === \"object\" && \"type\" in converted) {\n // If it's a card, extract its children\n if (converted.type === \"card\") {\n return (converted as CardElement).children;\n }\n return [converted];\n }\n\n return [];\n}\n\n/**\n * Extract text content from React children.\n */\nfunction extractTextContent(children: unknown): string {\n if (typeof children === \"string\") {\n return children;\n }\n if (typeof children === \"number\") {\n return String(children);\n }\n if (Array.isArray(children)) {\n return children.map(extractTextContent).join(\"\");\n }\n return \"\";\n}\n\n// ============================================================================\n// Fallback Text Generation\n// ============================================================================\n\n/**\n * Generate plain text fallback from a CardElement.\n * Used for platforms/clients that can't render rich cards,\n * and for the SentMessage.text property.\n */\nexport function cardToFallbackText(card: CardElement): string {\n const parts: string[] = [];\n\n if (card.title) {\n parts.push(card.title);\n }\n\n if (card.subtitle) {\n parts.push(card.subtitle);\n }\n\n for (const child of card.children) {\n const text = childToFallbackText(child);\n if (text) {\n parts.push(text);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Generate fallback text from a card child element.\n */\nfunction childToFallbackText(child: CardChild): string | null {\n switch (child.type) {\n case \"text\":\n return child.content;\n case \"fields\":\n return child.children.map((f) => `${f.label}: ${f.value}`).join(\"\\n\");\n case \"actions\":\n return `[${child.children.map((b) => b.label).join(\"] [\")}]`;\n case \"section\":\n return child.children\n .map((c) => childToFallbackText(c))\n .filter(Boolean)\n .join(\"\\n\");\n default:\n return null;\n }\n}\n","/**\n * Modal elements for form dialogs.\n */\n\n// ============================================================================\n// Modal Element Types\n// ============================================================================\n\nexport type ModalChild = TextInputElement | SelectElement;\n\nexport interface ModalElement {\n type: \"modal\";\n callbackId: string;\n title: string;\n submitLabel?: string;\n closeLabel?: string;\n notifyOnClose?: boolean;\n children: ModalChild[];\n}\n\nexport interface TextInputElement {\n type: \"text_input\";\n id: string;\n label: string;\n placeholder?: string;\n initialValue?: string;\n multiline?: boolean;\n optional?: boolean;\n maxLength?: number;\n}\n\nexport interface SelectElement {\n type: \"select\";\n id: string;\n label: string;\n placeholder?: string;\n options: SelectOptionElement[];\n initialOption?: string;\n optional?: boolean;\n}\n\nexport interface SelectOptionElement {\n label: string;\n value: string;\n}\n\nexport function isModalElement(value: unknown): value is ModalElement {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"type\" in value &&\n (value as ModalElement).type === \"modal\"\n );\n}\n\n// ============================================================================\n// Builder Functions\n// ============================================================================\n\nexport interface ModalOptions {\n callbackId: string;\n title: string;\n submitLabel?: string;\n closeLabel?: string;\n notifyOnClose?: boolean;\n children?: ModalChild[];\n}\n\nexport function Modal(options: ModalOptions): ModalElement {\n return {\n type: \"modal\",\n callbackId: options.callbackId,\n title: options.title,\n submitLabel: options.submitLabel,\n closeLabel: options.closeLabel,\n notifyOnClose: options.notifyOnClose,\n children: options.children ?? [],\n };\n}\n\nexport interface TextInputOptions {\n id: string;\n label: string;\n placeholder?: string;\n initialValue?: string;\n multiline?: boolean;\n optional?: boolean;\n maxLength?: number;\n}\n\nexport function TextInput(options: TextInputOptions): TextInputElement {\n return {\n type: \"text_input\",\n id: options.id,\n label: options.label,\n placeholder: options.placeholder,\n initialValue: options.initialValue,\n multiline: options.multiline,\n optional: options.optional,\n maxLength: options.maxLength,\n };\n}\n\nexport interface SelectOptions {\n id: string;\n label: string;\n placeholder?: string;\n options: SelectOptionElement[];\n initialOption?: string;\n optional?: boolean;\n}\n\nexport function Select(options: SelectOptions): SelectElement {\n return {\n type: \"select\",\n id: options.id,\n label: options.label,\n placeholder: options.placeholder,\n options: options.options,\n initialOption: options.initialOption,\n optional: options.optional,\n };\n}\n\nexport function SelectOption(options: {\n label: string;\n value: string;\n}): SelectOptionElement {\n return {\n label: options.label,\n value: options.value,\n };\n}\n\n// ============================================================================\n// JSX Support\n// ============================================================================\n\ninterface ReactElement {\n $$typeof: symbol;\n type: unknown;\n props: Record<string, unknown>;\n}\n\nfunction isReactElement(value: unknown): value is ReactElement {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const maybeElement = value as { $$typeof?: unknown };\n if (typeof maybeElement.$$typeof !== \"symbol\") {\n return false;\n }\n const symbolStr = maybeElement.$$typeof.toString();\n return (\n symbolStr.includes(\"react.element\") ||\n symbolStr.includes(\"react.transitional.element\")\n );\n}\n\ntype AnyModalElement = ModalElement | ModalChild | SelectOptionElement;\n\nconst modalComponentMap = new Map<unknown, string>([\n [Modal, \"Modal\"],\n [TextInput, \"TextInput\"],\n [Select, \"Select\"],\n [SelectOption, \"SelectOption\"],\n]);\n\nexport function fromReactModalElement(\n element: unknown,\n): AnyModalElement | null {\n if (!isReactElement(element)) {\n if (isModalElement(element)) {\n return element;\n }\n if (typeof element === \"object\" && element !== null && \"type\" in element) {\n return element as ModalChild;\n }\n return null;\n }\n\n const { type, props } = element;\n const componentName = modalComponentMap.get(type);\n\n if (!componentName) {\n if (props.children) {\n return convertModalChildren(props.children)[0] ?? null;\n }\n return null;\n }\n\n const convertedChildren = props.children\n ? convertModalChildren(props.children)\n : [];\n\n switch (componentName) {\n case \"Modal\":\n return Modal({\n callbackId: props.callbackId as string,\n title: props.title as string,\n submitLabel: props.submitLabel as string | undefined,\n closeLabel: props.closeLabel as string | undefined,\n notifyOnClose: props.notifyOnClose as boolean | undefined,\n children: convertedChildren.filter(\n (c): c is ModalChild =>\n c !== null &&\n \"type\" in c &&\n (c.type === \"text_input\" || c.type === \"select\"),\n ),\n });\n\n case \"TextInput\":\n return TextInput({\n id: props.id as string,\n label: props.label as string,\n placeholder: props.placeholder as string | undefined,\n initialValue: props.initialValue as string | undefined,\n multiline: props.multiline as boolean | undefined,\n optional: props.optional as boolean | undefined,\n maxLength: props.maxLength as number | undefined,\n });\n\n case \"Select\":\n return Select({\n id: props.id as string,\n label: props.label as string,\n placeholder: props.placeholder as string | undefined,\n options: convertedChildren.filter(\n (c): c is SelectOptionElement =>\n c !== null && \"label\" in c && \"value\" in c && !(\"type\" in c),\n ),\n initialOption: props.initialOption as string | undefined,\n optional: props.optional as boolean | undefined,\n });\n\n case \"SelectOption\":\n return SelectOption({\n label: props.label as string,\n value: props.value as string,\n });\n\n default:\n return null;\n }\n}\n\nfunction convertModalChildren(children: unknown): AnyModalElement[] {\n if (children == null) {\n return [];\n }\n\n if (Array.isArray(children)) {\n return children.flatMap(convertModalChildren);\n }\n\n const converted = fromReactModalElement(children);\n if (converted) {\n if (isModalElement(converted)) {\n return converted.children;\n }\n return [converted];\n }\n\n return [];\n}\n","/**\n * Custom JSX runtime for chat cards.\n *\n * This allows using JSX syntax without React. Configure your bundler:\n *\n * tsconfig.json:\n * {\n * \"compilerOptions\": {\n * \"jsx\": \"react-jsx\",\n * \"jsxImportSource\": \"chat\"\n * }\n * }\n *\n * Or per-file:\n * /** @jsxImportSource chat *\\/\n *\n * Usage:\n * ```tsx\n * import { Card, Text, Button, Actions } from \"chat\";\n *\n * const card = (\n * <Card title=\"Order #1234\">\n * <Text>Your order is ready!</Text>\n * <Actions>\n * <Button id=\"pickup\" style=\"primary\">Schedule Pickup</Button>\n * </Actions>\n * </Card>\n * );\n * ```\n */\n\nimport {\n Actions,\n Button,\n type ButtonElement,\n type ButtonStyle,\n Card,\n type CardChild,\n type CardElement,\n Divider,\n Field,\n type FieldElement,\n Fields,\n Image,\n LinkButton,\n type LinkButtonElement,\n Section,\n Text,\n type TextStyle,\n} from \"./cards\";\n\nimport {\n isModalElement,\n Modal,\n type ModalChild,\n type ModalElement,\n Select,\n SelectOption,\n type SelectOptionElement,\n TextInput,\n} from \"./modals\";\n\n// Symbol to identify our JSX elements before they're processed\nconst JSX_ELEMENT = Symbol.for(\"chat.jsx.element\");\n\n// ============================================================================\n// JSX Props Types - Strongly typed props for each component\n// ============================================================================\n\n/** Props for Card component in JSX */\nexport interface CardProps {\n title?: string;\n subtitle?: string;\n imageUrl?: string;\n children?: unknown;\n}\n\n/** Props for Text component in JSX */\nexport interface TextProps {\n style?: TextStyle;\n children?: string | number;\n}\n\n/** Props for Button component in JSX */\nexport interface ButtonProps {\n id: string;\n label?: string;\n style?: ButtonStyle;\n value?: string;\n children?: string | number;\n}\n\n/** Props for LinkButton component in JSX */\nexport interface LinkButtonProps {\n url: string;\n label?: string;\n style?: ButtonStyle;\n children?: string | number;\n}\n\n/** Props for Image component in JSX */\nexport interface ImageProps {\n url: string;\n alt?: string;\n}\n\n/** Props for Field component in JSX */\nexport interface FieldProps {\n label: string;\n value: string;\n}\n\n/** Props for container components (Section, Actions, Fields) */\nexport interface ContainerProps {\n children?: unknown;\n}\n\n/** Props for Divider component (no props) */\nexport type DividerProps = Record<string, never>;\n\n/** Props for Modal component in JSX */\nexport interface ModalProps {\n callbackId: string;\n title: string;\n submitLabel?: string;\n closeLabel?: string;\n notifyOnClose?: boolean;\n children?: unknown;\n}\n\n/** Props for TextInput component in JSX */\nexport interface TextInputProps {\n id: string;\n label: string;\n placeholder?: string;\n initialValue?: string;\n multiline?: boolean;\n optional?: boolean;\n maxLength?: number;\n}\n\n/** Props for Select component in JSX */\nexport interface SelectProps {\n id: string;\n label: string;\n placeholder?: string;\n initialOption?: string;\n optional?: boolean;\n children?: unknown;\n}\n\n/** Props for SelectOption component in JSX */\nexport interface SelectOptionProps {\n label: string;\n value: string;\n}\n\n/** Union of all valid JSX props */\nexport type CardJSXProps =\n | CardProps\n | TextProps\n | ButtonProps\n | LinkButtonProps\n | ImageProps\n | FieldProps\n | ContainerProps\n | DividerProps\n | ModalProps\n | TextInputProps\n | SelectProps\n | SelectOptionProps;\n\n/** Component function type with proper overloads */\ntype CardComponentFunction =\n | typeof Card\n | typeof Text\n | typeof Button\n | typeof LinkButton\n | typeof Image\n | typeof Field\n | typeof Divider\n | typeof Section\n | typeof Actions\n | typeof Fields\n | typeof Modal\n | typeof TextInput\n | typeof Select\n | typeof SelectOption;\n\n/**\n * Represents a JSX element from the chat JSX runtime.\n * This is the type returned when using JSX syntax with chat components.\n */\nexport interface CardJSXElement<P extends CardJSXProps = CardJSXProps> {\n $$typeof: typeof JSX_ELEMENT;\n type: CardComponentFunction;\n props: P;\n children: unknown[];\n}\n\n// Internal alias for backwards compatibility\ntype JSXElement = CardJSXElement;\n\n/**\n * Check if a value is a JSX element from our runtime.\n */\nfunction isJSXElement(value: unknown): value is JSXElement {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as JSXElement).$$typeof === JSX_ELEMENT\n );\n}\n\n/** Non-null card element for children arrays */\ntype CardChildOrNested =\n | CardChild\n | ButtonElement\n | LinkButtonElement\n | FieldElement;\n\n/**\n * Process children, converting JSX elements to card elements.\n */\nfunction processChildren(children: unknown): CardChildOrNested[] {\n if (children == null) {\n return [];\n }\n\n if (Array.isArray(children)) {\n return children.flatMap(processChildren);\n }\n\n // If it's a JSX element, resolve it\n if (isJSXElement(children)) {\n const resolved = resolveJSXElement(children);\n if (resolved) {\n return [resolved as CardChildOrNested];\n }\n return [];\n }\n\n // If it's already a card element, return it\n if (typeof children === \"object\" && \"type\" in children) {\n return [children as CardChildOrNested];\n }\n\n // If it's a string or number, it might be text content for a Button or Text\n if (typeof children === \"string\" || typeof children === \"number\") {\n // Return as string, the component will handle it\n return [String(children) as unknown as CardChildOrNested];\n }\n\n return [];\n}\n\n/** Any card element type that can be created */\ntype AnyCardElement =\n | CardElement\n | CardChild\n | ButtonElement\n | LinkButtonElement\n | FieldElement\n | ModalElement\n | ModalChild\n | SelectOptionElement\n | null;\n\n/**\n * Type guard to check if props match TextProps\n */\nfunction isTextProps(props: CardJSXProps): props is TextProps {\n return !(\"id\" in props) && !(\"url\" in props) && !(\"label\" in props);\n}\n\n/**\n * Type guard to check if props match ButtonProps\n */\nfunction isButtonProps(props: CardJSXProps): props is ButtonProps {\n return \"id\" in props && typeof props.id === \"string\" && !(\"url\" in props);\n}\n\n/**\n * Type guard to check if props match LinkButtonProps\n */\nfunction isLinkButtonProps(props: CardJSXProps): props is LinkButtonProps {\n return \"url\" in props && typeof props.url === \"string\" && !(\"id\" in props);\n}\n\n/**\n * Type guard to check if props match ImageProps\n */\nfunction isImageProps(props: CardJSXProps): props is ImageProps {\n return \"url\" in props && typeof props.url === \"string\";\n}\n\n/**\n * Type guard to check if props match FieldProps\n */\nfunction isFieldProps(props: CardJSXProps): props is FieldProps {\n return (\n \"label\" in props &&\n \"value\" in props &&\n typeof props.label === \"string\" &&\n typeof props.value === \"string\"\n );\n}\n\n/**\n * Type guard to check if props match CardProps\n */\nfunction isCardProps(props: CardJSXProps): props is CardProps {\n return (\n !(\"id\" in props) &&\n !(\"url\" in props) &&\n !(\"callbackId\" in props) &&\n (\"title\" in props || \"subtitle\" in props || \"imageUrl\" in props)\n );\n}\n\n/**\n * Type guard to check if props match ModalProps\n */\nfunction isModalProps(props: CardJSXProps): props is ModalProps {\n return \"callbackId\" in props && \"title\" in props;\n}\n\n/**\n * Type guard to check if props match TextInputProps\n */\nfunction isTextInputProps(props: CardJSXProps): props is TextInputProps {\n return (\n \"id\" in props &&\n \"label\" in props &&\n !(\"options\" in props) &&\n !(\"value\" in props)\n );\n}\n\n/**\n * Type guard to check if props match SelectProps\n */\nfunction isSelectProps(props: CardJSXProps): props is SelectProps {\n return \"id\" in props && \"label\" in props && !(\"value\" in props);\n}\n\n/**\n * Type guard to check if props match SelectOptionProps\n */\nfunction isSelectOptionProps(props: CardJSXProps): props is SelectOptionProps {\n return \"label\" in props && \"value\" in props && !(\"id\" in props);\n}\n\n/**\n * Resolve a JSX element by calling its component function.\n * Transforms JSX props into the format each builder function expects.\n */\nfunction resolveJSXElement(element: JSXElement): AnyCardElement {\n const { type, props, children } = element;\n\n // Process children first\n const processedChildren = processChildren(children);\n\n // Use identity comparison to determine which builder function this is\n // This is necessary because function names get minified in production builds\n if (type === Text) {\n // Text(content: string, options?: { style })\n // JSX children become the content string\n const textProps = isTextProps(props) ? props : { style: undefined };\n const content =\n processedChildren.length > 0\n ? String(processedChildren[0])\n : String(textProps.children ?? \"\");\n return Text(content, { style: textProps.style });\n }\n\n if (type === Section) {\n // Section takes array as first argument\n return Section(processedChildren as CardChild[]);\n }\n\n if (type === Actions) {\n // Actions takes array of ButtonElements and LinkButtonElements\n return Actions(processedChildren as (ButtonElement | LinkButtonElement)[]);\n }\n\n if (type === Fields) {\n // Fields takes array of FieldElements\n return Fields(processedChildren as FieldElement[]);\n }\n\n if (type === Button) {\n // Button({ id, label, style, value })\n // JSX children become the label\n if (!isButtonProps(props)) {\n throw new Error(\"Button requires an 'id' prop\");\n }\n const label =\n processedChildren.length > 0\n ? String(processedChildren[0])\n : (props.label ?? \"\");\n return Button({\n id: props.id,\n label,\n style: props.style,\n value: props.value,\n });\n }\n\n if (type === LinkButton) {\n // LinkButton({ url, label, style })\n // JSX children become the label\n if (!isLinkButtonProps(props)) {\n throw new Error(\"LinkButton requires a 'url' prop\");\n }\n const label =\n processedChildren.length > 0\n ? String(processedChildren[0])\n : (props.label ?? \"\");\n return LinkButton({\n url: props.url,\n label,\n style: props.style,\n });\n }\n\n if (type === Image) {\n // Image({ url, alt })\n if (!isImageProps(props)) {\n throw new Error(\"Image requires a 'url' prop\");\n }\n return Image({ url: props.url, alt: props.alt });\n }\n\n if (type === Field) {\n // Field({ label, value })\n if (!isFieldProps(props)) {\n throw new Error(\"Field requires 'label' and 'value' props\");\n }\n return Field({\n label: props.label,\n value: props.value,\n });\n }\n\n if (type === Divider) {\n // Divider() - no args\n return Divider();\n }\n\n // Modal components\n if (type === Modal) {\n if (!isModalProps(props)) {\n throw new Error(\"Modal requires 'callbackId' and 'title' props\");\n }\n return Modal({\n callbackId: props.callbackId,\n title: props.title,\n submitLabel: props.submitLabel,\n closeLabel: props.closeLabel,\n notifyOnClose: props.notifyOnClose,\n children: processedChildren as unknown as ModalChild[],\n });\n }\n\n if (type === TextInput) {\n if (!isTextInputProps(props)) {\n throw new Error(\"TextInput requires 'id' and 'label' props\");\n }\n return TextInput({\n id: props.id,\n label: props.label,\n placeholder: props.placeholder,\n initialValue: props.initialValue,\n multiline: props.multiline,\n optional: props.optional,\n maxLength: props.maxLength,\n });\n }\n\n if (type === Select) {\n if (!isSelectProps(props)) {\n throw new Error(\"Select requires 'id' and 'label' props\");\n }\n return Select({\n id: props.id,\n label: props.label,\n placeholder: props.placeholder,\n initialOption: props.initialOption,\n optional: props.optional,\n options: processedChildren as SelectOptionElement[],\n });\n }\n\n if (type === SelectOption) {\n if (!isSelectOptionProps(props)) {\n throw new Error(\"SelectOption requires 'label' and 'value' props\");\n }\n return SelectOption({\n label: props.label,\n value: props.value,\n });\n }\n\n // Default: Card({ title, subtitle, imageUrl, children })\n const cardProps = isCardProps(props) ? props : {};\n return Card({\n title: cardProps.title,\n subtitle: cardProps.subtitle,\n imageUrl: cardProps.imageUrl,\n children: processedChildren as CardChild[],\n });\n}\n\n/**\n * JSX factory function (used by the JSX transform).\n * Creates a lazy JSX element that will be resolved when needed.\n */\nexport function jsx<P extends CardJSXProps>(\n type: CardComponentFunction,\n props: P & { children?: unknown },\n _key?: string,\n): CardJSXElement<P> {\n const { children, ...restProps } = props;\n return {\n $$typeof: JSX_ELEMENT,\n type,\n props: restProps as P,\n children: children != null ? [children] : [],\n };\n}\n\n/**\n * JSX factory for elements with multiple children.\n */\nexport function jsxs<P extends CardJSXProps>(\n type: CardComponentFunction,\n props: P & { children?: unknown },\n _key?: string,\n): CardJSXElement<P> {\n const { children, ...restProps } = props;\n return {\n $$typeof: JSX_ELEMENT,\n type,\n props: restProps as P,\n children: Array.isArray(children)\n ? children\n : children != null\n ? [children]\n : [],\n };\n}\n\n/**\n * Development JSX factory (same as jsx, but called in dev mode).\n */\nexport const jsxDEV = jsx;\n\n/**\n * Fragment support (flattens children).\n */\nexport function Fragment(props: { children?: unknown }): CardChild[] {\n return processChildren(props.children) as CardChild[];\n}\n\n/**\n * Convert a JSX element tree to a CardElement.\n * Call this on the root JSX element to get a usable CardElement.\n */\nexport function toCardElement(jsxElement: unknown): CardElement | null {\n if (isJSXElement(jsxElement)) {\n const resolved = resolveJSXElement(jsxElement);\n if (\n resolved &&\n typeof resolved === \"object\" &&\n \"type\" in resolved &&\n resolved.type === \"card\"\n ) {\n return resolved as CardElement;\n }\n }\n\n // Already a CardElement\n if (\n typeof jsxElement === \"object\" &&\n jsxElement !== null &&\n \"type\" in jsxElement &&\n (jsxElement as CardElement).type === \"card\"\n ) {\n return jsxElement as CardElement;\n }\n\n return null;\n}\n\nexport function toModalElement(jsxElement: unknown): ModalElement | null {\n if (isJSXElement(jsxElement)) {\n const resolved = resolveJSXElement(jsxElement);\n if (\n resolved &&\n typeof resolved === \"object\" &&\n \"type\" in resolved &&\n resolved.type === \"modal\"\n ) {\n return resolved as ModalElement;\n }\n }\n if (isModalElement(jsxElement)) {\n return jsxElement;\n }\n return null;\n}\n\n/**\n * Check if a value is a JSX element (from our runtime or React).\n */\nexport function isJSX(value: unknown): boolean {\n if (isJSXElement(value)) {\n return true;\n }\n // Check for React elements\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"$$typeof\" in value &&\n typeof (value as { $$typeof: unknown }).$$typeof === \"symbol\"\n ) {\n const symbolStr = (value as { $$typeof: symbol }).$$typeof.toString();\n return (\n symbolStr.includes(\"react.element\") ||\n symbolStr.includes(\"react.transitional.element\")\n );\n }\n return false;\n}\n\n// Re-export for JSX namespace\nexport namespace JSX {\n export interface Element extends JSXElement {}\n // biome-ignore lint/complexity/noBannedTypes: Required for JSX namespace\n export type IntrinsicElements = {};\n export interface ElementChildrenAttribute {\n // biome-ignore lint/complexity/noBannedTypes: Required for JSX children attribute\n children: {};\n }\n}\n"],"mappings":"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","names":["isReactElement"]}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as CardElement, a as CardJSXElement, M as ModalElement, b as CardChild, A as Actions$1, B as Button$1, c as Card$1, T as Text$1, D as Divider$1, F as Field$1, d as Fields$1, f as fromReactElement$1, I as Image$1, i as isCardElement$1, e as isJSX$1, S as Section$1, t as toCardElement$1, g as toModalElement$1, h as fromReactModalElement$1, j as isModalElement$1, k as Modal$1, l as Select$1, m as SelectOption$1, n as TextInput$1 } from './jsx-runtime-CFK57xOl.js';
2
- export { x as ActionsElement, y as ButtonElement, z as ButtonOptions, o as ButtonProps, E as ButtonStyle, p as CardJSXProps, G as CardOptions, q as CardProps, r as ContainerProps, H as DividerElement, s as DividerProps, J as FieldElement, u as FieldProps, K as FieldsElement, L as ImageElement, v as ImageProps, Q as ModalChild, R as ModalOptions, N as SectionElement, U as SelectElement, V as SelectOptionElement, W as SelectOptions, O as TextElement, X as TextInputElement, Y as TextInputOptions, w as TextProps, P as TextStyle } from './jsx-runtime-CFK57xOl.js';
1
+ import { C as CardElement, a as CardJSXElement, M as ModalElement, b as CardChild, A as Actions$1, B as Button$1, c as Card$1, T as Text$1, D as Divider$1, F as Field$1, d as Fields$1, f as fromReactElement$1, I as Image$1, i as isCardElement$1, e as isJSX$1, L as LinkButton$1, S as Section$1, t as toCardElement$1, g as toModalElement$1, h as fromReactModalElement$1, j as isModalElement$1, k as Modal$1, l as Select$1, m as SelectOption$1, n as TextInput$1 } from './jsx-runtime-BTjNItXE.js';
2
+ export { y as ActionsElement, z as ButtonElement, E as ButtonOptions, o as ButtonProps, G as ButtonStyle, p as CardJSXProps, H as CardOptions, q as CardProps, r as ContainerProps, J as DividerElement, s as DividerProps, K as FieldElement, u as FieldProps, N as FieldsElement, O as ImageElement, v as ImageProps, P as LinkButtonElement, Q as LinkButtonOptions, w as LinkButtonProps, W as ModalChild, X as ModalOptions, R as SectionElement, Y as SelectElement, Z as SelectOptionElement, _ as SelectOptions, U as TextElement, $ as TextInputElement, a0 as TextInputOptions, x as TextProps, V as TextStyle } from './jsx-runtime-BTjNItXE.js';
3
3
  import { WORKFLOW_SERIALIZE, WORKFLOW_DESERIALIZE } from '@workflow/serde';
4
4
  import { Root, Content, Blockquote, Code, Emphasis, InlineCode, Delete, Link, ListItem, List, Paragraph, Strong, Text } from 'mdast';
5
5
  export { Blockquote, Code, Content, Delete, Emphasis, InlineCode, Link, List, ListItem, Paragraph, Root, Strong, Text } from 'mdast';
@@ -207,9 +207,10 @@ interface Adapter<TThreadId = unknown, TRawMessage = unknown> {
207
207
  *
208
208
  * @param triggerId - Platform-specific trigger ID from the action event
209
209
  * @param modal - The modal element to display
210
+ * @param contextId - Optional context ID for server-side stored thread/message context
210
211
  * @returns The view/dialog ID
211
212
  */
212
- openModal?(triggerId: string, modal: ModalElement): Promise<{
213
+ openModal?(triggerId: string, modal: ModalElement, contextId?: string): Promise<{
213
214
  viewId: string;
214
215
  }>;
215
216
  /**
@@ -273,8 +274,22 @@ interface ChatInstance {
273
274
  processAction(event: Omit<ActionEvent, "thread" | "openModal"> & {
274
275
  adapter: Adapter;
275
276
  }, options?: WebhookOptions): void;
276
- processModalSubmit(event: Omit<ModalSubmitEvent, "thread">, options?: WebhookOptions): Promise<ModalResponse | undefined>;
277
- processModalClose(event: Omit<ModalCloseEvent, "thread">, options?: WebhookOptions): void;
277
+ /**
278
+ * Process a modal submit event from an adapter.
279
+ *
280
+ * @param event - The modal submit event (without relatedThread/relatedMessage)
281
+ * @param contextId - Context ID for retrieving stored thread/message context
282
+ * @param options - Webhook options
283
+ */
284
+ processModalSubmit(event: Omit<ModalSubmitEvent, "relatedThread" | "relatedMessage">, contextId?: string, options?: WebhookOptions): Promise<ModalResponse | undefined>;
285
+ /**
286
+ * Process a modal close event from an adapter.
287
+ *
288
+ * @param event - The modal close event (without relatedThread/relatedMessage)
289
+ * @param contextId - Context ID for retrieving stored thread/message context
290
+ * @param options - Webhook options
291
+ */
292
+ processModalClose(event: Omit<ModalCloseEvent, "relatedThread" | "relatedMessage">, contextId?: string, options?: WebhookOptions): void;
278
293
  getState(): StateAdapter;
279
294
  getUserName(): string;
280
295
  /** Get the configured logger, optionally with a child prefix */
@@ -472,6 +487,11 @@ interface Thread<TState = Record<string, unknown>, TRawMessage = unknown> {
472
487
  * Fetches the latest 50 messages and updates `recentMessages`.
473
488
  */
474
489
  refresh(): Promise<void>;
490
+ /**
491
+ * Wrap a Message object as a SentMessage with edit/delete capabilities.
492
+ * Used internally for reconstructing messages from serialized data.
493
+ */
494
+ createSentMessageFromMessage(message: Message<TRawMessage>): SentMessage<TRawMessage>;
475
495
  /**
476
496
  * Get a platform-specific mention string for a user.
477
497
  * Use this to @-mention a user in a message.
@@ -953,22 +973,59 @@ interface ActionEvent<TRawMessage = unknown> {
953
973
  * ```
954
974
  */
955
975
  type ActionHandler = (event: ActionEvent) => Promise<void>;
956
- interface ModalSubmitEvent {
976
+ /**
977
+ * Event emitted when a user submits a modal form.
978
+ */
979
+ interface ModalSubmitEvent<TRawMessage = unknown> {
980
+ /** The callback ID specified when creating the modal */
957
981
  callbackId: string;
982
+ /** Platform-specific view/dialog ID */
958
983
  viewId: string;
984
+ /** Form field values keyed by input ID */
959
985
  values: Record<string, string>;
960
- privateMetadata?: string;
986
+ /** The user who submitted the modal */
961
987
  user: Author;
988
+ /** The adapter that received this event */
962
989
  adapter: Adapter;
990
+ /** Raw platform-specific payload */
963
991
  raw: unknown;
992
+ /**
993
+ * The thread where the modal was originally triggered from.
994
+ * Available when the modal was opened via ActionEvent.openModal().
995
+ */
996
+ relatedThread?: Thread<Record<string, unknown>, TRawMessage>;
997
+ /**
998
+ * The message that contained the action which opened the modal.
999
+ * Available when the modal was opened from a message action via ActionEvent.openModal().
1000
+ * This is a SentMessage with edit/delete capabilities.
1001
+ */
1002
+ relatedMessage?: SentMessage<TRawMessage>;
964
1003
  }
965
- interface ModalCloseEvent {
1004
+ /**
1005
+ * Event emitted when a user closes/cancels a modal (requires notifyOnClose).
1006
+ */
1007
+ interface ModalCloseEvent<TRawMessage = unknown> {
1008
+ /** The callback ID specified when creating the modal */
966
1009
  callbackId: string;
1010
+ /** Platform-specific view/dialog ID */
967
1011
  viewId: string;
968
- privateMetadata?: string;
1012
+ /** The user who closed the modal */
969
1013
  user: Author;
1014
+ /** The adapter that received this event */
970
1015
  adapter: Adapter;
1016
+ /** Raw platform-specific payload */
971
1017
  raw: unknown;
1018
+ /**
1019
+ * The thread where the modal was originally triggered from.
1020
+ * Available when the modal was opened via ActionEvent.openModal().
1021
+ */
1022
+ relatedThread?: Thread<Record<string, unknown>, TRawMessage>;
1023
+ /**
1024
+ * The message that contained the action which opened the modal.
1025
+ * Available when the modal was opened from a message action via ActionEvent.openModal().
1026
+ * This is a SentMessage with edit/delete capabilities.
1027
+ */
1028
+ relatedMessage?: SentMessage<TRawMessage>;
972
1029
  }
973
1030
  type ModalErrorsResponse = {
974
1031
  action: "errors";
@@ -1413,8 +1470,18 @@ declare class Chat<TAdapters extends Record<string, Adapter> = Record<string, Ad
1413
1470
  processAction(event: Omit<ActionEvent, "thread" | "openModal"> & {
1414
1471
  adapter: Adapter;
1415
1472
  }, options?: WebhookOptions): void;
1416
- processModalSubmit(event: Omit<ModalSubmitEvent, "thread">, _options?: WebhookOptions): Promise<ModalResponse | undefined>;
1417
- processModalClose(event: Omit<ModalCloseEvent, "thread">, options?: WebhookOptions): void;
1473
+ processModalSubmit(event: Omit<ModalSubmitEvent, "relatedThread" | "relatedMessage">, contextId?: string, _options?: WebhookOptions): Promise<ModalResponse | undefined>;
1474
+ processModalClose(event: Omit<ModalCloseEvent, "relatedThread" | "relatedMessage">, contextId?: string, options?: WebhookOptions): void;
1475
+ /**
1476
+ * Store modal context server-side and return a context ID.
1477
+ * Called when opening a modal to preserve thread/message for the submit handler.
1478
+ */
1479
+ private storeModalContext;
1480
+ /**
1481
+ * Retrieve and delete modal context from server-side storage.
1482
+ * Called when processing modal submit/close to reconstruct thread/message.
1483
+ */
1484
+ private retrieveModalContext;
1418
1485
  /**
1419
1486
  * Handle an action event internally.
1420
1487
  */
@@ -1608,7 +1675,7 @@ declare class ThreadImpl<TState = Record<string, unknown>> implements Thread<TSt
1608
1675
  * const thread = ThreadImpl.fromJSON(serializedThread);
1609
1676
  * ```
1610
1677
  */
1611
- static fromJSON<TState = Record<string, unknown>>(json: SerializedThread): ThreadImpl<TState>;
1678
+ static fromJSON<TState = Record<string, unknown>>(json: SerializedThread, adapter?: Adapter): ThreadImpl<TState>;
1612
1679
  /**
1613
1680
  * Serialize a ThreadImpl instance for @workflow/serde.
1614
1681
  * This static method is automatically called by workflow serialization.
@@ -1621,6 +1688,7 @@ declare class ThreadImpl<TState = Record<string, unknown>> implements Thread<TSt
1621
1688
  */
1622
1689
  static [WORKFLOW_DESERIALIZE](data: SerializedThread): ThreadImpl;
1623
1690
  private createSentMessage;
1691
+ createSentMessageFromMessage(message: Message): SentMessage;
1624
1692
  }
1625
1693
 
1626
1694
  /**
@@ -2003,6 +2071,7 @@ declare const fromReactElement: typeof fromReactElement$1;
2003
2071
  declare const Image: typeof Image$1;
2004
2072
  declare const isCardElement: typeof isCardElement$1;
2005
2073
  declare const isJSX: typeof isJSX$1;
2074
+ declare const LinkButton: typeof LinkButton$1;
2006
2075
  declare const Section: typeof Section$1;
2007
2076
  declare const toCardElement: typeof toCardElement$1;
2008
2077
  declare const toModalElement: typeof toModalElement$1;
@@ -2014,4 +2083,4 @@ declare const Select: typeof Select$1;
2014
2083
  declare const SelectOption: typeof SelectOption$1;
2015
2084
  declare const TextInput: typeof TextInput$1;
2016
2085
 
2017
- export { type ActionEvent, type ActionHandler, Actions, type Adapter, type AdapterPostableMessage, type Attachment, type Author, BaseFormatConverter, Button, Card, CardChild, CardElement, CardJSXElement, CardText, Chat, type ChatConfig, ChatError, type ChatInstance, ConsoleLogger, type CustomEmojiMap, DEFAULT_EMOJI_MAP, Divider, type Emoji, type EmojiFormats, type EmojiMapConfig, EmojiResolver, type EmojiValue, type EphemeralMessage, type FetchDirection, type FetchOptions, type FetchResult, Field, Fields, type FileUpload, type FormatConverter, type FormattedContent, Image, type Lock, LockError, type LogLevel, type Logger, type MarkdownConverter, type MentionHandler, Message, type MessageData, type MessageHandler, type MessageMetadata, Modal, type ModalCloseEvent, type ModalCloseHandler, type ModalCloseResponse, ModalElement, type ModalErrorsResponse, type ModalPushResponse, type ModalResponse, type ModalSubmitEvent, type ModalSubmitHandler, type ModalUpdateResponse, NotImplementedError, type PostEphemeralOptions, type PostableAst, type PostableCard, type PostableMarkdown, type PostableMessage, type PostableRaw, RateLimitError, type RawMessage, type ReactionEvent, type ReactionHandler, Section, Select, SelectOption, type SentMessage, type SerializedMessage, type SerializedThread, type StateAdapter, type StreamOptions, type SubscribedMessageHandler, THREAD_STATE_TTL_MS, TextInput, type Thread, ThreadImpl, type ThreadInfo, type WebhookOptions, type WellKnownEmoji, blockquote, codeBlock, convertEmojiPlaceholders, createEmoji, defaultEmojiResolver, emoji, emphasis, fromReactElement, fromReactModalElement, getEmoji, getNodeChildren, getNodeValue, inlineCode, isBlockquoteNode, isCardElement, isCodeNode, isDeleteNode, isEmphasisNode, isInlineCodeNode, isJSX, isLinkNode, isListItemNode, isListNode, isModalElement, isParagraphNode, isStrongNode, isTextNode, link, markdownToPlainText, paragraph, parseMarkdown, root, strikethrough, stringifyMarkdown, strong, text, toCardElement, toModalElement, toPlainText, walkAst };
2086
+ export { type ActionEvent, type ActionHandler, Actions, type Adapter, type AdapterPostableMessage, type Attachment, type Author, BaseFormatConverter, Button, Card, CardChild, CardElement, CardJSXElement, CardText, Chat, type ChatConfig, ChatError, type ChatInstance, ConsoleLogger, type CustomEmojiMap, DEFAULT_EMOJI_MAP, Divider, type Emoji, type EmojiFormats, type EmojiMapConfig, EmojiResolver, type EmojiValue, type EphemeralMessage, type FetchDirection, type FetchOptions, type FetchResult, Field, Fields, type FileUpload, type FormatConverter, type FormattedContent, Image, LinkButton, type Lock, LockError, type LogLevel, type Logger, type MarkdownConverter, type MentionHandler, Message, type MessageData, type MessageHandler, type MessageMetadata, Modal, type ModalCloseEvent, type ModalCloseHandler, type ModalCloseResponse, ModalElement, type ModalErrorsResponse, type ModalPushResponse, type ModalResponse, type ModalSubmitEvent, type ModalSubmitHandler, type ModalUpdateResponse, NotImplementedError, type PostEphemeralOptions, type PostableAst, type PostableCard, type PostableMarkdown, type PostableMessage, type PostableRaw, RateLimitError, type RawMessage, type ReactionEvent, type ReactionHandler, Section, Select, SelectOption, type SentMessage, type SerializedMessage, type SerializedThread, type StateAdapter, type StreamOptions, type SubscribedMessageHandler, THREAD_STATE_TTL_MS, TextInput, type Thread, ThreadImpl, type ThreadInfo, type WebhookOptions, type WellKnownEmoji, blockquote, codeBlock, convertEmojiPlaceholders, createEmoji, defaultEmojiResolver, emoji, emphasis, fromReactElement, fromReactModalElement, getEmoji, getNodeChildren, getNodeValue, inlineCode, isBlockquoteNode, isCardElement, isCodeNode, isDeleteNode, isEmphasisNode, isInlineCodeNode, isJSX, isLinkNode, isListItemNode, isListNode, isModalElement, isParagraphNode, isStrongNode, isTextNode, link, markdownToPlainText, paragraph, parseMarkdown, root, strikethrough, stringifyMarkdown, strong, text, toCardElement, toModalElement, toPlainText, walkAst };
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import {
7
7
  Field,
8
8
  Fields,
9
9
  Image,
10
+ LinkButton,
10
11
  Modal,
11
12
  Section,
12
13
  Select,
@@ -20,7 +21,7 @@ import {
20
21
  isModalElement,
21
22
  toCardElement,
22
23
  toModalElement
23
- } from "./chunk-VJ2RPXCK.js";
24
+ } from "./chunk-TOJVXBG2.js";
24
25
 
25
26
  // src/chat-singleton.ts
26
27
  var _singleton = null;
@@ -765,13 +766,17 @@ var ThreadImpl = class _ThreadImpl {
765
766
  * const thread = ThreadImpl.fromJSON(serializedThread);
766
767
  * ```
767
768
  */
768
- static fromJSON(json) {
769
- return new _ThreadImpl({
769
+ static fromJSON(json, adapter) {
770
+ const thread = new _ThreadImpl({
770
771
  id: json.id,
771
772
  adapterName: json.adapterName,
772
773
  channelId: json.channelId,
773
774
  isDM: json.isDM
774
775
  });
776
+ if (adapter) {
777
+ thread._adapter = adapter;
778
+ }
779
+ return thread;
775
780
  }
776
781
  /**
777
782
  * Serialize a ThreadImpl instance for @workflow/serde.
@@ -839,6 +844,46 @@ var ThreadImpl = class _ThreadImpl {
839
844
  };
840
845
  return sentMessage;
841
846
  }
847
+ createSentMessageFromMessage(message) {
848
+ const adapter = this.adapter;
849
+ const threadId = this.id;
850
+ const messageId = message.id;
851
+ const self = this;
852
+ return {
853
+ id: message.id,
854
+ threadId: message.threadId,
855
+ text: message.text,
856
+ formatted: message.formatted,
857
+ raw: message.raw,
858
+ author: message.author,
859
+ metadata: message.metadata,
860
+ attachments: message.attachments,
861
+ isMention: message.isMention,
862
+ toJSON() {
863
+ return message.toJSON();
864
+ },
865
+ async edit(newContent) {
866
+ let postable = newContent;
867
+ if (isJSX(newContent)) {
868
+ const card = toCardElement(newContent);
869
+ if (!card)
870
+ throw new Error("Invalid JSX element: must be a Card element");
871
+ postable = card;
872
+ }
873
+ await adapter.editMessage(threadId, messageId, postable);
874
+ return self.createSentMessage(messageId, postable, threadId);
875
+ },
876
+ async delete() {
877
+ await adapter.deleteMessage(threadId, messageId);
878
+ },
879
+ async addReaction(emoji2) {
880
+ await adapter.addReaction(threadId, messageId, emoji2);
881
+ },
882
+ async removeReaction(emoji2) {
883
+ await adapter.removeReaction(threadId, messageId, emoji2);
884
+ }
885
+ };
886
+ }
842
887
  };
843
888
  function extractMessageContent(message) {
844
889
  if (typeof message === "string") {
@@ -892,6 +937,7 @@ function extractMessageContent(message) {
892
937
  // src/chat.ts
893
938
  var DEFAULT_LOCK_TTL_MS = 3e4;
894
939
  var DEDUPE_TTL_MS = 6e4;
940
+ var MODAL_CONTEXT_TTL_MS = 24 * 60 * 60 * 1e3;
895
941
  var Chat = class {
896
942
  /**
897
943
  * Register this Chat instance as the global singleton.
@@ -1238,20 +1284,21 @@ var Chat = class {
1238
1284
  options.waitUntil(task);
1239
1285
  }
1240
1286
  }
1241
- async processModalSubmit(event, _options) {
1242
- this.logger.debug("Incoming modal submit", {
1243
- adapter: event.adapter.name,
1244
- callbackId: event.callbackId,
1245
- viewId: event.viewId,
1246
- user: event.user.userName
1247
- });
1287
+ async processModalSubmit(event, contextId, _options) {
1288
+ const { relatedThread, relatedMessage } = await this.retrieveModalContext(
1289
+ event.adapter.name,
1290
+ contextId
1291
+ );
1292
+ const fullEvent = {
1293
+ ...event,
1294
+ relatedThread,
1295
+ relatedMessage
1296
+ };
1248
1297
  for (const { callbackIds, handler } of this.modalSubmitHandlers) {
1249
1298
  if (callbackIds.length === 0 || callbackIds.includes(event.callbackId)) {
1250
1299
  try {
1251
- const response = await handler(event);
1252
- if (response) {
1253
- return response;
1254
- }
1300
+ const response = await handler(fullEvent);
1301
+ if (response) return response;
1255
1302
  } catch (err) {
1256
1303
  this.logger.error("Modal submit handler error", {
1257
1304
  error: err,
@@ -1261,17 +1308,20 @@ var Chat = class {
1261
1308
  }
1262
1309
  }
1263
1310
  }
1264
- processModalClose(event, options) {
1311
+ processModalClose(event, contextId, options) {
1265
1312
  const task = (async () => {
1266
- this.logger.debug("Incoming modal close", {
1267
- adapter: event.adapter.name,
1268
- callbackId: event.callbackId,
1269
- viewId: event.viewId,
1270
- user: event.user.userName
1271
- });
1313
+ const { relatedThread, relatedMessage } = await this.retrieveModalContext(
1314
+ event.adapter.name,
1315
+ contextId
1316
+ );
1317
+ const fullEvent = {
1318
+ ...event,
1319
+ relatedThread,
1320
+ relatedMessage
1321
+ };
1272
1322
  for (const { callbackIds, handler } of this.modalCloseHandlers) {
1273
1323
  if (callbackIds.length === 0 || callbackIds.includes(event.callbackId)) {
1274
- await handler(event);
1324
+ await handler(fullEvent);
1275
1325
  }
1276
1326
  }
1277
1327
  })().catch((err) => {
@@ -1284,6 +1334,43 @@ var Chat = class {
1284
1334
  options.waitUntil(task);
1285
1335
  }
1286
1336
  }
1337
+ /**
1338
+ * Store modal context server-side and return a context ID.
1339
+ * Called when opening a modal to preserve thread/message for the submit handler.
1340
+ */
1341
+ async storeModalContext(adapterName, thread, message) {
1342
+ const contextId = crypto.randomUUID();
1343
+ const key = `modal-context:${adapterName}:${contextId}`;
1344
+ const context = {
1345
+ thread: thread.toJSON(),
1346
+ message: message?.toJSON()
1347
+ };
1348
+ await this._stateAdapter.set(key, context, MODAL_CONTEXT_TTL_MS);
1349
+ return contextId;
1350
+ }
1351
+ /**
1352
+ * Retrieve and delete modal context from server-side storage.
1353
+ * Called when processing modal submit/close to reconstruct thread/message.
1354
+ */
1355
+ async retrieveModalContext(adapterName, contextId) {
1356
+ if (!contextId) {
1357
+ return { relatedThread: void 0, relatedMessage: void 0 };
1358
+ }
1359
+ const key = `modal-context:${adapterName}:${contextId}`;
1360
+ const stored = await this._stateAdapter.get(key);
1361
+ if (!stored) {
1362
+ return { relatedThread: void 0, relatedMessage: void 0 };
1363
+ }
1364
+ await this._stateAdapter.delete(key);
1365
+ const adapter = this.adapters.get(adapterName);
1366
+ const thread = ThreadImpl.fromJSON(stored.thread, adapter);
1367
+ let relatedMessage;
1368
+ if (stored.message) {
1369
+ const message = Message.fromJSON(stored.message);
1370
+ relatedMessage = thread.createSentMessageFromMessage(message);
1371
+ }
1372
+ return { relatedThread: thread, relatedMessage };
1373
+ }
1287
1374
  /**
1288
1375
  * Handle an action event internally.
1289
1376
  */
@@ -1331,7 +1418,18 @@ var Chat = class {
1331
1418
  }
1332
1419
  modalElement = converted;
1333
1420
  }
1334
- return event.adapter.openModal(event.triggerId, modalElement);
1421
+ const recentMessage = thread.recentMessages[0];
1422
+ const message = recentMessage && typeof recentMessage.toJSON === "function" ? recentMessage : void 0;
1423
+ const contextId = await this.storeModalContext(
1424
+ event.adapter.name,
1425
+ thread,
1426
+ message
1427
+ );
1428
+ return event.adapter.openModal(
1429
+ event.triggerId,
1430
+ modalElement,
1431
+ contextId
1432
+ );
1335
1433
  }
1336
1434
  };
1337
1435
  this.logger.debug("Checking action handlers", {
@@ -2051,6 +2149,7 @@ var fromReactElement2 = fromReactElement;
2051
2149
  var Image2 = Image;
2052
2150
  var isCardElement2 = isCardElement;
2053
2151
  var isJSX2 = isJSX;
2152
+ var LinkButton2 = LinkButton;
2054
2153
  var Section2 = Section;
2055
2154
  var toCardElement2 = toCardElement;
2056
2155
  var toModalElement2 = toModalElement;
@@ -2075,6 +2174,7 @@ export {
2075
2174
  Field2 as Field,
2076
2175
  Fields2 as Fields,
2077
2176
  Image2 as Image,
2177
+ LinkButton2 as LinkButton,
2078
2178
  LockError,
2079
2179
  Message,
2080
2180
  Modal2 as Modal,