@huyooo/ai-chat-frontend-vue 0.1.3 → 0.1.4

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/dist/adapter.d.ts CHANGED
@@ -1,6 +1,5 @@
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';
1
+ import { ChatAdapter as ChatAdapterType, ChatMode, ThinkingMode } from '@huyooo/ai-chat-bridge-electron/renderer';
2
+ export type ChatAdapter = ChatAdapterType;
4
3
  /** 思考数据 */
5
4
  export interface ThinkingData {
6
5
  content: string;
@@ -21,13 +20,6 @@ export interface ImageData {
21
20
  base64: string;
22
21
  mimeType: string;
23
22
  }
24
- /** 聊天进度事件 */
25
- export interface ChatProgress {
26
- type: ChatProgressType;
27
- data: string | ThinkingData | ToolCallData | ToolResultData | {
28
- results: SearchResult[];
29
- };
30
- }
31
23
  /** 发送消息选项 */
32
24
  export interface SendMessageOptions {
33
25
  mode: ChatMode;
@@ -56,32 +48,8 @@ export interface SaveMessageOptions {
56
48
  toolCalls?: string;
57
49
  searchResults?: string;
58
50
  }
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
51
  /**
84
52
  * 创建空 Adapter(用于测试或无后端场景)
85
53
  */
86
- export declare function createNullAdapter(): ChatAdapter;
54
+ export declare function createNullAdapter(): ChatAdapterType;
87
55
  //# sourceMappingURL=adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,IAAI,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAA;AAGtH,MAAM,MAAM,WAAW,GAAG,eAAe,CAAA;AAGzC,WAAW;AACX,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,aAAa;AACb,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,aAAa;AACb,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;CACf;AAED,WAAW;AACX,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,aAAa;AACb,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,aAAa;AACb,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,CAAA;CACf;AAED,aAAa;AACb,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,QAAQ,CAAA;CAChB;AAED,aAAa;AACb,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,eAAe,CA2DnD"}
@@ -22,7 +22,7 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {
22
22
  "remove-image": (index: number) => any;
23
23
  "upload-image": () => any;
24
24
  "at-context": () => any;
25
- "update:mode": (mode: ChatMode) => any;
25
+ "update:mode": (mode: import('@huyooo/ai-chat-bridge-electron/renderer').ChatMode) => any;
26
26
  "update:model": (model: string) => any;
27
27
  "update:webSearch": (enabled: boolean) => any;
28
28
  "update:thinking": (enabled: boolean) => any;
@@ -32,7 +32,7 @@ declare const _default: import('vue').DefineComponent<__VLS_Props, {
32
32
  "onRemove-image"?: ((index: number) => any) | undefined;
33
33
  "onUpload-image"?: (() => any) | undefined;
34
34
  "onAt-context"?: (() => any) | undefined;
35
- "onUpdate:mode"?: ((mode: ChatMode) => any) | undefined;
35
+ "onUpdate:mode"?: ((mode: import('@huyooo/ai-chat-bridge-electron/renderer').ChatMode) => any) | undefined;
36
36
  "onUpdate:model"?: ((model: string) => any) | undefined;
37
37
  "onUpdate:webSearch"?: ((enabled: boolean) => any) | undefined;
38
38
  "onUpdate:thinking"?: ((enabled: boolean) => any) | undefined;
@@ -1,5 +1,5 @@
1
- import { ChatAdapter } from '../adapter';
2
- import { ChatMessage, ChatMode, SessionRecord } from '../types';
1
+ import { ChatAdapter, ChatMode, SessionRecord } from '@huyooo/ai-chat-bridge-electron/renderer';
2
+ import { ChatMessage } from '../types';
3
3
  export interface UseChatOptions {
4
4
  /** Adapter 实例 */
5
5
  adapter?: ChatAdapter;
@@ -14,6 +14,8 @@ export interface UseChatOptions {
14
14
  export declare function useChat(options?: UseChatOptions): {
15
15
  sessions: import('vue').Ref<{
16
16
  id: string;
17
+ appId: string | null;
18
+ userId: string | null;
17
19
  title: string;
18
20
  model: string;
19
21
  mode: ChatMode;
@@ -21,6 +23,8 @@ export declare function useChat(options?: UseChatOptions): {
21
23
  updatedAt: Date;
22
24
  }[], SessionRecord[] | {
23
25
  id: string;
26
+ appId: string | null;
27
+ userId: string | null;
24
28
  title: string;
25
29
  model: string;
26
30
  mode: ChatMode;
@@ -1 +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"}
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/composables/useChat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EACV,WAAW,EAEX,QAAQ,EACR,aAAa,EAEd,MAAM,0CAA0C,CAAA;AAEjD,OAAO,KAAK,EAAE,WAAW,EAA0B,MAAM,UAAU,CAAA;AAsBnE,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"}
package/dist/index.d.ts CHANGED
@@ -1,11 +1,13 @@
1
1
  /**
2
- * @huyooo/ai-chat-frontend
2
+ * @huyooo/ai-chat-frontend-vue
3
3
  *
4
- * AI Chat 前端组件库
4
+ * AI Chat 前端组件库 - Vue 版本
5
5
  *
6
6
  * 使用 adapter 模式,与后端通信方式解耦
7
7
  */
8
- export type { ChatAdapter, ChatProgress, ChatProgressType, ThinkingData, ToolCallData, ToolResultData, ImageData, SendMessageOptions, CreateSessionOptions, UpdateSessionOptions, SaveMessageOptions, } from './adapter';
8
+ export type { ChatAdapter, ChatProgress, ChatProgressType, ChatOptions, ChatMode, ModelConfig, ModelProvider, ThinkingMode, SessionRecord, MessageRecord, } from '@huyooo/ai-chat-bridge-electron/renderer';
9
+ export { createElectronAdapter } from '@huyooo/ai-chat-bridge-electron/renderer';
10
+ export type { ThinkingData, ToolCallData, ToolResultData, ImageData, SendMessageOptions, CreateSessionOptions, UpdateSessionOptions, SaveMessageOptions, } from './adapter';
9
11
  export { createNullAdapter } from './adapter';
10
12
  export { useChat } from './composables/useChat';
11
13
  export type { UseChatOptions } from './composables/useChat';
@@ -18,20 +20,22 @@ export { default as ExecutionSteps } from './components/chat/messages/ExecutionS
18
20
  export { default as ThinkingBlock } from './components/chat/ThinkingBlock.vue';
19
21
  export { default as ToolCallBlock } from './components/chat/ToolCallBlock.vue';
20
22
  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';
23
+ export type { ChatMessage, SearchResult, ToolCall, ChatSession, MediaOperation, AiModel, DiffStat, } from './types';
22
24
  export { DEFAULT_MODELS, FileType } from './types';
23
25
  /**
24
26
  * 使用说明:
25
27
  *
26
- * 1. 创建 adapter(使用桥接包):
27
- * import { createElectronAdapter } from '@huyooo/ai-chat-bridge-electron/renderer';
28
- * const adapter = createElectronAdapter();
28
+ * 1. 导入样式:
29
+ * import '@huyooo/ai-chat-frontend-vue/style.css'
29
30
  *
30
- * 2. Vue 组件中使用:
31
+ * 2. 创建 adapter 和使用组件(一行导入):
32
+ * import { ChatPanel, createElectronAdapter } from '@huyooo/ai-chat-frontend-vue'
33
+ * const adapter = createElectronAdapter()
31
34
  * <ChatPanel :adapter="adapter" />
32
35
  *
33
- * 3. 或使用 useChat composable:
34
- * const chat = useChat({ adapter });
35
- * // 然后自定义 UI
36
+ * 3. 或使用 useChat composable 自定义 UI
37
+ * import { useChat, createElectronAdapter } from '@huyooo/ai-chat-frontend-vue'
38
+ * const adapter = createElectronAdapter()
39
+ * const chat = useChat({ adapter })
36
40
  */
37
41
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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"}
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,WAAW,EACX,QAAQ,EACR,WAAW,EACX,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,0CAA0C,CAAA;AAGjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAA;AAGhF,YAAY,EACV,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,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;;;;;;;;;;;;;;;GAeG"}