@gooddata/sdk-ui-gen-ai 11.50.0-alpha.2 → 11.50.0-alpha.3

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 (23) hide show
  1. package/esm/components/completion/plugins/reference-placeholder.d.ts +21 -0
  2. package/esm/components/completion/plugins/reference-placeholder.d.ts.map +1 -0
  3. package/esm/components/completion/plugins/reference-placeholder.js +33 -0
  4. package/esm/components/completion/plugins/rehype-references.d.ts +5 -1
  5. package/esm/components/completion/plugins/rehype-references.d.ts.map +1 -1
  6. package/esm/components/completion/plugins/rehype-references.js +40 -18
  7. package/esm/components/completion/plugins/remark-references.d.ts.map +1 -1
  8. package/esm/components/completion/plugins/remark-references.js +2 -5
  9. package/esm/components/completion/utils.d.ts +1 -1
  10. package/esm/components/completion/utils.d.ts.map +1 -1
  11. package/esm/components/completion/utils.js +1 -4
  12. package/esm/components/customized/LandingScreen.js +1 -1
  13. package/esm/components/messages/contents/Markdown.d.ts.map +1 -1
  14. package/esm/components/messages/contents/Markdown.js +4 -1
  15. package/esm/components/messages/conversationContents/ConversationVisualizationContent.d.ts +0 -1
  16. package/esm/components/messages/conversationContents/ConversationVisualizationContent.d.ts.map +1 -1
  17. package/esm/components/messages/conversationContents/SaveVisualizationDialog.d.ts +0 -1
  18. package/esm/components/messages/conversationContents/SaveVisualizationDialog.d.ts.map +1 -1
  19. package/esm/store/sideEffects/onChatOpenSync.d.ts.map +1 -1
  20. package/esm/store/sideEffects/onChatOpenSync.js +14 -4
  21. package/esm/store/sideEffects/onVisualizationSave.d.ts +0 -1
  22. package/esm/store/sideEffects/onVisualizationSave.d.ts.map +1 -1
  23. package/package.json +20 -20
@@ -0,0 +1,21 @@
1
+ export declare const PLACEHOLDER_START = "\uE000";
2
+ export interface IExtractedReferences {
3
+ /** Original text with every `{type/id}` token replaced by a placeholder. */
4
+ text: string;
5
+ /** Original `{type/id}` tokens, indexed by the number embedded in their placeholder. */
6
+ tokens: string[];
7
+ }
8
+ /**
9
+ * `split`'s capture group wraps the whole placeholder, for use with `String.split`
10
+ * so the placeholder survives as its own array entry. The default form's capture
11
+ * group is just the numeric index, for an `exec()` loop that resolves it against
12
+ * `tokens`.
13
+ */
14
+ export declare function getPlaceholderRegex(split?: boolean): RegExp;
15
+ /**
16
+ * Replaces `{type/id}` reference tokens with placeholders before Markdown parsing.
17
+ * CommonMark's emphasis rule treats `_word_`-shaped substrings inside an id as
18
+ * legal italic markup and strips the underscores — extracting first avoids that.
19
+ */
20
+ export declare function extractReferences(text: string): IExtractedReferences;
21
+ //# sourceMappingURL=reference-placeholder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-placeholder.d.ts","sourceRoot":"","sources":["../../../../src/components/completion/plugins/reference-placeholder.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAG1C,MAAM,WAAW,oBAAoB;IACjC,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAK3D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAQpE"}
@@ -0,0 +1,33 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { getReferenceRegex } from "../utils.js";
3
+ // Private-use-area sentinels: never produced by normal chat text, and contain
4
+ // none of the characters (`_`, `*`, backtick, ...) CommonMark treats as inline
5
+ // syntax, so a placeholder can never be mis-tokenized as Markdown.
6
+ export const PLACEHOLDER_START = "\ue000";
7
+ const PLACEHOLDER_END = "\ue001";
8
+ /**
9
+ * `split`'s capture group wraps the whole placeholder, for use with `String.split`
10
+ * so the placeholder survives as its own array entry. The default form's capture
11
+ * group is just the numeric index, for an `exec()` loop that resolves it against
12
+ * `tokens`.
13
+ */
14
+ export function getPlaceholderRegex(split) {
15
+ if (split) {
16
+ return new RegExp(`(${PLACEHOLDER_START}\\d+${PLACEHOLDER_END})`, "g");
17
+ }
18
+ return new RegExp(`${PLACEHOLDER_START}(\\d+)${PLACEHOLDER_END}`, "g");
19
+ }
20
+ /**
21
+ * Replaces `{type/id}` reference tokens with placeholders before Markdown parsing.
22
+ * CommonMark's emphasis rule treats `_word_`-shaped substrings inside an id as
23
+ * legal italic markup and strips the underscores — extracting first avoids that.
24
+ */
25
+ export function extractReferences(text) {
26
+ const tokens = [];
27
+ const replacedText = text.replace(getReferenceRegex(), (match) => {
28
+ const index = tokens.length;
29
+ tokens.push(match);
30
+ return `${PLACEHOLDER_START}${index}${PLACEHOLDER_END}`;
31
+ });
32
+ return { text: replacedText, tokens };
33
+ }
@@ -1,4 +1,8 @@
1
1
  import { type Root } from "mdast";
