@gravity-ui/aikit 2.25.0 → 2.25.1-beta.878aea7e24fa31cfa067fc42048ca0be5fcbaca9.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.
@@ -1 +1 @@
1
- {"version":"2.25.0","type":"commonjs","sideEffects":["*.css","*.scss"]}
1
+ {"version":"2.25.1-beta.878aea7e24fa31cfa067fc42048ca0be5fcbaca9.0","type":"commonjs","sideEffects":["*.css","*.scss"]}
@@ -16,6 +16,9 @@ function normalizeContent(content) {
16
16
  return [];
17
17
  }
18
18
  if (typeof content === 'string') {
19
+ if (!content.trim()) {
20
+ return [];
21
+ }
19
22
  return [
20
23
  {
21
24
  type: 'text',
@@ -25,10 +28,18 @@ function normalizeContent(content) {
25
28
  },
26
29
  ];
27
30
  }
28
- if (Array.isArray(content)) {
29
- return content;
30
- }
31
- return [content];
31
+ const parts = Array.isArray(content) ? content : [content];
32
+ return parts.filter((part) => {
33
+ const data = part.data;
34
+ if (part.type !== 'text' ||
35
+ typeof data !== 'object' ||
36
+ data === null ||
37
+ !('text' in data) ||
38
+ typeof data.text !== 'string') {
39
+ return true;
40
+ }
41
+ return data.text.trim().length > 0;
42
+ });
32
43
  }
