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>
104 lines
3.3 KiB
JavaScript
104 lines
3.3 KiB
JavaScript
// __mocks__/obsidian.js
|
|
/* eslint-disable no-undef */
|
|
import yaml from "js-yaml";
|
|
|
|
module.exports = {
|
|
Vault: jest.fn().mockImplementation(() => {
|
|
return {
|
|
getMarkdownFiles: jest.fn().mockImplementation(() => {
|
|
// Return an array of mock markdown file objects
|
|
return [
|
|
{ path: "test/test2/note1.md" },
|
|
{ path: "test/note2.md" },
|
|
{ path: "test2/note3.md" },
|
|
{ path: "note4.md" },
|
|
];
|
|
}),
|
|
cachedRead: jest.fn().mockImplementation((file) => {
|
|
// Simulate reading file contents. You can adjust the content as needed for your tests.
|
|
const fileContents = {
|
|
"test/test2/note1.md": "---\ntags: [Tag1, tag2]\n---\nContent of note1",
|
|
"test/note2.md": "---\ntags: [tag2, tag3]\n---\nContent of note2",
|
|
"test2/note3.md": "something else ---\ntags: [false_tag]\n---\nContent of note3",
|
|
"note4.md": "---\ntags: [tag1, Tag4]\n---\nContent of note4",
|
|
};
|
|
return Promise.resolve(fileContents[file.path]);
|
|
}),
|
|
};
|
|
}),
|
|
Platform: {
|
|
isDesktop: true,
|
|
},
|
|
parseYaml: jest.fn().mockImplementation((content) => {
|
|
return yaml.load(content);
|
|
}),
|
|
Modal: class Modal {
|
|
constructor() {
|
|
this.open = jest.fn();
|
|
this.close = jest.fn();
|
|
this.onOpen = jest.fn();
|
|
this.onClose = jest.fn();
|
|
}
|
|
},
|
|
App: jest.fn().mockImplementation(() => ({
|
|
workspace: {
|
|
getActiveFile: jest.fn(),
|
|
},
|
|
vault: {
|
|
read: jest.fn(),
|
|
},
|
|
})),
|
|
ItemView: jest.fn().mockImplementation(function () {
|
|
this.containerEl = document.createElement("div");
|
|
this.onOpen = jest.fn();
|
|
this.onClose = jest.fn();
|
|
this.getDisplayText = jest.fn().mockReturnValue("Mock View");
|
|
this.getViewType = jest.fn().mockReturnValue("mock-view");
|
|
this.getIcon = jest.fn().mockReturnValue("document");
|
|
}),
|
|
Notice: jest.fn().mockImplementation(function (message) {
|
|
this.message = message;
|
|
this.noticeEl = document.createElement("div");
|
|
this.hide = jest.fn();
|
|
}),
|
|
TFile: jest.fn().mockImplementation(function (path) {
|
|
this.path = path;
|
|
this.name = path.split("/").pop();
|
|
this.basename = this.name.replace(/\.[^/.]+$/, "");
|
|
this.extension = path.split(".").pop();
|
|
}),
|
|
TFolder: jest.fn().mockImplementation(function (path) {
|
|
this.path = path || "";
|
|
this.name = this.path.split("/").pop() || "";
|
|
}),
|
|
WorkspaceLeaf: jest.fn().mockImplementation(function () {
|
|
this.view = null;
|
|
this.setViewState = jest.fn();
|
|
this.detach = jest.fn();
|
|
this.getViewState = jest.fn().mockReturnValue({});
|
|
}),
|
|
};
|
|
|
|
// Mock the global app object
|
|
global.app = {
|
|
vault: {
|
|
getAbstractFileByPath: jest.fn().mockReturnValue({
|
|
name: "test-file.md",
|
|
path: "test-file.md",
|
|
}),
|
|
read: jest.fn().mockResolvedValue("test content"),
|
|
modify: jest.fn().mockResolvedValue(undefined),
|
|
getMarkdownFiles: jest.fn().mockReturnValue([]),
|
|
getAllLoadedFiles: jest.fn().mockReturnValue([]),
|
|
},
|
|
workspace: {
|
|
getActiveFile: jest.fn().mockReturnValue(null),
|
|
getLeaf: jest.fn().mockReturnValue({
|
|
openFile: jest.fn().mockResolvedValue(undefined),
|
|
}),
|
|
},
|
|
metadataCache: {
|
|
getFirstLinkpathDest: jest.fn().mockReturnValue(null),
|
|
getFileCache: jest.fn().mockReturnValue(null),
|
|
},
|
|
};
|