@huyooo/ai-chat-frontend-react 0.2.45 → 0.3.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.
Files changed (188) hide show
  1. package/dist/adapter.d.ts +58 -0
  2. package/dist/adapter.d.ts.map +1 -0
  3. package/dist/components/ChatPanel.d.ts +71 -0
  4. package/dist/components/ChatPanel.d.ts.map +1 -0
  5. package/dist/components/common/ConfirmDialog.d.ts +27 -0
  6. package/dist/components/common/ConfirmDialog.d.ts.map +1 -0
  7. package/dist/components/common/CopyButton.d.ts +15 -0
  8. package/dist/components/common/CopyButton.d.ts.map +1 -0
  9. package/dist/components/common/IndexingSettings.d.ts +3 -0
  10. package/dist/components/common/IndexingSettings.d.ts.map +1 -0
  11. package/dist/components/common/Toast.d.ts +12 -0
  12. package/dist/components/common/Toast.d.ts.map +1 -0
  13. package/dist/components/common/ToggleSwitch.d.ts +9 -0
  14. package/dist/components/common/ToggleSwitch.d.ts.map +1 -0
  15. package/dist/components/header/ChatHeader.d.ts +42 -0
  16. package/dist/components/header/ChatHeader.d.ts.map +1 -0
  17. package/dist/components/input/AtFilePicker.d.ts +16 -0
  18. package/dist/components/input/AtFilePicker.d.ts.map +1 -0
  19. package/dist/components/input/ChatInput.d.ts +49 -0
  20. package/dist/components/input/ChatInput.d.ts.map +1 -0
  21. package/dist/components/input/DropdownSelector.d.ts +46 -0
  22. package/dist/components/input/DropdownSelector.d.ts.map +1 -0
  23. package/dist/components/input/ImagePreviewModal.d.ts +11 -0
  24. package/dist/components/input/ImagePreviewModal.d.ts.map +1 -0
  25. package/dist/components/input/QueuedMessageList.d.ts +11 -0
  26. package/dist/components/input/QueuedMessageList.d.ts.map +1 -0
  27. package/dist/components/input/at-views/AtChatsView.d.ts +17 -0
  28. package/dist/components/input/at-views/AtChatsView.d.ts.map +1 -0
  29. package/dist/components/input/at-views/AtDocsView.d.ts +17 -0
  30. package/dist/components/input/at-views/AtDocsView.d.ts.map +1 -0
  31. package/dist/components/input/at-views/AtFilesView.d.ts +26 -0
  32. package/dist/components/input/at-views/AtFilesView.d.ts.map +1 -0
  33. package/dist/components/input/at-views/AtTerminalsView.d.ts +17 -0
  34. package/dist/components/input/at-views/AtTerminalsView.d.ts.map +1 -0
  35. package/dist/components/input/at-views/index.d.ts +9 -0
  36. package/dist/components/input/at-views/index.d.ts.map +1 -0
  37. package/dist/components/input/at-views/useAtViewTooltip.d.ts +12 -0
  38. package/dist/components/input/at-views/useAtViewTooltip.d.ts.map +1 -0
  39. package/dist/components/input/atContextItems.d.ts +9 -0
  40. package/dist/components/input/atContextItems.d.ts.map +1 -0
  41. package/dist/components/input/atContextToolHints.d.ts +2 -0
  42. package/dist/components/input/atContextToolHints.d.ts.map +1 -0
  43. package/dist/components/message/MessageBubble.d.ts +69 -0
  44. package/dist/components/message/MessageBubble.d.ts.map +1 -0
  45. package/dist/components/message/PartsRenderer.d.ts +22 -0
  46. package/dist/components/message/PartsRenderer.d.ts.map +1 -0
  47. package/dist/components/message/WelcomeMessage.d.ts +16 -0
  48. package/dist/components/message/WelcomeMessage.d.ts.map +1 -0
  49. package/dist/components/message/parts/CollapsibleCard.d.ts +29 -0
  50. package/dist/components/message/parts/CollapsibleCard.d.ts.map +1 -0
  51. package/dist/components/message/parts/CompactPart.d.ts +14 -0
  52. package/dist/components/message/parts/CompactPart.d.ts.map +1 -0
  53. package/dist/components/message/parts/ContentCompressPart.d.ts +13 -0
  54. package/dist/components/message/parts/ContentCompressPart.d.ts.map +1 -0
  55. package/dist/components/message/parts/ErrorPart.d.ts +10 -0
  56. package/dist/components/message/parts/ErrorPart.d.ts.map +1 -0
  57. package/dist/components/message/parts/ExtensionPartHost.d.ts +15 -0
  58. package/dist/components/message/parts/ExtensionPartHost.d.ts.map +1 -0
  59. package/dist/components/message/parts/ImagePart.d.ts +9 -0
  60. package/dist/components/message/parts/ImagePart.d.ts.map +1 -0
  61. package/dist/components/message/parts/PlanPart.d.ts +11 -0
  62. package/dist/components/message/parts/PlanPart.d.ts.map +1 -0
  63. package/dist/components/message/parts/TavilySearchPart.d.ts +18 -0
  64. package/dist/components/message/parts/TavilySearchPart.d.ts.map +1 -0
  65. package/dist/components/message/parts/TextPart.d.ts +9 -0
  66. package/dist/components/message/parts/TextPart.d.ts.map +1 -0
  67. package/dist/components/message/parts/ThinkingPart.d.ts +12 -0
  68. package/dist/components/message/parts/ThinkingPart.d.ts.map +1 -0
  69. package/dist/components/message/parts/ToolCallPart.d.ts +35 -0
  70. package/dist/components/message/parts/ToolCallPart.d.ts.map +1 -0
  71. package/dist/components/message/parts/ZhipuSearchPart.d.ts +20 -0
  72. package/dist/components/message/parts/ZhipuSearchPart.d.ts.map +1 -0
  73. package/dist/components/message/parts/index.d.ts +20 -0
  74. package/dist/components/message/parts/index.d.ts.map +1 -0
  75. package/dist/components/message/parts/tool-call-display.d.ts +26 -0
  76. package/dist/components/message/parts/tool-call-display.d.ts.map +1 -0
  77. package/dist/components/message/parts/visual-predicate.d.ts +7 -0
  78. package/dist/components/message/parts/visual-predicate.d.ts.map +1 -0
  79. package/dist/components/message/parts/visual-render.d.ts +2 -0
  80. package/dist/components/message/parts/visual-render.d.ts.map +1 -0
  81. package/dist/components/message/parts/visual.d.ts +3 -0
  82. package/dist/components/message/parts/visual.d.ts.map +1 -0
  83. package/dist/components/message/welcome-types.d.ts +28 -0
  84. package/dist/components/message/welcome-types.d.ts.map +1 -0
  85. package/dist/context/AutoRunConfigContext.d.ts +8 -0
  86. package/dist/context/AutoRunConfigContext.d.ts.map +1 -0
  87. package/dist/context/ChatAdapterContext.d.ts +4 -0
  88. package/dist/context/ChatAdapterContext.d.ts.map +1 -0
  89. package/dist/context/ChatInputContext.d.ts +51 -0
  90. package/dist/context/ChatInputContext.d.ts.map +1 -0
  91. package/dist/context/PartLoaderContext.d.ts +25 -0
  92. package/dist/context/PartLoaderContext.d.ts.map +1 -0
  93. package/dist/context/RenderersContext.d.ts +22 -0
  94. package/dist/context/RenderersContext.d.ts.map +1 -0
  95. package/dist/hooks/chat/types.d.ts +109 -0
  96. package/dist/hooks/chat/types.d.ts.map +1 -0
  97. package/dist/hooks/chat/useCapabilityConfig.d.ts +35 -0
  98. package/dist/hooks/chat/useCapabilityConfig.d.ts.map +1 -0
  99. package/dist/hooks/chat/useMessageActions.d.ts +13 -0
  100. package/dist/hooks/chat/useMessageActions.d.ts.map +1 -0
  101. package/dist/hooks/chat/useMessageSender.d.ts +15 -0
  102. package/dist/hooks/chat/useMessageSender.d.ts.map +1 -0
  103. package/dist/hooks/chat/useSessionManager.d.ts +18 -0
  104. package/dist/hooks/chat/useSessionManager.d.ts.map +1 -0
  105. package/dist/hooks/chat/utils.d.ts +20 -0
  106. package/dist/hooks/chat/utils.d.ts.map +1 -0
  107. package/dist/hooks/useChat.d.ts +105 -0
  108. package/dist/hooks/useChat.d.ts.map +1 -0
  109. package/dist/hooks/useImageUpload.d.ts +56 -0
  110. package/dist/hooks/useImageUpload.d.ts.map +1 -0
  111. package/dist/hooks/useVoiceInput.d.ts +26 -0
  112. package/dist/hooks/useVoiceInput.d.ts.map +1 -0
  113. package/dist/hooks/useVoiceToTextInput.d.ts +22 -0
  114. package/dist/hooks/useVoiceToTextInput.d.ts.map +1 -0
  115. package/dist/icons.d.ts +2 -0
  116. package/dist/icons.d.ts.map +1 -0
  117. package/dist/index.d.ts +55 -684
  118. package/dist/index.d.ts.map +1 -0
  119. package/dist/index.js +34 -1
  120. package/dist/style.css +103 -0
  121. package/dist/types/index.d.ts +251 -0
  122. package/dist/types/index.d.ts.map +1 -0
  123. package/dist/utils/applyToolCallResult.d.ts +8 -0
  124. package/dist/utils/applyToolCallResult.d.ts.map +1 -0
  125. package/dist/utils/applyToolCallResult.test.d.ts +2 -0
  126. package/dist/utils/applyToolCallResult.test.d.ts.map +1 -0
  127. package/package.json +19 -11
  128. package/dist/KaTeX_AMS-Regular-CYEKBG2K.woff +0 -0
  129. package/dist/KaTeX_AMS-Regular-JKX5W2C4.ttf +0 -0
  130. package/dist/KaTeX_AMS-Regular-U6PRYMIZ.woff2 +0 -0
  131. package/dist/KaTeX_Caligraphic-Bold-5QL5CMTE.woff2 +0 -0
  132. package/dist/KaTeX_Caligraphic-Bold-WZ3QSGD3.woff +0 -0
  133. package/dist/KaTeX_Caligraphic-Bold-ZTS3R3HK.ttf +0 -0
  134. package/dist/KaTeX_Caligraphic-Regular-3LKEU76G.woff +0 -0
  135. package/dist/KaTeX_Caligraphic-Regular-A7XRTZ5Q.ttf +0 -0
  136. package/dist/KaTeX_Caligraphic-Regular-KX5MEWCF.woff2 +0 -0
  137. package/dist/KaTeX_Fraktur-Bold-2QVFK6NQ.woff2 +0 -0
  138. package/dist/KaTeX_Fraktur-Bold-T4SWXBMT.woff +0 -0
  139. package/dist/KaTeX_Fraktur-Bold-WGHVTYOR.ttf +0 -0
  140. package/dist/KaTeX_Fraktur-Regular-2PEIFJSJ.woff2 +0 -0
  141. package/dist/KaTeX_Fraktur-Regular-5U4OPH2X.ttf +0 -0
  142. package/dist/KaTeX_Fraktur-Regular-PQMHCIK6.woff +0 -0
  143. package/dist/KaTeX_Main-Bold-2GA4IZIN.woff +0 -0
  144. package/dist/KaTeX_Main-Bold-W5FBVCZM.ttf +0 -0
  145. package/dist/KaTeX_Main-Bold-YP5VVQRP.woff2 +0 -0
  146. package/dist/KaTeX_Main-BoldItalic-4P4C7HJH.woff +0 -0
  147. package/dist/KaTeX_Main-BoldItalic-N4V3DX7S.woff2 +0 -0
  148. package/dist/KaTeX_Main-BoldItalic-ODMLBJJQ.ttf +0 -0
  149. package/dist/KaTeX_Main-Italic-I43T2HSR.ttf +0 -0
  150. package/dist/KaTeX_Main-Italic-RELBIK7M.woff2 +0 -0
  151. package/dist/KaTeX_Main-Italic-SASNQFN2.woff +0 -0
  152. package/dist/KaTeX_Main-Regular-ARRPAO67.woff2 +0 -0
  153. package/dist/KaTeX_Main-Regular-P5I74A2A.woff +0 -0
  154. package/dist/KaTeX_Main-Regular-W74P5G27.ttf +0 -0
  155. package/dist/KaTeX_Math-BoldItalic-6EBV3DK5.woff +0 -0
  156. package/dist/KaTeX_Math-BoldItalic-K4WTGH3J.woff2 +0 -0
  157. package/dist/KaTeX_Math-BoldItalic-VB447A4D.ttf +0 -0
  158. package/dist/KaTeX_Math-Italic-6KGCHLFN.woff2 +0 -0
  159. package/dist/KaTeX_Math-Italic-KKK3USB2.woff +0 -0
  160. package/dist/KaTeX_Math-Italic-SON4MRCA.ttf +0 -0
  161. package/dist/KaTeX_SansSerif-Bold-RRNVJFFW.woff2 +0 -0
  162. package/dist/KaTeX_SansSerif-Bold-STQ6RXC7.ttf +0 -0
  163. package/dist/KaTeX_SansSerif-Bold-X5M5EMOD.woff +0 -0
  164. package/dist/KaTeX_SansSerif-Italic-HMPFTM52.woff2 +0 -0
  165. package/dist/KaTeX_SansSerif-Italic-PSN4QKYX.woff +0 -0
  166. package/dist/KaTeX_SansSerif-Italic-WTBAZBGY.ttf +0 -0
  167. package/dist/KaTeX_SansSerif-Regular-2TL3USAE.ttf +0 -0
  168. package/dist/KaTeX_SansSerif-Regular-OQCII6EP.woff +0 -0
  169. package/dist/KaTeX_SansSerif-Regular-XIQ62X4E.woff2 +0 -0
  170. package/dist/KaTeX_Script-Regular-72OLXYNA.ttf +0 -0
  171. package/dist/KaTeX_Script-Regular-A5IFOEBS.woff +0 -0
  172. package/dist/KaTeX_Script-Regular-APUWIHLP.woff2 +0 -0
  173. package/dist/KaTeX_Size1-Regular-4HRHTS65.woff +0 -0
  174. package/dist/KaTeX_Size1-Regular-5LRUTBFT.woff2 +0 -0
  175. package/dist/KaTeX_Size1-Regular-7K6AASVL.ttf +0 -0
  176. package/dist/KaTeX_Size2-Regular-222HN3GT.ttf +0 -0
  177. package/dist/KaTeX_Size2-Regular-K5ZHAIS6.woff +0 -0
  178. package/dist/KaTeX_Size2-Regular-LELKET5D.woff2 +0 -0
  179. package/dist/KaTeX_Size3-Regular-TLFPAHDE.woff +0 -0
  180. package/dist/KaTeX_Size3-Regular-UFCO6WCA.ttf +0 -0
  181. package/dist/KaTeX_Size3-Regular-WQRQ47UD.woff2 +0 -0
  182. package/dist/KaTeX_Size4-Regular-7PGNVPQK.ttf +0 -0
  183. package/dist/KaTeX_Size4-Regular-CDMV7U5C.woff2 +0 -0
  184. package/dist/KaTeX_Size4-Regular-PKMWZHNC.woff +0 -0
  185. package/dist/KaTeX_Typewriter-Regular-3F5K6SQ6.ttf +0 -0
  186. package/dist/KaTeX_Typewriter-Regular-MJMFSK64.woff +0 -0
  187. package/dist/KaTeX_Typewriter-Regular-VBYJ4NRC.woff2 +0 -0
  188. package/dist/index.css +0 -4017
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PartLoaderContext.d.ts","sourceRoot":"","sources":["../../src/context/PartLoaderContext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAA;AAE1E,mCAAmC;AACnC,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,CAC3B,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,MAAM,GAAG,iBAAiB,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;AAE3D;;;GAGG;AACH,eAAO,MAAM,iBAAiB,qDAAuD,CAAA;AACrF,eAAO,MAAM,qBAAqB,0DAA4D,CAAA;AAE9F,wBAAgB,aAAa,IAAI,cAAc,GAAG,SAAS,CAE1D;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAEnE;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,cAAc,CAAA;IACrB,UAAU,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAChC,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,+CAA+C;AAC/C,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAI1D,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Part 渲染器上下文
3
+ * 用于注入自定义 Part 类型渲染器(如 weather, stock 等)
4
+ */
5
+ import { type ComponentType, type ReactNode, type FC } from 'react';
6
+ /** Part 渲染器 Props(每个自定义渲染器接收的 props) */
7
+ export interface PartRendererProps {
8
+ [key: string]: unknown;
9
+ }
10
+ /** Part 渲染器映射(key: part.type, value: 渲染组件) */
11
+ export type PartRenderers = Record<string, ComponentType<PartRendererProps>>;
12
+ /** Part 渲染器上下文 */
13
+ export declare const PartRenderersContext: import("react").Context<PartRenderers>;
14
+ /** Part 渲染器 Provider Props */
15
+ interface PartRenderersProviderProps {
16
+ partRenderers?: PartRenderers;
17
+ children: ReactNode;
18
+ }
19
+ /** Part 渲染器 Provider */
20
+ export declare const PartRenderersProvider: FC<PartRenderersProviderProps>;
21
+ export {};
22
+ //# sourceMappingURL=RenderersContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderersContext.d.ts","sourceRoot":"","sources":["../../src/context/RenderersContext.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAiB,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,OAAO,CAAA;AAElF,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,8CAA8C;AAC9C,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAE5E,kBAAkB;AAClB,eAAO,MAAM,oBAAoB,wCAAmC,CAAA;AAEpE,8BAA8B;AAC9B,UAAU,0BAA0B;IAClC,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED,wBAAwB;AACxB,eAAO,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAShE,CAAA"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * 聊天模块内部共享类型(React 版)
3
+ */
4
+ import type { MutableRefObject, Dispatch, SetStateAction } from 'react';
5
+ import type { ChatAdapter, ChatMode, SessionRecord, AutoRunConfig, ChatCapabilityExtensionGroup } from '@huyooo/ai-chat-bridge-electron/renderer';
6
+ import type { AtContextItem, ChatEvent, ChatHistoryMessage } from '@huyooo/ai-chat-types';
7
+ import type { ChatMessage } from '../../types';
8
+ /** 排队中的消息 */
9
+ export interface QueuedMessage {
10
+ id: string;
11
+ text: string;
12
+ images?: string[];
13
+ atContextItems?: AtContextItem[];
14
+ }
15
+ /** 会话状态 - 每个会话独立的状态 */
16
+ export interface SessionState {
17
+ messages: ChatMessage[];
18
+ hasMoreHistory: boolean;
19
+ oldestLoadedSequence: number | null;
20
+ isLoadingHistory: boolean;
21
+ isLoading: boolean;
22
+ abortController: AbortController | null;
23
+ activeAssistantMessageId: string | null;
24
+ queuedMessages: QueuedMessage[];
25
+ }
26
+ /** 工具 UI 声明 */
27
+ export interface ToolUI {
28
+ type: 'render' | 'action';
29
+ name: string;
30
+ props?: Record<string, unknown>;
31
+ renderOnResultOnly?: boolean;
32
+ }
33
+ /** 工具完成事件数据 */
34
+ export interface ToolCompleteEvent {
35
+ name: string;
36
+ result: unknown;
37
+ ui?: ToolUI;
38
+ }
39
+ export type ToolApprovalPendingEvent = Extract<ChatEvent, {
40
+ type: 'tool_approval_request';
41
+ }>['data'];
42
+ export interface UseChatOptions {
43
+ adapter: ChatAdapter;
44
+ defaultModel?: string;
45
+ defaultMode?: ChatMode;
46
+ onToolComplete?: (event: ToolCompleteEvent) => void;
47
+ onToolApprovalPending?: (event: ToolApprovalPendingEvent) => void;
48
+ /** 是否启动副作用;用于 ChatPanel 接入外部 runtime 时禁用内部 fallback runtime */
49
+ enabled?: boolean;
50
+ }
51
+ /** compact 压缩缓存数据(streaming 结束后再持久化) */
52
+ export interface PendingCompactData {
53
+ summaryContent: string;
54
+ model?: string;
55
+ tokensBeforeCompact: number;
56
+ compressedTokens: number;
57
+ originalMessageCount: number;
58
+ compressedMessageCount: number;
59
+ duration: number;
60
+ }
61
+ /** 单条消息内容压缩缓存数据 */
62
+ export interface PendingContentCompressData {
63
+ summary: string;
64
+ model?: string;
65
+ originalTokens: number;
66
+ compressedTokens: number;
67
+ duration: number;
68
+ }
69
+ /** streamAssistantResponse 参数 */
70
+ export interface StreamRequestParams {
71
+ sessionId: string;
72
+ state: SessionState;
73
+ userMsgId: string;
74
+ history: ChatHistoryMessage[];
75
+ text: string;
76
+ images?: string[];
77
+ atContextItems?: AtContextItem[];
78
+ /** finally 中是否处理队列(仅 sendMessage 需要) */
79
+ processQueue?: boolean;
80
+ }
81
+ /** 子模块间共享的上下文(React 版:使用 ref + state) */
82
+ export interface ChatContext {
83
+ adapter: ChatAdapter;
84
+ sessionStatesRef: MutableRefObject<Map<string, SessionState>>;
85
+ sessions: SessionRecord[];
86
+ setSessions: Dispatch<SetStateAction<SessionRecord[]>>;
87
+ currentSessionIdRef: MutableRefObject<string | null>;
88
+ currentSessionId: string | null;
89
+ setCurrentSessionId: Dispatch<SetStateAction<string | null>>;
90
+ modeRef: MutableRefObject<ChatMode>;
91
+ modelRef: MutableRefObject<string>;
92
+ webSearchRef: MutableRefObject<boolean>;
93
+ thinkingRef: MutableRefObject<boolean>;
94
+ enabledToolsRef: MutableRefObject<string[] | undefined>;
95
+ autoRunConfigRef: MutableRefObject<AutoRunConfig>;
96
+ capabilityExtensionsRef?: MutableRefObject<ChatCapabilityExtensionGroup[]>;
97
+ /** 确保聊天能力快照已完成首轮加载,避免首次发送时把 undefined 当作全量工具放行 */
98
+ ensureCapabilitiesLoaded?: () => Promise<void>;
99
+ onToolComplete?: (event: ToolCompleteEvent) => void;
100
+ onToolApprovalPending?: (event: ToolApprovalPendingEvent) => void;
101
+ getSessionState: (sessionId: string) => SessionState;
102
+ forceUpdate: () => void;
103
+ /** 配置 state setter(用于切换会话同步配置) */
104
+ setModeState: (v: ChatMode) => void;
105
+ setModelState: (v: string) => void;
106
+ setWebSearchState: (v: boolean) => void;
107
+ setThinkingState: (v: boolean) => void;
108
+ }
109
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/hooks/chat/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { ChatAdapter, AutoRunConfig, ChatCapabilityExtensionGroup } from '@huyooo/ai-chat-bridge-electron/renderer';
2
+ import type { SkillEnabledItem } from '@huyooo/ai-chat-types';
3
+ import type { AssetSource } from '@huyooo/ai-chat-core';
4
+ export declare function useCapabilityConfig(adapter: ChatAdapter, enabled?: boolean): {
5
+ autoRunConfig: AutoRunConfig;
6
+ autoRunConfigRef: import("react").MutableRefObject<AutoRunConfig>;
7
+ loadAutoRunConfig: () => Promise<void>;
8
+ saveAutoRunConfig: (config: AutoRunConfig) => Promise<void>;
9
+ enabledTools: string[] | undefined;
10
+ enabledToolsRef: import("react").MutableRefObject<string[] | undefined>;
11
+ capabilityExtensions: ChatCapabilityExtensionGroup[];
12
+ capabilityExtensionsRef: import("react").MutableRefObject<ChatCapabilityExtensionGroup[]>;
13
+ loadCapabilities: (force?: boolean) => Promise<void>;
14
+ ensureCapabilitiesLoaded: () => Promise<void>;
15
+ setToolsChatEnabled: (items: Array<{
16
+ alias: string;
17
+ enabled: boolean;
18
+ }>) => Promise<void>;
19
+ setMcpToolsChatEnabled: (items: Array<{
20
+ alias: string;
21
+ enabled: boolean;
22
+ }>) => Promise<void>;
23
+ setSkillsChatEnabled: (items: SkillEnabledItem[]) => Promise<void>;
24
+ setExtensionEnabled: (payload: {
25
+ id: string;
26
+ enabled: boolean;
27
+ source: AssetSource;
28
+ }) => Promise<{
29
+ ok: true;
30
+ } | {
31
+ ok: false;
32
+ error: string;
33
+ }>;
34
+ };
35
+ //# sourceMappingURL=useCapabilityConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCapabilityConfig.d.ts","sourceRoot":"","sources":["../../../src/hooks/chat/useCapabilityConfig.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EAGb,4BAA4B,EAC7B,MAAM,0CAA0C,CAAA;AACjD,OAAO,KAAK,EAGV,gBAAgB,EACjB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AA0GvD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,GAAE,OAAc;;;;gCAyD1B,aAAa;;;;;+BAoHf,OAAO;;iCArDJ,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;oCAcvC,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;kCAc5C,gBAAgB,EAAE;mCAUjB;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,WAAW,CAAA;KAAE;;;;;;EAuE9G"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 消息操作模块(轻操作,React 版)
3
+ * 包含取消、复制、工作目录设置
4
+ * 发送/重发等流式操作统一在 useMessageSender 中
5
+ */
6
+ import type { ChatContext } from './types';
7
+ export declare function useMessageActions(ctx: ChatContext): {
8
+ cancelRequest: () => void;
9
+ retryToolCall: (messageId: string, toolCallId: string) => Promise<void>;
10
+ copyMessage: (messageId: string) => Promise<void>;
11
+ setWorkingDirectory: (dir: string) => void;
12
+ };
13
+ //# sourceMappingURL=useMessageActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMessageActions.d.ts","sourceRoot":"","sources":["../../../src/hooks/chat/useMessageActions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAK1C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW;;+BAyFI,MAAM,cAAc,MAAM;6BAvC5B,MAAM;+BAiCV,MAAM;EAkFrD"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * 消息发送核心逻辑(React 版)
3
+ * 包含消息保存、事件处理、流式消息发送、重发/分叉、队列管理
4
+ */
5
+ import type { AtContextItem } from '@huyooo/ai-chat-types';
6
+ import type { ChatContext } from './types';
7
+ export declare function useMessageSender(ctx: ChatContext): {
8
+ sendMessage: (text: string, images?: string[], atContextItems?: AtContextItem[]) => Promise<void>;
9
+ resendFromIndex: (index: number, text: string, atContextItems?: AtContextItem[]) => Promise<void>;
10
+ regenerateMessage: (messageIndex: number) => void;
11
+ removeQueuedMessage: (messageId: string) => void;
12
+ editQueuedMessage: (messageId: string, newText: string) => void;
13
+ clearQueuedMessages: () => void;
14
+ };
15
+ //# sourceMappingURL=useMessageSender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMessageSender.d.ts","sourceRoot":"","sources":["../../../src/hooks/chat/useMessageSender.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAa1D,OAAO,KAAK,EACV,WAAW,EAIZ,MAAM,SAAS,CAAA;AAmBhB,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,WAAW;wBAmrBF,MAAM,WAAW,MAAM,EAAE,mBAAmB,aAAa,EAAE;6BAoFtD,MAAM,QAAQ,MAAM,mBAAmB,aAAa,EAAE;sCAkDnD,MAAM;qCAeP,MAAM;mCASR,MAAM,WAAW,MAAM;;EA0B1E"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 会话管理模块(React 版)
3
+ * 包含会话的增删改查、切换、导出等操作
4
+ */
5
+ import type { ChatContext } from './types';
6
+ export declare function useSessionManager(ctx: ChatContext): {
7
+ loadSessions: () => Promise<void>;
8
+ switchSession: (sessionId: string) => Promise<void>;
9
+ loadOlderMessages: () => Promise<void>;
10
+ createNewSession: () => Promise<import("@huyooo/ai-chat-types").SessionRecord | null>;
11
+ deleteSession: (sessionId: string) => Promise<void>;
12
+ deleteCurrentSession: () => Promise<void>;
13
+ hideSession: (sessionId: string, hidden: boolean) => Promise<void>;
14
+ clearAllSessions: () => Promise<void>;
15
+ hideOtherSessions: () => Promise<void>;
16
+ exportCurrentSession: () => string | null;
17
+ };
18
+ //# sourceMappingURL=useSessionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSessionManager.d.ts","sourceRoot":"","sources":["../../../src/hooks/chat/useSessionManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAM1C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW;;+BA+DI,MAAM;;;+BAwFN,MAAM;;6BAsCR,MAAM,UAAU,OAAO;;;gCAkD5B,MAAM,GAAG,IAAI;EAyC3D"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 聊天工具函数
3
+ *
4
+ * 框架无关的纯函数从 @huyooo/ai-chat-shared 导入(Vue/React 共享)
5
+ * 事件类型从 @huyooo/ai-chat-types 导入
6
+ * 此文件仅保留依赖前端 UI 类型的函数
7
+ */
8
+ import type { MessagePartInput, MessageRecord } from '@huyooo/ai-chat-bridge-electron/renderer';
9
+ import type { ChatMessage, ContentPart } from '../../types';
10
+ export type { FrontendChatEvent as ChatEvent } from '@huyooo/ai-chat-types';
11
+ export { shouldSaveEvent } from '@huyooo/ai-chat-types';
12
+ export { hasSkipped, hasCancelled, AT_LINE_RE, stripAtContextLines, extractAtContextRefs, buildPromptWithAtContext, computeAtContextBudget, generateId, extractToolGovernance, mergeToolGovernance, } from '@huyooo/ai-chat-shared';
13
+ /** 获取消息的纯文本内容 */
14
+ export declare function extractTextContent(parts: ContentPart[]): string;
15
+ /** 提取消息内容,优先使用已完成的压缩摘要 */
16
+ export declare function extractMessageContent(parts: ContentPart[]): string;
17
+ export declare function serializeMessageParts(parts: ContentPart[]): MessagePartInput[];
18
+ /** 转换存储的消息为显示格式 */
19
+ export declare function convertToMessage(record: MessageRecord): ChatMessage;
20
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/hooks/chat/utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAA;AAC/F,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAGZ,MAAM,aAAa,CAAA;AAIpB,YAAY,EAAE,iBAAiB,IAAI,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EACL,UAAU,EACV,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,UAAU,EACV,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,wBAAwB,CAAA;AAI/B,iBAAiB;AACjB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAK/D;AAED,0BAA0B;AAC1B,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAOlE;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAK9E;AAED,mBAAmB;AACnB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CA2DnE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * useChat Hook — 组合入口
3
+ * 管理聊天状态和与后端的通信
4
+ *
5
+ * 架构:
6
+ * - 使用 Map 存储每个会话的独立状态
7
+ * - 多会话可同时进行,互不干扰
8
+ * - 切换 tab 不会停止正在进行的请求
9
+ * - ContentPart 数组存储消息内容,支持流式渲染和自定义 UI
10
+ *
11
+ * 拆分模块:
12
+ * - chat/utils.ts 纯工具函数(无框架依赖)
13
+ * - chat/types.ts 内部共享类型
14
+ * - chat/useCapabilityConfig.ts 聊天能力配置
15
+ * - chat/useSessionManager.ts 会话管理
16
+ * - chat/useMessageSender.ts 消息发送核心逻辑
17
+ * - chat/useMessageActions.ts 消息操作
18
+ */
19
+ import type { ChatMode, SessionRecord } from '@huyooo/ai-chat-bridge-electron/renderer';
20
+ export type { QueuedMessage, ToolUI, ToolCompleteEvent, UseChatOptions } from './chat/types';
21
+ import type { UseChatOptions, SessionState } from './chat/types';
22
+ import type { ChatMessage, ContentPart } from '../types';
23
+ /**
24
+ * 聊天状态管理 Hook
25
+ *
26
+ * 核心架构:
27
+ * - sessionStatesRef: Map<sessionId, SessionState> 存储每个会话的独立状态
28
+ * - 多会话可同时进行请求,互不干扰
29
+ * - 切换 tab 不会停止任何正在进行的请求
30
+ */
31
+ export declare function useChat(options: UseChatOptions): {
32
+ sessions: SessionRecord[];
33
+ currentSessionId: string | null;
34
+ messages: ChatMessage[];
35
+ isLoading: boolean;
36
+ hasMoreHistory: boolean;
37
+ isLoadingHistory: boolean;
38
+ sessionStates: Map<string, SessionState>;
39
+ mode: ChatMode;
40
+ model: string;
41
+ webSearch: boolean;
42
+ thinking: boolean;
43
+ loadSessions: () => Promise<void>;
44
+ switchSession: (sessionId: string) => Promise<void>;
45
+ loadOlderMessages: () => Promise<void>;
46
+ createNewSession: () => Promise<SessionRecord | null>;
47
+ deleteSession: (sessionId: string) => Promise<void>;
48
+ deleteCurrentSession: () => Promise<void>;
49
+ hideSession: (sessionId: string, hidden: boolean) => Promise<void>;
50
+ clearAllSessions: () => Promise<void>;
51
+ hideOtherSessions: () => Promise<void>;
52
+ exportCurrentSession: () => string | null;
53
+ sendMessage: (text: string, images?: string[], atContextItems?: import("@huyooo/ai-chat-types").AtContextItem[]) => Promise<void>;
54
+ appendAssistantMessage: (input: {
55
+ parts: ContentPart[];
56
+ content?: string;
57
+ timestamp?: number;
58
+ model?: string;
59
+ mode?: ChatMode;
60
+ webSearchEnabled?: boolean;
61
+ thinkingEnabled?: boolean;
62
+ }) => Promise<ChatMessage>;
63
+ cancelRequest: () => void;
64
+ copyMessage: (messageId: string) => Promise<void>;
65
+ retryToolCall: (messageId: string, toolCallId: string) => Promise<void>;
66
+ regenerateMessage: (messageIndex: number) => void;
67
+ resendFromIndex: (index: number, text: string, atContextItems?: import("@huyooo/ai-chat-types").AtContextItem[]) => Promise<void>;
68
+ queuedMessages: import("./useChat").QueuedMessage[];
69
+ removeQueuedMessage: (messageId: string) => void;
70
+ editQueuedMessage: (messageId: string, newText: string) => void;
71
+ clearQueuedMessages: () => void;
72
+ setMode: (value: ChatMode) => void;
73
+ setModel: (value: string) => void;
74
+ setWebSearch: (value: boolean) => void;
75
+ setThinking: (value: boolean) => void;
76
+ setWorkingDirectory: (dir: string) => void;
77
+ autoRunConfig: import("@huyooo/ai-chat-core").AutoRunConfig;
78
+ loadAutoRunConfig: () => Promise<void>;
79
+ saveAutoRunConfig: (config: import("@huyooo/ai-chat-core").AutoRunConfig) => Promise<void>;
80
+ enabledTools: string[] | undefined;
81
+ capabilityExtensions: import("@huyooo/ai-chat-types").ChatCapabilityExtensionGroup[];
82
+ loadCapabilities: (force?: boolean) => Promise<void>;
83
+ reloadCapabilities: () => Promise<void>;
84
+ setToolsChatEnabled: (items: Array<{
85
+ alias: string;
86
+ enabled: boolean;
87
+ }>) => Promise<void>;
88
+ setMcpToolsChatEnabled: (items: Array<{
89
+ alias: string;
90
+ enabled: boolean;
91
+ }>) => Promise<void>;
92
+ setSkillsChatEnabled: (items: import("@huyooo/ai-chat-types").SkillEnabledItem[]) => Promise<void>;
93
+ setExtensionEnabled: (payload: {
94
+ id: string;
95
+ enabled: boolean;
96
+ source: import("@huyooo/ai-chat-core").AssetSource;
97
+ }) => Promise<{
98
+ ok: true;
99
+ } | {
100
+ ok: false;
101
+ error: string;
102
+ }>;
103
+ };
104
+ export type ChatRuntime = ReturnType<typeof useChat>;
105
+ //# sourceMappingURL=useChat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChat.d.ts","sourceRoot":"","sources":["../../src/hooks/useChat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EACV,QAAQ,EACR,aAAa,EACd,MAAM,0CAA0C,CAAA;AAUjD,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC5F,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAe,MAAM,cAAc,CAAA;AAC7E,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAIxD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc;;;;;;;;;;;;;;;;;;;;;;;oCA8HY;QACvD,KAAK,EAAE,WAAW,EAAE,CAAA;QACpB,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,QAAQ,CAAA;QACf,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAC1B,eAAe,CAAC,EAAE,OAAO,CAAA;KAC1B,KAAG,OAAO,CAAC,WAAW,CAAC;;;;;;;;;;qBAmFL,QAAQ;sBAQP,MAAM;0BAQF,OAAO;yBAQR,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8B/B;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,OAAO,CAAC,CAAA"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 图片上传 hook
3
+ * 处理图片选择、粘贴、拖拽、预览等功能
4
+ * 与 Vue 版本 useImageUpload.ts 保持一致
5
+ */
6
+ /** 内部图片数据结构(包含预览用的 dataUrl) */
7
+ export interface ImageItem {
8
+ dataUrl: string;
9
+ base64: string;
10
+ mimeType: string;
11
+ }
12
+ /** 导出给外部使用的图片数据格式 */
13
+ export interface ImageData {
14
+ base64: string;
15
+ mimeType: string;
16
+ }
17
+ /** useImageUpload 配置项 */
18
+ interface UseImageUploadOptions {
19
+ /** 最大图片数量,默认 5 */
20
+ maxImages?: number;
21
+ /** 单张图片最大大小(字节),默认 10MB */
22
+ maxSize?: number;
23
+ /** 图片最大宽度,默认 4000px(避免超过 API 像素限制) */
24
+ maxWidth?: number;
25
+ /** 图片最大高度,默认 4000px(避免超过 API 像素限制) */
26
+ maxHeight?: number;
27
+ /** 压缩质量 0-1,默认 0.85 */
28
+ quality?: number;
29
+ }
30
+ /**
31
+ * 图片上传 hook
32
+ * @param options 配置项
33
+ */
34
+ export declare function useImageUpload(options?: UseImageUploadOptions): {
35
+ images: ImageItem[];
36
+ isDragOver: boolean;
37
+ previewVisible: boolean;
38
+ previewIndex: number;
39
+ setPreviewIndex: import("react").Dispatch<import("react").SetStateAction<number>>;
40
+ imageUrls: string[];
41
+ imageData: ImageData[];
42
+ hasImages: boolean;
43
+ handleImageSelect: (event: React.ChangeEvent<HTMLInputElement>) => void;
44
+ handlePaste: (event: React.ClipboardEvent) => void;
45
+ handleDragOver: (event: React.DragEvent) => void;
46
+ handleDragLeave: () => void;
47
+ handleDrop: (event: React.DragEvent) => void;
48
+ openPreview: (index: number) => void;
49
+ closePreview: () => void;
50
+ removeImage: (index: number) => void;
51
+ clearImages: () => void;
52
+ addImages: (files: File[]) => void;
53
+ initImages: (data: string[]) => void;
54
+ };
55
+ export {};
56
+ //# sourceMappingURL=useImageUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useImageUpload.d.ts","sourceRoot":"","sources":["../../src/hooks/useImageUpload.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,+BAA+B;AAC/B,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAqB;AACrB,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,yBAAyB;AACzB,UAAU,qBAAqB;IAC7B,kBAAkB;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B;;;;;;;;;+BA2ItD,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC;yBAenC,KAAK,CAAC,cAAc;4BAuBa,KAAK,CAAC,SAAS;;wBAkBhD,KAAK,CAAC,SAAS;yBAee,MAAM;;yBAeN,MAAM;;uBAepC,IAAI,EAAE;uBAUsB,MAAM,EAAE;EAuD/C"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * 语音输入 hook(React)
3
+ *
4
+ * 浏览器录音 + Electron bridge ASR(WebSocket)实时转写。
5
+ * 与 Vue 版本 useVoiceInput.ts 逻辑保持一致,但使用 React state。
6
+ */
7
+ import type { ChatAdapter } from '@huyooo/ai-chat-bridge-electron/renderer';
8
+ export type VoiceInputStatus = 'idle' | 'connecting' | 'recording' | 'processing' | 'error';
9
+ export interface VoiceInputConfig {
10
+ sampleRate?: number;
11
+ sendInterval?: number;
12
+ enablePunc?: boolean;
13
+ enableItn?: boolean;
14
+ }
15
+ export interface UseVoiceInputReturn {
16
+ status: VoiceInputStatus;
17
+ isRecording: boolean;
18
+ currentText: string;
19
+ finalText: string;
20
+ error: string | null;
21
+ start: () => Promise<void>;
22
+ stop: () => Promise<string>;
23
+ cancel: () => void;
24
+ }
25
+ export declare function useVoiceInput(adapter: ChatAdapter | undefined, config?: VoiceInputConfig): UseVoiceInputReturn;
26
+ //# sourceMappingURL=useVoiceInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVoiceInput.d.ts","sourceRoot":"","sources":["../../src/hooks/useVoiceInput.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,0CAA0C,CAAC;AAE3F,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;AAE5F,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAkID,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,MAAM,GAAE,gBAAqB,GAAG,mBAAmB,CAqSlH"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * 将语音识别(useVoiceInput)封装成“写入输入框”的高内聚控制层
3
+ * - 处理 prefix(追加模式)
4
+ * - 处理实时同步到 inputText
5
+ * - 处理 Enter:语音中 Enter 停止/取消语音(不发送)
6
+ * - 输出按钮状态/禁用逻辑(ChatInput 只负责渲染)
7
+ */
8
+ import type { ChatAdapter } from '@huyooo/ai-chat-bridge-electron/renderer';
9
+ export declare function useVoiceToTextInput(opts: {
10
+ adapter: ChatAdapter | undefined;
11
+ inputText: string;
12
+ setInputText: (v: string) => void;
13
+ hasImages: boolean;
14
+ isLoading: boolean;
15
+ }): {
16
+ voiceInput: import("./useVoiceInput").UseVoiceInputReturn;
17
+ isVoiceActive: boolean;
18
+ toggleVoice: () => Promise<void>;
19
+ sendDisabled: boolean;
20
+ handleKeyDownForVoice: (e: React.KeyboardEvent<HTMLTextAreaElement>) => boolean;
21
+ };
22
+ //# sourceMappingURL=useVoiceToTextInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVoiceToTextInput.d.ts","sourceRoot":"","sources":["../../src/hooks/useVoiceToTextInput.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAG5E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,OAAO,EAAE,WAAW,GAAG,SAAS,CAAC;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;;;;;+BA+CO,KAAK,CAAC,aAAa,CAAC,mBAAmB,CAAC;EAmB/C"}
@@ -0,0 +1,2 @@
1
+ export declare function preloadIcons(): void;
2
+ //# sourceMappingURL=icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../src/icons.ts"],"names":[],"mappings":"AAuBA,wBAAgB,YAAY,SAI3B"}