diff --git a/src/interface/obsidian/src/interact_with_files.ts b/src/interface/obsidian/src/interact_with_files.ts
index ebd2b7a7..90627774 100644
--- a/src/interface/obsidian/src/interact_with_files.ts
+++ b/src/interface/obsidian/src/interact_with_files.ts
@@ -1,4 +1,4 @@
-import { App, TFile } from 'obsidian';
+import { App, MarkdownView, TFile } from 'obsidian';
import { diffWords } from 'diff';
/**
@@ -55,6 +55,7 @@ export class FileInteractions {
private app: App;
private readonly EDIT_BLOCK_START = '';
private readonly EDIT_BLOCK_END = '';
+ private readonly CONTEXT_FILES_LIMIT = 3;
/**
* Constructor for FileInteractions
@@ -65,6 +66,26 @@ export class FileInteractions {
this.app = app;
}
+ /**
+ * Get N open, recently viewed markdown files.
+ */
+ private getRecentActiveMarkdownFiles(N: number): TFile[] {
+ const seen = new Set();
+ const recentActiveFiles = this.app.workspace.getLeavesOfType('markdown')
+ .sort((a, b) => (b as any).activeTime - (a as any).activeTime) // Sort by leaf activeTime (note: undocumented prop)
+ .map(leaf => (leaf.view as MarkdownView)?.file)
+ // Dedupe by file path
+ .filter((file): file is TFile => {
+ if (!file || seen.has(file.path)) return false;
+ seen.add(file.path);
+ return true;
+ })
+ .slice(0, N);
+
+ console.log(`Using ${recentActiveFiles.length} recently viewed md files for context: ${recentActiveFiles.map(file => file.path).join(', ')}`);
+ return recentActiveFiles;
+ }
+
/**
* Gets the content of all open files
*
@@ -75,9 +96,9 @@ export class FileInteractions {
// Only proceed if we have read or write access
if (fileAccessMode === 'none') return '';
- // Get all open markdown leaves
- const leaves = this.app.workspace.getLeavesOfType('markdown');
- if (leaves.length === 0) return '';
+ // Get recently viewed markdown files
+ const recentFiles = this.getRecentActiveMarkdownFiles(this.CONTEXT_FILES_LIMIT);
+ if (recentFiles.length === 0) return '';
// Instructions in write access mode
let editInstructions: string = '';
@@ -274,11 +295,7 @@ For context, the user is currently working on the following files:
`;
- for (const leaf of leaves) {
- const view = leaf.view as any;
- const file = view?.file;
- if (!file || file.extension !== 'md') continue;
-
+ for (const file of recentFiles) {
// Read file content
let fileContent: string;
try {
@@ -684,10 +701,8 @@ For context, the user is currently working on the following files:
// Track current content for each file as we apply edits
const currentFileContents = new Map();
- // Get all open markdown files
- const files = this.app.workspace.getLeavesOfType('markdown')
- .map(leaf => (leaf.view as any)?.file)
- .filter(file => file && file.extension === 'md');
+ // Get recently viewed markdown file(s) to edit
+ const files = this.getRecentActiveMarkdownFiles(this.CONTEXT_FILES_LIMIT);
// Track success/failure for each edit
const editResults: { block: EditBlock, success: boolean, error?: string }[] = [];