@deep-eye/core 1.2.10 → 1.2.11

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.
package/CHANGELOG.md CHANGED
@@ -2,15 +2,29 @@
2
2
 
3
3
  `@deep-eye/core` 的用户可见变更(语义化版本)。
4
4
 
5
+ ## [1.2.11] - 2026-08-03
6
+
7
+ ### Added
8
+
9
+ - `ChatSender` / `ChatBot` 支持 `@` 提及(`triggers`、`#trigger-menu`、`mention-*` / `trigger-*` 事件):输入区改为 contenteditable,选中后插入原子 chip;前后自动补空格;插入/删除走浏览器撤销栈,一次撤回会连同触发的 `@` 一起去掉。
10
+
11
+ ### Changed
12
+
13
+ - 提及 chip 默认文字色改为 `#6366f1`(可用 `--chat-sender-mention-color` 覆盖)。
14
+ - 移除 `.chat-sender__editor` 内边距,由外层布局控制间距。
15
+
5
16
  ## [1.2.10] - 2026-08-03
6
17
 
7
18
  ### Changed
8
19
 
9
20
  - 思考过程默认展开显示。
21
+ - `ChatActionbar` 内置复制按钮改为 slot-with-fallback:提供 `#actionbar`/`ChatActionbar` 默认插槽时完全替换内置按钮(不再是"追加"),并通过插槽 props 暴露 `copyFailed`、`copy()`,方便消费端复用内置剪贴板逻辑。`ChatMessage`/`MessageBubble`/`ConversationList`/`ChatBot` 对应插槽类型同步更新。
10
22
 
11
23
  ### Fixed
12
24
 
13
25
  - 移除表格流式输出时的骨架占位动画,流式渲染直接展示已有表格内容。
26
+ - 修复表格列对齐(`:---:`/`---:`)被丢弃的问题:根因是 `sanitizeHtml`(DOMPurify)的 `ALLOWED_ATTR` 白名单未包含 `align`,md4x 输出的对齐属性在 sanitize 阶段被整体剥离;同时补充 `prose.css` 里 `[align="center"]`/`[align="right"]` 规则,避免未来被更高优先级的 class 选择器覆盖。
27
+ - `ChatBot` 补齐对内置 `ChatSender` 独有事件的转发(`menu-item-click`、`quick-action-select`、`quick-action-clear`、`update:activeQuickAction`、`screenshot`、`attachment-menu-open`/`attachment-menu-close`、`attachment-error`、`voice-*`、`audio-*`):此前直接使用 `ChatBot` + `senderConfig` 的消费端完全收不到这些事件,只能监听在从未渲染过的裸标签上。
14
28
 
15
29
  ## [1.2.9] - 2026-08-03
16
30
 
@@ -1,5 +1,15 @@
1
1
  import { type ClassifiedChatError } from './chatErrors';
