@huyooo/ai-chat-frontend-vue 0.1.2

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 (45) hide show
  1. package/dist/adapter.d.ts +87 -0
  2. package/dist/adapter.d.ts.map +1 -0
  3. package/dist/components/ChatInput.vue.d.ts +54 -0
  4. package/dist/components/ChatInput.vue.d.ts.map +1 -0
  5. package/dist/components/ChatPanel.vue.d.ts +38 -0
  6. package/dist/components/ChatPanel.vue.d.ts.map +1 -0
  7. package/dist/components/chat/SearchResultBlock.vue.d.ts +8 -0
  8. package/dist/components/chat/SearchResultBlock.vue.d.ts.map +1 -0
  9. package/dist/components/chat/ThinkingBlock.vue.d.ts +7 -0
  10. package/dist/components/chat/ThinkingBlock.vue.d.ts.map +1 -0
  11. package/dist/components/chat/ToolCallBlock.vue.d.ts +9 -0
  12. package/dist/components/chat/ToolCallBlock.vue.d.ts.map +1 -0
  13. package/dist/components/chat/messages/ExecutionSteps.vue.d.ts +13 -0
  14. package/dist/components/chat/messages/ExecutionSteps.vue.d.ts.map +1 -0
  15. package/dist/components/chat/messages/MessageBubble.vue.d.ts +28 -0
  16. package/dist/components/chat/messages/MessageBubble.vue.d.ts.map +1 -0
  17. package/dist/components/chat/ui/ChatHeader.vue.d.ts +34 -0
  18. package/dist/components/chat/ui/ChatHeader.vue.d.ts.map +1 -0
  19. package/dist/components/chat/ui/WelcomeMessage.vue.d.ts +7 -0
  20. package/dist/components/chat/ui/WelcomeMessage.vue.d.ts.map +1 -0
  21. package/dist/composables/useChat.d.ts +96 -0
  22. package/dist/composables/useChat.d.ts.map +1 -0
  23. package/dist/index.d.ts +37 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +1497 -0
  26. package/dist/preload/preload.d.ts +6 -0
  27. package/dist/preload/preload.d.ts.map +1 -0
  28. package/dist/style.css +1 -0
  29. package/dist/types/index.d.ts +107 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/package.json +59 -0
  32. package/src/adapter.ts +160 -0
  33. package/src/components/ChatInput.vue +649 -0
  34. package/src/components/ChatPanel.vue +309 -0
  35. package/src/components/chat/SearchResultBlock.vue +155 -0
  36. package/src/components/chat/ThinkingBlock.vue +109 -0
  37. package/src/components/chat/ToolCallBlock.vue +213 -0
  38. package/src/components/chat/messages/ExecutionSteps.vue +281 -0
  39. package/src/components/chat/messages/MessageBubble.vue +272 -0
  40. package/src/components/chat/ui/ChatHeader.vue +535 -0
  41. package/src/components/chat/ui/WelcomeMessage.vue +135 -0
  42. package/src/composables/useChat.ts +423 -0
  43. package/src/index.ts +82 -0
  44. package/src/preload/preload.ts +79 -0
  45. package/src/types/index.ts +164 -0