2
2
  import { type TextContentObject } from "../../../model.js";
3
- export declare function rehypeReferences(references: TextContentObject[]): () => (tree: Root) => Root;
3
+ /**
4
+ * `tokens` must be the `tokens` array `extractReferences()` returned for the same
5
+ * Markdown text — placeholders are resolved by looking up their embedded index in it.
6
+ */
7
+ export declare function rehypeReferences(references: TextContentObject[], tokens: string[]): () => (tree: Root) => Root;
4
8
  //# sourceMappingURL=rehype-references.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rehype-references.d.ts","sourceRoot":"","sources":["../../../../src/components/completion/plugins/rehype-references.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC;AAGlC,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAK3D,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,EAAE,8BAyC/D"}
1
+ {"version":3,"file":"rehype-references.d.ts","sourceRoot":"","sources":["../../../../src/components/completion/plugins/rehype-references.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,OAAO,CAAC;AAGlC,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAK3D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,8BAyCjF"}
@@ -1,10 +1,14 @@
1
1
  // (C) 2022-2026 GoodData Corporation
2
2
  import cx from "classnames";
3
- import { getReferenceRegex } from "../utils.js";
4
- export function rehypeReferences(references) {
3
+ import { PLACEHOLDER_START, getPlaceholderRegex } from "./reference-placeholder.js";
4
+ /**
5
+ * `tokens` must be the `tokens` array `extractReferences()` returned for the same
6
+ * Markdown text — placeholders are resolved by looking up their embedded index in it.
7
+ */
8
+ export function rehypeReferences(references, tokens) {
5
9
  return function () {
6
10
  return function (tree) {
7
- iterateTree(tree, references, {
11
+ iterateTree(tree, references, tokens, {
8
12
  onTextNodeReference: (text, obj) => {
9
13
  return [
10
14
  {
@@ -43,35 +47,53 @@ export function rehypeReferences(references) {
43
47
  };
44
48
  };
45
49
  }
46
- function iterateTree(node, references, callbacks) {
47
- //Text type
50
+ function iterateTree(node, references, tokens, callbacks) {
48
51
  if (node.type === "text") {
49
- const res = iterateReferenceMatch(node.value, references, (ref) => {
52
+ const value = node.value;
53
+ if (!value.includes(PLACEHOLDER_START)) {
54
+ return [node];
55
+ }
56
+ const res = iterateReferenceMatch(value, references, tokens, (ref) => {
50
57
  return callbacks.onTextNodeReference(node, ref);
51
58
  });
52
- return res.length ? res : [node];
59
+ if (res.length) {
60
+ return res;
61
+ }
62
+ node.value = restoreUnresolvedPlaceholders(value, tokens);
63
+ return [node];
53
64
  }
54
65
  if (node.children) {
55
- // has children
56
66
  node.children = node.children.reduce((acc, child) => {
57
- return [...acc, ...iterateTree(child, references, callbacks)];
67
+ return [...acc, ...iterateTree(child, references, tokens, callbacks)];
58
68
  }, []);
59
69
  return [node];
60
70
  }
61
- // no children
62
71
  return [node];
63
72
  }
64
- function iterateReferenceMatch(value, references, onMatch) {
73
+ /**
74
+ * Replaces any placeholder occurrences left in a text node (i.e. ones that did not
75
+ * resolve to a reference chip) with their original `{type/id}` token text, so the
76
+ * output never leaks a raw placeholder sentinel (an invisible PUA-wrapped digit)
77
+ * as visible text.
78
+ */
79
+ function restoreUnresolvedPlaceholders(value, tokens) {
80
+ return value.replace(getPlaceholderRegex(), (match, indexStr) => {
81
+ const originalToken = tokens[Number(indexStr)];
82
+ return originalToken ?? match;
83
+ });
84
+ }
85
+ function iterateReferenceMatch(value, references, tokens, onMatch) {
65
86
  const items = [];
66
- const regex = getReferenceRegex();
87
+ const regex = getPlaceholderRegex();
67
88
  let match = regex.exec(value);
68
89
  while (match) {
69
- const [type, id] = match[1].split("/");
70
- const ref = references.find((ref) => {
71
- return ref.id === id && ref.type === type;
72
- });
73
- if (ref) {
74
- items.push(...onMatch(ref));
90
+ const originalToken = tokens[Number(match[1])];
91
+ if (originalToken) {
92
+ const [type, id] = originalToken.slice(1, -1).split("/");
93
+ const ref = references.find((ref) => ref.id === id && ref.type === type);
94
+ if (ref) {
95
+ items.push(...onMatch(ref));
96
+ }
75
97
  }
76
98
  match = regex.exec(value);
77
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"remark-references.d.ts","sourceRoot":"","sources":["../../../../src/components/completion/plugins/remark-references.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,MAAM,EAAc,MAAM,OAAO,CAAC;AAM3D,wBAAgB,gBAAgB,mCAiC/B"}
1
+ {"version":3,"file":"remark-references.d.ts","sourceRoot":"","sources":["../../../../src/components/completion/plugins/remark-references.ts"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,MAAM,EAAc,MAAM,OAAO,CAAC;AAK3D,wBAAgB,gBAAgB,mCAiC/B"}
@@ -1,12 +1,12 @@
1
1
  // (C) 2022-2026 GoodData Corporation
2
- import { getReferenceRegex } from "../utils.js";
2
+ import { getPlaceholderRegex } from "./reference-placeholder.js";
3
3
  export function remarkReferences() {
4
4
  return function () {
5
5
  return function (tree) {
6
6
  iterateTree(tree, {
7
7
  onText: (text) => {
8
8
  const nodes = [];
9
- const parts = text.value.split(getReferenceRegex(true));
9
+ const parts = text.value.split(getPlaceholderRegex(true));
10
10
  let start = text.position?.start ?? { line: 0, column: 0, offset: 0 };
11
11
  parts.forEach((part) => {
12
12
  const end = {
@@ -32,17 +32,14 @@ export function remarkReferences() {
32
32
  };
33
33
  }
34
34
  function iterateTree(node, callbacks) {
35
- //Text type
36
35
  if (node.type === "text") {
37
36
  return callbacks.onText(node);
38
37
  }
39
- // has children
40
38
  if (node.children) {
41
39
  node.children = node.children.reduce((acc, child) => {
42
40
  return [...acc, ...iterateTree(child, callbacks)];
43
41
  }, []);
44
42
  return [node];
45
43
  }
46
- // no children
47
44
  return [node];
48
45
  }
@@ -16,7 +16,7 @@ export declare function getOptions(intl: IntlShape, { items, search, canManage,
16
16
  excludeTags?: string[];
17
17
  }): ICompletionItem[];
18
18
  declare const SupportedReferenceTypes: readonly ["fact", "metric", "date", "attribute", "label", "dashboard", "visualization"];
19
- export declare function getReferenceRegex(split?: boolean): RegExp;
19
+ export declare function getReferenceRegex(): RegExp;
20
20
  export declare function getItems(intl: IntlShape, item: CatalogItem, { canManage, canAnalyze, onCompletionSelected }: {
21
21
  canManage?: boolean;
22
22
  canAnalyze?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/completion/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,mCAAmC,EACxC,KAAK,qBAAqB,EAC1B,KAAK,MAAM,EAQd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,WAAW,eAAgB,SAAQ,UAAU;IAC/C,IAAI,EAAE,WAAW,GAAG,qBAAqB,CAAC;CAC7C;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,iBAW7C;AAGD,wBAAgB,UAAU,CACtB,IAAI,EAAE,SAAS,EACf,EACI,KAAK,EACL,MAAM,EACN,SAAS,EACT,UAAU,EACV,oBAA+B,EAC/B,WAAW,EACX,WAAW,EACd,EAAE;IACC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;IAC7D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,GACF,eAAe,EAAE,CAcnB;AAED,QAAA,MAAM,uBAAuB,yFAQnB,CAAC;AAGX,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO,UAKhD;AAGD,wBAAgB,QAAQ,CACpB,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,WAAW,EACjB,EACI,SAAS,EACT,UAAU,EACV,oBAAoB,EACvB,EAAE;IACC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;CAChE,GACF,eAAe,EAAE,CAqGnB;AAUD,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,GACtC,iBAAiB,GAAG,IAAI,CAgB1B;AAGD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,iBAExD;AAGD,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,WAAW,GAAG,qBAAqB,GAAG,mCAAmC,GAChF,MAAM,GAAG,IAAI,CAoBf;AAGD,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,WAAW,GAAG,qBAAqB,GAAG,mCAAmC,UAqBlF;AAGD,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,WAAW,GAAG,qBAAqB,GAAG,mCAAmC,GAChF,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAoBjD;AAsBD,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,WA0B1F"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/components/completion/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,mCAAmC,EACxC,KAAK,qBAAqB,EAC1B,KAAK,MAAM,EAQd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAIxD,MAAM,WAAW,eAAgB,SAAQ,UAAU;IAC/C,IAAI,EAAE,WAAW,GAAG,qBAAqB,CAAC;CAC7C;AAGD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,iBAW7C;AAGD,wBAAgB,UAAU,CACtB,IAAI,EAAE,SAAS,EACf,EACI,KAAK,EACL,MAAM,EACN,SAAS,EACT,UAAU,EACV,oBAA+B,EAC/B,WAAW,EACX,WAAW,EACd,EAAE;IACC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;IAC7D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,GACF,eAAe,EAAE,CAcnB;AAED,QAAA,MAAM,uBAAuB,yFAQnB,CAAC;AAGX,wBAAgB,iBAAiB,WAEhC;AAGD,wBAAgB,QAAQ,CACpB,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,WAAW,EACjB,EACI,SAAS,EACT,UAAU,EACV,oBAAoB,EACvB,EAAE;IACC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;CAChE,GACF,eAAe,EAAE,CAqGnB;AAUD,wBAAgB,yBAAyB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC,GACtC,iBAAiB,GAAG,IAAI,CAgB1B;AAGD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,eAAe,iBAExD;AAGD,wBAAgB,gBAAgB,CAC5B,IAAI,EAAE,WAAW,GAAG,qBAAqB,GAAG,mCAAmC,GAChF,MAAM,GAAG,IAAI,CAoBf;AAGD,wBAAgB,mBAAmB,CAC/B,IAAI,EAAE,WAAW,GAAG,qBAAqB,GAAG,mCAAmC,UAqBlF;AAGD,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,WAAW,GAAG,qBAAqB,GAAG,mCAAmC,GAChF,CAAC,OAAO,uBAAuB,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAoBjD;AAsBD,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,WA0B1F"}
@@ -39,10 +39,7 @@ const SupportedReferenceTypes = [
39
39
  "visualization",
40
40
  ];
41
41
  // Utility: Get regex for references
42
- export function getReferenceRegex(split) {
43
- if (split) {
44
- return new RegExp(`(\\{(?:${SupportedReferenceTypes.join("|")})\\/[.A-Za-z0-9_-]{1,255}\\})`, "g");
45
- }
42
+ export function getReferenceRegex() {
46
43
  return new RegExp(`\\{((?:${SupportedReferenceTypes.join("|")})\\/(?!\\.)[.A-Za-z0-9_-]{1,255})\\}`, "g");
47
44
  }
48
45
  // Utility: Get item for completion
@@ -26,7 +26,7 @@ const quickOptions = [
26
26
  ];
27
27
  function LandingScreenComponent({ LandingScreen, isBigScreen, isSmallScreen, isFullscreen, }) {
28
28
  const intl = useIntl();
29
- return (_jsx("div", { className: "gd-gen-ai-chat__messages__empty", children: LandingScreen ? (_jsx(LandingScreen, {})) : (_jsxs(DefaultLandingContainer, { isFullscreen: isFullscreen, isBigScreen: isBigScreen, isSmallScreen: isSmallScreen, children: [
29
+ return (_jsx("div", { className: "gd-gen-ai-chat__messages__empty", "data-testid": "gen-ai-chat-landing-screen", children: LandingScreen ? (_jsx(LandingScreen, {})) : (_jsxs(DefaultLandingContainer, { isFullscreen: isFullscreen, isBigScreen: isBigScreen, isSmallScreen: isSmallScreen, children: [
30
30
  _jsxs(DefaultLandingTitle, { children: [
31
31
  _jsx(DefaultLandingTitleAscent, { children: _jsx(FormattedMessage, { id: "gd.gen-ai.welcome.line-1" }) }), _jsx("br", {}), _jsx(FormattedMessage, { id: "gd.gen-ai.welcome.line-2" })
32
32
  ] }), _jsx(DefaultLandingQuestions, { isFullscreen: isFullscreen, isBigScreen: isBigScreen, isSmallScreen: isSmallScreen, children: quickOptions.map((option) => (_jsx(DefaultLandingQuestion, { icon: option.icon, title: intl.formatMessage(option.title), question: intl.formatMessage(option.question), answer: intl.formatMessage(option.answer) }, option.title.id))) })
@@ -1 +1 @@
1
- {"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/contents/Markdown.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAsB3D,KAAK,sBAAsB,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAqB,EAAE,EAAE,sBAAsB,2CAexG"}
1
+ {"version":3,"file":"Markdown.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/contents/Markdown.tsx"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAuB3D,KAAK,sBAAsB,GAAG;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAqB,EAAE,EAAE,sBAAsB,2CAiBxG"}
@@ -1,9 +1,11 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  // (C) 2024-2026 GoodData Corporation
3
+ import { useMemo } from "react";
3
4
  import Markdown from "react-markdown";
4
5
  import remarkEmoji from "remark-emoji";
5
6
  import remarkGfm from "remark-gfm";
6
7
  import { Typography } from "@gooddata/sdk-ui-kit";
8
+ import { extractReferences } from "../../completion/plugins/reference-placeholder.js";
7
9
  import { rehypeReferences } from "../../completion/plugins/rehype-references.js";
8
10
  import { remarkReferences } from "../../completion/plugins/remark-references.js";
9
11
  import { CustomHyperlink } from "./CustomHyperlink.js";
@@ -22,8 +24,9 @@ const customUrlTransform = (url) => {
22
24
  return /^http|https|mailto|tel|gooddata:/i.test(url) ? url : "";
23
25
  };
24
26
  export function MarkdownComponent({ children, references, allowMarkdown = false }) {
27
+ const { text, tokens } = useMemo(() => extractReferences(children), [children]);
25
28
  if (allowMarkdown) {
26
- return (_jsx(Markdown, { remarkPlugins: [remarkEmoji, remarkGfm, remarkReferences()], rehypePlugins: [rehypeReferences(references ?? [])], components: componentMap, urlTransform: customUrlTransform, children: children }));
29
+ return (_jsx(Markdown, { remarkPlugins: [remarkEmoji, remarkGfm, remarkReferences()], rehypePlugins: [rehypeReferences(references ?? [], tokens)], components: componentMap, urlTransform: customUrlTransform, children: text }));
27
30
  }
28
31
  return _jsx(Typography, { tagName: "p", children: children });
29
32
  }
@@ -32,7 +32,6 @@ export declare const ConversationVisualizationContent: import("react-redux").Con
32
32
  uri: string;
33
33
  ref: import("@gooddata/sdk-model").ObjRef;
34
34
  isLocked?: boolean | undefined;
35
- isHidden?: boolean | undefined;
36
35
  certification?: import("@gooddata/sdk-model").IObjectCertification | undefined;
37
36
  };
38
37
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationVisualizationContent.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/conversationContents/ConversationVisualizationContent.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,qCAAqC,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,KAAK,aAAa,EAAgD,MAAM,qBAAqB,CAAC;AAwBvG,OAAO,EAAE,KAAK,0BAA0B,EAAE,KAAK,mCAAmC,EAAE,MAAM,mBAAmB,CAAC;AAM9G,OAAO,EAEH,0BAA0B,EAC7B,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAwBlF,MAAM,MAAM,qCAAqC,GAAG;IAChD,OAAO,EAAE,0BAA0B,CAAC;IACpC,IAAI,EAAE,mCAAmC,CAAC;IAC1C,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,aAAa,EAAE,WAAW,CAAC,qCAAqC,CAAC,eAAe,CAAC,CAAC,CAAC;IACnF,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxD,oBAAoB,CAAC,EAAE,OAAO,0BAA0B,CAAC;IACzD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF,iBAAS,oCAAoC,CAAC,EAC1C,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,EAC/B,EAAE,qCAAqC,2CAmGvC;AAmnBD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;;EAGN,CAAC"}
1
+ {"version":3,"file":"ConversationVisualizationContent.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/conversationContents/ConversationVisualizationContent.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,qCAAqC,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,KAAK,aAAa,EAAgD,MAAM,qBAAqB,CAAC;AAwBvG,OAAO,EAAE,KAAK,0BAA0B,EAAE,KAAK,mCAAmC,EAAE,MAAM,mBAAmB,CAAC;AAM9G,OAAO,EAEH,0BAA0B,EAC7B,MAAM,8CAA8C,CAAC;AAGtD,OAAO,EAAE,KAAK,yBAAyB,EAAE,MAAM,kCAAkC,CAAC;AAwBlF,MAAM,MAAM,qCAAqC,GAAG;IAChD,OAAO,EAAE,0BAA0B,CAAC;IACpC,IAAI,EAAE,mCAAmC,CAAC;IAC1C,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,aAAa,EAAE,WAAW,CAAC,qCAAqC,CAAC,eAAe,CAAC,CAAC,CAAC;IACnF,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxD,oBAAoB,CAAC,EAAE,OAAO,0BAA0B,CAAC;IACzD,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,4BAA4B,CAAC,EAAE,OAAO,CAAC;CAC1C,CAAC;AAEF,iBAAS,oCAAoC,CAAC,EAC1C,OAAO,EACP,IAAI,EACJ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,WAAW,EACX,oBAAoB,EACpB,mBAAmB,EACnB,4BAA4B,EAC/B,EAAE,qCAAqC,2CAmGvC;AAmnBD,eAAO,MAAM,gCAAgC;;;;;;;;;;;;;;;;EAGN,CAAC"}
@@ -24,7 +24,6 @@ export declare const SaveVisualizationDialog: import("react-redux").ConnectedCom
24
24
  uri: string;
25
25
  ref: import("@gooddata/sdk-model").ObjRef;
26
26
  isLocked?: boolean | undefined;
27
- isHidden?: boolean | undefined;
28
27
  certification?: import("@gooddata/sdk-model").IObjectCertification | undefined;
29
28
  };
30
29
  };
@@ -1 +1 @@
1
- {"version":3,"file":"SaveVisualizationDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/conversationContents/SaveVisualizationDialog.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,qCAAqC,EAAE,MAAM,2BAA2B,CAAC;AAGvF,OAAO,EAAE,KAAK,0BAA0B,EAAE,KAAK,mCAAmC,EAAE,MAAM,mBAAmB,CAAC;AAC9G,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAE7G,MAAM,MAAM,4BAA4B,GAAG;IACvC,OAAO,EAAE,0BAA0B,CAAC;IACpC,IAAI,EAAE,mCAAmC,CAAC;IAC1C,aAAa,EAAE,WAAW,CAAC,qCAAqC,CAAC,eAAe,CAAC,CAAC,CAAC;IACnF,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IAC/C,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,wBAAwB,EAAE,OAAO,wBAAwB,CAAC;CAC7D,CAAC;AAEF,iBAAS,2BAA2B,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,aAAa,EACb,OAAO,EACP,uBAAuB,EACvB,wBAAwB,EAC3B,EAAE,4BAA4B,GAAG,oCAAoC,2CAkDrE;AA8DD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;EAAiE,CAAC"}
1
+ {"version":3,"file":"SaveVisualizationDialog.d.ts","sourceRoot":"","sources":["../../../../src/components/messages/conversationContents/SaveVisualizationDialog.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,qCAAqC,EAAE,MAAM,2BAA2B,CAAC;AAGvF,OAAO,EAAE,KAAK,0BAA0B,EAAE,KAAK,mCAAmC,EAAE,MAAM,mBAAmB,CAAC;AAC9G,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAE7G,MAAM,MAAM,4BAA4B,GAAG;IACvC,OAAO,EAAE,0BAA0B,CAAC;IACpC,IAAI,EAAE,mCAAmC,CAAC;IAC1C,aAAa,EAAE,WAAW,CAAC,qCAAqC,CAAC,eAAe,CAAC,CAAC,CAAC;IACnF,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IAC/C,uBAAuB,EAAE,OAAO,uBAAuB,CAAC;IACxD,wBAAwB,EAAE,OAAO,wBAAwB,CAAC;CAC7D,CAAC;AAEF,iBAAS,2BAA2B,CAAC,EACjC,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,aAAa,EACb,OAAO,EACP,uBAAuB,EACvB,wBAAwB,EAC3B,EAAE,4BAA4B,GAAG,oCAAoC,2CAkDrE;AA8DD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;EAAiE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"onChatOpenSync.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/onChatOpenSync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUtD,OAAO,EACH,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAElC,MAAM,gBAAgB,CAAC;AAgBxB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAiB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;;;;;;;;;;;6DA4F1F"}
1
+ {"version":3,"file":"onChatOpenSync.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/onChatOpenSync.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUtD,OAAO,EACH,KAAK,sBAAsB,EAC3B,KAAK,0BAA0B,EAElC,MAAM,gBAAgB,CAAC;AAiBxB;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAiB,cAAc,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;;;;;;;;;;;6DAyG1F"}
@@ -2,7 +2,7 @@
2
2
  import { call, getContext, put, select } from "redux-saga/effects";
3
3
  import { makeConversationItem, } from "../../model.js";
4
4
  import { settingsSelector } from "../chatWindow/chatWindowSelectors.js";
5
- import { asyncProcessSelector, conversationSelector, conversationsLoadedSelector, } from "../messages/messagesSelectors.js";
5
+ import { asyncProcessSelector, conversationMessagesSelector, conversationSelector, conversationsLoadedSelector, } from "../messages/messagesSelectors.js";
6
6
  import { loadConversationsSuccessAction, setCurrentConversationAction, setMessagesAction, } from "../messages/messagesSlice.js";
7
7
  import { convertToLocalContent } from "./converters/toLocalContent.js";
8
8
  import { notifyDefinitionReceived } from "./onDefinitionReceivedTrigger.js";
@@ -52,6 +52,7 @@ export function* onChatOpenSync({ payload: { isOpen } }) {
52
52
  return;
53
53
  }
54
54
  const current = yield select(conversationSelector);
55
+ const currentItems = yield select(conversationMessagesSelector);
55
56
  // Keep a brand-new, not-yet-persisted draft conversation as-is.
56
57
  if (current && !current.id) {
57
58
  return;
@@ -98,11 +99,20 @@ export function* onChatOpenSync({ payload: { isOpen } }) {
98
99
  // writes into whatever currentConversation points at, so the switch must come first - and
99
100
  // both puts are dispatched synchronously (no yield between them) so the UI never observes the
100
101
  // intermediate empty/unloaded state.
101
- if (latest.id !== currentNow?.id) {
102
+ const isDifferentConversation = latest.id !== currentNow?.id;
103
+ if (isDifferentConversation) {
102
104
  yield put(setCurrentConversationAction({ conversation: latest }));
103
105
  }
104
- yield put(setMessagesAction({ items }));
105
- yield call(notifyDefinitionReceived, items, latest.localId);
106
+ // Check if new items are different from the current ones. If so, replace the whole list.
107
+ // If the conversation was just switched above, we always replace because the currentItems
108
+ // we have in hand belong to the previous conversation.
109
+ const sameItems = !isDifferentConversation &&
110
+ items.length === currentItems.length &&
111
+ items.every((item, i) => item.id === currentItems[i]?.id);
112
+ if (!sameItems) {
113
+ yield put(setMessagesAction({ items }));
114
+ yield call(notifyDefinitionReceived, items, latest.localId);
115
+ }
106
116
  }
107
117
  catch {
108
118
  // Fail silently - keep showing whatever is currently loaded.
@@ -37,7 +37,6 @@ export declare function onVisualizationSave({ payload }: PayloadAction<{
37
37
  uri: string;
38
38
  ref: import("@gooddata/sdk-model").ObjRef;
39
39
  isLocked?: boolean | undefined;
40
- isHidden?: boolean | undefined;
41
40
  certification?: import("@gooddata/sdk-model").IObjectCertification | undefined;
42
41
  };
43
42
  } & Message[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"onVisualizationSave.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/onVisualizationSave.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAGH,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,kBAAkB,EAG1B,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAEH,KAAK,0BAA0B,EAE/B,KAAK,OAAO,EAEf,MAAM,gBAAgB,CAAC;AASxB,wBAAiB,mBAAmB,CAAC,EACjC,OAAO,EACV,EAAE,aAAa,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAgHD;AAoGD,eAAO,MAAM,cAAc,+FA0C1B,CAAC;AAEF,eAAO,MAAM,gBAAgB,+FAoC5B,CAAC"}
1
+ {"version":3,"file":"onVisualizationSave.d.ts","sourceRoot":"","sources":["../../../src/store/sideEffects/onVisualizationSave.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAGH,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,kBAAkB,EAG1B,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAEH,KAAK,0BAA0B,EAE/B,KAAK,OAAO,EAEf,MAAM,gBAAgB,CAAC;AASxB,wBAAiB,mBAAmB,CAAC,EACjC,OAAO,EACV,EAAE,aAAa,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CACpB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAgHD;AAoGD,eAAO,MAAM,cAAc,+FA0C1B,CAAC;AAEF,eAAO,MAAM,gBAAgB,+FAoC5B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-gen-ai",
3
- "version": "11.50.0-alpha.2",
3
+ "version": "11.50.0-alpha.3",
4
4
  "description": "GoodData GenAI SDK",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -57,18 +57,18 @@
57
57
  "reselect": "5.1.1",
58
58
  "tslib": "2.8.1",
59
59
  "uuid": "11.1.1",
60
- "@gooddata/api-client-tiger": "11.50.0-alpha.2",
61
- "@gooddata/sdk-backend-spi": "11.50.0-alpha.2",
62
- "@gooddata/sdk-ui": "11.50.0-alpha.2",
63
- "@gooddata/sdk-model": "11.50.0-alpha.2",
64
- "@gooddata/sdk-ui-charts": "11.50.0-alpha.2",
65
- "@gooddata/sdk-ui-filters": "11.50.0-alpha.2",
66
- "@gooddata/sdk-ui-dashboard": "11.50.0-alpha.2",
67
- "@gooddata/sdk-ui-kit": "11.50.0-alpha.2",
68
- "@gooddata/sdk-ui-pivot": "11.50.0-alpha.2",
69
- "@gooddata/sdk-ui-semantic-search": "11.50.0-alpha.2",
70
- "@gooddata/sdk-ui-theme-provider": "11.50.0-alpha.2",
71
- "@gooddata/util": "11.50.0-alpha.2"
60
+ "@gooddata/api-client-tiger": "11.50.0-alpha.3",
61
+ "@gooddata/sdk-backend-spi": "11.50.0-alpha.3",
62
+ "@gooddata/sdk-model": "11.50.0-alpha.3",
63
+ "@gooddata/sdk-ui-charts": "11.50.0-alpha.3",
64
+ "@gooddata/sdk-ui": "11.50.0-alpha.3",
65
+ "@gooddata/sdk-ui-kit": "11.50.0-alpha.3",
66
+ "@gooddata/sdk-ui-filters": "11.50.0-alpha.3",
67
+ "@gooddata/sdk-ui-dashboard": "11.50.0-alpha.3",
68
+ "@gooddata/sdk-ui-pivot": "11.50.0-alpha.3",
69
+ "@gooddata/sdk-ui-semantic-search": "11.50.0-alpha.3",
70
+ "@gooddata/util": "11.50.0-alpha.3",
71
+ "@gooddata/sdk-ui-theme-provider": "11.50.0-alpha.3"
72
72
  },
73
73
  "devDependencies": {
74
74
  "@microsoft/api-documenter": "^7.17.0",
@@ -111,13 +111,13 @@
111
111
  "typescript": "5.9.3",
112
112
  "vitest": "4.1.8",
113
113
  "vitest-dom": "0.1.1",
114
- "@gooddata/eslint-config": "11.50.0-alpha.2",
115
- "@gooddata/reference-workspace": "11.50.0-alpha.2",
116
- "@gooddata/i18n-toolkit": "11.50.0-alpha.2",
117
- "@gooddata/oxlint-config": "11.50.0-alpha.2",
118
- "@gooddata/sdk-ui-theme-provider": "11.50.0-alpha.2",
119
- "@gooddata/stylelint-config": "11.50.0-alpha.2",
120
- "@gooddata/sdk-backend-mockingbird": "11.50.0-alpha.2"
114
+ "@gooddata/eslint-config": "11.50.0-alpha.3",
115
+ "@gooddata/i18n-toolkit": "11.50.0-alpha.3",
116
+ "@gooddata/reference-workspace": "11.50.0-alpha.3",
117
+ "@gooddata/oxlint-config": "11.50.0-alpha.3",
118
+ "@gooddata/sdk-ui-theme-provider": "11.50.0-alpha.3",
119
+ "@gooddata/stylelint-config": "11.50.0-alpha.3",
120
+ "@gooddata/sdk-backend-mockingbird": "11.50.0-alpha.3"
121
121
  },
122
122
  "peerDependencies": {
123
123
  "react": "^18.0.0 || ^19.0.0",