mirror of
https://github.com/logancyang/obsidian-copilot.git
synced 2026-07-22 07:50:24 +00:00
* Building persistent memory for copilot (#1848) * Implement chat input v3 (#1794) * Fix chat crash React 409 (#1849) * Fix mobile typeahead menu size (#1853) * Enhance progress bar and bug fix (#1814) * feat: Add edit context for progress card. * fix: When adding a model, do not set the key in the single model setting. * fix: fix the width of the popover on mobile. * Refactor Brevilabs API integration to use models base URL (#1855) - Updated constants to switch from BREVILABS_API_BASE_URL to BREVILABS_MODELS_BASE_URL for model-related API calls. - Adjusted ChatModelManager and EmbeddingManager to utilize the new models base URL for configuration settings. * feat: Add new chat history popover. (#1850) * feat: Add new chat history popover. * feat: Add open source file button to chat history popover - Add ArrowUpRight button to each chat history item - Implement openChatSourceFile method in main.ts - Add onOpenSourceFile callback prop chain through components - Open chat files in new Obsidian tabs when clicked - Optimize error handling to prevent duplicate notices * feat: Implement localSearch CiC prompting flow in CopilotPlusChainRunner (#1856) * Properly extract response text in UserMemoryManager (#1857) * feat: Temporarily disable autocomplete features (#1858) * chore: Update version to 3.1.0-preview-250927 in manifest.json * Support space in typeahead trigger and improve search (#1859) * More chat input enhancement (#1864) * Fix dropdown color * Fix badge border in light theme * Increase search result number * support paste image * fix folder context * Enhance ChatPersistenceManager with filename sanitization tests (#1865) - Added tests to ensure proper sanitization of wiki link brackets and illegal characters in filenames when saving chat messages. - Updated filename generation logic to handle empty sanitized topics by defaulting to 'Untitled Chat'. - Refactored imports in ChatPersistenceManager for better organization. * Update ApplyView accept button styles for improved visibility and interaction (#1866) - Adjusted the positioning of the action button to be further from the bottom of the viewport for better accessibility. - Increased the z-index to ensure the button is always on top of other elements. - Added a shadow effect to enhance the button's visibility against the background. * Expose add selection to chat context to free users (#1867) * New chat input improvements (#1868) * Improve search logic in at mention search * Subscribe to file changes * Detect changes for folders and tags * Make context badge tooltip always show * Add full note path in preview * Fix enter being blocked when no search result * Rebuild "Active Note" and more chat input improvement (#1873) * Performance improvement and extend "active note" to note typeahead menu (#1875) * Add better agent prompt logging (#1882) * Add read tool (#1883) * Add readNote tool for reading notes in chunks * Enhance readNote tool to support dynamic note path display and linked note extraction * Refine readNote tool instructions for improved clarity and efficiency in note content retrieval * Add support for readNote tool: integrate emoji, format results, and refine instructions * Add inline citation reminder functionality to user questions * Add an alert when user hits the maxToken limit (#1884) * Refactor AutonomousAgentChainRunner (#1887) * Refactor AutonomousAgentChainRunner to enhance agent workflow, streamline context preparation, and improve response handling * Enhance type safety in addChatHistoryToMessages by specifying message structure * Improve max iteration limit message for clarity and formatting * Refactor tool display name handling for improved clarity and maintainability * Refactor tool call ID generation and visibility handling for improved clarity and uniqueness * Fix agent tool call ID (#1890) * Enhance tool call ID generation and improve readNote handling in prompts Update readNote description for clarity and improve prompt instructions * Update instructions for registerFileTreeTool to clarify usage guidelines * Clarify instructions for readNote tool to improve context inference and handling of partial note titles * Add token counter (#1889) * Fix index rebuild on semantic search toggle (#1891) * Update token counter label (#1892) * Implement tag search v3 (#1893) * feat: Enhance TieredLexicalRetriever to support tag-based retrieval and improve search scoring - Added support for returning all matching tags in TieredLexicalRetriever. - Introduced new options for tag terms and returnAllTags in the retriever. - Updated FullTextEngine to prioritize tag matches and improve scoring for documents with tags. - Enhanced tokenization to handle hierarchical tags and prevent splitting hyphenated tags. - Improved handling of frontmatter tags in documents. - Updated search tools to accommodate new tag handling features. - Added tests to verify the functionality of tag-based retrieval and scoring improvements. * fix: Improve logging for query expansion in SearchCore * feat: Add explanation for non-tag matches in FullTextEngine search results * feat: Enhance QueryExpander to preserve standalone terms in tag handling and improve term validation * feat: Enhance QueryExpander and TieredLexicalRetriever to improve tag handling and standalone term extraction * Update version to 3.1.0-preview-251006 in manifest.json * Normalize tag queries for case-insensitive matching and improve search functionality (#1894) * Implement merge retriever (#1896) * Fix note read (#1897) * Enhance note resolution logic and add tests for wiki-linked notes and basename matching * Implement note resolution outcome types and enhance readNoteTool tests for ambiguous matches * Add deriveReadNoteDisplayName function and enhance readNoteTool tests for edge cases * Fix note tool UI freeze (#1898) * Update how tags work in context (#1895) * Enhance file creation instructions in modelAdapter and update tool usage guidelines in builtinTools (#1901) - Added instructions for confirming folder existence before creating new files in modelAdapter. - Updated custom prompt instructions in builtinTools to clarify the use of getFileTree for folder lookups when creating new notes. * Do not add url context for youtube url (#1899) * Update YouTube Script command and modal title to indicate Plus feature (#1903) * Enhance ChatPersistenceManager to handle file save conflicts (#1904) * Enhance ChatPersistenceManager to handle file save conflicts and improve epoch handling * Fix type checking for existing files in ChatPersistenceManager to prevent errors * Fix verify add (#1905) - Rename "Verify" button to "Test" in Add Model dialog - Make verification not required for adding model in Set Keys - Upgrade chatAnthropic client to fix the Top P -1 error for Claude Opus models * Enhance XML parsing to handle tool calls missing closing tags --------- Co-authored-by: Wenzheng Jiang <jwzh.hi@gmail.com> Co-authored-by: Zero Liu <zero@lumos.com> Co-authored-by: Emt-lin <41323133+Emt-lin@users.noreply.github.com>
149 lines
3.7 KiB
TypeScript
149 lines
3.7 KiB
TypeScript
import { useCallback, useEffect, useState } from "react";
|
|
import { ChainType } from "@/chainFactory";
|
|
import { ChatMessage, MessageContext } from "@/types/message";
|
|
import { ChatUIState } from "@/state/ChatUIState";
|
|
|
|
/**
|
|
* React hook for using ChatManager through ChatUIState
|
|
*
|
|
* This provides a clean React integration that:
|
|
* - Manages local state synchronization
|
|
* - Provides memoized callback functions
|
|
* - Handles subscriptions and cleanup
|
|
* - Maintains compatibility with existing Chat component API
|
|
*/
|
|
export function useChatManager(chatUIState: ChatUIState) {
|
|
const [messages, setMessages] = useState<ChatMessage[]>([]);
|
|
|
|
// Subscribe to state changes
|
|
useEffect(() => {
|
|
// Initial sync
|
|
setMessages([...chatUIState.getMessages()]);
|
|
|
|
// Subscribe to updates
|
|
const unsubscribe = chatUIState.subscribe(() => {
|
|
setMessages([...chatUIState.getMessages()]);
|
|
});
|
|
|
|
return unsubscribe;
|
|
}, [chatUIState]);
|
|
|
|
// ================================
|
|
// MESSAGE OPERATIONS
|
|
// ================================
|
|
|
|
const sendMessage = useCallback(
|
|
async (
|
|
displayText: string,
|
|
context: MessageContext,
|
|
chainType: ChainType,
|
|
includeActiveNote: boolean = false
|
|
): Promise<string> => {
|
|
return await chatUIState.sendMessage(displayText, context, chainType, includeActiveNote);
|
|
},
|
|
[chatUIState]
|
|
);
|
|
|
|
const editMessage = useCallback(
|
|
async (
|
|
messageId: string,
|
|
newText: string,
|
|
chainType: ChainType,
|
|
includeActiveNote: boolean = false
|
|
): Promise<boolean> => {
|
|
return await chatUIState.editMessage(messageId, newText, chainType, includeActiveNote);
|
|
},
|
|
[chatUIState]
|
|
);
|
|
|
|
const regenerateMessage = useCallback(
|
|
async (
|
|
messageId: string,
|
|
onUpdateCurrentMessage: (message: string) => void,
|
|
onAddMessage: (message: ChatMessage) => void
|
|
): Promise<boolean> => {
|
|
return await chatUIState.regenerateMessage(messageId, onUpdateCurrentMessage, onAddMessage);
|
|
},
|
|
[chatUIState]
|
|
);
|
|
|
|
const deleteMessage = useCallback(
|
|
async (messageId: string): Promise<boolean> => {
|
|
return await chatUIState.deleteMessage(messageId);
|
|
},
|
|
[chatUIState]
|
|
);
|
|
|
|
const clearMessages = useCallback((): void => {
|
|
chatUIState.clearMessages();
|
|
}, [chatUIState]);
|
|
|
|
const truncateAfterMessageId = useCallback(
|
|
async (messageId: string): Promise<void> => {
|
|
await chatUIState.truncateAfterMessageId(messageId);
|
|
},
|
|
[chatUIState]
|
|
);
|
|
|
|
// ================================
|
|
// COMPATIBILITY
|
|
// ================================
|
|
|
|
// For compatibility with existing Chat component
|
|
const addMessage = useCallback(
|
|
(message: ChatMessage): void => {
|
|
chatUIState.addMessage(message);
|
|
},
|
|
[chatUIState]
|
|
);
|
|
|
|
// ================================
|
|
// ADVANCED OPERATIONS
|
|
// ================================
|
|
|
|
const loadMessages = useCallback(
|
|
(messages: ChatMessage[]): void => {
|
|
chatUIState.loadMessages(messages);
|
|
},
|
|
[chatUIState]
|
|
);
|
|
|
|
const getMessage = useCallback(
|
|
(id: string): ChatMessage | undefined => {
|
|
return chatUIState.getMessage(id);
|
|
},
|
|
[chatUIState]
|
|
);
|
|
|
|
const getLLMMessages = useCallback((): ChatMessage[] => {
|
|
return chatUIState.getLLMMessages();
|
|
}, [chatUIState]);
|
|
|
|
const getDebugInfo = useCallback(() => {
|
|
return chatUIState.getDebugInfo();
|
|
}, [chatUIState]);
|
|
|
|
// ================================
|
|
// RETURN API
|
|
// ================================
|
|
|
|
return {
|
|
// Core state
|
|
messages,
|
|
|
|
// Modern API
|
|
sendMessage,
|
|
editMessage,
|
|
regenerateMessage,
|
|
deleteMessage,
|
|
addMessage,
|
|
clearMessages,
|
|
truncateAfterMessageId,
|
|
|
|
// Advanced operations
|
|
loadMessages,
|
|
getMessage,
|
|
getLLMMessages,
|
|
getDebugInfo,
|
|
};
|
|
}
|