33
44
  /**
34
45
  * Check if message content contains ONLY thinking content (no other content types).
@@ -1 +1 @@
1
- {"version":3,"file":"messageUtils.js","sourceRoot":"../../../src","sources":["utils/messageUtils.ts"],"names":[],"mappings":";;AAaA,sCAKC;AAED,gDAOC;AAED,4CAuBC;AAOD,wDAQC;AAKD,sDA4BC;AAvFD,SAAgB,aAAa,CAG3B,OAAsD;IACpD,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AACnC,CAAC;AAED,SAAgB,kBAAkB,CAI9B,OAAsD;IAEtD,OAAO,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;AACxC,CAAC;AAED,SAAgB,gBAAgB,CAC5B,OAA8E;IAE9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACH;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;oBACF,IAAI,EAAE,OAAO;iBAChB;aACJ;SACJ,CAAC;IACN,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAClC,OAA8E;IAE9E,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;AAC3D,CAAC;AAKD,SAAgB,qBAAqB,CAGjC,OAAiB,EACjB,cAAiD;IAEjD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACjB,OAAO,cAAc,CAAC,GAAG,CACrB,CAAC,MAAM,EAA2B,EAAE,CAAC,CAAC;YAClC,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EACJ,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU;gBACjC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC1B,CAAC,CAAC,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,MAAM,CAAC,KAAmC;SACpD,CAAC,CACL,CAAC;IACN,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC","sourcesContent":["import type {\n ActionPopupConfig,\n BaseMessageAction,\n BaseMessageActionConfig,\n DefaultMessageAction,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n TUserMessage,\n} from '../types';\n\nexport function isUserMessage<\n Metadata = TMessageMetadata,\n TCustomMessageContent extends TMessageContent = never,\n>(message: TChatMessage<TCustomMessageContent, Metadata>): message is TUserMessage<Metadata> {\n return message.role === 'user';\n}\n\nexport function isAssistantMessage<\n Metadata = TMessageMetadata,\n TCustomMessageContent extends TMessageContent = never,\n>(\n message: TChatMessage<TCustomMessageContent, Metadata>,\n): message is TAssistantMessage<TCustomMessageContent, Metadata> {\n return message.role === 'assistant';\n}\n\nexport function normalizeContent<TCustomMessageContent extends TMessageContent = never>(\n content: TAssistantMessage<TCustomMessageContent, TMessageMetadata>['content'],\n): TMessageContentUnion<TCustomMessageContent>[] {\n if (!content) {\n return [];\n }\n\n if (typeof content === 'string') {\n return [\n {\n type: 'text',\n data: {\n text: content,\n },\n },\n ];\n }\n\n if (Array.isArray(content)) {\n return content;\n }\n\n return [content];\n}\n\n/**\n * Check if message content contains ONLY thinking content (no other content types).\n * @param content - Message content to check\n * @returns true if content contains only thinking parts and nothing else\n */\nexport function hasOnlyThinkingContent<TCustomMessageContent extends TMessageContent = never>(\n content: TAssistantMessage<TCustomMessageContent, TMessageMetadata>['content'],\n): boolean {\n const parts = normalizeContent(content);\n if (parts.length === 0) {\n return false;\n }\n return parts.every((part) => part.type === 'thinking');\n}\n\n// Re-export ActionPopup types for convenience\nexport type {ActionPopupContext, ActionPopupConfig} from '../types';\n\nexport function resolveMessageActions<\n TMessage extends TChatMessage<TMessageContent, TMessageMetadata>,\n>(\n message: TMessage,\n defaultActions?: DefaultMessageAction<TMessage>[],\n): BaseMessageAction[] | undefined {\n if (message.actions) {\n return message.actions;\n }\n\n if (defaultActions) {\n return defaultActions.map(\n (action): BaseMessageActionConfig => ({\n actionType: action.type,\n icon: action.icon,\n children:\n typeof action.children === 'function'\n ? action.children(message)\n : action.children,\n label: action.label,\n view: action.view,\n onClick: () => action.onClick(message),\n popup: action.popup as ActionPopupConfig<unknown>,\n }),\n );\n }\n\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"messageUtils.js","sourceRoot":"../../../src","sources":["utils/messageUtils.ts"],"names":[],"mappings":";;AAaA,sCAKC;AAED,gDAOC;AAED,4CAsCC;AAOD,wDAQC;AAKD,sDA4BC;AAtGD,SAAgB,aAAa,CAG3B,OAAsD;IACpD,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AACnC,CAAC;AAED,SAAgB,kBAAkB,CAI9B,OAAsD;IAEtD,OAAO,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;AACxC,CAAC;AAED,SAAgB,gBAAgB,CAC5B,OAA8E;IAE9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACd,CAAC;QAED,OAAO;YACH;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;oBACF,IAAI,EAAE,OAAO;iBAChB;aACJ;SACJ,CAAC;IACN,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IACI,IAAI,CAAC,IAAI,KAAK,MAAM;YACpB,OAAO,IAAI,KAAK,QAAQ;YACxB,IAAI,KAAK,IAAI;YACb,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;YACjB,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAC/B,CAAC;YACC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAClC,OAA8E;IAE9E,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;AAC3D,CAAC;AAKD,SAAgB,qBAAqB,CAGjC,OAAiB,EACjB,cAAiD;IAEjD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACjB,OAAO,cAAc,CAAC,GAAG,CACrB,CAAC,MAAM,EAA2B,EAAE,CAAC,CAAC;YAClC,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EACJ,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU;gBACjC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC1B,CAAC,CAAC,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,MAAM,CAAC,KAAmC;SACpD,CAAC,CACL,CAAC;IACN,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC","sourcesContent":["import type {\n ActionPopupConfig,\n BaseMessageAction,\n BaseMessageActionConfig,\n DefaultMessageAction,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n TUserMessage,\n} from '../types';\n\nexport function isUserMessage<\n Metadata = TMessageMetadata,\n TCustomMessageContent extends TMessageContent = never,\n>(message: TChatMessage<TCustomMessageContent, Metadata>): message is TUserMessage<Metadata> {\n return message.role === 'user';\n}\n\nexport function isAssistantMessage<\n Metadata = TMessageMetadata,\n TCustomMessageContent extends TMessageContent = never,\n>(\n message: TChatMessage<TCustomMessageContent, Metadata>,\n): message is TAssistantMessage<TCustomMessageContent, Metadata> {\n return message.role === 'assistant';\n}\n\nexport function normalizeContent<TCustomMessageContent extends TMessageContent = never>(\n content: TAssistantMessage<TCustomMessageContent, TMessageMetadata>['content'],\n): TMessageContentUnion<TCustomMessageContent>[] {\n if (!content) {\n return [];\n }\n\n if (typeof content === 'string') {\n if (!content.trim()) {\n return [];\n }\n\n return [\n {\n type: 'text',\n data: {\n text: content,\n },\n },\n ];\n }\n\n const parts = Array.isArray(content) ? content : [content];\n return parts.filter((part) => {\n const data = part.data;\n\n if (\n part.type !== 'text' ||\n typeof data !== 'object' ||\n data === null ||\n !('text' in data) ||\n typeof data.text !== 'string'\n ) {\n return true;\n }\n\n return data.text.trim().length > 0;\n });\n}\n\n/**\n * Check if message content contains ONLY thinking content (no other content types).\n * @param content - Message content to check\n * @returns true if content contains only thinking parts and nothing else\n */\nexport function hasOnlyThinkingContent<TCustomMessageContent extends TMessageContent = never>(\n content: TAssistantMessage<TCustomMessageContent, TMessageMetadata>['content'],\n): boolean {\n const parts = normalizeContent(content);\n if (parts.length === 0) {\n return false;\n }\n return parts.every((part) => part.type === 'thinking');\n}\n\n// Re-export ActionPopup types for convenience\nexport type {ActionPopupContext, ActionPopupConfig} from '../types';\n\nexport function resolveMessageActions<\n TMessage extends TChatMessage<TMessageContent, TMessageMetadata>,\n>(\n message: TMessage,\n defaultActions?: DefaultMessageAction<TMessage>[],\n): BaseMessageAction[] | undefined {\n if (message.actions) {\n return message.actions;\n }\n\n if (defaultActions) {\n return defaultActions.map(\n (action): BaseMessageActionConfig => ({\n actionType: action.type,\n icon: action.icon,\n children:\n typeof action.children === 'function'\n ? action.children(message)\n : action.children,\n label: action.label,\n view: action.view,\n onClick: () => action.onClick(message),\n popup: action.popup as ActionPopupConfig<unknown>,\n }),\n );\n }\n\n return undefined;\n}\n"]}
@@ -1 +1 @@
1
- {"version":"2.25.0","type":"module","sideEffects":["*.css","*.scss"]}
1
+ {"version":"2.25.1-beta.878aea7e24fa31cfa067fc42048ca0be5fcbaca9.0","type":"module","sideEffects":["*.css","*.scss"]}
@@ -9,6 +9,9 @@ export function normalizeContent(content) {
9
9
  return [];
10
10
  }