@@ -0,0 +1,87 @@
1
+ import { SessionRecord, MessageRecord, ChatMode, ThinkingMode, SearchResult } from './types';
2
+ /** 聊天进度类型 */
3
+ export type ChatProgressType = 'thinking' | 'search_start' | 'search_result' | 'tool_call' | 'tool_result' | 'text_delta' | 'text' | 'done' | 'error';
4
+ /** 思考数据 */
5
+ export interface ThinkingData {
6
+ content: string;
7
+ isComplete: boolean;
8
+ }
9
+ /** 工具调用数据 */
10
+ export interface ToolCallData {
11
+ name: string;
12
+ args: Record<string, unknown>;
13
+ }
14
+ /** 工具结果数据 */
15
+ export interface ToolResultData {
16
+ name: string;
17
+ result: string;
18
+ }
19
+ /** 图片数据 */
20
+ export interface ImageData {
21
+ base64: string;
22
+ mimeType: string;
23
+ }
24
+ /** 聊天进度事件 */
25
+ export interface ChatProgress {
26
+ type: ChatProgressType;
27
+ data: string | ThinkingData | ToolCallData | ToolResultData | {
28
+ results: SearchResult[];
29
+ };
30
+ }
31
+ /** 发送消息选项 */
32
+ export interface SendMessageOptions {
33
+ mode: ChatMode;
34
+ model: string;
35
+ enableWebSearch: boolean;
36
+ thinkingMode: ThinkingMode;
37
+ }
38
+ /** 创建会话选项 */
39
+ export interface CreateSessionOptions {
40
+ title: string;
41
+ model: string;
42
+ mode: ChatMode;
43
+ }
44
+ /** 更新会话选项 */
45
+ export interface UpdateSessionOptions {
46
+ title?: string;
47
+ model?: string;
48
+ mode?: ChatMode;
49
+ }
50
+ /** 保存消息选项 */
51
+ export interface SaveMessageOptions {
52
+ sessionId: string;
53
+ role: 'user' | 'assistant';
54
+ content: string;
55
+ thinking?: string;
56
+ toolCalls?: string;
57
+ searchResults?: string;
58
+ }
59
+ /**
60
+ * Chat Adapter 接口
61
+ * 所有后端通信实现都需要实现此接口
62
+ */
63
+ export interface ChatAdapter {
64
+ /** 获取所有会话 */
65
+ getSessions(): Promise<SessionRecord[]>;
66
+ /** 创建新会话 */
67
+ createSession(options: CreateSessionOptions): Promise<SessionRecord>;
68
+ /** 更新会话 */
69
+ updateSession(sessionId: string, options: UpdateSessionOptions): Promise<void>;
70
+ /** 删除会话 */
71
+ deleteSession(sessionId: string): Promise<void>;
72
+ /** 获取会话消息 */
73
+ getMessages(sessionId: string): Promise<MessageRecord[]>;
74
+ /** 保存消息 */
75
+ saveMessage(options: SaveMessageOptions): Promise<MessageRecord>;
76
+ /** 发送消息并获取流式响应 */
77
+ sendMessage(content: string, options: SendMessageOptions, images?: string[]): AsyncGenerator<ChatProgress, void, unknown>;
78
+ /** 取消当前请求 */
79
+ cancel(): void;
80
+ /** 设置工作目录 */
81
+ setWorkingDir?(dir: string): void;
82
+ }
83
+ /**
84
+ * 创建空 Adapter(用于测试或无后端场景)
85
+ */
86
+ export declare function createNullAdapter(): ChatAdapter;
87
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { ChatMode, ModelConfig } from '../types';
2
+ type __VLS_Props = {
3
+ /** 变体模式:input-底部输入框,message-历史消息 */
4
+ variant?: 'input' | 'message';
5
+ /** 受控值(用于历史消息编辑) */
6
+ value?: string;
7
+ selectedImages?: string[];
8
+ isLoading?: boolean;
9
+ mode?: ChatMode;
10
+ model?: string;
11
+ models?: ModelConfig[];
12
+ webSearchEnabled?: boolean;
13
+ thinkingEnabled?: boolean;
14
+ };
15
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {
16
+ focus: () => void | undefined;
17
+ setText: (text: string) => void;
18
+ clear: () => void;
19
+ }, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
20
+ cancel: () => any;
21
+ send: (text: string) => any;
22
+ "remove-image": (index: number) => any;
23
+ "upload-image": () => any;
24
+ "at-context": () => any;
25
+ "update:mode": (mode: ChatMode) => any;
26
+ "update:model": (model: string) => any;
27
+ "update:webSearch": (enabled: boolean) => any;
28
+ "update:thinking": (enabled: boolean) => any;
29
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
30
+ onCancel?: (() => any) | undefined;
31
+ onSend?: ((text: string) => any) | undefined;
32
+ "onRemove-image"?: ((index: number) => any) | undefined;
33
+ "onUpload-image"?: (() => any) | undefined;
34
+ "onAt-context"?: (() => any) | undefined;
35
+ "onUpdate:mode"?: ((mode: ChatMode) => any) | undefined;
36
+ "onUpdate:model"?: ((model: string) => any) | undefined;
37
+ "onUpdate:webSearch"?: ((enabled: boolean) => any) | undefined;
38
+ "onUpdate:thinking"?: ((enabled: boolean) => any) | undefined;
39
+ }>, {
40
+ model: string;
41
+ mode: ChatMode;
42
+ variant: "input" | "message";
43
+ value: string;
44
+ selectedImages: string[];
45
+ isLoading: boolean;
46
+ models: ModelConfig[];
47
+ webSearchEnabled: boolean;
48
+ thinkingEnabled: boolean;
49
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
50
+ containerRef: HTMLDivElement;
51
+ inputRef: HTMLTextAreaElement;
52
+ }, HTMLDivElement>;
53
+ export default _default;
54
+ //# sourceMappingURL=ChatInput.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.vue.d.ts","sourceRoot":"","sources":["../../src/components/ChatInput.vue"],"names":[],"mappings":"AAiJA;AA0pBA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGtD,KAAK,WAAW,GAAG;IACf,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;;;oBAuMc,MAAM;;;;;;;;;;;;;;;;;;;;;;;WA3MZ,MAAM;UADP,QAAQ;aALL,OAAO,GAAG,SAAS;WAErB,MAAM;oBACG,MAAM,EAAE;eACb,OAAO;YAGV,WAAW,EAAE;sBACH,OAAO;qBACR,OAAO;;;;;AA+nB7B,wBAWG"}
@@ -0,0 +1,38 @@
1
+ import { ChatAdapter } from '../adapter';
2
+ import { ModelConfig, ChatMode } from '../types';
3
+ interface Props {
4
+ /** Adapter 实例 */
5
+ adapter?: ChatAdapter;
6
+ /** 工作目录 */
7
+ workingDir?: string;
8
+ /** 默认模型 */
9
+ defaultModel?: string;
10
+ /** 默认模式 */
11
+ defaultMode?: ChatMode;
12
+ /** 可用模型列表 */
13
+ models?: ModelConfig[];
14
+ /** 隐藏标题栏 */
15
+ hideHeader?: boolean;
16
+ /** 关闭回调(有此属性时显示关闭按钮) */
17
+ onClose?: () => void;
18
+ /** 自定义类名 */
19
+ className?: string;
20
+ }
21
+ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
22
+ close: () => any;
23
+ }, string, import('vue').PublicProps, Readonly<Props> & Readonly<{
24
+ onClose?: (() => any) | undefined;
25
+ }>, {
26
+ adapter: ChatAdapter;
27
+ defaultModel: string;
28
+ defaultMode: ChatMode;
29
+ onClose: () => void;
30
+ models: ModelConfig[];
31
+ workingDir: string;
32
+ hideHeader: boolean;
33
+ className: string;
34
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
35
+ messagesRef: HTMLDivElement;
36
+ }, HTMLDivElement>;
37
+ export default _default;
38
+ //# sourceMappingURL=ChatPanel.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatPanel.vue.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.vue"],"names":[],"mappings":"AAoEA;AAyTA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAOtD,UAAU,KAAK;IACb,iBAAiB;IACjB,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,WAAW;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW;IACX,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW;IACX,WAAW,CAAC,EAAE,QAAQ,CAAC;IACvB,aAAa;IACb,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB;IACxB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;;;;;;aAfW,WAAW;kBAIN,MAAM;iBAEP,QAAQ;aAMZ,MAAM,IAAI;YAJX,WAAW,EAAE;gBANT,MAAM;gBAQN,OAAO;eAIR,MAAM;;;;AAmdpB,wBAUG"}
@@ -0,0 +1,8 @@
1
+ import { SearchResult } from '../../types';
2
+ type __VLS_Props = {
3
+ results: SearchResult[];
4
+ searching: boolean;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
7
+ export default _default;
8
+ //# sourceMappingURL=SearchResultBlock.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchResultBlock.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/SearchResultBlock.vue"],"names":[],"mappings":"AAgCA;AA+JA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;;AA4IF,wBAOG"}
@@ -0,0 +1,7 @@
1
+ type __VLS_Props = {
2
+ content: string;
3
+ isComplete: boolean;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
6
+ export default _default;
7
+ //# sourceMappingURL=ThinkingBlock.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThinkingBlock.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ThinkingBlock.vue"],"names":[],"mappings":"AAgBA;AAkHA,KAAK,WAAW,GAAG;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;;AAmHF,wBAOG"}
@@ -0,0 +1,9 @@
1
+ type __VLS_Props = {
2
+ name: string;
3
+ args?: Record<string, unknown>;
4
+ result?: string;
5
+ status: 'running' | 'success' | 'error';
6
+ };
7
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
8
+ export default _default;
9
+ //# sourceMappingURL=ToolCallBlock.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolCallBlock.vue.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ToolCallBlock.vue"],"names":[],"mappings":"AA+BA;AAoOA,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;CACzC,CAAC;;AA6MF,wBAOG"}
@@ -0,0 +1,13 @@
1
+ import { ToolCall, SearchResult } from '../../../types';
2
+ type __VLS_Props = {
3
+ loading?: boolean;
4
+ hasContent?: boolean;
5
+ thinking?: string;
6
+ thinkingComplete?: boolean;
7
+ searching?: boolean;
8
+ searchResults?: SearchResult[];
9
+ toolCalls?: ToolCall[];
10
+ };
11
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
+ export default _default;
13
+ //# sourceMappingURL=ExecutionSteps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExecutionSteps.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/messages/ExecutionSteps.vue"],"names":[],"mappings":"AA8EA;AA6RA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE7D,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;CACxB,CAAC;;AA8VF,wBAMG"}
@@ -0,0 +1,28 @@
1
+ import { ToolCall, SearchResult } from '../../../types';
2
+ type __VLS_Props = {
3
+ role: 'user' | 'assistant';
4
+ content: string;
5
+ images?: string[];
6
+ thinking?: string;
7
+ thinkingComplete?: boolean;
8
+ searchResults?: SearchResult[];
9
+ searching?: boolean;
10
+ toolCalls?: ToolCall[];
11
+ loading?: boolean;
12
+ copied?: boolean;
13
+ /** 是否支持重新发送(仅用户消息) */
14
+ onSend?: (text: string) => void;
15
+ };
16
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
17
+ copy: () => any;
18
+ send: (text: string) => any;
19
+ regenerate: () => any;
20
+ "view-image": (url: string) => any;
21
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
22
+ onCopy?: (() => any) | undefined;
23
+ onSend?: ((text: string) => any) | undefined;
24
+ onRegenerate?: (() => any) | undefined;
25
+ "onView-image"?: ((url: string) => any) | undefined;
26
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
27
+ export default _default;
28
+ //# sourceMappingURL=MessageBubble.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBubble.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/messages/MessageBubble.vue"],"names":[],"mappings":"AA8DA;AAsRA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE7D,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,CAAC;;;;;;;;;;;;AAyOF,wBAQG"}
@@ -0,0 +1,34 @@
1
+ import { SessionRecord } from '../../../types';
2
+ type __VLS_Props = {
3
+ sessions: SessionRecord[];
4
+ currentSessionId?: string | null;
5
+ showClose?: boolean;
6
+ };
7
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
8
+ "new-session": () => any;
9
+ "switch-session": (sessionId: string) => any;
10
+ "delete-session": (sessionId: string) => any;
11
+ close: () => any;
12
+ "clear-all": () => any;
13
+ "close-others": () => any;
14
+ export: () => any;
15
+ "copy-id": () => any;
16
+ feedback: () => any;
17
+ settings: () => any;
18
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
19
+ "onNew-session"?: (() => any) | undefined;
20
+ "onSwitch-session"?: ((sessionId: string) => any) | undefined;
21
+ "onDelete-session"?: ((sessionId: string) => any) | undefined;
22
+ onClose?: (() => any) | undefined;
23
+ "onClear-all"?: (() => any) | undefined;
24
+ "onClose-others"?: (() => any) | undefined;
25
+ onExport?: (() => any) | undefined;
26
+ "onCopy-id"?: (() => any) | undefined;
27
+ onFeedback?: (() => any) | undefined;
28
+ onSettings?: (() => any) | undefined;
29
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
30
+ historyRef: HTMLDivElement;
31
+ moreRef: HTMLDivElement;
32
+ }, HTMLDivElement>;
33
+ export default _default;
34
+ //# sourceMappingURL=ChatHeader.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatHeader.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/ui/ChatHeader.vue"],"names":[],"mappings":"AAqIA;AAsiBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkhBF,wBASG"}
@@ -0,0 +1,7 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
2
+ "quick-action": (prompt: string) => any;
3
+ }, string, import('vue').PublicProps, Readonly<{}> & Readonly<{
4
+ "onQuick-action"?: ((prompt: string) => any) | undefined;
5
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
6
+ export default _default;
7
+ //# sourceMappingURL=WelcomeMessage.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WelcomeMessage.vue.d.ts","sourceRoot":"","sources":["../../../../src/components/chat/ui/WelcomeMessage.vue"],"names":[],"mappings":"AAqBA;;;;;;AA8QA,wBAOG"}
@@ -0,0 +1,96 @@
1
+ import { ChatAdapter } from '../adapter';
2
+ import { ChatMessage, ChatMode, SessionRecord } from '../types';
3
+ export interface UseChatOptions {
4
+ /** Adapter 实例 */
5
+ adapter?: ChatAdapter;
6
+ /** 默认模型 */
7
+ defaultModel?: string;
8
+ /** 默认模式 */
9
+ defaultMode?: ChatMode;
10
+ }
11
+ /**
12
+ * 聊天状态管理 Composable
13
+ */
14
+ export declare function useChat(options?: UseChatOptions): {
15
+ sessions: import('vue').Ref<{
16
+ id: string;
17
+ title: string;
18
+ model: string;
19
+ mode: ChatMode;
20
+ createdAt: Date;
21
+ updatedAt: Date;
22
+ }[], SessionRecord[] | {
23
+ id: string;
24
+ title: string;
25
+ model: string;
26
+ mode: ChatMode;
27
+ createdAt: Date;
28
+ updatedAt: Date;
29
+ }[]>;
30
+ currentSessionId: import('vue').Ref<string | null, string | null>;
31
+ messages: import('vue').Ref<{
32
+ id: string;
33
+ role: "user" | "assistant";
34
+ content: string;
35
+ images?: string[] | undefined;
36
+ thinking?: string | undefined;
37
+ thinkingComplete?: boolean | undefined;
38
+ searchResults?: {
39
+ title: string;
40
+ url: string;
41
+ snippet: string;
42
+ }[] | undefined;
43
+ searching?: boolean | undefined;
44
+ toolCalls?: {
45
+ name: string;
46
+ args?: Record<string, unknown> | undefined;
47
+ result?: string | undefined;
48
+ status: "running" | "success" | "error";
49
+ }[] | undefined;
50
+ copied?: boolean | undefined;
51
+ loading?: boolean | undefined;
52
+ timestamp?: Date | undefined;
53
+ }[], ChatMessage[] | {
54
+ id: string;
55
+ role: "user" | "assistant";
56
+ content: string;
57
+ images?: string[] | undefined;
58
+ thinking?: string | undefined;
59
+ thinkingComplete?: boolean | undefined;
60
+ searchResults?: {
61
+ title: string;
62
+ url: string;
63
+ snippet: string;
64
+ }[] | undefined;
65
+ searching?: boolean | undefined;
66
+ toolCalls?: {
67
+ name: string;
68
+ args?: Record<string, unknown> | undefined;
69
+ result?: string | undefined;
70
+ status: "running" | "success" | "error";
71
+ }[] | undefined;
72
+ copied?: boolean | undefined;
73
+ loading?: boolean | undefined;
74
+ timestamp?: Date | undefined;
75
+ }[]>;
76
+ isLoading: import('vue').Ref<boolean, boolean>;
77
+ mode: import('vue').Ref<ChatMode, ChatMode>;
78
+ model: import('vue').Ref<string, string>;
79
+ webSearch: import('vue').Ref<boolean, boolean>;
80
+ thinking: import('vue').Ref<boolean, boolean>;
81
+ loadSessions: () => Promise<void>;
82
+ switchSession: (sessionId: string) => Promise<void>;
83
+ createNewSession: () => Promise<void>;
84
+ deleteSession: (sessionId: string) => Promise<void>;
85
+ deleteCurrentSession: () => Promise<void>;
86
+ sendMessage: (text: string, images?: string[]) => Promise<void>;
87
+ cancelRequest: () => void;
88
+ copyMessage: (messageId: string) => Promise<void>;
89
+ regenerateMessage: (messageIndex: number) => void;
90
+ setMode: (value: ChatMode) => void;
91
+ setModel: (value: string) => void;
92
+ setWebSearch: (value: boolean) => void;
93
+ setThinking: (value: boolean) => void;
94
+ setWorkingDirectory: (dir: string) => void;
95
+ };
96
+ //# sourceMappingURL=useChat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/composables/useChat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,YAAY,CAAA;AAE3D,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,aAAa,EAId,MAAM,UAAU,CAAA;AAsBjB,MAAM,WAAW,cAAc;IAC7B,iBAAiB;IACjB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,WAAW;IACX,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,WAAW;IACX,WAAW,CAAC,EAAE,QAAQ,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,GAAE,cAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAuCV,MAAM;;+BAsCN,MAAM;;wBAgGb,MAAM,WAAW,MAAM,EAAE;;6BAmIpB,MAAM;sCAoBH,MAAM;qBAwC5B,QAAQ;sBACP,MAAM;0BACF,OAAO;yBACR,OAAO;+BAlCI,MAAM;EAuCzC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @huyooo/ai-chat-frontend
3
+ *
4
+ * AI Chat 前端组件库
5
+ *
6
+ * 使用 adapter 模式,与后端通信方式解耦
7
+ */
8
+ export type { ChatAdapter, ChatProgress, ChatProgressType, ThinkingData, ToolCallData, ToolResultData, ImageData, SendMessageOptions, CreateSessionOptions, UpdateSessionOptions, SaveMessageOptions, } from './adapter';
9
+ export { createNullAdapter } from './adapter';
10
+ export { useChat } from './composables/useChat';
11
+ export type { UseChatOptions } from './composables/useChat';
12
+ export { default as ChatPanel } from './components/ChatPanel.vue';
13
+ export { default as ChatInput } from './components/ChatInput.vue';
14
+ export { default as ChatHeader } from './components/chat/ui/ChatHeader.vue';
15
+ export { default as WelcomeMessage } from './components/chat/ui/WelcomeMessage.vue';
16
+ export { default as MessageBubble } from './components/chat/messages/MessageBubble.vue';
17
+ export { default as ExecutionSteps } from './components/chat/messages/ExecutionSteps.vue';
18
+ export { default as ThinkingBlock } from './components/chat/ThinkingBlock.vue';
19
+ export { default as ToolCallBlock } from './components/chat/ToolCallBlock.vue';
20
+ export { default as SearchResultBlock } from './components/chat/SearchResultBlock.vue';
21
+ export type { ChatMessage, ChatMode, ModelConfig, ModelProvider, ThinkingMode, SessionRecord, MessageRecord, SearchResult, ToolCall, ChatSession, MediaOperation, AiModel, DiffStat, } from './types';
22
+ export { DEFAULT_MODELS, FileType } from './types';
23
+ /**
24
+ * 使用说明:
25
+ *
26
+ * 1. 创建 adapter(使用桥接包):
27
+ * import { createElectronAdapter } from '@huyooo/ai-chat-bridge-electron/renderer';
28
+ * const adapter = createElectronAdapter();
29
+ *
30
+ * 2. 在 Vue 组件中使用:
31
+ * <ChatPanel :adapter="adapter" />
32
+ *
33
+ * 3. 或使用 useChat composable:
34
+ * const chat = useChat({ adapter });
35
+ * // 然后自定义 UI
36
+ */
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAG9C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGlE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAG5E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAGpF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAG1F,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAGvF,YAAY,EACV,WAAW,EACX,QAAQ,EACR,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,EACb,YAAY,EACZ,QAAQ,EAER,WAAW,EACX,cAAc,EACd,OAAO,EACP,QAAQ,GACT,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnD;;;;;;;;;;;;;GAaG"}