diff --git a/src/interface/obsidian/src/chat_view.ts b/src/interface/obsidian/src/chat_view.ts index e6ef59eb..af88b08c 100644 --- a/src/interface/obsidian/src/chat_view.ts +++ b/src/interface/obsidian/src/chat_view.ts @@ -104,6 +104,9 @@ export class KhojChatView extends KhojPaneView { super(leaf, plugin); this.fileInteractions = new FileInteractions(this.app); + // Initialize file access mode from persisted settings + this.fileAccessMode = this.setting.fileAccessMode ?? 'read'; + this.waitingForLocation = true; fetch("https://ipapi.co/json") @@ -271,29 +274,48 @@ export class KhojChatView extends KhojPaneView { text: "File Access", attr: { class: "khoj-input-row-button clickable-icon", - title: "Toggle file access mode (Read Only)", + title: "Toggle open file access", }, }); - setIcon(fileAccessButton, "file-search"); - fileAccessButton.addEventListener('click', () => { + // Set initial icon based on persisted setting + switch (this.fileAccessMode) { + case 'none': + setIcon(fileAccessButton, "file-x"); + fileAccessButton.title = "Toggle open file access (No Access)"; + break; + case 'write': + setIcon(fileAccessButton, "file-edit"); + fileAccessButton.title = "Toggle open file access (Read & Write)"; + break; + case 'read': + default: + setIcon(fileAccessButton, "file-search"); + fileAccessButton.title = "Toggle open file access (Read Only)"; + break; + } + fileAccessButton.addEventListener('click', async () => { // Cycle through modes: none -> read -> write -> none switch (this.fileAccessMode) { case 'none': this.fileAccessMode = 'read'; setIcon(fileAccessButton, "file-search"); - fileAccessButton.title = "Toggle file access mode (Read Only)"; + fileAccessButton.title = "Toggle open file access (Read Only)"; break; case 'read': this.fileAccessMode = 'write'; setIcon(fileAccessButton, "file-edit"); - fileAccessButton.title = "Toggle file access mode (Read & Write)"; + fileAccessButton.title = "Toggle open file access (Read & Write)"; break; case 'write': this.fileAccessMode = 'none'; setIcon(fileAccessButton, "file-x"); - fileAccessButton.title = "Toggle file access mode (No Access)"; + fileAccessButton.title = "Toggle open file access (No Access)"; break; } + + // Persist the updated mode to settings + this.setting.fileAccessMode = this.fileAccessMode; + await this.plugin.saveSettings(); }); let chatInput = inputRow.createEl("textarea", { diff --git a/src/interface/obsidian/src/settings.ts b/src/interface/obsidian/src/settings.ts index e8cf4f51..4a07ca0c 100644 --- a/src/interface/obsidian/src/settings.ts +++ b/src/interface/obsidian/src/settings.ts @@ -38,6 +38,7 @@ export interface KhojSetting { syncFolders: string[]; syncInterval: number; autoVoiceResponse: boolean; + fileAccessMode: 'none' | 'read' | 'write'; selectedChatModelId: string | null; // Mirrors server's selected_chat_model_config availableChatModels: ModelOption[]; } @@ -58,6 +59,7 @@ export const DEFAULT_SETTINGS: KhojSetting = { syncFolders: [], syncInterval: 60, autoVoiceResponse: true, + fileAccessMode: 'read', selectedChatModelId: null, // Will be populated from server availableChatModels: [], }