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>
127 lines
3.6 KiB
TypeScript
127 lines
3.6 KiB
TypeScript
import MemoryManager from "@/LLMProviders/memoryManager";
|
|
import { ModelAdapterFactory } from "@/LLMProviders/chainRunner/utils/modelAdapter";
|
|
import { buildAgentPromptDebugReport } from "@/LLMProviders/chainRunner/utils/promptDebugService";
|
|
import { ToolRegistry } from "@/tools/ToolRegistry";
|
|
import { ChatMessage } from "@/types/message";
|
|
import { initializeBuiltinTools } from "@/tools/builtinTools";
|
|
import { getSettings } from "@/settings/model";
|
|
import { UserMemoryManager } from "@/memory/UserMemoryManager";
|
|
|
|
interface HeadlessApp {
|
|
vault: {
|
|
getRoot: () => { name: string };
|
|
getAbstractFileByPath: (path: string) => null;
|
|
read: (file: unknown) => Promise<string>;
|
|
getMarkdownFiles: () => unknown[];
|
|
getAllLoadedFiles: () => unknown[];
|
|
adapter: {
|
|
mkdir: (path: string) => Promise<void>;
|
|
};
|
|
};
|
|
metadataCache: {
|
|
getFirstLinkpathDest: () => null;
|
|
getFileCache: () => null;
|
|
};
|
|
workspace: {
|
|
getActiveFile: () => null;
|
|
getLeaf: () => { openFile: () => Promise<void> };
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Create a minimal Obsidian app stub suitable for CLI usage.
|
|
*
|
|
* The autonomous agent only needs vault lookups and metadata cache reads, so this
|
|
* provides no-op implementations that satisfy those expectations.
|
|
*/
|
|
function createHeadlessApp(): HeadlessApp {
|
|
return {
|
|
vault: {
|
|
getRoot: () => ({ name: "root" }),
|
|
getAbstractFileByPath: () => null,
|
|
read: async () => "",
|
|
getMarkdownFiles: () => [],
|
|
getAllLoadedFiles: () => [],
|
|
adapter: {
|
|
mkdir: async () => {
|
|
/* no-op */
|
|
},
|
|
},
|
|
},
|
|
metadataCache: {
|
|
getFirstLinkpathDest: () => null,
|
|
getFileCache: () => null,
|
|
},
|
|
workspace: {
|
|
getActiveFile: () => null,
|
|
getLeaf: () => ({
|
|
openFile: async () => {
|
|
/* no-op */
|
|
},
|
|
}),
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Format a plain user message into the ChatMessage shape used by the agent.
|
|
*
|
|
* @param message - Raw user text to analyse.
|
|
* @returns Minimal chat message.
|
|
*/
|
|
function buildChatMessage(message: string): ChatMessage {
|
|
return {
|
|
message,
|
|
originalMessage: message,
|
|
sender: "user",
|
|
timestamp: null,
|
|
isVisible: true,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Generate the annotated prompt debug report for a given user input.
|
|
*
|
|
* @param args - CLI arguments (expects the user prompt as the concatenated string).
|
|
*/
|
|
export async function run(args: string[]): Promise<void> {
|
|
const userInput = args.join(" ").trim();
|
|
|
|
if (!userInput) {
|
|
console.error('Usage: npm run prompt:debug -- "your message here"');
|
|
process.exitCode = 1;
|
|
return;
|
|
}
|
|
|
|
const app = createHeadlessApp();
|
|
(globalThis as any).app = app;
|
|
|
|
initializeBuiltinTools();
|
|
|
|
const registry = ToolRegistry.getInstance();
|
|
const settings = getSettings();
|
|
const enabledToolIds = new Set(settings.autonomousAgentEnabledToolIds || []);
|
|
const availableTools = registry.getEnabledTools(enabledToolIds, false);
|
|
|
|
const toolDescriptions = (
|
|
await import("@/LLMProviders/chainRunner/AutonomousAgentChainRunner")
|
|
).AutonomousAgentChainRunner.generateToolDescriptions(availableTools);
|
|
|
|
const memoryManager = MemoryManager.getInstance();
|
|
const userMemoryManager = new UserMemoryManager(app as any);
|
|
const chainContext = {
|
|
memoryManager,
|
|
userMemoryManager,
|
|
} as any;
|
|
|
|
const adapter = ModelAdapterFactory.createAdapter({ modelName: "gpt-4" } as any);
|
|
const report = await buildAgentPromptDebugReport({
|
|
chainManager: chainContext,
|
|
adapter,
|
|
availableTools,
|
|
toolDescriptions,
|
|
userMessage: buildChatMessage(userInput),
|
|
});
|
|
|
|
console.log(report.annotatedPrompt);
|
|
}
|