2
- import type { ChatActionbarCopyPayload, ChatBotExpose, ChatBotProps, ChatMessageProps, ChatComposerAttachment, ChatQueueItem, ChatResourceFile, ChatSendPayload, ChatToolActionPayload, ConversationMessage, ConversationStreamStatus, ConversationToolCall, ConversationUiAction, ResponseStreamEvent, ResponseSseFrame } from './types';
2
+ import type { ChatActionbarCopyPayload, ChatAttachmentError, ChatBotExpose, ChatBotProps, ChatMessageProps, ChatComposerAttachment, ChatQueueItem, ChatResourceFile, ChatSendPayload, ChatSenderQuickAction, ChatToolActionPayload, ConversationMessage, ConversationStreamStatus, ConversationToolCall, ConversationUiAction, ResponseStreamEvent, ResponseSseFrame } from './types';
3
+ interface ChatBotTriggerMenuSlotProps {
4
+ triggerId: string;
5
+ query: string;
6
+ select: (payload: {
7
+ id: string;
8
+ label: string;
9
+ }) => void;
10
+ close: () => void;
11
+ anchorRect: DOMRect | null;
12
+ }
3
13
  type __VLS_Slots = {
4
14
  sidebar?: (props: {
5
15
  artifact: ConversationUiAction | null;
@@ -22,6 +32,8 @@ type __VLS_Slots = {
22
32
  'assistant-actionbar'?: (props: {
23
33
  message: unknown;
24
34
  copied: boolean;
35
+ copyFailed: boolean;
36
+ copy: () => Promise<void>;
25
37
  }) => unknown;
26
38
  tool?: (props: {
27
39
  toolCall: ConversationToolCall;
@@ -31,6 +43,7 @@ type __VLS_Slots = {
31
43
  'file-preview'?: (props: {
32
44
  resource: ChatResourceFile;
33
45
  }) => unknown;
46
+ 'trigger-menu'?: (props: ChatBotTriggerMenuSlotProps) => unknown;
34
47
  };
35
48
  declare const __VLS_base: import("vue").DefineComponent<ChatBotProps, ChatBotExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
36
49
  stop: () => any;
@@ -40,6 +53,41 @@ declare const __VLS_base: import("vue").DefineComponent<ChatBotProps, ChatBotExp
40
53
  send: (payload: ChatSendPayload) => any;
41
54
  "update:draft": (draft: string) => any;
42
55
  "update:attachments": (attachments: readonly ChatComposerAttachment[]) => any;
56
+ "attachment-error": (error: ChatAttachmentError, file?: File | undefined) => any;
57
+ "voice-click": () => any;
58
+ "voice-record": () => any;
59
+ "voice-start": () => any;
60
+ "voice-stop": () => any;
61
+ "voice-cancel": () => any;
62
+ "audio-device-change": (deviceIndex: number) => any;
63
+ "audio-transcript": (text: string) => any;
64
+ screenshot: () => any;
65
+ "menu-item-click": (itemId: string) => any;
66
+ "attachment-menu-open": () => any;
67
+ "attachment-menu-close": () => any;
68
+ "update:activeQuickAction": (id: string | null) => any;
69
+ "quick-action-select": (action: ChatSenderQuickAction) => any;
70
+ "quick-action-clear": () => any;
71
+ "trigger-open": (payload: {
72
+ triggerId: string;
73
+ }) => any;
74
+ "trigger-query": (payload: {
75
+ triggerId: string;
76
+ query: string;
77
+ }) => any;
78
+ "trigger-close": (payload: {
79
+ triggerId: string;
80
+ }) => any;
81
+ "mention-insert": (payload: {
82
+ triggerId: string;
83
+ id: string;
84
+ label: string;
85
+ }) => any;
86
+ "mention-remove": (payload: {
87
+ triggerId: string;
88
+ id: string;
89
+ label: string;
90
+ }) => any;
43
91
  retry: (payload: ChatSendPayload | null, error: Error) => any;
44
92
  "update:messages": (messages: ConversationMessage[]) => any;
45
93
  "update:queue": (queue: readonly ChatQueueItem[]) => any;
@@ -55,6 +103,41 @@ declare const __VLS_base: import("vue").DefineComponent<ChatBotProps, ChatBotExp
55
103
  onSend?: ((payload: ChatSendPayload) => any) | undefined;
56
104
  "onUpdate:draft"?: ((draft: string) => any) | undefined;
57
105
  "onUpdate:attachments"?: ((attachments: readonly ChatComposerAttachment[]) => any) | undefined;
106
+ "onAttachment-error"?: ((error: ChatAttachmentError, file?: File | undefined) => any) | undefined;
107
+ "onVoice-click"?: (() => any) | undefined;
108
+ "onVoice-record"?: (() => any) | undefined;
109
+ "onVoice-start"?: (() => any) | undefined;
110
+ "onVoice-stop"?: (() => any) | undefined;
111
+ "onVoice-cancel"?: (() => any) | undefined;
112
+ "onAudio-device-change"?: ((deviceIndex: number) => any) | undefined;
113
+ "onAudio-transcript"?: ((text: string) => any) | undefined;
114
+ onScreenshot?: (() => any) | undefined;
115
+ "onMenu-item-click"?: ((itemId: string) => any) | undefined;
116
+ "onAttachment-menu-open"?: (() => any) | undefined;
117
+ "onAttachment-menu-close"?: (() => any) | undefined;
118
+ "onUpdate:activeQuickAction"?: ((id: string | null) => any) | undefined;
119
+ "onQuick-action-select"?: ((action: ChatSenderQuickAction) => any) | undefined;
120
+ "onQuick-action-clear"?: (() => any) | undefined;
121
+ "onTrigger-open"?: ((payload: {
122
+ triggerId: string;
123
+ }) => any) | undefined;
124
+ "onTrigger-query"?: ((payload: {
125
+ triggerId: string;
126
+ query: string;
127
+ }) => any) | undefined;
128
+ "onTrigger-close"?: ((payload: {
129
+ triggerId: string;
130
+ }) => any) | undefined;
131
+ "onMention-insert"?: ((payload: {
132
+ triggerId: string;
133
+ id: string;
134
+ label: string;
135
+ }) => any) | undefined;
136
+ "onMention-remove"?: ((payload: {
137
+ triggerId: string;
138
+ id: string;
139
+ label: string;
140
+ }) => any) | undefined;
58
141
  onRetry?: ((payload: ChatSendPayload | null, error: Error) => any) | undefined;
59
142
  "onUpdate:messages"?: ((messages: ConversationMessage[]) => any) | undefined;
60
143
  "onUpdate:queue"?: ((queue: readonly ChatQueueItem[]) => any) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatBot.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatBot.vue"],"names":[],"mappings":"AA60BA,OAAO,EAAqB,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,KAAK,EACV,wBAAwB,EAExB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EAErB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EAEpB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,SAAS,CAAA;AAahB,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,QAAQ,EAAE,oBAAoB,GAAG,IAAI,CAAA;QACrC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAA;KAC9B,KAAK,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAA;IAChC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,OAAO,CAAA;QACf,YAAY,EAAE,gBAAgB,CAAA;KAC/B,KAAK,OAAO,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAA;IACjF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,oBAAoB,CAAA;QAC9B,WAAW,CAAC,EAAE,OAAO,SAAS,EAAE,WAAW,CAAA;QAC3C,SAAS,EAAE,OAAO,CAAA;KACnB,KAAK,OAAO,CAAA;IACb,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,gBAAgB,CAAA;KAAE,KAAK,OAAO,CAAA;CACpE,CAAC;AAswBF,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6EAKd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"ChatBot.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatBot.vue"],"names":[],"mappings":"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"}
@@ -8,6 +8,8 @@ type __VLS_Slots = {
8
8
  default?: (props: {
9
9
  message: AssistantMessage;
10
10
  copied: boolean;
11
+ copyFailed: boolean;
12
+ copy: () => Promise<void>;
11
13
  }) => unknown;
12
14
  };
13
15
  declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
@@ -1 +1 @@
1
- {"version":3,"file":"ChatActionbar.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ChatActionbar.vue"],"names":[],"mappings":"AA4NA,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAI1E,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,gBAAgB,CAAA;IACzB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAC;AAGF,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAA;CAC7E,CAAC;AA4MF,QAAA,MAAM,UAAU;;;;kFAGd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"ChatActionbar.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ChatActionbar.vue"],"names":[],"mappings":"AAwMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AAI1E,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,gBAAgB,CAAA;IACzB,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAC;AAGF,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,gBAAgB,CAAA;QACzB,MAAM,EAAE,OAAO,CAAA;QACf,UAAU,EAAE,OAAO,CAAA;QACnB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAC1B,KAAK,OAAO,CAAA;CACd,CAAC;AA6MF,QAAA,MAAM,UAAU;;;;kFAGd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatFollowUps.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ChatFollowUps.vue"],"names":[],"mappings":"AAsIA,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B,CAAC;AAuGF,QAAA,MAAM,YAAY;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"ChatFollowUps.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ChatFollowUps.vue"],"names":[],"mappings":"AAuIA,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;CAC7B,CAAC;AAuGF,QAAA,MAAM,YAAY;;;;kFAGhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
@@ -11,6 +11,8 @@ type __VLS_Slots = {
11
11
  actionbar?: (props: {
12
12
  message: ConversationMessage;
13
13
  copied: boolean;
14
+ copyFailed: boolean;
15
+ copy: () => Promise<void>;
14
16
  }) => unknown;
15
17
  tool?: (props: {
16
18
  toolCall: ConversationToolCall;
@@ -47,6 +49,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
47
49
  type: PropType<ChatToolStates>;
48
50
  default: () => {};
49
51
  };
52
+ followUps: {
53
+ type: PropType<string[]>;
54
+ default: undefined;
55
+ };
50
56
  showFollowUps: {
51
57
  type: BooleanConstructor;
52
58
  default: boolean;
@@ -85,6 +91,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
85
91
  type: PropType<ChatToolStates>;
86
92
  default: () => {};
87
93
  };
94
+ followUps: {
95
+ type: PropType<string[]>;
96
+ default: undefined;
97
+ };
88
98
  showFollowUps: {
89
99
  type: BooleanConstructor;
90
100
  default: boolean;
@@ -101,6 +111,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
101
111
  toolStates: Readonly<Record<string, import("../types").ChatToolState>>;
102
112
  userAvatar: string;
103
113
  assistantAvatar: string;
114
+ followUps: string[];
104
115
  showFollowUps: boolean;
105
116
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
106
117
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1 +1 @@
1
- {"version":3,"file":"ChatMessage.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ChatMessage.vue"],"names":[],"mappings":"AA0GA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAEnC,OAAO,KAAK,EACV,wBAAwB,EACxB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACZ,MAAM,UAAU,CAAA;AAyCjB,KAAK,WAAW,GAAG;IACjB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,OAAO,CAAA;KACrB,KAAK,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,mBAAmB,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAA;IACjF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,oBAAoB,CAAA;QAC9B,WAAW,CAAC,EAAE,WAAW,CAAA;QACzB,SAAS,EAAE,OAAO,CAAA;KACnB,KAAK,OAAO,CAAA;CACd,CAAC;AA2IF,QAAA,MAAM,UAAU;;cAII,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;cAQ9B,QAAQ,CAAC,SAAS,WAAW,EAAE,CAAC;;;;cAI/B,QAAQ,CAAC,iBAAiB,CAAC;;;;;;;;;;;;cAY3B,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;cAxBxB,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;cAQ9B,QAAQ,CAAC,SAAS,WAAW,EAAE,CAAC;;;;cAI/B,QAAQ,CAAC,iBAAiB,CAAC;;;;;;;;;;;;cAY3B,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;4EAQ1C,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"ChatMessage.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ChatMessage.vue"],"names":[],"mappings":"AAmHA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAEnC,OAAO,KAAK,EACV,wBAAwB,EACxB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACZ,MAAM,UAAU,CAAA;AA6CjB,KAAK,WAAW,GAAG;IACjB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,OAAO,CAAA;KACrB,KAAK,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAClB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,MAAM,EAAE,OAAO,CAAA;QACf,UAAU,EAAE,OAAO,CAAA;QACnB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAC1B,KAAK,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,oBAAoB,CAAA;QAC9B,WAAW,CAAC,EAAE,WAAW,CAAA;QACzB,SAAS,EAAE,OAAO,CAAA;KACnB,KAAK,OAAO,CAAA;CACd,CAAC;AA2IF,QAAA,MAAM,UAAU;;cAII,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;cAQ9B,QAAQ,CAAC,SAAS,WAAW,EAAE,CAAC;;;;cAI/B,QAAQ,CAAC,iBAAiB,CAAC;;;;;;;;;;;;cAY3B,QAAQ,CAAC,cAAc,CAAC;;;;cAIzB,QAAQ,CAAC,MAAM,EAAE,CAAC;;;;;;;;;;;;;;cA5BjB,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;cAQ9B,QAAQ,CAAC,SAAS,WAAW,EAAE,CAAC;;;;cAI/B,QAAQ,CAAC,iBAAiB,CAAC;;;;;;;;;;;;cAY3B,QAAQ,CAAC,cAAc,CAAC;;;;cAIzB,QAAQ,CAAC,MAAM,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;4EAQnC,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -1,21 +1,20 @@
1
- import type { ChatAttachmentError, ChatAttachmentLimits, ChatAttachmentMenuItem, ChatComposerAttachment, ChatSendPayload, ChatSenderQuickAction, ChatTheme, ChatUploadConfig } from '../types';
2
- interface Props {
3
- placeholder?: string;
4
- disabled?: boolean;
5
- showAttachment?: boolean;
6
- maxRows?: number;
7
- draft?: string;
8
- attachments?: readonly ChatComposerAttachment[];
9
- uploadConfig?: ChatUploadConfig;
10
- attachmentLimits?: Partial<ChatAttachmentLimits>;
11
- streaming?: boolean;
12
- theme?: ChatTheme;
13
- showScreenshot?: boolean;
14
- customMenuItems?: readonly ChatAttachmentMenuItem[];
15
- quickActions?: readonly ChatSenderQuickAction[];
16
- activeQuickAction?: string | null;
17
- }
18
- declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
1
+ import type { ChatAttachmentError, ChatAttachmentLimits, ChatComposerAttachment, ChatSendPayload, ChatSenderProps, ChatSenderQuickAction, ChatSenderTrigger, ChatUploadConfig } from '../types';
2
+ declare function handleMentionMenuClose(): void;
3
+ declare function handleMentionSelect(payload: {
4
+ id: string;
5
+ label: string;
6
+ }): void;
7
+ declare var __VLS_28: {
8
+ triggerId: string;
9
+ query: string;
10
+ select: typeof handleMentionSelect;
11
+ close: typeof handleMentionMenuClose;
12
+ anchorRect: DOMRect | null;
13
+ };
14
+ type __VLS_Slots = {} & {
15
+ 'trigger-menu'?: (props: typeof __VLS_28) => any;
16
+ };
17
+ declare const __VLS_base: import("vue").DefineComponent<ChatSenderProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
19
18
  stop: () => any;
20
19
  send: (payload: ChatSendPayload) => any;
21
20
  "update:draft": (value: string) => any;
@@ -35,7 +34,27 @@ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {},
35
34
  "update:activeQuickAction": (id: string | null) => any;
36
35
  "quick-action-select": (action: ChatSenderQuickAction) => any;
37
36
  "quick-action-clear": () => any;
38
- }, string, import("vue").PublicProps, Readonly<Props> & Readonly<{
37
+ "trigger-open": (payload: {
38
+ triggerId: string;
39
+ }) => any;
40
+ "trigger-query": (payload: {
41
+ triggerId: string;
42
+ query: string;
43
+ }) => any;
44
+ "trigger-close": (payload: {
45
+ triggerId: string;
46
+ }) => any;
47
+ "mention-insert": (payload: {
48
+ triggerId: string;
49
+ id: string;
50
+ label: string;
51
+ }) => any;
52
+ "mention-remove": (payload: {
53
+ triggerId: string;
54
+ id: string;
55
+ label: string;
56
+ }) => any;
57
+ }, string, import("vue").PublicProps, Readonly<ChatSenderProps> & Readonly<{
39
58
  onStop?: (() => any) | undefined;
40
59
  onSend?: ((payload: ChatSendPayload) => any) | undefined;
41
60
  "onUpdate:draft"?: ((value: string) => any) | undefined;
@@ -55,8 +74,28 @@ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {},
55
74
  "onUpdate:activeQuickAction"?: ((id: string | null) => any) | undefined;
56
75
  "onQuick-action-select"?: ((action: ChatSenderQuickAction) => any) | undefined;
57
76
  "onQuick-action-clear"?: (() => any) | undefined;
77
+ "onTrigger-open"?: ((payload: {
78
+ triggerId: string;
79
+ }) => any) | undefined;
80
+ "onTrigger-query"?: ((payload: {
81
+ triggerId: string;
82
+ query: string;
83
+ }) => any) | undefined;
84
+ "onTrigger-close"?: ((payload: {
85
+ triggerId: string;
86
+ }) => any) | undefined;
87
+ "onMention-insert"?: ((payload: {
88
+ triggerId: string;
89
+ id: string;
90
+ label: string;
91
+ }) => any) | undefined;
92
+ "onMention-remove"?: ((payload: {
93
+ triggerId: string;
94
+ id: string;
95
+ label: string;
96
+ }) => any) | undefined;
58
97
  }>, {
59
- theme: ChatTheme;
98
+ theme: import("..").ChatTheme;
60
99
  disabled: boolean;
61
100
  placeholder: string;
62
101
  showAttachment: boolean;
@@ -66,10 +105,18 @@ declare const __VLS_export: import("vue").DefineComponent<Props, {}, {}, {}, {},
66
105
  uploadConfig: ChatUploadConfig;
67
106
  attachmentLimits: Partial<ChatAttachmentLimits>;
68
107
  showScreenshot: boolean;
69
- customMenuItems: readonly ChatAttachmentMenuItem[];
108
+ customMenuItems: readonly import("..").ChatAttachmentMenuItem[];
70
109
  quickActions: readonly ChatSenderQuickAction[];
71
110
  activeQuickAction: string | null;
111
+ triggers: readonly ChatSenderTrigger[];
112
+ triggerMenuPlacement: "caret" | "custom";
72
113
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
114
+ declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
73
115
  declare const _default: typeof __VLS_export;
74
116
  export default _default;
117
+ type __VLS_WithSlots<T, S> = T & {
118
+ new (): {
119
+ $slots: S;
120
+ };
121
+ };
75
122
  //# sourceMappingURL=ChatSender.vue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChatSender.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ChatSender.vue"],"names":[],"mappings":"AAw6DA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EACjB,MAAM,UAAU,CAAA;AAEjB,UAAU,KAAK;IACb,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAA;IAC/C,YAAY,CAAC,EAAE,gBAAgB,CAAA;IAC/B,gBAAgB,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAChD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,eAAe,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAA;IACnD,YAAY,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAA;IAC/C,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AAw2CD,QAAA,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA72CR,SAAS;cARN,OAAO;iBADJ,MAAM;oBAEH,OAAO;aACd,MAAM;WACR,MAAM;iBACA,SAAS,sBAAsB,EAAE;kBAChC,gBAAgB;sBACZ,OAAO,CAAC,oBAAoB,CAAC;oBAG/B,OAAO;qBACN,SAAS,sBAAsB,EAAE;kBACpC,SAAS,qBAAqB,EAAE;uBAC3B,MAAM,GAAG,IAAI;6EA62CjC,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
1
+ {"version":3,"file":"ChatSender.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ChatSender.vue"],"names":[],"mappings":"AAmzEA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,UAAU,CAAA;AA6cjB,iBAAS,sBAAsB,IAAI,IAAI,CAEtC;AAED,iBAAS,mBAAmB,CAAC,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWzE;AA27CD,QAAA,IAAI,QAAQ;;;;;;CAAY,CAAE;AAC1B,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,QAAQ,KAAK,GAAG,CAAA;CAAE,CAAC;AASvD,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;mBAz3DyB,MAAM;;;mBACL,MAAM;eAAS,MAAM;;;mBACrB,MAAM;;;mBACL,MAAM;YAAM,MAAM;eAAS,MAAM;;;mBACjC,MAAM;YAAM,MAAM;eAAS,MAAM;;;;;;;;;;;;;;;;;;;;;;;mBAJnC,MAAM;;;mBACL,MAAM;eAAS,MAAM;;;mBACrB,MAAM;;;mBACL,MAAM;YAAM,MAAM;eAAS,MAAM;;;mBACjC,MAAM;YAAM,MAAM;eAAS,MAAM;;;;;;;;;;;;;;;;;;6EAy3D1E,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AAWzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -15,6 +15,8 @@ type __VLS_Slots = {
15
15
  'assistant-actionbar'?: (props: {
16
16
  message: ConversationMessage;
17
17
  copied: boolean;
18
+ copyFailed: boolean;
19
+ copy: () => Promise<void>;
18
20
  }) => unknown;
19
21
  tool?: (props: {
20
22
  toolCall: ConversationToolCall;
@@ -59,6 +61,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
59
61
  type: PropType<ChatToolStates>;
60
62
  default: () => {};
61
63
  };
64
+ followUps: {
65
+ type: PropType<string[]>;
66
+ default: undefined;
67
+ };
62
68
  }>, ConversationListExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
63
69
  copy: (payload: ChatActionbarCopyPayload) => any;
64
70
  action: (payload: ConversationUiAction) => any;
@@ -102,6 +108,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
102
108
  type: PropType<ChatToolStates>;
103
109
  default: () => {};
104
110
  };
111
+ followUps: {
112
+ type: PropType<string[]>;
113
+ default: undefined;
114
+ };
105
115
  }>> & Readonly<{
106
116
  onCopy?: ((payload: ChatActionbarCopyPayload) => any) | undefined;
107
117
  onAction?: ((payload: ConversationUiAction) => any) | undefined;
@@ -115,6 +125,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
115
125
  toolStates: Readonly<Record<string, import("../types").ChatToolState>>;
116
126
  userAvatar: string;
117
127
  assistantAvatar: string;
128
+ followUps: string[];
118
129
  autoScroll: AutoScrollMode;
119
130
  responseError: Error;
120
131
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationList.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ConversationList.vue"],"names":[],"mappings":"AA24BA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAMnC,OAAO,KAAK,EACV,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,cAAc,EAEd,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACZ,MAAM,UAAU,CAAA;AA8CjB,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,MAAM,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,OAAO,CAAA;QACf,YAAY,EAAE,gBAAgB,CAAA;KAC/B,KAAK,OAAO,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,mBAAmB,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAA;IAC7F,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,oBAAoB,CAAA;QAC9B,WAAW,CAAC,EAAE,WAAW,CAAA;QACzB,SAAS,EAAE,OAAO,CAAA;KACnB,KAAK,OAAO,CAAA;CACd,CAAC;AA20BF,QAAA,MAAM,UAAU;;cAKG,QAAQ,CAAC,SAAS,mBAAmB,EAAE,CAAC;;;;;;;;cAQvC,QAAQ,CAAC,wBAAwB,CAAC;;;;cAIlC,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;cAgBxB,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;cAhCzB,QAAQ,CAAC,SAAS,mBAAmB,EAAE,CAAC;;;;;;;;cAQvC,QAAQ,CAAC,wBAAwB,CAAC;;;;cAIlC,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;cAgBxB,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;4EAI1C,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"ConversationList.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/ConversationList.vue"],"names":[],"mappings":"AAs5BA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AAMnC,OAAO,KAAK,EACV,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,cAAc,EAEd,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACZ,MAAM,UAAU,CAAA;AAkDjB,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,MAAM,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,OAAO,CAAA;IACvB,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,KAAK,EAAE,MAAM,CAAA;QACb,MAAM,EAAE,OAAO,CAAA;QACf,YAAY,EAAE,gBAAgB,CAAA;KAC/B,KAAK,OAAO,CAAA;IACb,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,qBAAqB,CAAC,EAAE,CAAC,KAAK,EAAE;QAC9B,OAAO,EAAE,mBAAmB,CAAA;QAC5B,MAAM,EAAE,OAAO,CAAA;QACf,UAAU,EAAE,OAAO,CAAA;QACnB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAC1B,KAAK,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,oBAAoB,CAAA;QAC9B,WAAW,CAAC,EAAE,WAAW,CAAA;QACzB,SAAS,EAAE,OAAO,CAAA;KACnB,KAAK,OAAO,CAAA;CACd,CAAC;AA60BF,QAAA,MAAM,UAAU;;cAKG,QAAQ,CAAC,SAAS,mBAAmB,EAAE,CAAC;;;;;;;;cAQvC,QAAQ,CAAC,wBAAwB,CAAC;;;;cAIlC,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;cAgBxB,QAAQ,CAAC,cAAc,CAAC;;;;cAIzB,QAAQ,CAAC,MAAM,EAAE,CAAC;;;;;;;;;;;cApClB,QAAQ,CAAC,SAAS,mBAAmB,EAAE,CAAC;;;;;;;;cAQvC,QAAQ,CAAC,wBAAwB,CAAC;;;;cAIlC,QAAQ,CAAC,iBAAiB,CAAC;;;;cAI3B,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;cAgBxB,QAAQ,CAAC,cAAc,CAAC;;;;cAIzB,QAAQ,CAAC,MAAM,EAAE,CAAC;;;;;;;;;;;;;;;;;;;4EAInC,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -11,6 +11,8 @@ type __VLS_Slots = {
11
11
  actionbar?: (props: {
12
12
  message: ConversationMessage;
13
13
  copied: boolean;
14
+ copyFailed: boolean;
15
+ copy: () => Promise<void>;
14
16
  }) => unknown;
15
17
  tool?: (props: {
16
18
  toolCall: ConversationToolCall;
@@ -47,6 +49,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
47
49
  type: PropType<ChatToolStates>;
48
50
  default: () => {};
49
51
  };
52
+ followUps: {
53
+ type: PropType<string[]>;
54
+ default: undefined;
55
+ };
50
56
  showFollowUps: {
51
57
  type: BooleanConstructor;
52
58
  default: boolean;
@@ -85,6 +91,10 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
85
91
  type: PropType<ChatToolStates>;
86
92
  default: () => {};
87
93
  };
94
+ followUps: {
95
+ type: PropType<string[]>;
96
+ default: undefined;
97
+ };
88
98
  showFollowUps: {
89
99
  type: BooleanConstructor;
90
100
  default: boolean;
@@ -101,6 +111,7 @@ declare const __VLS_base: import("vue").DefineComponent<import("vue").ExtractPro
101
111
  toolStates: Readonly<Record<string, import("../types").ChatToolState>>;
102
112
  userAvatar: string;
103
113
  assistantAvatar: string;
114
+ followUps: string[];
104
115
  showFollowUps: boolean;
105
116
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
106
117
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -1 +1 @@
1
- {"version":3,"file":"MessageBubble.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/MessageBubble.vue"],"names":[],"mappings":"AAkeA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AASnC,OAAO,KAAK,EACV,wBAAwB,EACxB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EAGd,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACZ,MAAM,UAAU,CAAA;AAwCjB,KAAK,WAAW,GAAG;IACjB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,OAAO,CAAA;KACrB,KAAK,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,mBAAmB,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAA;IACjF,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,oBAAoB,CAAA;QAC9B,WAAW,CAAC,EAAE,WAAW,CAAA;QACzB,SAAS,EAAE,OAAO,CAAA;KACnB,KAAK,OAAO,CAAA;CACd,CAAC;AA4dF,QAAA,MAAM,UAAU;;cAII,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;cAQ9B,QAAQ,CAAC,SAAS,WAAW,EAAE,CAAC;;;;cAI/B,QAAQ,CAAC,iBAAiB,CAAC;;;;;;;;;;;;cAY3B,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;cAxBxB,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;cAQ9B,QAAQ,CAAC,SAAS,WAAW,EAAE,CAAC;;;;cAI/B,QAAQ,CAAC,iBAAiB,CAAC;;;;;;;;;;;;cAY3B,QAAQ,CAAC,cAAc,CAAC;;;;;;;;;;;;;;;;;;;;4EAQ1C,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
1
+ {"version":3,"file":"MessageBubble.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/components/MessageBubble.vue"],"names":[],"mappings":"AA0eA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;AASnC,OAAO,KAAK,EACV,wBAAwB,EACxB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EAGd,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACZ,MAAM,UAAU,CAAA;AA4CjB,KAAK,WAAW,GAAG;IACjB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAChB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,OAAO,CAAA;KACrB,KAAK,OAAO,CAAA;IACb,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE;QAClB,OAAO,EAAE,mBAAmB,CAAA;QAC5B,MAAM,EAAE,OAAO,CAAA;QACf,UAAU,EAAE,OAAO,CAAA;QACnB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;KAC1B,KAAK,OAAO,CAAA;IACb,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE;QACb,QAAQ,EAAE,oBAAoB,CAAA;QAC9B,WAAW,CAAC,EAAE,WAAW,CAAA;QACzB,SAAS,EAAE,OAAO,CAAA;KACnB,KAAK,OAAO,CAAA;CACd,CAAC;AA4dF,QAAA,MAAM,UAAU;;cAII,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;cAQ9B,QAAQ,CAAC,SAAS,WAAW,EAAE,CAAC;;;;cAI/B,QAAQ,CAAC,iBAAiB,CAAC;;;;;;;;;;;;cAY3B,QAAQ,CAAC,cAAc,CAAC;;;;cAIzB,QAAQ,CAAC,MAAM,EAAE,CAAC;;;;;;;;;;;;;;cA5BjB,QAAQ,CAAC,mBAAmB,CAAC;;;;;;;;cAQ9B,QAAQ,CAAC,SAAS,WAAW,EAAE,CAAC;;;;cAI/B,QAAQ,CAAC,iBAAiB,CAAC;;;;;;;;;;;;cAY3B,QAAQ,CAAC,cAAc,CAAC;;;;cAIzB,QAAQ,CAAC,MAAM,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;4EAQnC,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/mdoc/sanitize.ts"],"names":[],"mappings":"AAgEA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD"}
1
+ {"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/mdoc/sanitize.ts"],"names":[],"mappings":"AAiEA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,79 @@
1
+ import type { ChatSenderTrigger } from './types';
2
+ /**
3
+ * Pure DOM helpers backing `ChatSender`'s contenteditable rich-text editor.
4
+ * Kept free of Vue reactivity so the trigger-detection and serialization algorithms
5
+ * (design doc §3, §5, §7) can be unit tested against plain DOM fixtures.
6
+ */
7
+ export declare const MENTION_TRIGGER_ATTR = "data-mention-trigger-id";
8
+ export declare const MENTION_ID_ATTR = "data-mention-id";
9
+ export declare const MENTION_LABEL_ATTR = "data-mention-label";
10
+ export declare const MENTION_CLASS = "chat-sender__mention";
11
+ export declare function isMentionElement(node: Node | null | undefined): node is HTMLElement;
12
+ /**
13
+ * Whether inserting a mention at `range.start` should prepend a separating space
14
+ * (not at editor start, and not when the previous character is already whitespace).
15
+ */
16
+ export declare function rangeNeedsLeadingSpace(editor: HTMLElement, range: Range): boolean;
17
+ /**
18
+ * Finds a mention chip immediately before the collapsed caret (for Backspace).
19
+ * Returns null when a normal character would be deleted first.
20
+ *
21
+ * Also treats "caret at the end of a whitespace-only text node that follows a chip"
22
+ * as adjacent — so one Backspace after the inserted trailing space removes the chip.
23
+ */
24
+ export declare function findMentionBeforeCaret(editor: HTMLElement, range: Range): HTMLElement | null;
25
+ /**
26
+ * Finds a mention chip immediately after the collapsed caret (for Delete).
27
+ * Returns null when a normal character would be deleted first.
28
+ */
29
+ export declare function findMentionAfterCaret(editor: HTMLElement, range: Range): HTMLElement | null;
30
+ export interface MentionTriggerMatch {
31
+ trigger: ChatSenderTrigger;
32
+ /** Spans from immediately before the trigger char (inclusive) to the caret. */
33
+ range: Range;
34
+ }
35
+ /**
36
+ * Design doc §5: finds the nearest unclosed trigger char behind the caret. Whitespace or an
37
+ * atomic-island/editor-start boundary encountered before any trigger char means "no match".
38
+ * Because characters are scanned nearest-first, the first trigger char found is automatically
39
+ * the closest one among all configured `triggers` (§5.4).
40
+ */
41
+ export declare function findTriggerMatch(triggers: readonly ChatSenderTrigger[], root: HTMLElement, caretNode: Node, caretOffset: number): MentionTriggerMatch | null;
42
+ /** Design doc §3: text nodes concatenate as-is, `<br>` becomes `\n`, mentions become their visible label text. */
43
+ export declare function serializeMentionEditorContent(root: HTMLElement): string;
44
+ /** Builds the atomic, non-editable mention "island" (design doc §2.1). */
45
+ export declare function createMentionElement(trigger: ChatSenderTrigger, id: string, label: string): HTMLSpanElement;
46
+ /** Renders plain text (no chip reconstruction — design doc §3.1 known limitation). */
47
+ export declare function renderPlainTextIntoEditor(root: HTMLElement, text: string): void;
48
+ /** Inserts `text` at `range`, converting embedded `\n` into real `<br>` elements. Returns the last inserted node (for caret placement), or null if `text` was empty. */
49
+ export declare function insertTextWithLineBreaksAtRange(range: Range, text: string): Node | null;
50
+ export declare function hasMeaningfulContent(root: HTMLElement): boolean;
51
+ /**
52
+ * Design doc §7: native Range API caret positioning, with a zero-width-space probe fallback.
53
+ * jsdom (used in unit tests) does not implement `Range.getBoundingClientRect` at all, so this
54
+ * degrades to `null` there instead of throwing — real positioning needs browser verification
55
+ * per design doc §13 risk 3.
56
+ */
57
+ export declare function getCaretRect(): DOMRect | null;
58
+ /** Anchor for the trigger menu: caret when measurable, otherwise top-left of the editor. */
59
+ export declare function getMenuAnchorRect(editor: HTMLElement): DOMRect | null;
60
+ export interface TriggerMenuPositionInput {
61
+ anchor: DOMRect;
62
+ menuWidth: number;
63
+ menuHeight: number;
64
+ viewportWidth: number;
65
+ viewportHeight: number;
66
+ gap?: number;
67
+ margin?: number;
68
+ }
69
+ export interface TriggerMenuPosition {
70
+ left: number;
71
+ top: number;
72
+ placement: 'below' | 'above';
73
+ }
74
+ /**
75
+ * Places the trigger menu below the caret when there is room; flips above when the
76
+ * bottom edge would leave the viewport. Also clamps horizontally.
77
+ */
78
+ export declare function resolveTriggerMenuPosition(input: TriggerMenuPositionInput): TriggerMenuPosition;
79
+ //# sourceMappingURL=mentionEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentionEditor.d.ts","sourceRoot":"","sources":["../../../src/components/chat/mentionEditor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD;;;;GAIG;AAEH,eAAO,MAAM,oBAAoB,4BAA4B,CAAA;AAC7D,eAAO,MAAM,eAAe,oBAAoB,CAAA;AAChD,eAAO,MAAM,kBAAkB,uBAAuB,CAAA;AACtD,eAAO,MAAM,aAAa,yBAAyB,CAAA;AAEnD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,WAAW,CAMnF;AAcD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAsCjF;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG,IAAI,CA+B5F;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,GAAG,IAAI,CAkC3F;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,+EAA+E;IAC/E,KAAK,EAAE,KAAK,CAAA;CACb;AA4CD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,iBAAiB,EAAE,EACtC,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,IAAI,EACf,WAAW,EAAE,MAAM,GAClB,mBAAmB,GAAG,IAAI,CAe5B;AAED,kHAAkH;AAClH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAWvE;AAED,0EAA0E;AAC1E,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,iBAAiB,EAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GACZ,eAAe,CA4BjB;AAED,sFAAsF;AACtF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAO/E;AAED,wKAAwK;AACxK,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAWvF;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAM/D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,OAAO,GAAG,IAAI,CAS7C;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI,CAQrE;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,OAAO,GAAG,OAAO,CAAA;CAC7B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,wBAAwB,GAAG,mBAAmB,CA6B/F"}
@@ -61,6 +61,26 @@ export interface ChatSenderQuickAction {
61
61
  /** Overrides the textarea placeholder while this action is active. */
62
62
  placeholder?: string;
63
63
  }
64
+ /**
65
+ * Configuration for a rich-text `@`-style trigger character. Typing `char` inline (or
66
+ * clicking the optional entry `button`) opens the consumer-rendered `#trigger-menu` slot.
67
+ * Multiple triggers may be configured (e.g. `@` and `/`); only one can be "open" at a time.
68
+ */
69
+ export interface ChatSenderTrigger {
70
+ id: string;
71
+ /** Single non-whitespace trigger character, e.g. `@` or `/`. */
72
+ char: string;
73
+ /**
74
+ * Renders an entry button next to the `+` attachment button. Clicking it inserts `char`
75
+ * at the caret and focuses the editor, feeding into the exact same detection pipeline as
76
+ * typing the character manually. Omit to make this a type-only trigger.
77
+ */
78
+ button?: {
79
+ icon?: Component;
80
+ /** aria-label for the entry button, e.g. "提及知识库". */
81
+ label: string;
82
+ };
83
+ }
64
84
  export interface QiniuUploadCredential {
65
85
  uptoken: string;
66
86
  fileKey: string;
@@ -200,12 +220,6 @@ export interface AssistantMessage {
200
220
  name?: string;
201
221
  reasoning_content?: string;
202
222
  tool_calls?: ConversationToolCall[];
203
- /**
204
- * Suggested follow-up questions shown under the latest completed assistant bubble.
205
- * ConversationList only renders these for the latest non-streaming assistant message;
206
- * at most three items are displayed.
207
- */
208
- follow_ups?: string[];
209
223
  /** GA-only original file metadata surfaced from `response.output_item.done`. */
210
224
  resource_files?: Record<string, unknown>[];
211
225
  }
@@ -251,7 +265,13 @@ export interface ChatMessageProps {
251
265
  assistantAvatar?: string;
252
266
  toolStates?: ChatToolStates;
253
267
  /**
254
- * When true, render `message.follow_ups` under the assistant bubble.
268
+ * Suggested follow-up questions to render under the assistant bubble. Populated
269
+ * independently of `message` (e.g. by a separate, slower analysis pipeline that
270
+ * finishes after the assistant message itself is complete).
271
+ */
272
+ followUps?: string[];
273
+ /**
274
+ * When true, render `followUps` under the assistant bubble.
255
275
  * ConversationList sets this only for the latest completed assistant message.
256
276
  * Defaults to true for standalone ChatMessage usage.
257
277
  */
@@ -309,6 +329,7 @@ export interface ConversationListConfig {
309
329
  userAvatar?: string;
310
330
  assistantAvatar?: string;
311
331
  toolStates?: ChatToolStates;
332
+ followUps?: string[];
312
333
  }
313
334
  export interface ConversationListProps extends ConversationListConfig {
314
335
  messages: readonly ConversationMessage[];
@@ -339,6 +360,15 @@ export interface ChatSenderProps {
339
360
  customMenuItems?: readonly ChatAttachmentMenuItem[];
340
361
  quickActions?: readonly ChatSenderQuickAction[];
341
362
  activeQuickAction?: string | null;
363
+ /** Trigger characters (e.g. `@`) that open `#trigger-menu`. See `ChatSenderTrigger`. */
364
+ triggers?: readonly ChatSenderTrigger[];
365
+ /**
366
+ * How the `#trigger-menu` popup is hosted:
367
+ * - `'caret'` (default): library wraps the slot in a teleported panel anchored to the caret
368
+ * - `'custom'`: no shell sizing/positioning — consumer owns layout (large panel, fixed coords, etc.).
369
+ * Slot still receives `anchorRect` / `select` / `close` so caret coords remain available.
370
+ */
371
+ triggerMenuPlacement?: 'caret' | 'custom';
342
372
  }
343
373
  export type ResponseStatus = 'in_progress' | 'completed' | 'incomplete' | 'failed';
344
374
  export type ResponseOutputItemStatus = 'in_progress' | 'completed' | 'incomplete' | 'failed';
@@ -546,6 +576,7 @@ export interface ChatBotProps {
546
576
  previewRenderers?: ChatPreviewRendererMap;
547
577
  toolRenderers?: ChatToolRendererMap;
548
578
  toolStates?: ChatToolStates;
579
+ followUps?: string[];
549
580
  }
550
581
  export interface ChatBotExpose {
551
582
  consume: (input: ResponseStreamSource, options?: ChatBotConsumeOptions) => Promise<void>;