11
11
  if (typeof content === 'string') {
12
+ if (!content.trim()) {
13
+ return [];
14
+ }
12
15
  return [
13
16
  {
14
17
  type: 'text',
@@ -18,10 +21,18 @@ export function normalizeContent(content) {
18
21
  },
19
22
  ];
20
23
  }
21
- if (Array.isArray(content)) {
22
- return content;
23
- }
24
- return [content];
24
+ const parts = Array.isArray(content) ? content : [content];
25
+ return parts.filter((part) => {
26
+ const data = part.data;
27
+ if (part.type !== 'text' ||
28
+ typeof data !== 'object' ||
29
+ data === null ||
30
+ !('text' in data) ||
31
+ typeof data.text !== 'string') {
32
+ return true;
33
+ }
34
+ return data.text.trim().length > 0;
35
+ });
25
36
  }
26
37
  /**
27
38
  * Check if message content contains ONLY thinking content (no other content types).
@@ -1 +1 @@
1
- {"version":3,"file":"messageUtils.js","sourceRoot":"../../../src","sources":["utils/messageUtils.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,aAAa,CAG3B,OAAsD;IACpD,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAI9B,OAAsD;IAEtD,OAAO,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC5B,OAA8E;IAE9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO;YACH;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;oBACF,IAAI,EAAE,OAAO;iBAChB;aACJ;SACJ,CAAC;IACN,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAClC,OAA8E;IAE9E,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;AAC3D,CAAC;AAKD,MAAM,UAAU,qBAAqB,CAGjC,OAAiB,EACjB,cAAiD;IAEjD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACjB,OAAO,cAAc,CAAC,GAAG,CACrB,CAAC,MAAM,EAA2B,EAAE,CAAC,CAAC;YAClC,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EACJ,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU;gBACjC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC1B,CAAC,CAAC,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,MAAM,CAAC,KAAmC;SACpD,CAAC,CACL,CAAC;IACN,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC","sourcesContent":["import type {\n ActionPopupConfig,\n BaseMessageAction,\n BaseMessageActionConfig,\n DefaultMessageAction,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n TUserMessage,\n} from '../types';\n\nexport function isUserMessage<\n Metadata = TMessageMetadata,\n TCustomMessageContent extends TMessageContent = never,\n>(message: TChatMessage<TCustomMessageContent, Metadata>): message is TUserMessage<Metadata> {\n return message.role === 'user';\n}\n\nexport function isAssistantMessage<\n Metadata = TMessageMetadata,\n TCustomMessageContent extends TMessageContent = never,\n>(\n message: TChatMessage<TCustomMessageContent, Metadata>,\n): message is TAssistantMessage<TCustomMessageContent, Metadata> {\n return message.role === 'assistant';\n}\n\nexport function normalizeContent<TCustomMessageContent extends TMessageContent = never>(\n content: TAssistantMessage<TCustomMessageContent, TMessageMetadata>['content'],\n): TMessageContentUnion<TCustomMessageContent>[] {\n if (!content) {\n return [];\n }\n\n if (typeof content === 'string') {\n return [\n {\n type: 'text',\n data: {\n text: content,\n },\n },\n ];\n }\n\n if (Array.isArray(content)) {\n return content;\n }\n\n return [content];\n}\n\n/**\n * Check if message content contains ONLY thinking content (no other content types).\n * @param content - Message content to check\n * @returns true if content contains only thinking parts and nothing else\n */\nexport function hasOnlyThinkingContent<TCustomMessageContent extends TMessageContent = never>(\n content: TAssistantMessage<TCustomMessageContent, TMessageMetadata>['content'],\n): boolean {\n const parts = normalizeContent(content);\n if (parts.length === 0) {\n return false;\n }\n return parts.every((part) => part.type === 'thinking');\n}\n\n// Re-export ActionPopup types for convenience\nexport type {ActionPopupContext, ActionPopupConfig} from '../types';\n\nexport function resolveMessageActions<\n TMessage extends TChatMessage<TMessageContent, TMessageMetadata>,\n>(\n message: TMessage,\n defaultActions?: DefaultMessageAction<TMessage>[],\n): BaseMessageAction[] | undefined {\n if (message.actions) {\n return message.actions;\n }\n\n if (defaultActions) {\n return defaultActions.map(\n (action): BaseMessageActionConfig => ({\n actionType: action.type,\n icon: action.icon,\n children:\n typeof action.children === 'function'\n ? action.children(message)\n : action.children,\n label: action.label,\n view: action.view,\n onClick: () => action.onClick(message),\n popup: action.popup as ActionPopupConfig<unknown>,\n }),\n );\n }\n\n return undefined;\n}\n"]}
1
+ {"version":3,"file":"messageUtils.js","sourceRoot":"../../../src","sources":["utils/messageUtils.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,aAAa,CAG3B,OAAsD;IACpD,OAAO,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAI9B,OAAsD;IAEtD,OAAO,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC5B,OAA8E;IAE9E,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACd,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAClB,OAAO,EAAE,CAAC;QACd,CAAC;QAED,OAAO;YACH;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE;oBACF,IAAI,EAAE,OAAO;iBAChB;aACJ;SACJ,CAAC;IACN,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC3D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,IACI,IAAI,CAAC,IAAI,KAAK,MAAM;YACpB,OAAO,IAAI,KAAK,QAAQ;YACxB,IAAI,KAAK,IAAI;YACb,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC;YACjB,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAC/B,CAAC;YACC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAClC,OAA8E;IAE9E,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;AAC3D,CAAC;AAKD,MAAM,UAAU,qBAAqB,CAGjC,OAAiB,EACjB,cAAiD;IAEjD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACjB,OAAO,cAAc,CAAC,GAAG,CACrB,CAAC,MAAM,EAA2B,EAAE,CAAC,CAAC;YAClC,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EACJ,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU;gBACjC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC1B,CAAC,CAAC,MAAM,CAAC,QAAQ;YACzB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YACtC,KAAK,EAAE,MAAM,CAAC,KAAmC;SACpD,CAAC,CACL,CAAC;IACN,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC","sourcesContent":["import type {\n ActionPopupConfig,\n BaseMessageAction,\n BaseMessageActionConfig,\n DefaultMessageAction,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n TUserMessage,\n} from '../types';\n\nexport function isUserMessage<\n Metadata = TMessageMetadata,\n TCustomMessageContent extends TMessageContent = never,\n>(message: TChatMessage<TCustomMessageContent, Metadata>): message is TUserMessage<Metadata> {\n return message.role === 'user';\n}\n\nexport function isAssistantMessage<\n Metadata = TMessageMetadata,\n TCustomMessageContent extends TMessageContent = never,\n>(\n message: TChatMessage<TCustomMessageContent, Metadata>,\n): message is TAssistantMessage<TCustomMessageContent, Metadata> {\n return message.role === 'assistant';\n}\n\nexport function normalizeContent<TCustomMessageContent extends TMessageContent = never>(\n content: TAssistantMessage<TCustomMessageContent, TMessageMetadata>['content'],\n): TMessageContentUnion<TCustomMessageContent>[] {\n if (!content) {\n return [];\n }\n\n if (typeof content === 'string') {\n if (!content.trim()) {\n return [];\n }\n\n return [\n {\n type: 'text',\n data: {\n text: content,\n },\n },\n ];\n }\n\n const parts = Array.isArray(content) ? content : [content];\n return parts.filter((part) => {\n const data = part.data;\n\n if (\n part.type !== 'text' ||\n typeof data !== 'object' ||\n data === null ||\n !('text' in data) ||\n typeof data.text !== 'string'\n ) {\n return true;\n }\n\n return data.text.trim().length > 0;\n });\n}\n\n/**\n * Check if message content contains ONLY thinking content (no other content types).\n * @param content - Message content to check\n * @returns true if content contains only thinking parts and nothing else\n */\nexport function hasOnlyThinkingContent<TCustomMessageContent extends TMessageContent = never>(\n content: TAssistantMessage<TCustomMessageContent, TMessageMetadata>['content'],\n): boolean {\n const parts = normalizeContent(content);\n if (parts.length === 0) {\n return false;\n }\n return parts.every((part) => part.type === 'thinking');\n}\n\n// Re-export ActionPopup types for convenience\nexport type {ActionPopupContext, ActionPopupConfig} from '../types';\n\nexport function resolveMessageActions<\n TMessage extends TChatMessage<TMessageContent, TMessageMetadata>,\n>(\n message: TMessage,\n defaultActions?: DefaultMessageAction<TMessage>[],\n): BaseMessageAction[] | undefined {\n if (message.actions) {\n return message.actions;\n }\n\n if (defaultActions) {\n return defaultActions.map(\n (action): BaseMessageActionConfig => ({\n actionType: action.type,\n icon: action.icon,\n children:\n typeof action.children === 'function'\n ? action.children(message)\n : action.children,\n label: action.label,\n view: action.view,\n onClick: () => action.onClick(message),\n popup: action.popup as ActionPopupConfig<unknown>,\n }),\n );\n }\n\n return undefined;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gravity-ui/aikit",
3
- "version": "2.25.0",
3
+ "version": "2.25.1-beta.878aea7e24fa31cfa067fc42048ca0be5fcbaca9.0",
4
4
  "description": "Gravity UI base kit for building ai assistant chats",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",